在 WordPress 中,使用 WP_Query
进行文章查询是最常见的操作,学习好这方面的操作, WordPress 开发基本就学会了一半。
「WordPress果酱」将通过一系列教程讲解如何使用 WP_Query
进行 WordPress 文章查询。
我写这一系列文章的目的也是为了方便自己使用这些参数的时候方便查询,所以如果你也是经常进行 WordPress 二次开发的话,建议收藏本文。
第六讲关于排序相关的参数,排序相关的参数就是 order
和 orderby
两个参数,但是值比较多比较多:
首先是 order
参数,数据类型为:(string | array),用于指定 “orderby” 参数的升序或降序,默认为”DESC
”,即为降序,如果是数组的话,可用于多个 order/orderby
集:
ASC
– 升序,从最低值到最高值 (1, 2, 3; a, b, c)DESC
– 降序,从最高值到最低值 (3, 2, 1; c, b, a)
然后是 orderby
参数,数据类型为:(string | array),按参数对检索到的文章进行排序。默认为:date
(post_date
)。可以传递一个或多个选项:
none
– 无顺序ID
– 按文章 ID 排序,注意 ID 是大写的。author
– 按文章作者排序。title
– 按文章标题排序name
– 按文章名称排序,即 URL别名。type
– 按文章类型排序。date
– 按文章发布日期排序。modified
– 按文章修改日期排序。parent
– 按文章或页面的父 ID 排序rand
– 随机排序comment_count
– 按文章评论数排序relevance
– 按相关性排序,根据以下顺序按搜索词排序:首先是否匹配整个句子,其次如果所有搜索词都在标题内,第三是否有任何搜索词出现在标题中,第四是否完整的句子出现在内容中。menu_order
– 按照页面的顺序排序。常用于页面(排序字段在页面编辑页面的「页面属性」框中),也可用于具有不同menu_order
值的任何文章类型(默认值都是 0)。meta_value
– 按照自定义字段排序,请先确保在查询中已经设置了meta_key
,额外要注意,是按字母顺序排列的,这对于字符串来说没有问题,但对于数字可以结果不是你预期的,(例如结果是 1、3、34、4、56、6 ,而不是 1、3、4、6、 34, 56)。如果要按照数字排序,请使用meta_value_num
代替数值。如果要将自定义字段的值转换为特定类型之后再排序,可以通过指定meta_type
来实现,可以这些类型:NUMERIC
,BINARY
,CHAR
,DATE
,DATETIME
,DECIMAL
,SIGNED
,TIME
,UNSIGNED
。也可以使用meta_value_*
来指定,例如转换为DATETIME
类型时,也可以使用meta_value_datetime
来作为orderby
参数。meta_value_num
– 按照数字类型的自定义字段排序。post__in
– 按照post__in
参数中给出的文章 ID 顺序进行排序,注意使用post__in
,order
参数的值无效。post_name__in
– 按照post_name__in
参数中给出的文章名称(URL别名)顺序进行排序,同样这时候order
参数的值无效。post_parent__in
– 按照post_parent__in
参数中给出的文章父 ID 顺序进行排序,同样这时候order
参数的值无效。
按照文章标题降序:
代码语言:javascript复制$args = array(
'orderby' => 'title',
'order' => 'DESC',
);
$query = new WP_Query( $args );
先按照「页面顺序」排序,然后再按文章标题,降序:
代码语言:javascript复制$args = array(
'orderby' => 'menu_order title',
'order' => 'DESC',
);
$query = new WP_Query( $args );
随机显示一遍文章:
代码语言:javascript复制$args = array(
'orderby' => 'rand',
'posts_per_page' => '1',
);
$query = new WP_Query( $args );
按照评论数排序(最受欢迎):
代码语言:javascript复制$args = array(
'orderby' => 'comment_count'
);
$query = new WP_Query( $args );
获取按照价格自定义字段排序的商品:
代码语言:javascript复制$args = array(
'post_type' => 'product',
'orderby' => 'meta_value_num',
'meta_key' => 'price',
);
$query = new WP_Query( $args );
按照标题降序,页面顺序升序:
代码语言:javascript复制$args = array(
'orderby' => array( 'title' => 'DESC', 'menu_order' => 'ASC' )
);
$query = new WP_Query( $args );
按照数字类型自定义字段降序,标题升序:
代码语言:javascript复制$args = array(
'orderby' => array( 'meta_value_num' => 'DESC', 'title' => 'ASC' ),
'meta_key' => 'age'
);
$query = new WP_Query( $args );
获取 my_custom_post_type
的文章,按照数字自定义字段 age
排序,并通过 meta_query
过滤数据只显示 age 为:3-4 的数据
$args = array(
'post_type' => 'my_custom_post_type',
'meta_key' => 'age',
'orderby' => 'meta_value_num',
'order' => 'ASC',
'meta_query' => array(
array(
'key' => 'age',
'value' => array( 3, 4 ),
'compare' => 'IN',
),
),
);
$query = new WP_Query( $args );
如果要通过两个自定义字段来排序,比如先通过 city 升序 然后 province 降序,这时候就需要通过「命名的 meta 查询」(named meta queries
)来组合并链接 meta_query
到 orderby
数组:
$q = new WP_Query( array(
'meta_query' => array(
'relation' => 'AND',
'province_clause' => array(
'key' => 'province',
'value' => '广东省',
),
'city_clause' => array(
'key' => 'city',
'compare' => 'EXISTS',
),
),
'orderby' => array(
'city_clause' => 'ASC',
'province_clause' => 'DESC',
),
) );