WP_Query合并查询条件异常,需实现两类文章组合查询
解决WP_Query获取两类文章并集的问题
原代码问题分析
你用array_merge合并两个查询参数的方式是错误的:
array_merge会覆盖重复键的参数,比如showposts会被$args2的5覆盖,最终只取5篇;- WP_Query的默认参数关系是AND,合并后的参数会要求文章同时满足「分类32378」和「带slider元键」,所以只得到两类的交集,不是你要的并集。
解决方案一:两次查询合并去重(直观易维护)
先分别获取两类文章的ID,合并后去重,再用ID列表查询最终结果,确保取到「分类32378所有文章 + 所有分类带slider元键的文章」,再限制总数为7篇:
// 1. 获取所有带slider元键的文章ID $slider_post_ids = get_posts([ 'meta_key' => 'slider', 'meta_value' => true, 'fields' => 'ids', // 只取ID,提升查询效率 'posts_per_page' => -1 // 取出所有符合条件的 ]); // 2. 获取分类32378的所有文章ID $cat32378_post_ids = get_posts([ 'cat' => 32378, 'fields' => 'ids', 'posts_per_page' => -1 ]); // 3. 合并ID并去重(避免同一文章被重复统计) $combined_ids = array_unique(array_merge($slider_post_ids, $cat32378_post_ids)); // 4. 限制总数为7篇,截取前7个ID if (count($combined_ids) > 7) { $combined_ids = array_slice($combined_ids, 0, 7); } // 5. 用ID列表查询最终文章,保持合并后的顺序 $the_query = new WP_Query([ 'post__in' => $combined_ids, 'posts_per_page' => 7, 'orderby' => 'post__in' // 按合并后的ID顺序输出,可根据需求调整排序规则 ]);
解决方案二:用WP_Query原生复合条件(简洁高效)
利用WP_Query的relation参数设置条件为OR,直接查询满足「分类32378」或「带slider元键」的文章,自动去重,限制总数7篇:
$args = [ 'posts_per_page' => 7, 'relation' => 'OR', // 两个条件满足其一即可 'tax_query' => [ [ 'taxonomy' => 'category', 'field' => 'term_id', 'terms' => 32378 ] ], 'meta_query' => [ [ 'key' => 'slider', 'value' => true ] ] ]; $the_query = new WP_Query($args);
两种方案对比
- 方案一:逻辑清晰,可灵活调整两类文章的优先级(比如调整合并顺序),适合需要精确控制输出顺序的场景;
- 方案二:代码更简洁,直接利用WP_Query原生能力,性能更优,适合不需要特殊排序的场景。
内容的提问来源于stack exchange,提问作者Morteza Ahmadi
相关产品推荐
相关产品推荐

