之前換 theme 是因為 Arlo 跟我說,我的 trackback 爛掉了。結果 theme 換好了,還是不能夠 trackback,還好新 theme 的樣式我很滿意,才沒有做白工。只好再翻出國三生長輩的這篇《Wordpress Trackback Auto-Discovery》仔細研究了一下,這才發現,雖然舊 theme 爛到底了什麼也沒做好,但新選的 Beeblebrox theme 一樣也是找不到 trackback_rdf() 的存在,只好乖乖自己改 theme 把 trackback_rdf() 加上去。

可是,這一加,出了問題了。冒出了如下的錯誤訊息:

Warning: strtotime() [function.strtotime]: Called with an empty time parameter. in /WP/wp-includes/template-functions-links.php on line 4

一追之下才發現,這實在是 wordpress 程式寫的不好的緣故啊。trackback_rdf()不加任何參數地輾轉呼叫到 get_permalink(),於是 get_permalink() 只好用 0 這個預設參數值當參數呼叫 get_post() 取得當篇文章的各項資料。這可好了,get_post() 若收到 0,就會去抓 $GLOBALS['post'] 當作要查的文章的 id,而因為此時尚沒有 $GLOBALS['post'] 的存在,因而產生錯誤。

為什麼 $GLOBALS['post'] 會不存在呢?因為我想說 meta data 最好放在 header 裡,所以我是在 HTML 的 <head> 裡呼叫 trackback_rdf() 的 (當然是已經先利用了 is_single() 以避免 ijliao 提及的問題)。而 $GLOBALS['post'] 卻要到後面顯示文章的地方,呼叫了 the_post() 之後,才會存在,所以造成了 get_permalink() 的錯誤。

換句話說,wordpress 的 trackback_rdf() 利用到了 the_post() 的一個 side-effect 才得以正確執行。

這,這實在不是我的錯啊!明明就是 wordpress 程式寫的不好的緣故。一個 function 必須要在特定的地點才能使用,又沒有任何的文件說明或利用 assertion 之類的機制保護,難保後來的維護者不得不犯錯啊。還好是 open source,否則肯定會 debug 到死也難以查出問題之所在。