WordPress中WP_Query术语为空时出错,求助实现多自定义分类动态筛选查询
动态构建WP_Query的分类筛选逻辑
没问题,这个需求核心就是动态生成tax_query条件——只把用户实际选择了的分类规则加进去,而不是固定死三个分类条件。这样不管用户选一个、两个还是三个分类,查询都能正常工作。
咱们来修改你的代码,一步步实现:
第一步:安全处理POST参数(重要!)
首先要对AJAX传过来的参数做安全过滤,避免注入风险,同时确保参数是数组格式(比如用户只选一个分类时,可能传的是单个ID,要转成数组):
// 安全处理各分类参数,转成整数数组 $cat_ids = isset($_POST['category']) ? array_map('intval', $_POST['category']) : array(); $ser = isset($_POST['services']) ? array_map('intval', $_POST['services']) : array(); $tech = isset($_POST['technology']) ? array_map('intval', $_POST['technology']) : array(); $ind = isset($_POST['industry']) ? array_map('intval', $_POST['industry']) : array(); $paged = isset($_POST['page']) ? intval($_POST['page']) + 1 : 1;
第二步:动态构建tax_query数组
先初始化tax_query的基础结构,然后只把非空的分类条件加进去:
// 初始化tax_query,默认关系为AND(多分类选择时同时满足) $tax_query = array('relation' => 'AND'); // 检查服务分类是否有选中值,有则加入条件 if (!empty($ser)) { $tax_query[] = array( 'taxonomy' => 'Collateral_services', 'field' => 'id', 'terms' => $ser, ); } // 检查技术分类是否有选中值,有则加入条件 if (!empty($tech)) { $tax_query[] = array( 'taxonomy' => 'Collateral_Technology', 'field' => 'id', 'terms' => $tech, ); } // 检查行业分类是否有选中值,有则加入条件 if (!empty($ind)) { $tax_query[] = array( 'taxonomy' => 'Collateral_Industry', 'field' => 'id', 'terms' => $ind, ); }
第三步:组装WP_Query参数
这里要注意:如果用户一个分类都没选,那tax_query里就只有relation,这时候不要把tax_query加入$args,否则WP_Query会报错或者返回空结果:
$args = array( 'post_type' => 'page', 'category__in' => $cat_ids, 'post_status' => 'publish', 'orderby' => 'date', // 修正原代码的排序参数错误:orderby指定字段,order指定排序方向 'order' => 'DESC', 'paged' => $paged, ); // 只有当tax_query里有实际的分类条件时,才加入到args中 if (count($tax_query) > 1) { // 初始仅含relation,count>1说明有有效筛选条件 $args['tax_query'] = $tax_query; } // 执行查询 $new = new WP_Query($args);
额外说明
- 我修正了你原来
orderby的错误:orderby是指定排序的字段(比如date、title),order才是指定升序/降序(ASC/DESC),原来的写法会导致排序不生效哦。 - 如果你的需求是多分类选择时满足任意一个(而不是同时满足),只需要把
relation改成OR就行。 - 记得在AJAX的前端代码里,确保没有选中分类时,对应的参数要传空数组或者不传,不要传无效值。
内容的提问来源于stack exchange,提问作者Sanad Cal
相关产品推荐
相关产品推荐

