query_posts 函數在 WordPress 主題中是用於控制哪些文章可以出現在主循環中,可能説主循環很多人都不懂,那麼舉個例子,首頁、存檔頁的這些文章 (包括分頁中的) 都是在主循環中的。在不使用 query_posts 函數控制的情況,首頁、存檔頁等都是按照文章的發佈時間列出你博客上所有已發佈的文章,而如果你想定義哪些文章可以顯示,哪些文章不顯示,文章按照什麼樣的方法排序等,那麼你就要用到 query_posts 函數了。

基本用法:

首先介紹一下如何使用 query_posts 函數。在主題目錄下找到存檔頁面文件,存檔頁面包括 index.php 、 archive.php 等,一般分類頁、標籤頁、日期頁和作者頁等都是用 archive.php,具體的 WordPress 主題文件構成可以看這篇文章:WordPress 主題文件構成

確定了你要控制哪個頁面的文章列表,那麼我們就可以開始了,比如你想讓首頁的文章按評論數排序,那麼 index.php 中的代碼基本框架就是這樣的:

<?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 函數改成這樣的行式:

$args = array(
 // query_posts 參數,具體參數可以參加官方文檔
 'orderby'   => comment_count
 );// 下面這一行代碼是必須的,不然不能分頁
 $arms = array_merge($args, $wp_query->query);
 query_posts($arms);

下面是一些常見的 query_posts 函數用法,你可以直接用到你的主題中。

一、只顯示含有某個自定義字段的文章

我們常見的 WordPress 站點文章排序,通常情況下是按發佈時間的升序或降序方式排列,這種排序方式幾乎可以滿足大多數站點的需求了,但是有些另類的站點可能會有一些另類的需求:我想手動修改文章的排列方式,可以隨意更改文章的排列位置。其實 WordPress 的 query_posts 就可以輕鬆解決這個問題,不過你得自己動手改一些代碼。

修改方法:

1 、打開 WordPress 當前主題要修改的 php 文件,搜索代碼:

while (have_posts())

將其替換成:

/**
 * 名稱:WordPress 手動修改文章排列順序
 */

$args = array(
    'meta_key' => 'sort',
    'orderby'   => 'meta_value_num',  // 須 WordPress 2.8 及以上版本
    'order' => DESC
);
$arms = array_merge($args, $wp_query->query);

query_posts($arms);
while (have_posts())

接着搜索:

endwhile;

將其改成:

endwhile;wp_reset_query();

2 、給之前發表的所有文章添加自定義字段 (或者稱作自定義欄目,在文章編輯頁底部可以看到),名稱為 sort ,值填數字。這樣在首頁,文章的排列順序就按照 sort 字段的值,從大到小排列了。通過修改 sort 字段的值,可以達到自定義文章排列順序的目的。

3 、需要注意的是,通過以上修改後,你必須給所有文章添加自定義字段 sort,否則沒有添加 sort 字段的文章將無法在首頁顯示。這也許就是手動排序需要付出的代價吧,要不然何謂手動?

4 、如果你同時想手動修改標籤頁、分類頁等存檔頁面的文章排列順序,同樣可以按照第一步介紹的方法來操作,修改主題目錄下的 archive.php 等。

其實這種方式你可以看成怎樣只顯示我推薦的文章,那麼含有這個自定義字段的文章就是推薦文章。

讓訪客自行選擇文章排序方式

其實實現過程也比較簡單,一個是構造鏈接,另外一個是使用 query_posts 來改變一下主循環就可以了。

構造鏈接

鏈接主要用於傳遞 GET 參數,讓 PHP 程序知道你到底想怎麼排序。在主題的 index.php 中你需要的位置插入以下代碼,用於輸出排序按鈕的 HTML,這個排序按鈕的樣式,你再自己寫寫 css 咯。需要注意的是以下代碼會自動獲取當前用户已選擇的排序方式,並給這個排序按鈕的 li 添加了 class=」current」:

<h4> 文章排序</h4>
 <ul>
 <li><a <?php if ( isset($_GET['order']) && ($_GET['order']=='rand') ) echo ''; ?> href="<?php%20echo%20get_option('home');%20?>/?order=rand" rel="nofollow"> 隨機閲讀</a></li>
 <li><a <?php if ( isset($_GET['order']) && ($_GET['order']=='commented') ) echo ''; ?> href="<?php%20echo%20get_option('home');%20?>/?order=commented" rel="nofollow"> 評論最多</a></li>
 <li><a <?php if ( isset($_GET['order']) && ($_GET['order']=='alpha') ) echo ''; ?> href="<?php%20echo%20get_option('home');%20?>/?order=alpha" rel="nofollow"> 標題排序</a></li>
 </ul>

改變主循環

首先你得先在主題的 index.php 中找到以下語句:

if (have_posts())

然後在這句之前添加以下代碼:

if ( isset($_GET['order']) )
{
switch ($_GET['order'])
{
case 'rand' : $orderby = 'rand'; break;
case 'commented' : $orderby = 'comment_count'; break;
case 'alpha' : $orderby = 'title'; break;
default : $orderby = 'title';
}
global $wp_query;
$args= array('orderby' => $orderby, 'order' => 'DESC');

$arms = array_merge($args, $wp_query->query);
query_posts($arms);
}

if (have_posts())

好了,就這麼簡單,複製粘貼,輕輕鬆鬆實現排序效果

二、怎樣讓某分類的文章不顯示/顯示

如果你不想讓某分類的文章出現在主循環中,那麼你可以使用 query_posts 添加參數 category__not_in 即可:

$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 即可。

三、如何對文章進行排序

$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 的文章,可以使用以下代碼:

$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);

如果不想顯示 2,4,6 這幾篇文章,可以將 post__in 改成 post__not_in 。另外如果只想顯示置頂文章,那麼可以將 array(2,4,6) 改成 get_option(『sticky_posts』),這段代碼會自動給你填充所有置頂文章的 ID 。

五、讓置頂文章不置頂

如果你不想讓置頂文章顯示在頂部,而是讓它們安裝正常的順序排列,那麼可以使用以下代碼:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
 $args=array(
 'paged' => $paged,
 'ignore_sticky_posts' => 1
 );
 query_posts($args);

六、列出所有狀態的文章

WordPress 的文章狀態有很多種,包括已發佈、草稿、已刪除、私人的、定時發佈的等等,如果你想將這些文章都統統顯示出來,那麼可以這樣:

$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 參數:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
 $args = array(
 // 控制只顯示 10 篇文章,如果將 10 改成-1 將顯示所有文章
 'showposts' => 10,
 'paged' => $paged
 );
 query_posts($args);

如果你只是想控制首頁、分類頁等每各分頁顯示的文章數量,可以在 WordPress 管理後台 – 設置 – 閲讀那裏設置博客頁面至多顯示多少篇文章。