升級至 WordPress 2.7,留言功能暫時減少,對留言功能相關程式的觀察心得

本站升級至 WordPress 2.7,此版本對一般使用者最明顯改變的就是留言功能開始允許所謂的主題式回覆,且此主題式回覆還可以設定深度,深度一層就是和原本一樣,深度二層就是非常類似現在台灣幾家 BSP 有提供的「板主回覆」,但事實上 WordPress 所提供的更強悍,可以提供最多 10 層的回覆,亦即站長、板主、一般使用者,均可以自由的回覆下去。

但是講這麼多,這功能還真不好弄,因為這不但是核心程式已經做好改變,搭配的主題也需要改變,甚至因為本來我們有使用分頁功能的留言顯示,以及即時顯示、發表後五分鐘內可修改、可訂閱留言通知等外掛,均因為 WordPress 2.7 的大幅度改變,而造成深淺不一的影響。為此我弄了很久,現在暫時是把所謂的主題回覆給弄出來了,不過原本留言時的功能也少了一些。

我想要等看看幾個 plugin 的作者有沒有對應 WordPress 2.7 的修正出來,再看看要怎麼做。現在先將就著用吧!未來幾天之內還是有可能發生不定時關站處理 WordPress 的狀況。

討論區不受此影響。

補充一下我升級到 WordPress 2.7 以後遇到的最大災難好了。

其實升級的過程沒有什麼問題,甚至因為已經看到有人偷懶,沒有先把 plugins 解除就直接覆蓋且成功,所以我也懶了,就這麼做下去,也沒發生任何問題。然後我就想說,那個主題式回覆功能,應該不會自己出現,可能要大改背景主題的相關檔案才會有(事實上後來 google 了一下發現也確實是如此)。

在 WordPress 2.7 以前,顯示留言這個部分,沒有獨立的 function,多半都是在搭配主題的 comments.php 中呼叫數個 function 組合出來直接顯示。所以當升級到 WordPress 2.7 以後,雖然後台多了主題式回覆的設定,但是由於前面背景主題還在使用傳統方式顯示留言,因此完全不會有主題式回覆的效果出現。

WordPress 2.7 採用了新的、獨立的 function 來顯示主題式留言,叫做 wp_list_comments(),Google 到的一些文件發現,這個新的 function 在 () 裡面可以傳遞大頭照的 size,如果沒有給參數,預設大頭照的大小就是 32。我希望大頭照可以更大一點,就這麼寫:

wp_list_comments(‘avatar_size=56’);

這樣就會把大頭照的 size 為 56×56 的訊息傳遞進去,顯示留言時就會展現更大的大頭照。

但是他顯示出來的樣式很死,想要修正顯示出來的外觀,例如加上使用者的國家地區、瀏覽器資訊、作業系統資訊這些,就不知道從何下手。於是 trace 了一下程式,發現在 wp-includes/comment-template.php 中,有個叫做 start_el 的 function,這裡是關鍵處,整個留言的外觀是在這裡決定的。這下子頭大啦!我們不是不能自己來改這邊的東西,可是下次一旦升級 WordPress,那這邊的改變就全毀了,而且這樣子也不符合使用的精神,還是應該從 plugin 以及 theme 這兩方面去著手修改才是。所以我決定先讓自己腦袋冷卻一下,這幾天看看各大 plugin 的作者有沒有推出什麼東西再說吧!

另外遇到的最大災難就是,留言板變成一片空白。 😐

畫面上也沒有任何錯誤,觀看 server 吐出來的 html 碼,根本就是直接停掉了,哪有這種怪事?但是其他文章的留言顯示都很正常啊! (哭)

我們的留言板,是累積了十年以來的留言資料,超過三萬筆「有效、有意義」的留言,如果是 WordPress 2.7 以前的版本,會全部一口氣吐出來,誰受得了啊~所以我有裝一個可以分頁顯示留言的 plugin (Paged Comments),還蠻好用的。現在 WordPress 2.7 有了自己的留言分頁顯示功能,再加上主題回覆功能也不適用在這個 plugin,理應廢除,只不過 WordPress 2.7 的分頁功能有點太過簡單,簡單來說,譬如我每 10 篇留言一頁,共 15 篇留言,結果 WordPress 2.7 分頁功能出來的是,第一頁 5 篇留言,第二頁 10 篇留言,這太爛了吧!反過來才對吧!所以我看等人家寫好 plugin 也是勢在必行。

但是真正的問題是,我的留言板什麼東西都吐不出來。再一次的仔細追蹤程式發現,Wordpress 2.7 自己的留言顯示過程,是先將這篇文章的所有留言內容,全部通通倒入記憶體,然後再根據分頁的參數,把指定範圍的給顯示出來!這… 整個程式架構是寫得很漂亮啦!但也太沒效率了吧!為什麼不一開始就指定好範圍然後從資料庫去撈呢?這樣也可以避免 web server 與 mysql 之間的大量傳遞啊!而且整個程式就是突然停在一筆一筆的把資料丟到陣列的階段,是真的突然停,沒有錯誤訊息(我追的好苦終於追到這一個關鍵點),為此我還設定了即時顯示現在的陣列大小,會停在差不多 9300 筆左右。

好,小改一下程式,9300 就停下來跳出來,嘿!我的留言板正常了!

難道是記憶體不夠?

我把 php.ini 檔中的記憶體限制從 16MB(預設 8MB 不夠用),提升到 128MB,放開 9300 的限制,還是一片空白,然後我再放大到 256MB,嘿!三萬多筆留言這下子全部出現了!不過玩一玩發現還是偶爾會無法顯示出來,好吧!最後放大 php 的記憶體上限到 512MB,這下子真的完全不出錯了。

這完全是你 WordPress 2.7 的留言顯示過程太浪費記憶體所致啊!(也沒聽說那個 blog 的單篇文章有三萬多筆留言的)

以前用 “Paged Comments” 這個 plugin 來顯示留言,就不會有這個問題,因為人家就是先抓好範圍,然後只對資料庫撈特定範圍出來就好,所以根本不需要這麼多的記憶體。

總結,一個是記憶體遭濫用的問題,一個是留言樣式似乎被寫死,自己解決太辛苦,還是等各方大德推出最新的 plugins for WordPress 2.7 吧!

話說回來,Wordpress 2.7 現在的後台真是一整個爽。

Facebook留言

個留言

您可能也會喜歡…