query_posts是一個非常好用的調用文章函數,可以做到同頁面內顯示多種不同範圍的文章,可以抓出某分類、標籤、日期及作者都可以,甚至連自訂欄位的資料也可以拿來當時判斷範圍的條件資料。
首先 query_posts 的寫法通常是如以下這樣的結構,先定義查詢再加入文章迴圈程式碼後再重置查詢就差不多ok了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?php //定義要顯示的文章範圍查詢 query_posts('posts_per_page=5'); //文章迴圈 if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <!-- 這邊是當判斷符合時列出的文章清單,你可以用< ?php the_xxx(); >系列來顯示相關的文章資訊 --> <?php endwhile; else: ?> <!-- 這邊是顯示抓無資料時要跑出來的錯誤訊息 --> <?php endif; //重置查詢(這是為了避免之後的查詢資料因為上面這段查詢而混亂掉) wp_reset_query(); ?> |
再來是說明在query_posts裡可以輸入哪些參數來顯示出自己想要的文章範圍。
Category Parameters(文章分類參數)
- cat - 輸入分類編號來顯示出該分類內的文章
- category_name - 輸入分類名稱來顯示出該分類內的文章
- category__and - 顯示同時被列入多個分類的文章 (限輸入分類編號來識別)
- category__in - 顯示該分類內的文章,但不包括子分類內的文章 (限輸入分類編號來識別)
- category__not_in - 除某分類內的文章,其他分類及子分類文章均顯示 (限輸入分類編號來識別)
範例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php // 僅顯示分類編號為4的文章 (包括子分類文章) query_posts('cat=4'); // 僅顯示分類名稱為Codex的文章 (包括子分類文章) query_posts('category_name=Codex'); // 顯示多個分類內的文章 (包括各子分類文章) query_posts('cat=2,6,17,38'); // 除了分類編號為3的文章 (包括子分類文章),其他文章都顯示 query_posts('cat=-3'); // 顯示同時有分類編號為2及6的文章 query_posts(array('category__and' => 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 - 顯示符合其中一個特定標籤的的文章 (限輸入標籤代稱來識別)
範例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php // 僅顯示標籤帶有cooking的文章 query_posts('tag=cooking'); // 僅顯示標籤帶有bread或baking的文章 query_posts('tag=bread,baking'); // 僅顯示標籤帶有bread及baking及recipe的文章 query_posts('tag=bread+baking+recipe'); // 僅顯示標籤帶有編號37及47的文章 query_posts(array('tag__and' => 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 - 輸入作者名稱來顯示該作者發表的文章
範例:
1 2 3 4 5 6 7 8 9 10 | <?php // 僅顯示作者編號為3的文章 query_posts('author=3'); // 僅顯示作者編號不為3的文章 query_posts('author=-3'); // 僅顯示作者名稱為Harriet的文章 query_posts('author_name=Harriet'); ?> |
Post & Page Parameters(文章 & 分頁參數)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <?php // 顯示文章編號為27的文章 'p' => 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 篇文章。
1 2 3 4 | <?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; query_posts('cat=9,8&tag=CSS,CKEditor&posts_per_page=5&paged=$paged'); ?> |
或
1 2 3 4 5 6 | <?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $args = array( 'posts_per_page' => 5, 'paged'=>$paged ); query_posts('cat=9,8&tag=CSS,CKEditor&' . $args); ?> |
範例 2:顯示分類編號為9及8但不包括子分類的文章,並且不列出文章編號為6,2,8的文章,每頁顯示 5 篇文章。
1 2 3 4 5 6 7 8 9 10 | <?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $args = array( 'category__in' => array(9,8), 'post__not_in' => array(6,2,8), 'posts_per_page' => 5, 'paged'=>$paged ); query_posts($args); ?> |
Sticky Post Parameters(置頂文章參數)
1 2 3 4 5 6 7 | <?php // 僅顯示置頂文章 array('post__in'=>get_option('sticky_posts')) // 將文章的置頂屬性清除掉,以正常文章順序排序(例如發表日期)顯示出來 caller_get_posts=1 ?> |
範例 1:只顯示置頂文章,如果沒有就不顯示。
1 2 3 4 5 6 7 8 9 10 11 12 | <?php $sticky = get_option('sticky_posts'); $args = array( 'posts_per_page' => 1, 'post__in' => $sticky, 'caller_get_posts' => 1 ); query_posts($args); if($sticky[0]) { // 在這裡輸入迴圈區塊程式碼... } ?> |
範例 2:顯示文章,但不顯示置頂文章。
1 2 3 | <?php query_posts(array("post__not_in" =>get_option("sticky_posts"))); ?> |
範例 3:顯示分類編號為6的文章、每頁顯示 3 篇文章,並且將此分類下文章的置頂屬性清除掉,以正常文章順序排序(例如發表日期)顯示出來。
1 2 3 | <?php query_posts('cat=6&posts_per_page=3&caller_get_posts=1'); ?> |
下集待續...
目前沒有任何文章。


請問一下
這方法可以用在分頁上面嗎!?
新增一篇文章
切換到html模式
把程式碼貼上
發表之後
空空如也...
不行喔
除非你有安裝可以在內容裡允許執行php程式碼的外掛,不然還是要直接寫在php檔案上喔~~
瞭解了
你的文章都寫得不錯
希望有空能多寫一些好文出來^^
感謝支持丫~
有新發現就會努力整理分享的~~
這運用在主題上面真的很好用呢!
WordPress在抓出文章範圍這點上的query_posts函數寫得很不錯,可以不用重新寫SQL指命來重新抓取,真的很方便。
你好
想請問一下
我已經透過 query_posts('cat=5');
將分頁裡面的資料都抓出來也正常顯示了
但因為篇數過多
所以要有分頁功能
可是根據網路上面收尋到的分頁語法
雖然可以顯示一共有幾頁也可以換頁
但是怎麼換頁
還是顯示那幾篇文章而已
不知道是不是能夠有教學文章可以教一下呢?
謝謝
感覺你好像是沒加上page的樣子,照我這樣改看看,xxxxxxxxxxx換成你自己設的值。
$page = (get_query_var('paged')) ? get_query_var('paged') : 1; query_posts("xxxxxxxxxxx&paged=$page");痾...
還真的是我沒有加上去
感謝你
遇到問題了,現在我需要在特定的分頁上調用特定分類的文章...例如
分頁縮名為"page1"的時候,我要在該頁面調用分類名稱為"page1"的文章;
分頁縮名為"apple"的時候,我要在該頁面調用分類名稱"apple"的文章;
換句話說,就是分頁要調用分類名稱=分頁名稱的文章
我試過這種方法:query_posts('category_name=the_title();');
the_title(); 是不是有適合的參數可以替換它?
夫,我成功了!
這是我的方法:
the_slug()是我在function.php定義的功能,可以抓取文章縮略名。
0.0+ 呼呼~ 不錯耶~ 自己找出解答了~~
以往類似做法我都是直接指定,想不到還有這種懶人自動指定的想法~ XD
這玩意兒讓我想了一個月。