WP_Query 類是 WordPress 文章查詢的核心,它的文章查詢部分提供了很多可用參數,經過好幾個版本的升級完善,讓它越來越強大,本文就可以讓你詳細的瞭解所有查詢參數和技巧。
作者
查詢和某些作者 (用户) 有關的文章,可以使用 4 個參數:
- author(整數):用户 ID
- author_name(字符串):用户的暱稱 (「user_nicename」 字段)
- author__in(數組):用户 ID
- author__not_in(數組):用户 ID
獲取一個作者的文章
根據用户 ID 獲取:
|
1 |
$query=newWP_Query('author=123'); |
根據用户的暱稱 (「user_nicename」 字段) 獲取:
|
1 |
$query=newWP_Query('author_name=rami'); |
獲取多個作者的文章
根據用户 ID 獲取多個作者的文章:
|
1 |
$query=newWP_Query('author=2,6,17,38'); |
排除作者的文章
排除一個作者可以使用用户 ID 前邊加上 「-」 的方式:
|
1 |
$query=newWP_Query('author=-12'); |
多作者查詢
獲取多個作者的文章:
|
1 |
$query=newWP_Query(array('author__in'=>array(2,6))); |
排除多個作者的文章:
|
1 |
$query=newWP_Query(array('author__not_in'=>array(2,6))); |
分類
關於分類有 5 個可用的參數:
- cat(整數):分類 ID
- category_name(字符串):分類別名
- category__and(數組):分類 ID
- category__in(數組):分類 ID
- category__not_in(數組):分類 ID
獲取一個分類的文章
根據分類的 ID 獲取一個分類的文章 (包含此分類的子分類):
|
1 |
$query=newWP_Query('cat=4'); |
根據分類的別名獲取一個分類的文章 (包含此分類的子分類):
|
1 |
$query=newWP_Query('category_name=staff'); |
根據分類的 ID 獲取一個分類的文章 (不包含此分類的子分類):
|
1 |
$query=newWP_Query('category__in=4'); |
獲取多個分類的文章
根據分類的 ID 獲取多個分類的文章:
|
1 |
$query=newWP_Query('cat=2,6,17,38'); |
根據分類別名獲取多個分類的文章:
|
1 |
$query=newWP_Query('category_name=staff,news'); |
根據分類別名獲取同時擁有幾個分類的文章:
|
1 |
$query=newWP_Query('category_name=staff+news'); |
排除分類
想要排除一些分類只需要在分類 ID 前加上 「-」 號:
|
1 |
$query=newWP_Query('cat=-12,-34,-56'); |
多分類查詢
獲取同時有多個分類的文章,下邊的代碼會獲取必須同時擁有 ID 為 2 和 6 的分類的文章:
|
1 |
$query=newWP_Query(array('category__and'=>array(2,6))); |
獲取多個分類的文章,不包含其子分類,下邊的代碼獲取了擁有 ID 為 2 或者 ID 為 6 的分類的文章:
|
1 |
$query=newWP_Query(array('category__in'=>array(2,6))); |
排除一些分類的文章:
|
1 |
$query=newWP_Query(array('category__not_in'=>array(2,6))); |
標籤
獲取關於標籤的文章,可以使用 7 個參數:
- tag(字符串):標籤別名
- tag_id(整數):標籤 ID
- tag__end(數組):一些標籤 ID
- tag__in(數組):一些標籤 ID
- tag_slug__and(數組):一些標籤別名
- tag_slug__in(數組):一些標籤別名
獲取一個標籤的文章
根據標籤別名獲取有這個標籤的文章:
|
1 |
$query=newWP_Query('tag=cooking'); |
根據標籤 ID 獲取有這個標籤的文章:
|
1 |
$query=newWP_Query('tag_id=13'); |
獲取多個標籤的文章
根據標籤的別名獲取帶有這幾個標籤其中一個的文章:
|
1 |
$query=newWP_Query('tag=bread,baking'); |
根據標籤別名獲取同時擁有幾個標籤的文章:
|
1 |
$query=newWP_Query('tag=bread+baking+recipe'); |
多標籤查詢
根據標籤 ID 獲取同時有幾個標籤的文章:
|
1 |
$query=newWP_Query(array('tag__and'=>array(37,47))); |
根據標籤 ID 獲取有這個標籤的文章:
|
1 |
$query=newWP_Query(array('tag__in'=>array(37,47))); |
根據標籤 ID 排除包含某些標籤的文章:
|
1 |
$query=newWP_Query(array('tag__not_in'=>array(37,47))); |
tag_slug__in 和 tag_slug__and 的使用方法同上,只是把 ID 換成別名。
自定義分類法
有關自定義分類法 (Taxonomy) 的查詢可以使用 1 個參數:
- tax_query(數組):分類法查詢參數
- relation(字符串):條件的邏輯關係,OR(或者) 或 AND(和)
- taxonomy(字符串):分類法名稱
- field(字符串):根據分類法條款的什麼字段查詢,可選 term_id(分類條款 ID) 、 name(名稱) 和 slug(別名),默認是 term_id
- terms(整數 | 字符串 | 分類):分類法條款
- include_children(布爾):是否包含子分類法條款,默認是 True
- operator(字符串):匹配運算符 (IN 、 IN NOT 和 AND),默認是 IN
簡單的分類法查詢
獲取 people 分類法裏別名為 bob 的條款下的文章:
|
$args=array( 'post_type'=>'post', 'tax_query'=>array( array( 'taxonomy'=>'people', 'field' =>'slug', 'terms' =>'bob', ), ), ); $query=newWP_Query($args); |
多分類法查詢
獲取同時是 movie_genre 分類法下別名為 action 或 comedy 的條款的文章和不是 actor 分類法下 ID 為 103 或 115 或 206 的條款的文章 (略拗口):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$args=array( 'post_type'=>'post', 'tax_query'=>array( 'relation'=>'AND', array( 'taxonomy'=>'movie_genre', 'field' =>'slug', 'terms' =>array('action','comedy'), ), array( 'taxonomy'=>'actor', 'field' =>'id', 'terms' =>array(103,115,206), 'operator'=>'NOT IN', ), ), ); $query=newWP_Query($args); |
獲取是分類法 category(也就是分類) 下別名為 quotes 的條款或是分類法 post_format 下別名為 post-format-quote 的條款的文章:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$args=array( 'post_type'=>'post', 'tax_query'=>array( 'relation'=>'OR', array( 'taxonomy'=>'category', 'field' =>'slug', 'terms' =>array('quotes'), ), array( 'taxonomy'=>'post_format', 'field' =>'slug', 'terms' =>array('post-format-quote'), ),
), ); $query=newWP_Query($args); |
搜索
顯示搜索關鍵詞的結果,只有一個參數。
搜索關鍵詞
搜索一個關鍵詞:
|
1 |
$query=newWP_Query('s=keyword'); |
文章和頁面
根據文章信息獲取文章。請記住,默認情況下,post_type 一般都是 post(文章) 。 有 9 個參數可以使用:
- p(整數):文章 ID
- name(字符串):文章別名
- page_id(整數):頁面 ID
- postname(字符串):頁面別名
- post_parent(整數):如果填寫 ID 則只返回它的子項目,如果填 0 則只返回頂級項目
- post_parent__in(數組):一些父級項目的 ID,獲取它們的子項目
- post_parent__not_in(數組):一些父級項目的 ID,排除它們的子項目
- post__in(數組):一些文章 ID
- post__not_in(數組):一些文章 ID
根據 ID 獲取文章或頁面
根據 ID 獲取文章:
|
1 |
$query=newWP_Query('p=7'); |
根據 ID 獲取頁面:
|
1 |
$query=newWP_Query('page_id=7'); |
根據別名獲取文章或頁面
根據別名獲取文章:
|
1 |
$query=newWP_Query('name=about-my-life'); |
根據別名獲取頁面:
|
1 |
$query=newWP_Query('pagename=contact'); |
獲取文章或頁面的子項目
根據別名獲取一個頁面的子頁面,contact_us 是父頁面別名,canada 是子頁面別名:
|
1 |
$query=newWP_Query('pagename=contact_us/canada'); |
獲取一個文章的子項目:
|
1 |
$query=newWP_Query('post_parent=93'); |
獲取所有頂級項目:
|
1 |
$query=newWP_Query('post_parent=0'); |
同時獲取多個父級文章的子項目:
|
1 |
$query=newWP_Query(array('post_parent__in'=>array(2,5,12,14,20))); |
多文章和頁面查詢
根據 ID 獲取幾個頁面:
|
1 |
$query=newWP_Query(array('post_type'=>'page','post__in'=>array(2,5,12,14,20))); |
排除幾個 ID 的文章:
|
1 |
$query=newWP_Query(array('post_type'=>'post','post__not_in'=>array(2,5,12,14,20))); |
PS:post__in 和 post__not_in 不能一起用。 PS2:post__not_in 不能使用以逗號分隔的字符串,只能是數組:
|
//這是錯誤的,不會工作 $query=newWP_Query('post__not_in=1,2,3'); //這才是正確的 $query=newWP_Query(array('post__not_in'=>array(1,2,3))); |
密碼
有關文章密碼的查詢,可以使用 2 個參數:
- has_password(布爾):文章是否有密碼
- post_password(字符串):指定的文章密碼
有無密碼
獲取有密碼的文章:
|
1 |
$query=newWP_Query(array('has_password'=>true)); |
獲取沒有密碼的文章:
|
1 |
$query=newWP_Query(array('has_password'=>false)); |
指定密碼
獲取密碼是指定內容的文章:
|
1 |
$query=newWP_Query('post_password=123'); |
類型
有關文章類型的查詢,只有一個參數可以使用:
- post_type(字符串 | 數組):文章的類型,一般默認都是 post(文章)
一個文章類型
獲取頁面:
|
1 |
$query=newWP_Query('post_type=page'); |
獲取自定義文章類型:
|
1 |
$query=newWP_Query('post_type=custom_post_type_name'); |
多個文章類型
獲取多個文章類型:
|
1 |
$query=newWP_Query(array('post_type'=>array('post','page','movie','book'))); |
獲取全部文章類型:
|
1 |
$query=newWP_Query('post_type=any'); |
狀態
有關文章狀態的查詢。文章狀態指的是文章當前處於什麼情況,比如 「已發佈」 、 「草稿」 、 「待審核」 和 「定時發佈」 等等,文章狀態是可以由主題或者插件開發者擴展的。 關於文章狀態可以使用一個參數:
- post_status(字符串 | 數組):文章的狀態,一般默認都是 publish(已發佈)
獲取一個狀態的文章
獲取草稿文章:
|
1 |
$query=newWP_Query('post_status=draft'); |
獲取多個狀態的文章
獲取多個狀態下的文章:
|
1 |
$query=newWP_Query(array('post_status'=>array('pending','draft','future'))); |
獲取全部狀態的文章:
|
1 |
$query=newWP_Query('post_status=any'); |
分頁
有關分頁的查詢,有 7 個參數可以使用:
- nopaging(布爾):將文章分頁還是全部獲取。默認是 False:分頁
- posts_per_page(整數):每頁顯示多少文章,如果設置成 –1 則不分頁
- posts_per_archive_page(整數):和 posts_per_page 是一樣的,不過這個只有在當前查詢是根據存檔或是搜索的情況下才生效
- offset(整數):偏移值,去掉前邊幾篇文章,再從後邊找回來
- paged(整數):頁碼,指定文章分頁的當前頁
- page(整數):靜態首頁的頁碼
- ignore_sticky_posts(布爾):是否忽略指定文章,要忽略置頂文章可以設置成 True,默認是 False
設置每頁文章數
設置每頁的文章數量為 3 篇文章:
|
1 |
$query=newWP_Query('posts_per_page=3'); |
顯示全部文章
獲取全部文章,不分頁 (方法一):
|
1 |
$query=newWP_Query('nopagi ng=1'); |
獲取全部文章,不分頁 (方法二):
|
1 |
$query=newWP_Query('posts_per_page=-1'); |
偏移
從第 4 個文章開始獲取:
|
1 |
$query=newWP_Query('offset=3')); |
每頁 5 篇文章,而但向前移位 3 篇:
|
1 |
$query=newWP_Query(array('posts_per_page'=>5,'offset'=>3)); |
獲取第 N 頁文章
獲取第 6 頁的文章:
|
1 |
$query=newWP_Query('paged=6'); |
獲取當前頁文章
獲取當前頁文章:
|
1 |
$query=newWP_Query(array('paged'=>get_query_var('paged'))); |
獲取當前頁文章,如果沒有指定頁碼則默認第一頁:
|
$paged=(get_query_var('paged'))?get_query_var('paged'):1; $query=newWP_Query(array('paged'=>$paged)); |
置頂文章
獲取第一篇置頂文章:
|
$sticky=get_option('sticky_posts'); $query=newWP_Query('p='.$sticky[0]); |
獲取第一篇置頂文章,如果沒有置頂文章則獲取一篇最新的文章:
|
$args=array( 'posts_per_page' =>1, 'post__in' =>get_option('sticky_posts'), 'ignore_sticky_posts'=>1, ); $query=newWP_Query($args); |
排除置頂文章
排除全部置頂文章:
|
1 |
$query=newWP_Query(array('post__not_in'=>get_option('sticky_posts'))); |
忽略指定文章的置頂性,在循環裏按正常排序出現:
|
1 |
$query=newWP_Query('ignore_sticky_posts=1'); |
排序和排序類型
有關文章排序方法和類型的查詢,有兩個參數可以使用:
- order(字符串 | 數組):排序方法,ASC 為正序 (從小到大);DESC 為倒序 (從大到小)
- orderby(字符串 | 數組):根據什麼字段排序,默認是 post_date(文章日期)
按標題倒序
根據文章標題進行倒序排列:
|
1 |
$query=newWP_Query(array('orderby'=>'title','order'=>'DESC')); |
先根據 menu_order 排序,如果出現無法排序的情況 (比如相同或者為空) 則再利用 title 排序。
|
1 |
$query=newWP_Query(array('orderby'=>'menu_order title','order'=>'DESC')); |
隨機排序
獲取一篇隨機文章:
|
1 |
$query=newWP_Query(array('orderby'=>'rand','posts_per_page'=>'1')); |
熱門文章
獲取根據評論數量排序的文章:
|
1 |
$query=newWP_Query(array('orderby'=>'comment_count')); |
多條件不同排序
給多個排序條件,每個排序條件有不同的排序方法:
|
1 |
$query=newWP_Query(array('orderby'=>array('title'=>'DESC','menu_order'=>'ASC'))); |
自定義字段
獲取文章自定義字段 age 是 3 或 4 的文章,並且按照 age 字段值的數字大小排序:
|
$args=array( 'meta_key' =>'age', 'orderby' =>'meta_value_num', 'order' =>'ASC', 'meta_query'=>array( array( 'key' =>'age', 'value' =>array(3,4), 'compare'=>'IN', ), ), ); $query=newWP_Query($args); |
日期
和文章日期有關的查詢,有 9 個參數:
- year(整數):4 位數的年份,比如 2014
- monthnum(整數):月份,從 1 到 12
- w(整數):周,從 0 到 53
- day(整數):日,從 1 到 31
- hour(整數):小時,從 0 到 23
- minute(整數):分鐘,從 0 到 60
- second(整數):秒,從 0 到 60
- m(整數):年月,比如 201409
- date_query(數組):複雜的日期查詢
- year(整數):4 位數的年份,比如 2014
- month(整數):月份,從 1 到 12
- week(整數):周,從 0 到 53
- day(整數):日,從 1 到 31
- hour(整數):小時,從 0 到 23
- minute(整數):分鐘,從 0 到 59
- second(整數):秒,從 0 到 59
- before(字符串 | 數組):開啓查詢日期,可以是能被 strtotime() 函數解析的日期字符串,還可以使用數組:
- year(整數):4 位數的年份,比如 2014,默認為空
- month(整數):月份,從 1 到 12,默認是 1
- day(整數):日,從 1 到 31,默認是 1
- after(字符串 | 數組):結束查詢日期,可以是能被 strtotime() 函數解析的日期字符串,還可以使用數組:
- year(整數):4 位數的年份,比如 2014,默認為空
- month(整數):月份,從 1 到 12,默認是 12
- day(整數):日,從 1 到 31,默認是本月最後一天
- inclusive(布爾):before 和 after 是否包含所指定本日的文章
- compare(字符串):使用什麼比較符號 (=、!=、> 、>=、< 、<=、 IN 、 NOT IN 、 BETWEEN 、 NOT 、 BETWEEN)
- column(字符串):匹配的日期字段,默認是 post_date
- relation(字符串):條件的邏輯關係,OR(或者) 或 AND(和)
獲取 2012 年 12 月 12 日的文章
|
1 |
$query=newWP_Query('year=2012&monthnum=12&day=12'); |
或者:
|
$args=array( 'date_query'=>array( array( 'year' =>2012, 'month'=>12, 'day' =>12, ), ), ); $query=newWP_Query($args); |
獲取今天發佈的文章
|
$today=getdate(); $query=newWP_Query('year='.$today['year'].'&monthnum='.$today['mon'].'&day='.$today['mday']); |
或者:
|
$today=getdate(); $args=array( 'date_query'=>array( array( 'year' =>$today['year'], 'month'=>$today['mon'], 'day' =>$today['mday'], ), ), ); $query=newWP_Query($args); |
獲取本週發佈的文章
|
$week=date('W'); $year=date('Y'); $query=newWP_Query('year='.$year.'&w='.$week); |
或者:
|
$args=array( 'date_query'=>array( array( 'year'=>date('Y'), 'week'=>date('W'), ), ), ); $query=newWP_Query($args); |
獲取上午 9 點到下午 5 點的文章
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$args=array( 'date_query'=>array( array( 'hour' =>9, 'compare' =>'>=', ), array( 'hour' =>17, 'compare' =>'<=', ), array( 'dayofweek'=>array(2,6), 'compare' =>'BETWEEN', ), ), 'posts_per_page'=>-1, ); $query=newWP_Query($args); |
獲取 2013 年 1 月 1 日到 2013 年 2 月 18 日的文章
包含 2013 年 1 月 1 日和 2013 年 2 月 18 日的文章:
|
$args=array( 'date_query'=>array( array( 'after' =>'January 1st, 2013', 'before' =>array( 'year' =>2013, 'month'=>2, 'day' =>28, ), 'inclusive'=>true, ), ), 'posts_per_page'=>-1, ); $query=newWP_Query($args); |
不包含 2013 年 1 月 1 日和 2013 年 2 月 18 日的文章:
|
$args=array( 'date_query'=>array( array( 'after' =>'January 1st, 2013', 'before' =>array( 'year' =>2013, 'month'=>2, 'day' =>28, ), 'inclusive'=>false, ), ), 'posts_per_page'=>-1, ); $query=newWP_Query($args); |
獲取在一年前發佈卻在一個月前修改過的文章
|
$args=array( 'date_query'=>array( array( 'column'=>'post_date_gmt', 'before'=>'1 year ago', ), array( 'column'=>'post_modified_gmt', 'after' =>'1 month ago', ), ), 'posts_per_page'=>-1, ); $query=newWP_Query($args); |
自定義字段
有關自定義字段的查詢,可用使用 9 個參數:
- meta_key(字符串):自定義字段的名 (key)
- meta_value(字符串):自定義字段的值 (value)
- meta_value_num(數字):自定義字段的值 (value)
- meta_compare(字符串):匹配方法 (=、!=、> 、>=、< 、<=),默認是 「=」
- meta_query(數組):處理複雜的查詢
- relation(字符串):條件的邏輯關係,OR(或者) 或 AND(和)
- key(字符串):自定義字段的名 (key)
- value(字符串):自定義字段的值 (value)
- compare(字符串):匹配方法 (=、!=、> 、>=、< 、<=、 LIKE 、 NOT LIKE 、 IN 、 NOT IN 、 BETWEEN 、 NOT BETWEEN 、 EXISTS 、 NOT EXISTS),默認是 「=」
- type(字符串):自定義字段的類型 (NUMERIC 、 BINARY 、 CHAR 、 DATE 、 DATETIME 、 DECIMAL 、 SIGNED 、 TIME 、 UNSIGNED),默認是 「CHAR」
簡單的自定義字段查詢
獲取擁有自定義字段 color 的文章:
|
1 |
$query=newWP_Query('meta_key=color'); |
獲取自定義字段的值為 「blue」 的文章,不管字段的鍵值是什麼:
|
1 |
$query=newWP_Query('meta_value=blue'); |
獲取自定義字段的值為 「blue」 的頁面,不管字段的鍵值是什麼:
|
1 |
$query=newWP_Query('meta_value=blue&post_type=page'); |
獲取自定義字段 color 是 「blue」 的文章:
|
1 |
$query=newWP_Query(array('meta_key'=>'color','meta_value'=>'blue')); |
獲取自定義字段 color 不是 「blue」 的文章:
|
1 |
$query=newWP_Query(array('meta_key'=>'color','meta_value'=>'blue','meta_compare'=>'!=')); |
獲取文章類型是 「product」 的文章,並且自定義字段 price 小於或者等於 22:
|
1 |
$query=newWP_Query(array('meta_key'=>'price','meta_value'=>'22','meta_compare'=>'<=','post_type'=>'product')); |
簡單的複雜查詢
獲取 product 自定義文章類型中 color 自定義字段不包含 「blue」 的文章:
|
$args=array( 'post_type' =>'product', 'meta_query'=>array( array( 'key' =>'color', 'value' =>'blue', 'compare'=>'NOT LIKE', ), ), ); $query=newWP_Query($args); |
複雜的查詢
多自定義字段匹配:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$args=array( 'post_type' =>'product', 'meta_query'=>array( array( 'key' =>'color', 'value' =>'blue', 'compare'=>'NOT LIKE', ), array( 'key'=>'price', 'value' =>array(20,100), 'type' =>'numeric', 'compare'=>'BETWEEN', ), ), ); $query=newWP_Query($args); |
在 product 自定義文章類型裏獲取 color 自定義字段不包含 「blue」 或者 price 字段是 20 到 100 之間的文章:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$args=array( 'post_type' =>'product', 'meta_query'=>array( 'relation'=>'OR', array( 'key' =>'color', 'value' =>'blue', 'compare'=>'NOT LIKE', ), array( 'key' =>'price', 'value' =>array(20,100), 'type' =>'numeric', 'compare'=>'BETWEEN', ), ), ); $query=newWP_Query($args); |
用户權限
關於用户權限的文章查詢有一個參數可以使用:
只有用户有權限才顯示文章
只有用户有權限才獲取已發佈和私密的文章:
|
1 |
$query=newWP_Query(array('post_status'=>array('publish','private'),'perm'=>'readable')); |
文章緩存
有關文章數據的緩存,有 3 個參數:
- cache_results(布爾):文章信息緩存
- update_post_meta_cache(布爾):文章 meta 信息緩存
- update_post_term_cache(布爾):文章分類法信息緩存
獲取文章但不更新文章緩存
|
1 |
$query=newWP_Query(array('posts_per_page'=>50,'cache_results'=>false)); |
獲取文章但不更新 meta 信息的緩存
|
1 |
$query=newWP_Query(array('posts_per_page'=>50,'update_post_meta_cache'=>false)); |
獲取文章但不更新文章分類法的緩存
|
1 |
$query=newWP_Query(array('posts_per_page'=>50,'update_post_term_cache'=>false)); |
其它
由於本文內容太多,耗時好幾天才完成製作,如果出現不準確的內容請在評論中指出,謝謝!
更多關於文章查詢的內容:https://www.weixiaoduo.com/tag/query
參考資料:https://codex.WordPress.org/Class_Reference/WP_Query