WordPress 文章查询教程6:如何使用排序相关的参数

在 WordPress 中,使用 WP_Query 进行文章查询是最常见的操作,学习好这方面的操作, WordPress 开发基本就学会了一半。

「WordPress果酱」将通过一系列教程讲解如何使用 WP_Query 进行 WordPress 文章查询。

我写这一系列文章的目的也是为了方便自己使用这些参数的时候方便查询,所以如果你也是经常进行 WordPress 二次开发的话,建议收藏本文。

第六讲关于排序相关的参数,排序相关的参数就是 orderorderby 两个参数,但是值比较多比较多:

首先是 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__inorder 参数的值无效。
  • post_name__in – 按照 post_name__in 参数中给出的文章名称(URL别名)顺序进行排序,同样这时候 order 参数的值无效。
  • post_parent__in – 按照 post_parent__in 参数中给出的文章父 ID 顺序进行排序,同样这时候 order 参数的值无效。

按照文章标题降序:

$args = array(
    'orderby' => 'title',
    'order'   => 'DESC',
);
$query = new WP_Query( $args );

先按照「页面顺序」排序,然后再按文章标题,降序:

$args = array(
    'orderby' => 'menu_order title',
    'order'   => 'DESC',
);
$query = new WP_Query( $args );

随机显示一遍文章:

$args = array(
    'orderby'        => 'rand',
    'posts_per_page' => '1',
 
);
$query = new WP_Query( $args );

按照评论数排序(最受欢迎):

$args = array(
    'orderby' => 'comment_count'
);
$query = new WP_Query( $args );

获取按照价格自定义字段排序的商品:

$args = array(
    'post_type' => 'product',
    'orderby'   => 'meta_value_num',
    'meta_key'  => 'price',
);
$query = new WP_Query( $args );

按照标题降序,页面顺序升序:

$args = array(
    'orderby' => array( 'title' => 'DESC', 'menu_order' => 'ASC' )
);
$query = new WP_Query( $args );

按照数字类型自定义字段降序,标题升序:

$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_queryorderby 数组:

$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',
    ),
) );

©我爱水煮鱼,本站推荐使用的主机:阿里云,国外主机建议使用BlueHost

本站长期承接 WordPress 优化建站业务,请联系微信:「chenduopapa」。