WordPress中ACF自定义分类筛选问题求助
问题分析与修复方案
你遇到的核心问题是每个分类下都显示了所有文章,这是因为WP_Query的tax_query格式错误导致分类筛选失效,同时代码里还有几个影响功能的细节问题,以下是修复后的完整方案:
关键错误点
tax_query格式错误:必须是嵌套数组(外层数组包含内层条件数组),你当前写的一维数组无法被WP正确解析,导致分类筛选完全失效,返回了所有charging_faq类型文章。- 折叠面板ID重复:所有分类的折叠容器都用
id="faq",导致跨分类的折叠项互相干扰。 - Tab切换无对应容器:分类Tab的跳转链接没有匹配的内容容器ID,切换功能完全无效。
- 查询重置方式错误:使用
WP_Query后应该用wp_reset_postdata(),而非wp_reset_query()。
修复后的完整代码
<?php $section = get_query_var('section'); $sectionKey = get_query_var('section_key'); $categories = get_terms('charging_categories'); ?> <div id="section_<?php echo $sectionKey; ?>" class="section"> <div class="d-md-block col-12 col-md-12 charging-station-faq"> <div id="main"> <div class="container"> <div class="col-md-10 text-center"> <h2 class="white"><?php echo $fields['ch_faq_title']; ?></h2> <p class="text-center"><?php echo $fields['ch_faq_sub_title']; ?></p> </div> <!-- 统一Tab导航容器(移到循环外,避免重复生成) --> <div class="buttons-row nav nav-tabs justify-content-center" id="myTab" role="tablist"> <?php foreach ($categories as $i => $category) { ?> <a class="form_change_button nav-link <?php echo $i === 0 ? 'active' : ''; ?>" data-toggle="tab" href="#<?php echo esc_attr($category->slug); ?>" role="tab" aria-controls="<?php echo esc_attr($category->slug); ?>" aria-selected="<?php echo $i === 0 ? 'true' : 'false'; ?>"> <?php echo esc_html($category->name); ?> </a> <?php } ?> </div> <!-- Tab内容容器 --> <div class="tab-content" id="myTabContent"> <?php foreach ($categories as $i => $category) { ?> <div class="tab-pane fade <?php echo $i === 0 ? 'show active' : ''; ?>" id="<?php echo esc_attr($category->slug); ?>" role="tabpanel" aria-labelledby="<?php echo esc_attr($category->slug); ?>-tab"> <?php $args = array( 'post_type' => 'charging_faq', 'tax_query' => array( // 修正:tax_query必须为嵌套数组 array( 'taxonomy' => 'charging_categories', 'field' => 'slug', 'terms' => $category->slug, 'include_children' => false, // 可选:是否包含子分类文章,按需调整 ) ), ); $posts = new WP_Query($args); ?> <?php if ($posts->have_posts()) { ?> <!-- 每个分类的折叠容器使用唯一ID --> <div class="accordion" id="faq-<?php echo esc_attr($category->slug); ?>"> <?php while ($posts->have_posts()) : $posts->the_post(); ?> <div class="card" style="background-color: transparent;"> <div class="card-header" id="faqhead-<?php echo get_the_ID(); ?>"> <button href="#question-<?php echo get_the_ID(); ?>" class="btn btn-link" data-toggle="collapse" data-target="#question-<?php echo get_the_ID(); ?>" role="button" aria-expanded="true" aria-controls="question-<?php echo get_the_ID(); ?>"> <?php the_title(); ?> </button> </div> <div id="question-<?php echo get_the_ID(); ?>" class="collapse" aria-labelledby="faqhead-<?php echo get_the_ID(); ?>" data-parent="#faq-<?php echo esc_attr($category->slug); ?>"> <div class="card-body"> <?php the_content(); ?> </div> </div> </div> <?php endwhile; ?> </div> <?php wp_reset_postdata(); // 修正:用正确的方式重置查询 ?> <?php } ?> </div> <?php } ?> </div> </div> </div> </div> </div>
额外优化说明
- 将Tab导航移到分类循环外,符合Bootstrap标准Tab结构,避免重复生成导航栏。
- 给第一个Tab和内容容器添加
active类,默认显示第一个分类内容。 - 使用
esc_attr()和esc_html()转义输出内容,避免XSS安全风险。 - 折叠面板的ID和关联属性改为文章ID+分类Slug的组合,确保全局唯一性。
内容的提问来源于stack exchange,提问作者Hagai
相关产品推荐
相关产品推荐

