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 管理後臺 – 設定 – 閱讀那裡設定部落格頁面至多顯示多少篇文章。