query_posts是一個非常好用的調用文章函數,可以做到同頁面內顯示多種不同範圍的文章,可以抓出某分類、標籤、日期及作者都可以,甚至連自訂欄位的資料也可以拿來當時判斷範圍的條件資料。

首先 query_posts 的寫法通常是如以下這樣的結構,先定義查詢再加入文章迴圈程式碼後再重置查詢就差不多ok了。









再來是說明在query_posts裡可以輸入哪些參數來顯示出自己想要的文章範圍。

 

Category Parameters(文章分類參數)

  • cat – 輸入分類編號來顯示出該分類內的文章
  • category_name – 輸入分類名稱來顯示出該分類內的文章
  • category__and – 顯示同時被列入多個分類的文章 (限輸入分類編號來識別)
  • category__in – 顯示該分類內的文章,但不包括子分類內的文章 (限輸入分類編號來識別)
  • category__not_in – 除某分類內的文章,其他分類及子分類文章均顯示 (限輸入分類編號來識別)

範例:

 array(2,6)));

// 顯示分類編號為6的文章  (但不包括子分類文章)
query_posts(array('category__in' => array(6)));

// 除了分類編號為2及6的文章,子分類及其他分類文章都顯示
query_posts(array('category__not_in' => array(2,6)));
?>

 

Tag Parameters(標籤參數)

  • tag – 輸入標籤名稱來顯示含有該標籤的文章
  • tag_id – 輸入標籤編號來顯示含有該標籤的文章
  • tag__and – 顯示符合含有多個特定標籤的的文章 (限輸入標籤編號來識別)
  • tag__in – 顯示符合其中一個特定標籤的的文章 (限輸入標籤編號來識別)
  • tag__not_in – 只要有該標籤的文章一律不顯示 (限輸入標籤編號來識別)
  • tag_slug__and – 顯示符合含有多個特定標籤的的文章 (限輸入標籤代稱來識別)
  • tag_slug__in  – 顯示符合其中一個特定標籤的的文章 (限輸入標籤代稱來識別)

範例:

 array(37,47));

// 僅顯示標籤帶有編號37或47的文章
query_posts(array('tag__in' => array(37,47));

// 僅顯示標籤不帶有編號37或47的文章
query_posts(array('tag__not_in' => array(37,47));
?>

 

Author Parameters(作者參數)

  • author – 輸入作者編號來顯示該作者發表的文章
  • author_name – 輸入作者名稱來顯示該作者發表的文章

範例:


 

Post & Page Parameters(文章 & 分頁參數)

 27

// 顯示文章代稱為about-my-life的文章
'name' => 'about-my-life'

// 顯示分頁編號為7的分頁
'page_id' => 7

// 顯示分頁代稱為about的分頁
'pagename' => 'about'

// 當文章超過 5 篇時就僅顯示 5 篇文章並且搭配換頁程式碼顯示換頁連結,設為 -1 則不換頁全部顯示。
'posts_per_page' => 5

// 當設定為 6 時就顯示 6 篇文章,設為 -1 則顯示範圍內的全部文章。
'showposts' => 6

// 僅顯示文章編號為5,12,2,14,7的這 5 篇文章
'post__in' => array(5,12,2,14,7)

// 僅顯示文章編號不為5,12,2,14,7的其他全部文章
'post__not_in' => array(6,2,8)

// 顯示文章類型為分頁的文章,預設值為 post (文章),可以使用的數值有 attachment(媒體檔頁面), page(分頁), post(文章), 或 revision(修訂)。
'post_type' => 'page'

// 顯示文章狀態為公開性質的文章,可以使用的數值有 pending(審核中), draft(草稿), future(排程), private(私人), trash(垃圾)。
'post_status' => 'publish'

// 顯示文章範圍內的第 93 頁
'post_parent' => 93
?>

 

這邊先插一段說明如何將多個參數加在一起使用,有兩種寫法,一種是用 & 來連接多個參數,另一種是用 array 來組合多個參數。
不過像是cat這種多個數值是用逗號來分隔的話是不能用在array裡的,當然兩種寫法也是可以混在一起用。

範例 1:顯示分類編號為9及8的文章,並且只列出使用CSS或CKEditor標籤的文章,每頁顯示 5 篇文章。

 5,
	'paged'=>$paged
);
query_posts('cat=9,8&tag=CSS,CKEditor&' . $args); ?>

 

範例 2:顯示分類編號為9及8但不包括子分類的文章,並且不列出文章編號為6,2,8的文章,每頁顯示 5 篇文章。

 array(9,8),
	'post__not_in' => array(6,2,8),
	'posts_per_page' => 5,
	'paged'=>$paged
);
query_posts($args);
?>

 

Sticky Post Parameters(置頂文章參數)

get_option('sticky_posts'))

// 將文章的置頂屬性清除掉,以正常文章順序排序(例如發表日期)顯示出來
caller_get_posts=1
?>

 

範例 1:只顯示置頂文章,如果沒有就不顯示。

 1,
	'post__in'  => $sticky,
	'caller_get_posts' => 1
);
query_posts($args);
if($sticky[0]) {
   // 在這裡輸入迴圈區塊程式碼...
}
?>

 

範例 2:顯示文章,但不顯示置頂文章。

get_option("sticky_posts")));
?>

 

範例 3:顯示分類編號為6的文章、每頁顯示 3 篇文章,並且將此分類下文章的置頂屬性清除掉,以正常文章順序排序(例如發表日期)顯示出來。

 

下集待續…

作者: Mr. 夫

唯有力量才能制衡一切,沒有力量什麼都保護不了,就連自身也難保...

參與討論

18 則留言

  1. 你好
    想請問一下
    我已經透過 query_posts(‘cat=5’);
    將分頁裡面的資料都抓出來也正常顯示了
    但因為篇數過多
    所以要有分頁功能
    可是根據網路上面收尋到的分頁語法
    雖然可以顯示一共有幾頁也可以換頁
    但是怎麼換頁
    還是顯示那幾篇文章而已
    不知道是不是能夠有教學文章可以教一下呢?

    謝謝

    1. 感覺你好像是沒加上page的樣子,照我這樣改看看,xxxxxxxxxxx換成你自己設的值。

      $page = (get_query_var('paged')) ? get_query_var('paged') : 1;
      query_posts("xxxxxxxxxxx&paged=$page");
      
  2. 遇到問題了,現在我需要在特定的分頁上調用特定分類的文章…例如
    分頁縮名為”page1″的時候,我要在該頁面調用分類名稱為”page1″的文章;
    分頁縮名為”apple”的時候,我要在該頁面調用分類名稱”apple”的文章;

    換句話說,就是分頁要調用分類名稱=分頁名稱的文章

    我試過這種方法:query_posts(‘category_name=the_title();’);
    the_title(); 是不是有適合的參數可以替換它?

  3. 夫,我成功了!
    這是我的方法:

    $abc = the_slug();
    $args = array(
    	'category_name' => $abc,
    	'showposts' => 3,
    	'orderby' => rand,
    );
    			 query_posts($args);

    the_slug()是我在function.php定義的功能,可以抓取文章縮略名。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *