如何仅获取同时包含指定双分类的WordPress文章列表?
如何获取同时具备指定双分类的WordPress文章列表
先帮你拆解下现有代码里的核心问题:
- 你当前代码中的
compare'=>'IN'作用是:只要文章属于terms数组里任意一个分类(26或27),就会被筛选出来,这也就是为什么你现在得不到同时具备两个分类的文章。
要实现「同时具备两个指定分类」的需求,我们需要调整tax_query的结构,核心是通过relation参数强制要求所有分类条件同时生效:
修正后的代码片段
if (isset($_POST['bartags']) && !empty($_POST['bartags'])): $tags = explode(',', $_POST['bartags']); // 确保至少有两个分类参数时才构建AND条件 if (count($tags) >= 2) { $tax_query[] = array( 'relation' => 'AND', // 关键:要求所有嵌套条件同时满足 array( 'taxonomy' => 'bar_tag', 'terms' => $tags[0], 'compare' => '=' ), array( 'taxonomy' => 'bar_tag', 'terms' => $tags[1], 'compare' => '=' ) ); } else { // 如果仅传入单个分类,保留原逻辑兼容单分类筛选 $tax_query[] = array( 'taxonomy' => 'bar_tag', 'terms' => $tags, 'compare' => 'IN' ); } endif;
关键逻辑说明
relation => 'AND':这个参数会告诉WordPress,所有嵌套的分类条件必须同时成立,替代了默认的OR(任意一个条件满足即可)。- 拆分分类条件:把每个目标分类单独写成一个条件数组,明确要求文章必须同时属于这两个
bar_tag分类。 - 参数校验:增加
count($tags) >= 2的判断,避免参数异常时出错,同时兼容单分类的筛选场景。
如果你的bartags参数可能包含更多分类ID(不止两个),想要获取同时具备所有传入分类的文章,可以用循环生成条件项,扩展性更强:
if (isset($_POST['bartags']) && !empty($_POST['bartags'])): $tags = explode(',', $_POST['bartags']); $tax_conditions = array(); foreach ($tags as $tag_id) { $tax_conditions[] = array( 'taxonomy' => 'bar_tag', 'terms' => trim($tag_id), 'compare' => '=' ); } if (!empty($tax_conditions)) { $tax_query[] = array( 'relation' => 'AND', ...$tax_conditions // 用展开语法导入所有条件项 ); } endif;
内容的提问来源于stack exchange,提问作者Ravi Patel
相关产品推荐
相关产品推荐

