WordPress 2.1-alpha 外掛相容性問題
2006 年 九月 8 日 (星期五) 2:04 pm分類:電腦
標籤:blog, wordpress
我的 blog 架站軟體 WordPress,改用 svn 更新進度已將近一年。當然啦,svn 的最新進度往往不如 stable release 版那麼穩定,偶爾會出現小 bug,不過這是個很活躍的開放原始碼社群,即使有 bug,通常都會在幾天之內獲得解決。
最近突然發現,兩個原本運作正常的外掛:Recent Comments 及 Smart Archives,在 WordPress 2.1-alpha3 底下都出現 SQL error。等了幾天,問題都沒解決,只好親自檢查看看。
我先從較單純的 Smart Archives 開始追查。原本以為是資料庫 schema 有了變化,導致 SQL 指令出錯;但當我手動進入 mysql 下 SQL 指令的結果卻是一切正常,表示 schema 並沒有變動。最後才發現原因是:不知何時、也不知為何,WordPress 的 wp-settings.php 程式居然把 $tableposts 變數清成空字串了,難怪 PHP 看到的 embedded SQL 指令會是錯的。
我想把外掛程式碼當中的 $tableposts 變數,全都直接替換成底層的表格名稱 wp_posts;反正 schema 欄位或許會變,但表格名稱會變動的機率應該是微乎其微。但轉念一想:WordPress 開發團隊或許有其他考量,當初才不把表格名稱寫死在 PHP embedded SQL 指令當中;我還是先看看有沒有影響最少的方法吧。
用 “WordPress tableposts” 關鍵字在 Google 搜尋,發現兩個月前天佑的這篇文章〈WordPress 2.1 的插件相容性〉早就提到這問題了,也解釋了箇中原因及解決之道。不過我個人崇尚 Occam’s razor 及 least effort,比較喜歡以下的改法,將
global $tableXXX;
改成:
global $wpdb;
$tableXXX = $wpdb->XXX;
這樣的好處是:只要更改變數宣告處即可,程式主體仍維持原貌。變數通常都宣告在很前面的地方,位置集中,修改及維護也比較集中。
譬如說,針對 Smart Archives 1.5 版,只要把第 13 行:
global $tableposts, $wpdb, $PHP_SELF;
改成:
global /*$tableposts,*/ $wpdb, $PHP_SELF;
$tableposts = $wpdb->posts;
針對 Recent Comments 1.0 版,只要把第 245 行和第 282 行:
global $tablecomments,$tableposts;
改成:
global $wpdb;
$tablecomments = $wpdb->comments;
$tableposts = $wpdb->posts;
[2006-12-13 補充] 摘錄一段 WordPress 官方說法 “Is your plugin Naughty or Nice?”:
The
$table*variables have all been eliminated. They have not been deprecated as doing so would mean that the variables are still present but developers are no longer encouraged to use them. In this case, they have been removed from the core. When you’re developing plugins that contain SQL statements, ensure you globalize$wpdb, and call tables using$wpdb->posts,$wpdb->post2cat, etc.


追蹤留言回應:以
引用通告 (trackback):![[add to funP]](http://william.cswiz.org/blog/wp-content/themes/william/images/add-funp.png)
![[add to HEMiDEMi]](http://www.hemidemi.com/sticker/user/roxytom.bluecircus.net.gif)
![[add to udn bookmark]](http://bookmark.udn.com/html/help/80_20_02.gif)

2006 年 九月 11日 於 12:09 am
[...] WordPress 2.1-alpha 外掛相容性問題 - 我用的 Get Recent Comments v1.2 的改法如下: [...]
2008 年 四月 6日 於 2:53 pm
喔,原來是這樣子耶,謝謝