幾個 WordPress 小技巧

照理說 codex.wordpress.org 將資料整理得這麼齊全方便,許多關於 WordPress 的相關問題,只要稍事搜尋,應該便可以迎刃而解,不過身邊一些朋友或是囿於語言上的限制,或是缺乏一些資料庫以及動態頁面的觀念,要找資料,還是不知如何找起。比方說最近有人就問我這樣的問題:怎樣在頁面的某個位置上,不要從第一篇開始列出文章,而是要自訂只列出第二篇到第四篇;或,第一篇列出全文,而從第二篇到第四篇,只列出標題…等等。

WordPress 是透過 PHP 以及 MySQL 語法,從資料庫中讀取文章內容,所以要限制只抓從某一篇到某一篇的範圍,就是透過 offset(偏移)以及 limit (限制)兩個語法。而用 WP 的術語來說,在index.php 等模板檔案中,用來顯示文章的範圍,叫做 loop,而在首頁、日期彙整、單篇彙整等不同的狀況下,在 loop 中會列出數量、範圍不同的文章,也就是,在程式執行到 loop 之前,其他部份的程式已經幫你設好了資料庫的選擇(select)範圍,然後將這些文章的相關資料(內文、標題等),塞到 loop 當中,再從 loop 中設定的語法,顯示文章。

在 WP 1.5 版之前,這些程式都寫在 wp-blog-header.php 中,1.5 後移到了 classes.php 這個程式裡頭。要修改選取的範圍,有幾種方法,其一是直接修改這個檔案,另外,就是 WP 1.5 提供了 get_posts() 這個標籤(tag),自訂選擇範圍,然後再自行創建一個 loop 即可。

在 codex 上提供的範例,就是從最近的第二篇文章開始,列出十篇分類 ID 為 1 的文章,並且只顯示標題與摘要。程式碼如下:

        

可以看到,在 get_posts() 中傳入了幾個參數,numberposts 是文章數,offset 為 1,就是偏移選擇一篇,也就是,第一篇不選,偏移到第二篇開始選擇,然後 category 為 1,代表分類的 ID 為 1,如果不設定的話,代表不區分類別,全部選擇。之後 foreach ($posts as $post) : endforeach; 之間的部份,就是 loop

這邊順便舉一個修改 classes.php 的例子。WP 1.5 提供所謂的「靜態頁面」(static pages)功能,讓你可以使用發表網誌文章時相同的寫作介面,製作一些如自我介紹等靜態頁面效果。但是很奇怪的, 雖然這些資料都塞在資料庫中,WP 1.5 所提供的搜尋工具,只能夠搜尋網誌文章,不能夠搜尋靜態頁面的內容,這時候,我們來改一下 classes.php 的 505 行(WP 1.5.1版),原來是這樣:

$where .= ' AND (post_status = "publish"';

加上一行內容,改成這樣:

$where .= ' AND (post_status = "publish"';
if ($this->is_search) { $where .= ' OR post_status = "static"'; }

就可以了。

12 thoughts on “幾個 WordPress 小技巧

  1. 很抱歉,看完您的解說,對語法的來龍去脈雖然明白了,可是還是沒弄懂,這段語法應該貼在那個檔裡?我試了貼在classes.php,但是無法使用。

    如果我想要在每篇文章都有"read more”的功能,這個語法試用嗎?

  2. codex 的那段範例是改模版,也就是在 wp-content/themes/你的模版目錄/某的檔案.php 裡頭。至於改 classes.php ,其實已經改到了WP 的核心部分,如果您對於 WP 還不是很熟悉的話,建議您可以先不要從這個地方著手。

  3. 另外,如果希望每一篇都有 read more 的話,其實只要改模版就可以了。而而預設的 WP 模版中,都設計只要是點選標題,就會進入到單篇文章彙整當中,您可以參考看看 wp-contents/themes/您的模版目錄/index.php 裡頭的在 h3 標籤前後部分的語法。

  4. 後來我發現,經過這樣的選擇之後,只能使用 the_excerpt() 來顯示內文,反而不能用 the_content() 了,這讓我十分頭痛。所以我跑到控制台內把顯示文章設成1,結果果然搞定。但連search、archives的部份也變成一篇,所以還是無解阿…嘆!

    為什麼堅持要用 the_content() ,因為我看到的 the_excerpt() 是把文章一股腦兒的列完,實在不方便。他宣稱能夠只顯示前面120個字,但好像沒有這樣做。

    其實我只要一個小功能,就是首頁只要顯示一篇即可,而顯示方式就跟平常一樣,如有,就顯示”繼續閱讀”的連結,如果有就顯示第一頁就好。然後archives、search的部份還是照控制台內預設的10篇為基準。這樣的需求,對程式什麼都不懂的我來說,在MT上相當容易,查到tag用法即可,到了WP卻是困難重重~

    不知zonble有解答否?

  5. Even:

    如果你的需求就是首頁只要顯示一篇的話,那就是修改模板檔案裡頭的 index.php,然後在進入loop之前,加入一行:

    $posts = get_posts(‘numberposts=1’);

  6. 非常感謝您!!這就去試試看,看來想要自定特別的功能,就是需要把模板檔案直接download下來改阿

  7. 我用了這樣的方法 $posts = get_posts(’numberposts=1′); 之後果然是顯示一篇了,可是他還是照樣迴圈十次,所以還是會顯示出一次<h2>標題</h2><p>內容</p>,而後面九次是空的 <h2></h2><p></p> 類似這樣的效果。是不是要下個指令讓他迴圈一次就好?

  8. Pingback: siko Blog » 幾個 WordPress 小技巧 - 『轉載』

  9. Pingback: links for 2008-06-04 « Angie Said

Comments are closed.