如何在WordPress的查询中一次按两个不同的顺序排序

Maa*_*aaz 3 php wordpress

我有点问题.我试图通过自定义元字段获取最新的12个帖子.在这12个帖子中,我想按照发布日期订购.首先,我使用自定义元字段将12个帖子拉出来,并命令他们通过元字段查找最新信息.一旦我拥有它们,那么我想用最新的帖子重新订购它们.

这是我当前的代码,我不知道如何在一个查询中放置两个ord​​er-bys ...

$recentEpisodes12 = new WP_Query(array(
    'posts_per_page' => 12,
    'post_type' => 'post',
    'meta_key' => 'air_date',
    'order' => 'DESC',
    'orderby' => 'meta_value_num',
    'meta_query' => array(
        array(
            'key' => 'air_date',
        ),
        array(
            'key' => 'already_aired',
            'value' => 'yes',
            'compare' => '='
        )
    ),

)); 
Run Code Online (Sandbox Code Playgroud)

Mat*_*ens 5

根据 Codex,您只需用空格分隔它们:

多个“orderby”值

显示按“标题”和“菜单顺序”排序的页面。(标题占主导地位):

$query = new WP_Query( array( 'post_type' => 'page', 'orderby' => 'title menu_order', 'order' => 'ASC' ) );
Run Code Online (Sandbox Code Playgroud)

在你的情况下,这看起来像:

'orderby' => 'meta_value_num date'
Run Code Online (Sandbox Code Playgroud)

编辑:好的,看来您正在尝试在这里做一些更复杂的事情。我的理解是这样的,如有错误请指正:

  1. 排序方式air_date(按降序排列,最新的在前)。
  2. 根据 只保留 12 个最新项目air_date
  3. 按 订购生成的 12 个项目date

所做orderby的基本上是:

  1. 订购依据air_date.
  2. 如果任何项目具有相同的 air_date值,请按 排序date
  3. 仅保留前 12 项。

不同之处在于您只想通过 来区分air_date,而 的正常用法orderby使用这两个条件来确定哪些项目最终出现在结果中。

但我不知道解决这个问题的简单方法。但是,由于您只想更改结果项目的显示顺序,因此您可以自己对它们进行排序。您可以使用 PHP 对结果数组进行get_posts排序WP_Queryusort

$posts = get_posts(...);
usort($posts, '__sort_by_date_desc');

function __sort_by_date_desc($a, $b) {
    // Make timestamps from MySQL datetime values
    $a_date = mysql2date('U', $a->post_date);
    $b_date = mysql2date('U', $b->post_date);
    // Descending order, swap these for ascending
    return $b_date - $a_date;
}
Run Code Online (Sandbox Code Playgroud)


小智 5

在WordPress 4.2及更高版本中,通过一个或多个自定义字段进行排序变得更加容易.请参阅此链接以获取示例:https://make.wordpress.org/core/2015/03/30/query-improvements-in-wp-4-2-orderby-and-meta_query/

您甚至可以通过将数组传递给orderby来订购一个列ASC和另一个DESC:

'orderby' => array(
    'city_clause' => 'ASC',
    'state_clause' => 'DESC',
),  
Run Code Online (Sandbox Code Playgroud)