WP_Query出现0=1导致结果消失,多分类查询异常求助
WP_Query多分类法查询时“全部”选项导致无结果的问题修复
我来帮你解决这个WP_Query的坑!
问题根源
你当前的代码里,不管有没有实际的过滤需求,都把初始化的空数组(比如$category = array(''))塞进了tax_query里。而WP_Query对tax_query的子项有严格校验:如果一个子数组缺少taxonomy、field这些必填参数,它会直接判定这个条件无效,自动生成0=1的SQL WHERE子句——这就直接导致没有任何帖子能匹配这个条件,自然查不到结果。
当你选择“全部”选项时,对应的变量没有被赋值为有效的tax查询数组,还是那个空数组,这就触发了这个无效条件的问题。
修复后的代码
我们调整思路:只把需要过滤的分类法条件加入到tax_query中,不需要的就跳过。修改后的代码如下:
// 初始化一个空数组,用来存放有效的分类法查询条件 $tax_query = array(); // 设置tax_query的关系为AND(如果有多个条件的话) $tax_query['relation'] = 'AND'; // 处理分类(category)过滤 if($_POST['pageType'] !== "all"){ $tax_query[] = array ( 'taxonomy' => 'category', 'field' => 'slug', 'operator' => 'IN', 'terms' => explode(',', $_POST['pageType']) ); } // 处理地区(post_regions)过滤 if($_POST['regions'] !== "default"){ $tax_query[] = array( 'taxonomy' => 'post_regions', 'field' => 'slug', 'operator' => 'IN', 'terms' => explode(',', $_POST['regions']) ); } // 处理标签(post_tag)过滤 if($_POST['topics'] !== "All"){ $tax_query[] = array( 'taxonomy' => 'post_tag', 'field' => 'slug', 'terms' => explode(',', $_POST['topics']), 'operator' =>'IN' ); } // 处理post_categories过滤(你原代码里没给这个的判断逻辑,这里保留框架,需要的话补充判断条件) // if(你的判断条件){ // $tax_query[] = array( // 'taxonomy' => 'post_categories', // 'field' => 'slug', // 'operator' => 'IN', // 'terms' => ... // ); // } $args = array( 'post_type' => 'post', 'orderby' => 'publish_date', 'posts_per_page' => -1, 'order' => 'DESC', 'post_status' => 'publish', 'date_query' => array( 'relation' => 'OR', $dates ), ); // 只有当tax_query里有实际条件的时候,才添加到args中 if(!empty($tax_query) && count($tax_query) > 1){ // 因为我们加了relation,所以至少要有一个条件+relation $args['tax_query'] = $tax_query; } $query = new WP_Query( $args );
关键说明
- 只添加有效的条件:我们不再初始化那些无用的空数组,而是只在需要过滤的时候,把完整的tax查询数组加入到
$tax_query中 - 动态判断是否添加tax_query:如果没有任何分类法过滤需求,
$tax_query里只有relation,这时候我们就不把它加入到args里,WP_Query会忽略分类法过滤,返回所有符合其他条件的帖子 - 处理post_categories:你原代码里的
$post_categories没有对应的判断逻辑,我留了注释,记得补充对应的判断条件(比如类似其他参数的“全部”判断),避免再次出现无效条件
内容的提问来源于stack exchange,提问作者Mayank Kapahi
相关产品推荐
相关产品推荐

