如何组合两个WP_QUERY对象?

时间:2019-05-15 作者:MMT

我需要将两个不同的WordPress WP\\u查询对象与单独的$posts_per_page

假设我们有两个不同的类别,每个类别负责显示18个属于自己类别的帖子或产品,例如:

$category_query = new WP_Query([
   \'posts_per_page\' => \'18\',
    \'post_type\' => \'product\',
    \'tax_query\' => [
       [
         \'taxonomy\' => \'product_cat\',
         \'terms\' => 120,
         \'field\' => \'id\',
         \'include_children\' => false
      ]
    ]
 ]);
想象一下,另一个查询与上面一样,但具有不同的term_id, 如你所见posts_per_page 是18,对于每个查询,将返回18个特定类别的产品

虽然这是正确的,但我正在尝试将这两个查询结合起来,以减少数据库查询的数量,并返回总共36个产品,其中前18个仅包含类别1,其他18个包含类别2,即使它们是随机顺序的,通过简单的遍历数组可以解决此问题<你知道怎么做吗?

1 个回复
SO网友:Welcher

只需查询这两个术语并增加posts_per_page 计数

$category_query = new WP_Query([
   \'posts_per_page\' => 36,
    \'post_type\' => \'product\',
    \'tax_query\' => [
       [
         \'taxonomy\' => \'product_cat\',
         \'terms\' => [ 120, 121 ],
         \'field\' => \'id\',
         \'include_children\' => false
      ]
    ]
 ]);

EDIT:

据我所知,用多个术语运行查询并保证每个术语有18个(假设每个术语至少有18个项目)是不可能的。

我的建议是运行两个单独的查询,将结果合并在一起,然后缓存帖子列表。这将允许您仅在缓存失效后才访问数据库。

示例:(为了简洁起见,我省略了args,因为唯一改变的是术语id。)

// Look for the cached posts
$merged_items = get_transient( \'my_category_query\' );

// If we don\'t have them, get and cache them
if( false === $merged_items ) {
    $cat_query_one = new WP_Query( $args_with_the_first_term );
    $cat_query_two = new WP_Query( $args_with_the_seccond_term );
    $merged_items = array_merge( $cat_query_one->posts, $cat_query_two->posts );
    set_transient( \'my_category_query\', $merged_items, DAY_IN_SECONDS );
}

// Display your posts
foreach ( $merged_items as $post ) {
   // ...
}
需要考虑的是,使用fields => \'ids\' 参数这将加快查询速度,而且您还可以使用ID检索要显示的大部分数据。

WP\\U查询的其他一些性能提示:

  • \'no_found_rows\' => true: 当不需要分页时,如果不进行计算来确定查询总共有多少篇文章,那么这将非常有用
  • \'update_post_meta_cache\' => false: 不使用post meta时很有用
  • update_post_term_cache\' => false: 在不使用分类术语时有用
当添加了会影响此查询的新内容时,还应该刷新缓存。

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post