WordPress 函式 query_posts 在 WordPress 主題中是用於控制哪些文章可以出現在主迴圈中。
可能說主迴圈很多人都不懂,那麼舉個例子:
首
頁、存檔頁的這些文章 (包括分頁中的) 都是在主迴圈中的。在不使用 query_posts 函式控制的情況,首頁、存檔頁等都是按照文章的釋出時間列出你博
客上所有已釋出的文章,而如果你想定義哪些文章可以顯示,哪些文章不顯示,文章按照什麼樣的方法排序等,那麼你就要用到 query_posts 函式了。
WordPress 函式 query_posts 非常強大,引數無數,用法更是無數,下面簡單彙總一下 query_posts 函式的常用方法。開始之前,你可以先看看 query_posts 的官方檔案。看檔案對很多人來說可能會很困難,但是要成為一名優秀的主題開發者,學會看檔案才是王道。
query_posts 基本用法
首先介紹一下如何使用 query_posts 函式。在主題目錄下找到存檔頁面檔案,存檔頁面包括 index.php 、 archive.php 等,一般分類頁、標籤頁、日期頁和作者頁等都是用 archive.php 。
確定了你要控制哪個頁面的文章列表,那麼我們就可以開始了,比如你想讓首頁的文章按評論數排序,那麼 index.php 中的程式碼基本框架就是這樣的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php // query_posts 函式 query_posts('orderby=comment_count'); // 主迴圈 if ( have_posts() ) : while ( have_posts() ) : the_post(); .. endwhile; else: .. endif; // 重置 query wp_reset_query(); ?> |
其實你要做的就是在 index.php 中查詢 if (have_posts())或 while (have_posts()),在前面新增 query_posts 函式即可。不過以上方式可能會導致首頁無法分頁,那你可以將 query_posts 函式改成這樣的行式:
1 2 3 4 5 6 7 8 |
// 下面這一行程式碼是必須的,不然你的首頁不能分頁 $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $args = array( // 這裡以下面的方式新增 query_posts 引數,具體引數可以參加官方檔案 'orderby' => comment_count, 'paged' => $paged ); query_posts($args); |
下面是一些常見的 query_posts 函式用法,你可以直接用到你的主題中。
一、只顯示含有某個自定義欄位的文章
如果你想只顯示新增了某個自定義欄位的文章,並按照這個欄位的值來對文章排序,那麼你可以看看下面的例子:
1 、開啟 WordPress 當前主題目錄,開啟 index.php,搜尋程式碼:
1 |
while (have_posts()) |
將其替換成:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/** * 名稱:WordPress 手動修改文章排列順序 * 作者:露兜 * 部落格:http://www.ludou.org/ * 最後修改:2010 年 11 月 14 日 */ $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $args=array( 'meta_key' => 'sort', 'orderby' => 'meta_value_num', // 須 WordPress 2.8 及以上版本 'paged' => $paged, 'order' => DESC ); query_posts($args); while (have_posts()) |
接著搜尋:
1 |
endwhile; |
將其改成:
1 |
endwhile;wp_reset_query(); |
2 、給之前發表的所有文章新增自定義欄位 (或者稱作自定義欄目,在文章編輯頁底部可以看到),名稱為 sort ,值填數字。這樣在首頁,文章的排列順序就按照 sort 欄位的值,從大到小排列了。透過修改 sort 欄位的值,可以達到自定義文章排列順序的目的。
3 、需要注意的是,透過以上修改後,你必須給所有文章新增自定義欄位 sort,否則沒有新增 sort 欄位的文章將無法在首頁顯示。這也許就是手動排序需要付出的代價吧,要不然何謂手動?
4 、如果你同時想手動修改標籤頁、分類頁等存檔頁面的文章排列順序,同樣可以按照第一步介紹的方法來操作,修改主題目錄下的 archive.php 等。
其實這種方式你可以看成怎樣只顯示我推薦的文章,那麼含有這個自定義欄位的文章就是推薦文章。
二、怎樣讓某分類的文章不顯示/顯示
如果你不想讓某分類的文章出現在主迴圈中,那麼你可以使用 query_posts 新增引數 category__not_in 即可:
1 2 3 4 5 6 7 |
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $args = array( // 2, 6 就是你不想顯示的分類 ID,多個用半形逗號隔開 'category__not_in' => array(2, 6), 'paged' => $paged ); query_posts($args); |
如
果只想讓顯示某個分類的文章,可以將 category__not_in 改成 category__in 。同理,如果不顯示某標籤下的文章,可以將
category__not_in 改成:tag__not_in,或者只想讓顯示某個標籤下的文章,可以將 category__not_in 改成
tag__in,後面跟著標籤的 ID 即可。
三、如何對文章進行排序
1 2 3 4 5 6 7 |
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $args = array( // 以下程式碼中的 title 就是 orderby 的值,按標題排序 'orderby' => title, 'paged' => $paged ); query_posts($args); |
根據 orderby 的值不同,可以讓文章按照很多種方式進行排序,下面是列舉幾個常見的值及其對應的排序方式:title:按標題;date:按釋出日期;modified:按修改時間;ID:按文章 ID;rand:隨機排序;comment_count:按評論數
四、只顯示相應 ID 的文章
如我只想顯示 ID 為 2,4,6 的文章,可以使用以下程式碼:
1 2 3 4 5 6 7 |
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $args = array( // 以下程式碼中的 2,4,6 就是文章的 ID 'post__in' => array(2,4,6), 'paged' => $paged ); query_posts($args); |
五、讓置頂文章不置頂
如果你不想讓置頂文章顯示在頂部,而是讓它們安裝正常的順序排列,那麼可以使用以下程式碼:
1 2 3 4 5 6 |
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $args=array( 'paged' => $paged, 'caller_get_posts' => 1 ); query_posts($args); |
六、列出所有狀態的文章
WordPress 的文章狀態有很多種,包括已釋出、草稿、已刪除、私人的、定時釋出的等等,如果你想將這些文章都統統顯示出來,那麼可以這樣:
1 2 3 4 5 6 |
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $args = array( 'post_status' => array('publish', 'pending', 'draft', 'future', 'private', 'trash'), 'paged' => $paged ); query_posts($args); |
post_status 引數可以控制具體的文章狀態,值包括 pending(待審) 、 publish(已釋出) 、 draft(草稿), future(定時), private(私有), trash(已刪除) 。
七、控制文章的數量
如果你想控制要顯示的文章數量,可以使用 showposts 引數:
1 2 3 4 5 6 7 |
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $args = array( // 控制只顯示 10 篇文章,如果將 10 改成-1 將顯示所有文章 'showposts' => 10, 'paged' => $paged ); query_posts($args); |
如果你只是想控制首頁、分類頁等每各分頁顯示的文章數量,可以在 WordPress 管理後臺 – 設定 – 閱讀那裡設定部落格頁面至多顯示多少篇文章。