WordPress 3.5 正式發(fā)布, 這個(gè)版本包括大量更新. 啟用了最新的響應(yīng)式布局默認(rèn)主題 Twenty Twelve; 改版了 Admin 界面, 更加簡(jiǎn)潔而且針對(duì)移動(dòng)設(shè)備進(jìn)行了優(yōu)化; Media 功能也得到極大的提高, 現(xiàn)在更加沒(méi)有理由使用其他圖床服務(wù)了.
好話說(shuō)完了, 是時(shí)候 "但是" 了. 但是... WordPress 秉承一貫的作風(fēng), 也偷偷改了一些內(nèi)部方法, 現(xiàn)在 wpdb::prepare()
必須填入第二個(gè)參數(shù), 否則報(bào)錯(cuò)如下.
Warning: Missing argument 2 for wpdb::prepare(), called in xxx.php on line 75 and defined in /www/wp-includes/wp-db.php on line 990
wpdb::prepare() 的第二個(gè)參數(shù)
從技術(shù)上 WordPress 這樣修改 prepare
并沒(méi)有錯(cuò), 因?yàn)檫@是用來(lái)組裝 SQL 語(yǔ)句的方法, 按常理來(lái)說(shuō)必須有帶變量的字符串作為第一個(gè)參數(shù)和第二個(gè)作為變量的參數(shù), 這是為了避免 SQL 注入所引起的安全問(wèn)題. 但是 WordPress 從 2.2 或者更早版本允許了忽略第二個(gè)參數(shù)的寫法, 現(xiàn)在突然令第二個(gè)參數(shù)成為必填, 必然導(dǎo)致很多主題和插件不能正常使用.
我發(fā)布的所有 WordPress 主題和最新評(píng)論插件 WP-RecentComments 都中槍了. 感謝 neoner 提醒, 半個(gè)月前我更新 WP-RecentComments 解決了這個(gè)問(wèn)題, 但還沒(méi)有時(shí)間改主題, 因?yàn)橹黝}審核太麻煩了.
解決辦法
在更新主題之前, 我先在這里說(shuō)說(shuō)解決辦法, 讓用戶們自己可以先解決一下, 相信還有其他主題或者插件可能也會(huì)有類似問(wèn)題, 希望對(duì)大家有幫助.
我們需要先定位出現(xiàn)問(wèn)題的文件和代碼. PHP 的代碼報(bào)錯(cuò)很精準(zhǔn)的, 打開報(bào)錯(cuò)提醒中的文件 (前一個(gè)文件, 不是 wp-db.php), 找到代碼 $wpdb->prepare.為該方法添加一個(gè)空串作為第二個(gè)參數(shù), 比如: $wpdb->prepare('xxx'); 改為 $wpdb->prepare('xxx', ''); 即可.
總結(jié)
WordPress 也不是第一次偷偷修改方法調(diào)用方式了, WordPress 2.7 的時(shí)候也要求 comments_template
必須輸入第二個(gè)方法, 但是當(dāng)時(shí)是為了擴(kuò)展功能, 這次我真的不解. 除了安全考慮, WordPress 也可能有意淘汰一些不積極更新的主題, 我的主題明明向后兼容做得很好的, 實(shí)在太沒(méi)節(jié)操了.