踩坑筆記:wordpress函數之query_posts()

切版(qieban.cn)除了提供web前端外包開發之外,還提供wordpress二次開發服務,因此切版的網站天然也是wordpress搭建的,不過在近期的一次改版中,咱們但願案例部分可以默認調取pc,h5,響應式3個類型的案例,如何經過query_post來實現呢?php

方法很簡單前端

query_posts(「cat=-1,2,3″);git

那麼擴散一下,若是想排除響應式之外的其餘全部案例呢?web

query_posts(「cat=-1,2,-3″);數組

其中-3表明的是排除某一個分類下,怎麼樣,get到新技能了吧。app

今天就來講說WordPress 的主查詢函數 -query_posts(),由於我正在製做的主題裏面屢次用到了這個函數 。wordpress

query_posts()查詢函數決定了哪些文章出如今WordPress 主 循環(loop)中,正由於如此,query_posts函數僅用於修改主頁循環(Loop),而不是在頁面上生成次級循環。若是你但願在主循環外另外生 成循環,應該新建獨立的WP_Query對象,用這些對象生成循環。在主循環外的循環上使用query_posts會致使主循環運行誤差,並可能在頁面上 顯示出你不但願看到的內容。函數

query_posts()查詢函數函數接收大量參數,格式與URL中的參數格式相同(如p=4表示ID爲4的文章)。下面就舉例說說query_posts函數的一些經常使用的語法格式。oop

1.從博客主頁上排除某些分類目錄post

將如下代碼添加到index.php文件中,使主頁顯示的文章能夠來自除分類3之外的任何分類。

Php代碼

  1. <?php
  2.   if (is_home()) {
  3.     query_posts(「cat=-3″);
  4.   }
  5. ?>

 

你也能夠多排除幾個分類。

Php代碼

  1. <?php
  2.   if (is_home()) {
  3.     query_posts(「cat=-1,-2,-3″);
  4.   }
  5. ?>

 

2.查詢指定文章

用如下語句檢索某篇指定文章:

Php代碼

  1. <?php
  2. //獲取ID值爲5的文章
  3. query_posts(‘p=5′);
  4. ?>

 

若是你但願在查詢語句中使用Read More功能,請將全局變量$more設爲0。

Php代碼

  1. <?php
  2. //獲取ID值爲5的頁面
  3. query_posts(‘p=5′);
  4.  
  5. global $more;
  6. //初始化$more
  7. $more = 0;
  8.  
  9. //循環查詢到的結果
  10. while (have_posts()) : the_post();
  11. the_content(‘Read the full post ?’);
  12. endwhile;
  13. ?>

 

3.檢索指定頁面

用如下語句檢索某篇指定頁面:

Php代碼

  1. <?php
  2. query_posts(‘page_id=7′); //獲取頁面ID爲7的頁面
  3. ?>

 

或者

Php代碼

  1. <?php
  2. query_posts(‘pagename=about’);
  3. ?>

 

檢索子頁面時,須要提供子頁面及其父頁面的別名,用斜線隔開二者。例如:

Php代碼

  1. <?php
  2. query_posts(‘pagename=parent/child’);
  3. ?>

 

上面都是採起 query_posts($query_string) 的形式來調用該函數,下面介紹另外一種方法,用數組傳遞參數變量。

Php代碼

  1. query_posts(array(
  2.   ’cat’ => 22,
  3.   ’year’ => $current_year,
  4.   ’monthnum’ => $current_month,
  5.   ’order’ => ’ASC’,
  6. ));

 

相比字符串方式,數組形式更加形象直觀,不容易出錯。

下面整理一些常常要用到的參數,有些是我用過的,有些則沒有,算做概括吧。

分類參數

只顯示特定分類下的文章。

  • cat —— 必須使用分類ID
  • category_name
  • category_and —— 必須使用分類ID
  • category_in —— 必須使用分類ID
  • category_not_in —— 必須使用分類ID

根據ID顯示單個分類

只顯示來自某一個分類目錄ID(以及該分類目錄下的子分類目錄)的文章:

Php代碼

  1. query_posts(‘cat=4′);

 

根據分類名稱顯示單個分類

只顯示來自某一個分類名稱下的文章:

Php代碼

  1. query_posts(‘category_name=Staff Home’);

 

根據ID顯示多個分類

顯示來自若干指定分類目錄ID下的文章:

Php代碼

  1. query_posts(‘cat=2,6,17,38′);

 

排除某一分類中的文章

顯示除某一分類文章外的全部文章,被排除的分類ID以減號(’-’)做爲前綴。

Php代碼

  1. query_posts(‘cat=-3′);

 

以上代碼刪除ID爲3的分類中的文章。

 

處理多個分類

顯示隸屬於多個分類的文章。下面的代碼可展現同時屬於分類2和分類6的文章:

Php代碼

  1. query_posts(array(‘category__and’ => array(2,6)));

 

若是但願顯示分類2或分類6中的文章,可使用上面介紹的cat,也可使用category_in函數 (注意這裏不會顯示分類下子分類中的文章) :

Php代碼

  1. query_posts(array(‘category__in’ => array(2,6)));

 

能夠用下面這種方式排除多個分類中的文章:

Php代碼

  1. query_posts(array(‘category__not_in’ => array(2,6)));

 

標籤參數

顯示特定標籤下的文章。

  • tag —— 必須使用標籤ID
  • tag_id —— 必須使用標籤ID
  • tag_and —— 必須使用標籤ID
  • tag_in —— 必須使用標籤ID
  • tag_not_in —— 必須使用標籤ID
  • tag_slug_and ——必須使用標籤ID
  • tag_slug_in ——必須使用標籤ID

 

獲取某一標籤中的文章

Php代碼

  1. query_posts(‘tag=cooking’);

 

獲取若干標籤中任一標籤中的文章

Php代碼

  1. query_posts(‘tag=bread+baking+recipe’);

 

多個標籤

顯示同時屬於ID爲37和47的標籤下的文章:

Php代碼

  1. query_posts(array(‘tag__and’ => array(37,47));

 

若要顯示ID爲爲37或47的標籤下的文章,可使用tag參數,也能夠用tag_in:

Php代碼

  1. query_posts(array(‘tag__in’ => array(37,47));

 

顯示的文章既不屬於標籤37,也不屬於標籤47:

Php代碼

  1. query_posts(array(‘tag__not_in’ => array(37,47));

 

tag_slug_in與tag_slug_and工做方式幾乎一致,不一樣之處在於相匹配的別名不一樣。

 

做者參數

你也能夠根據做者來選擇文章。

  • author=3
  • author=-3 ——排除ID爲3的做者所發表的文章
  • author_name=Harriet

注意:author_name運行在user_nicename字段上,同時author運行在author id字段上。

顯示ID爲1的做者所發表的全部頁面,以標題順序排列頁面,頁面列表上方無置頂文章:

Php代碼

  1. query_posts(‘caller_get_posts=1&author=1&post_type=page&post_status=publish&orderby=title&order=ASC’);

 

文章&頁面參數

檢索單篇文章或頁面。

  • ‘p’ => 27 —— 經過文章ID顯示該文章
  • ‘name’ => ‘about-my-life’ —— 對某篇文章的查詢,查詢中含有文章別名
  • ‘page_id’ => 7 —— 對ID爲7的頁面的查詢
  • ‘pagename’ => ‘about’ —— 注意,這不是頁面標題,而是頁面路徑
  • 用’posts_per_page’ => 1 – use ‘posts_per_page’ => 3 展現3篇文章。用’posts_per_page’ => -1展現全部文章
  • ‘showposts’ => 1 – use ‘showposts’ => 3 展現3篇文章。用’showposts’ => -1展現全部文章。已棄用。
  • ‘post__in’ => array(5,12,2,14,7) —— 指定但願檢索的文章ID
  • ‘post__not_in’ => array(6,2,8) ——排除不但願檢索的文章ID
  • ‘post_type’ => ‘page’ ——返回頁面;默認值爲post;可用值包括any, attachment, page, post或revision。any可檢索到除修訂版外的全部頁面類型。
  • ‘post_status’ => ‘publish’ —— 返回已發佈頁面。可用值還包括pending, draft, future, private, trash。關於inherit請見get_children。trash狀態新增於WordPress  2.9。
  • ‘post_parent’ => 93 —— 返回頁面93的子頁面。

 

置頂文章參數

置頂文章功能引入於WordPress 2.7。在查詢中,被設爲「置頂」的文章會顯示在其它文章以前,除非該文章已經被caller_get_posts=1 參數排除。

  • array(‘post__in’=>get_option(‘sticky_posts’)) —— 返回全部置頂文章的數組
  • caller_get_posts=1 —— 排除返回的文章上方的置頂文章,但在返回文章列表時,以天然順序將曾經置頂的文章安插在列表中。

 

返回第一篇置頂文章

Php代碼

  1. $sticky=get_option(‘sticky_posts’) ;
  2. query_posts(‘p=’ . $sticky[0]);

 

Php代碼

  1. $args = array(
  2. ‘posts_per_page’ => 1,
  3. ‘post__in’ => get_option(‘sticky_posts’),
  4. ‘caller_get_posts’ => 1
  5. );
  6. query_posts($args);

 

注意:第二種方法只能返回最新發表的置頂文章;若當前無置頂文章,返回最新發表文章。

 

返回第一篇置頂文章;若無,則不返回任何內容

Php代碼

  1. $sticky = get_option(‘sticky_posts’);
  2. $args = array(
  3. ‘posts_per_page’ => 1,
  4. ‘post__in’ => $sticky,
  5. ‘caller_get_posts’ => 1
  6. );
  7. query_posts($args);
  8. if($sticky[0]) {
  9. // insert here your stuff…
  10. }

 

從查詢中排除全部置頂文章

Php代碼

  1. query_posts(array(「post__not_in」 =>get_option(「sticky_posts」)));

 

返回某一分類下全部文章,但不在文章列表上方顯示置頂文章。全部設爲「置頂」的文章以正常順序(如日期順序)顯示

Php代碼

  1. query_posts(‘caller_get_posts=1&posts_per_page=3&cat=6′);

 

返回某一分類下全部文章,徹底不顯示置頂文章,保留分頁

Php代碼

  1. <?php
  2.   $paged = (get_query_var(‘paged’)) ? get_query_var(‘paged’) : 1;
  3.   $sticky=get_option(‘sticky_posts’);
  4.   $args=array(
  5.     ’cat’=>3,
  6.     ’caller_get_posts’=>1,
  7.     ’post__not_in’ => $sticky,
  8.     ’paged’=>$paged,
  9.   );
  10.   query_posts($args);
  11. ?>

 

時間參數

檢索特定時間段內發表的文章。

  • hour= -hour (時,-範圍從0到23)
  • minute= – minute (分,-範圍從0到60)
  • second= – second (秒,-範圍從0到60)
  • day= – day of the month (日,-範圍從1到31)
  • monthnum= – month number (月,-範圍從1到12)
  • year= – 4 digit year (年,如2009)
  • w= – week of the year(一年中的第幾周,-範圍從0到53),使用 MySQL WEEK command Mode=1命令

 

返回最近發表的文章

Php代碼

  1. $today = getdate();
  2. query_posts(‘year=’ .$today["year"] .’&monthnum=’ .$today["mon"] .’&day=’ .$today["mday"] );

 

返回12月20日發表的文章

Php代碼

  1. query_posts(monthnum=12&day=20′ );

 

返回2009年3月1日到3月15日之間發表的文章

Php代碼

  1. <?php
  2.   //based on Austin Matzko’s code from wp-hackers email list
  3.   function filter_where($where = 」) {
  4.     //posts for March 1 to March 15, 2009
  5.     $where .= 」 AND post_date >= ’2009-03-01′ AND post_date < ’2009-03-16′」;
  6.     return $where;
  7.   }
  8.   add_filter(‘posts_where’, ’filter_where’);
  9.   query_posts($query_string);
  10. ?>

 

返回最近30天內發表的文章

Php代碼

  1. <?php
  2.   //based on Austin Matzko’s code from wp-hackers email list
  3.   function filter_where($where = 」) {
  4.     //posts in the last 30 days
  5.     $where .= 」 AND post_date > ’」 . date(‘Y-m-d’, strtotime(‘-30 days’)) . 」‘」;
  6.     return $where;
  7.   }
  8.   add_filter(‘posts_where’, ’filter_where’);
  9.   query_posts($query_string);
  10. ?>

 

返回過去30天到過去60天內發表的文章

Php代碼

  1. <?php
  2.   //based on Austin Matzko’s code from wp-hackers email list
  3.   function filter_where($where = 」) {
  4.     //posts 30 to 60 days old
  5.     $where .= 」 AND post_date >= ’」 . date(‘Y-m-d’, strtotime(‘-60 days’)) . 」‘」 . 」 AND post_date <= ’」 . date(‘Y-m-d’, strtotime(‘-30 days’)) . 」‘」;
  6.     return $where;
  7.   }
  8.   add_filter(‘posts_where’, ’filter_where’);
  9.   query_posts($query_string);
  10. ?>

 

分頁參數

  • paged=2 ——顯示點擊「較早的日誌」連接後出如今第二頁中的文章
  • posts_per_page=10 —— 每頁所顯示的文章數量;若值爲-1,顯示全部文章。
  • order=ASC —— 按時間順序顯示文章,若值爲DESC則按逆向時間順序顯示文章(默認)

 

offset(偏移)參數

經過offset參數,你能夠移除或忽略正常狀況下被查詢集中的一篇或多篇初始文章。

如下顯示最近一篇文章以後的5篇文章:

Php代碼

  1. query_posts(‘posts_per_page=5&offset=1′);

 

排序參數

  • orderby=author
  • orderby=date
  • orderby=category ——注意:該參數不能用於WordPress 2.8,可能已經被廢止
  • orderby=title
  • orderby=modified
  • orderby=menu_order
  • orderby=parent
  • orderby=ID
  • orderby=rand
  • orderby=meta_value —— meta_key=some value語句也應出如今查詢參數中
  • orderby=none – no order —— (新增於 WP 2.8)
  • orderby=comment_count ——(新增於 WP 2.9)

 

順序參數

決定以升序或降序排列排序參數

  • order=ASC —— 升序,從最低值到最高值
  • order=DESC —— 降序,從最高值到最低值

 

自定義字段參數

根據自定義關鍵字或值檢索文章(或頁面)。

  • meta_key=
  • metavalue=
  • meta_compare= —— 用以測試metavalue=的操做符,默認值爲 ‘=’,其它可能的值包括’!=’、 ‘>’、’>=’、 ‘<’或 ‘<=’ 。

返回關鍵字爲 ‘color’ 且值爲’blue’的文章:

Php代碼

  1. query_posts(‘meta_key=color&metavalue=blue’);

 

返回自定義字段關鍵字爲’color’的文章,不管自定義字段值爲什麼:

Php代碼

  1. query_posts(‘meta_key=color’);

 

返回自定義字段值爲’color’的文章,不管關鍵字爲什麼:

Php代碼

  1. query_posts(‘metavalue=color’);

 

返回自定義字段值爲’green’的頁面,不管自定義字段關鍵字爲什麼:

Php代碼

  1. query_posts(‘post_type=page&metavalue=green’);

 

返回自定義關鍵字爲’color’、自定義字段值不爲’blue’的文章和頁面:

Php代碼

  1. query_posts(‘post_type=any&meta_key=color&meta_compare=!=&metavalue=blue’);

 

返回自定義字段關鍵字爲’miles’、自定義字段值小於等於22的文章。注意,字段值99會被看作大於字段值100,由於數據是以字符串形式而不是數字形式存儲的。

query_posts('meta_key=miles&meta_compare=<=&metavalue=22');

 

聯合參數

你可能已經從上面有些例子中看出來了,能夠用&符號鏈接不一樣參數,如:

Php代碼

  1. uery_posts(‘cat=3&year=2004′);

 

顯示主頁上、當前月份發表的、隸屬於分類13下的文章:

Php代碼

  1. if (is_home()) {
  2.   query_posts($query_string . ’&cat=13&monthnum=’ . date(‘n’,current_time(‘timestamp’)));
  3. }

 

在WP 2.3中,如下參數聯合會返回同時屬於分類1和分類3的兩篇文章,以文章標題降序排列:

Php代碼

  1. query_posts(array(‘category__and’=>array(1,3),’posts_per_page’=>2,’orderby’=>title,’order’=>DESC));

 

在WP 2.3和WP 2.5中,如下參數聯合本應返回屬於分類1且帶有「apples」標籤的文章:

Php代碼

  1. query_posts(‘cat=1&tag=apples’);

 

但因爲一個bug,代碼沒能顯示出正常結果。有一個解決辦法:利用+號查找多個標籤:

Php代碼

  1. query_posts(‘cat=1&tag=apples+apples’);

 

這就顯示出咱們但願顯示的結果了。

 

使用技巧

設置>閱讀中的「博客頁面最多顯示」參數會影響你的查詢結果,要覆蓋設置>閱讀中的設置,須要在標籤中添加’posts_per_page’ 參數。例如:

Php代碼

  1. query_posts(‘category_name=The Category Name&posts_per_page=-1′);  //returns ALL from the category

 

注意:query_posts函數會改寫並取代頁面的主查詢。爲謹慎起見,請不要將query_posts用做其它用途。

相關文章
相關標籤/搜索