WordPress:WP_Query 个类别的帖子和 meta_query 或另一个 meta_query

WordPress: WP_Query with posts from a category and meta_query or only another meta_query

我在使用 WordPress 和 WP_Query 时遇到了一些问题。 我想通过 meta_query and/or 类别过滤 posts,但我遇到以下问题: 第一种类型的 post 有一个名为 "type" 的自定义字段,必须用 "exercise" 填充,并且 post 必须在名为 "Level" 的类别中(这将在之前设置)。 第二种posts只有自定义字段"type",必须填写"test".

我不知道如何将这两个条件放在一起。 因此,我尝试将其拆分为两个查询,然后将其合并,如下所示:

$firstArgs = array(
        'posts_per_page'=> -1,
        'category_name' => $level,
        'meta_key'      => 'duration',
        'orderby'       => 'meta_value_num',
        'order'         => 'DESC',
        'meta_query' => array(
             'key' => 'type',
             'value' => 'exercise'
        )     
);

$secondArgs = array(
        'posts_per_page' => -1,
        'meta_key'       => 'duration',
        'orderby'        => 'meta_value_num',
        'order'          => 'DESC',
        'meta_query' => array(
             'key' => 'type',
             'value' => 'test'
        )
);
$first_query = new WP_Query( $firstArgs );
$second_query = new WP_Query( $secondArgs );
$result = new WP_Query();
$result->posts = array_merge($first_query->posts, $second_query->posts);

此方法的问题是,我想按自定义字段 "duration" DESC 对 post 进行排序。如果我合并这两个数组,排序不是我想要的那样。

有谁知道更好的方法吗?如果是一个查询,排序就可以了,我认为这样效率更高。

感谢您的帮助!

$firstArgs = array(
        'posts_per_page'=> -1,
        'category_name' => $level,
        'meta_key'      => 'duration',
        'orderby'       => 'meta_value_num',
        'order'         => 'DESC',
        'meta_query' => array(
             'key' => 'type',
             'value' => 'exercise'
        )     
);

$secondArgs = array(
        'posts_per_page' => -1,
        'meta_key'       => 'duration',
        'orderby'        => 'meta_value_num',
        'order'          => 'DESC',
        'meta_query' => array(
             'key' => 'type',
             'value' => 'test'
        )
);

$firstArgs = get_posts($firstArgs);
$secondArgs = get_posts($secondArgs);
$your_posts = array_unique(array_merge($firstArgs,$secondArgs),SORT_REGULAR);

_e('<pre>');
print_r($your_posts);   
_e('</pre>');

为了更好地理解,请访问 here

我找到了适合我的答案。 首先,我按照 Dhruv 告诉我的方式检索数据,然后使用 usort 函数对结果进行排序,但使用的是匿名函数。

usort($your_posts, function($a, $b)
{
      $val1 = get_post_meta($a->ID, 'duration', true );
      $val2 = get_post_meta($b->ID, 'duration', true );
      return  -1*($val1 - $val2); // sort desc
});

也许这不是最好的方法,但它对我有用。 :-)