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

时间:2013-06-22 16:44:22

标签: 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' => '='
        )
    ),

)); 

3 个答案:

答案 0 :(得分: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',
),  

答案 1 :(得分:4)

According to the Codex,您只需要用空格分隔它们:

  

多个'orderby'值

     

显示按'title'和'menu_order'排序的页面。 (标题是   显性):

$query = new WP_Query( array( 'post_type' => 'page', 'orderby' => 'title menu_order', 'order' => 'ASC' ) );

在您的情况下,这将是:

'orderby' => 'meta_value_num date'

编辑:好吧,好像你正试图在这里做一些更复杂的事情。这就是我解释它的方法,如果我错了,请纠正我:

  1. air_date排序(按降序排列,最新排名第一)。
  2. 根据 air_date
  3. 仅保留12个最新项
  4. date订购生成的12个项目。
  5. orderby基本上做了什么:

    1. air_date订购。
    2. 如果任何项目具有相同的 air_date值,请按date订购。{/ li>
    3. 仅保留前12项。
    4. 区别在于您只想区分 air_date,而orderby的正常用法使用两个条件来确定哪些项目最终会出现在结果中。< / p> 但是,我不知道解决这个问题的简单方法。但是,由于您只想更改结果项的显示顺序,您可以自己对它们进行排序。您可以使用get_posts代替WP_Query,并使用PHP的usort

      对结果数组进行排序
      $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;
      }
      

答案 2 :(得分:0)

因此,如果您想通过发布日期订购它们,为什么还需要一个元字段呢?按meta值获得12条最新帖子后,air_date与发布日期有何不同?

值得注意的是:posts_per_page并不限制总回报数。它只是告诉WordPress何时拆分成新页面。

这样的事情应该基于你在原帖中描述的内容。

// Post Criteria
$post_criteria = array(
    'posts_per_page'  => 12, // Don't paginate until after 12 posts
    'orderby'         => 'post_date', // Order by post date
    'order'           => 'DESC', // Order them reverse chronologically (ie. get the newest first)
    'meta_key'        => 'air_date', // Only get posts with this meta key
    'meta_value'      => 'meta_value_num', // And this meta value (only needed if you have multiple possible values for the meta key and just want one)
    'post_type'       => 'post', // Only get posts
    'post_status'     => 'publish'); // Only get posts that are published (ie. no drafts, etc.)

// Get posts matching criteria
$posts = get_posts( $post_criteria );

// Discard posts after the 12th one
$posts = array_slice($posts, 0, 12);

// If you wanted to reverse them to display
// chronologically, uncomment this variable.
# $posts = array_reverse($posts);

// For each post
foreach ($posts as $post) {

    // Basic variables
    // See a full list here: http://codex.wordpress.org/Function_Reference/get_post#Return
    $id = $post->ID;
    $title = $post->post_title;
    $url = get_permalink($id);
    $content = $post->post_content;

    // Do stuff with the posts here.

}