【问题标题】:WordPress: WP_Query with posts from a category and meta_query or only another meta_queryWordPress:WP_Query 包含来自一个类别和 meta_query 或仅另一个 meta_query 的帖子
【发布时间】:2020-03-18 04:48:05
【问题描述】:

我在使用 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 对帖子进行排序。如果我合并这两个数组,排序就不是我想要的那样。

有人知道更好的方法吗?如果是一个查询,排序会起作用,我认为它更有效。

感谢您的帮助!

【问题讨论】:

  • 请尝试以下答案

标签: wordpress custom-fields meta-key


【解决方案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>');

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

【讨论】:

  • 感谢您的回答,但不幸的是,它没有按我的意愿工作。假设:firstArgs 查询返回三个帖子 - 帖子 A(持续时间:30 分钟)、帖子 B(持续时间:10 分钟)和帖子 C(持续时间:5 分钟)。第二个查询为您提供两个帖子:帖子 D(持续时间 40 分钟)和帖子 E(持续时间:10 分钟)。结果应该是这个顺序:发布 D、A、B、E、C(因为我想按持续时间排序)。还是我思维有误?
  • @noobhoch100 你试过 print_r($firstArgs);输出是什么?
  • $firstArgs 的输出是正确的。这个查询给出了来自“级别”类别的所有帖子,自定义字段类型为“锻炼”。这些帖子按持续时间排序(帖子 A、B、C - 在前面的示例中)。第二个也是正确的,但是如果我合并这两个,帖子将不会再次排序。但这就是第一点。:-( 后 A、B、C 和后 D、E 将合并到 A、B、C、D、E 而不是 D、A、B、E、C。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2021-03-22
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 2015-07-24
    • 2015-04-19
    • 2017-03-04
    • 2016-04-12
    • 1970-01-01
    相关资源
    最近更新 更多