2

我在使用 WordPress 和 WP_Query 时遇到了一些问题。我想获取按 meta_query 和/或类别过滤的帖子,但我有以下问题:第一种类型的帖子有一个名为“type”的自定义字段,该字段必须填写“exercise”,并且帖子必须位于名为“Level”的类别(这将在之前设置)。第二种类型的帖子只有名为“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);

这种方法的问题是,我想按自定义字段“持续时间”DESC 对帖子进行排序。如果我合并这两个数组,排序就不是我想要的那样。

有谁知道这样做的更好方法?如果它是一个查询,排序将起作用,我认为它更有效。

谢谢你的帮助!

4

2 回答 2

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

为了您更好的理解,请访问这里

于 2019-11-22T06:46:22.283 回答
0

我找到了一个对我有用的答案。首先,我按照 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
});

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

于 2019-11-28T09:37:03.240 回答