WordPress Elementor自定义查询:需匹配全部分类法术语
解决方案:匹配所有分类术语+指定分类的产品筛选
要实现同时满足「包含当前文章所有models分类术语」和「属于free-play-adapter产品分类」的产品筛选,核心是正确构建tax_query的逻辑关系。以下是可行的代码实现及问题分析:
代码实现
// 获取当前文章的所有models分类术语(以slug格式返回,需与后续查询字段匹配) $current_model_slugs = wp_get_post_terms( get_the_ID(), 'models', array( 'fields' => 'slugs' ) ); // 若当前文章无models术语,直接终止查询避免无效请求 if ( empty( $current_model_slugs ) ) { echo '无匹配的相关产品'; return; } // 构建产品查询参数 $related_products_args = array( 'post_type' => 'product', 'posts_per_page' => 8, // 根据需求调整展示数量 'no_found_rows' => true, // 无需分页时开启,提升性能 'tax_query' => array( 'relation' => 'AND', // 两个分类条件必须同时满足 // 条件1:产品包含当前文章的所有models术语 array( 'taxonomy' => 'models', 'field' => 'slug', 'terms' => $current_model_slugs, 'operator' => 'AND', // 强制匹配所有术语,而非任意一个 ), // 条件2:产品属于free-play-adapter分类 array( 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => 'free-play-adapter', ), ), ); // 执行查询并输出产品 $related_products = new WP_Query( $related_products_args ); if ( $related_products->have_posts() ) { while ( $related_products->have_posts() ) { $related_products->the_post(); // 替换为你的产品展示模板代码 printf( '<div class="related-product"><a href="%s">%s</a></div>', get_permalink(), get_the_title() ); } wp_reset_postdata(); } else { echo '无匹配的相关产品'; }
之前尝试失败的原因分析
- 第一次添加
AND无结果:- 可能是
terms数组传递格式错误(比如传递了术语ID却用slug作为查询字段),或者当前站点中没有同时包含所有models术语的产品。建议先打印$current_model_slugs确认术语是否正确获取,再检查对应产品的分类设置。
- 可能是
- 第二次无论是否加操作符都无返回:
- 大概率是
tax_query的结构错误,比如未设置外层relation为AND,或者分类法名称拼写错误(比如把product_cat写成category)。
- 大概率是
- 第三次仅匹配任意术语:
tax_query中同一分类法下的术语默认operator为IN,即匹配包含任意一个术语的产品,必须显式设置operator => 'AND'才能强制匹配所有术语。
注意事项
- 确保
models分类法已正确关联到product自定义文章类型(可通过注册分类法时的object_type参数确认)。 - 若使用术语ID而非slug查询,需将
wp_get_post_terms的fields改为ids,同时tax_query中的field设为term_id。
内容的提问来源于stack exchange,提问作者MsMaryMak
相关产品推荐
相关产品推荐

