You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WP_Query页面模板失效:仅需显示ACF选中分类的文章

解决WordPress ACF选中分类仅展示对应文章的问题

当前你的页面模板通过ACF的select_cat字段选择要展示的分类,但代码仍显示所有分类的文章,问题出在没有正确收集选中分类的ID并传递给WP_Query,以下是修复步骤:

原模板代码

<?php /* Template Name: Category Page 2*/ ?>
<?php get_header(); ?>


<div class="container">
  <div class="row">
    <div class="col-md-12">
      <?php
      $terms = get_field('select_cat');
      if ($terms) : $page_cat = array(); ?>
        <div class="mt-3">
            <span class="filter_title">Filter :</span>
            <select class="filter_dropdown">
                <option value="">All</option>
                <?php foreach ($terms as $term) : ?>
                    <option value="<?php echo esc_url(get_term_link($term)); ?>" data-thumbnail="<?php echo get_field('flag_image' , esc_html($term->taxonomy . '_' . $term->term_id)); ?>"><?php echo esc_html($term->name); ?></option>
                <?php endforeach; ?>
            </select>
        </div>
      <?php endif; ?>
    </div>
  </div>
</div>

<?php //print_r($page_cat); 
?>
<?php
$posts = new WP_Query([
  'post_type' => 'post',
  'post_status' => 'publish',
  'posts_per_page' => 9,
  'cat' => $page_cat,
  'orderby' => 'date',
  'order' => 'DESC',
  'paged' => 1,
]);
?>

<div class="container">
    <div class="row">
        <div class="col-md-8">
            <?php if ($posts->have_posts()) : ?>
              <div class="row post-list">
                <?php
                $i = 1;
                while ($posts->have_posts()) : $posts->the_post(); ?>
                    <?php 
                        $author_id = get_the_author_meta('ID');
                        $profilepicture = get_user_meta( $author_id, 'profilepicture', 'true' );
                        $display_name = get_the_author_meta( 'display_name', $author_id );
                    ?>
                    <div class="catpage_post_col col-md-<?php if ($i == 1) {echo "12";}else{echo "6";} ?>">
                        <div>
                            <a href="<?php echo get_permalink(); ?>"><img src="<?php echo wp_get_attachment_url( get_post_thumbnail_id($post->ID) ); ?>" class="img-fluid catpage_post_feature_img<?php if ($i == 1) {echo '-01';}?>"></a>
                        </div>
                        <div>
                            <span class="post_author_info">
                                <img src="<?php echo $profilepicture; ?>" class="post_author_img">
                                <span class="single_post_author_name">
                                    <a href="<?php echo esc_url( get_author_posts_url( $author_id ) ); ?>"><?php the_author(); ?></a>
                                </span>
                            </span>
                            <span class="post_date_info">
                                <?php echo get_the_date(); ?>
                            </span>
                            <?php if ($i == 1) { ?>
                                <span class="post_read_info">
                                    <?php echo do_shortcode('[rt_reading_time postfix="MINS READ" postfix_singular="minute"]') ?>
                                </span>
                            <?php } ?>
                        </div>
                        <h4 class="catpage_post_title"><a href="<?php echo get_permalink(); ?>" class="catpage_post_title_link"><?php echo get_the_title(); ?></a></h4>
                        <p class="catpage_post_excerpt">
                          <?php
                                $excerpt = get_the_excerpt(); 
                                $excerpt = substr( $excerpt, 0, 150 );
                                $result = substr( $excerpt, 0, strrpos( $excerpt, ' ' ) );
                                echo $result; 
                            ?>
                         </p>
                        <a href="<?php echo get_permalink(); ?>" class="catpage_post_link">CONTINUE READING</a>
                    </div>
                <?php $i++; endwhile;
                ?>
              </div>
            <?php endif; ?>
            <?php wp_reset_postdata(); ?>

            <div class="vc_btn3-container  with-icon without_col_change vc_btn3-center text-center mb-5 load-more-div">
                <a class="vc_general vc_btn3 vc_btn3-size-md vc_btn3-shape-round vc_btn3-style-classic vc_btn3-color-success d-inline-block load-more" href="#">Load more</a>
            </div>

        </div>
        <div class="col-md-4 post-sidebar">
            <?php dynamic_sidebar( 'sidebar01' ); ?>
        </div>
    </div>
</div>


<?php get_footer(); ?>

<script type="text/javascript">
  let currentPage = 1;
  $('.load-more').on('click', function(event) {
    event.preventDefault();
    currentPage++; // Do currentPage + 1, because we want to load the next page
    $.ajax({
      type: 'POST',
      url: '/wp-admin/admin-ajax.php',
      dataType: 'json',
      data: {
        action: 'weichie_load_more',
        paged: currentPage,
        page_cat: <?php echo json_encode($page_cat); ?>,
      },
      success: function(res) {
        $('.post-list').append(res.html);
        if (currentPage >= res.max) {
          $('.load-more-div').hide();
        }

      }
    });
  });
</script>

<script>
$(document).ready(function() {
    $(".filter_dropdown").change(function(){
        window.location = $('.filter_dropdown').val();
    });
})
</script>

修复步骤

1. 正确收集选中分类的ID

原代码中$page_cat仅初始化了空数组,但没有将选中分类的ID添加进去。修改分类字段处理部分:

<?php
$terms = get_field('select_cat');
$page_cat = array();
if ($terms) :
    // 遍历选中的分类,收集ID到数组
    foreach ($terms as $term) {
        $page_cat[] = $term->term_id;
    }
?>

2. 调整WP_Query参数

确保只有当$page_cat不为空时,才添加分类筛选条件,避免空数组导致显示所有文章:

<?php
// 初始化基础查询参数
$args = [
    'post_type' => 'post',
    'post_status' => 'publish',
    'posts_per_page' => 9,
    'orderby' => 'date',
    'order' => 'DESC',
    'paged' => 1,
];

// 如果有选中的分类,添加筛选条件
if (!empty($page_cat)) {
    $args['cat'] = $page_cat;
    
    // 如果是自定义分类,建议使用tax_query更通用:
    // $args['tax_query'] = [
    //     [
    //         'taxonomy' => 'category', // 替换为你的自定义分类slug
    //         'field' => 'term_id',
    //         'terms' => $page_cat,
    //     ]
    // ];
}

$posts = new WP_Query($args);
?>

3. 确保AJAX加载更多功能同步生效

需要在后台functions.php中对应的AJAX处理函数weichie_load_more里,同样使用page_cat参数进行筛选:

add_action('wp_ajax_weichie_load_more', 'weichie_load_more');
add_action('wp_ajax_nopriv_weichie_load_more', 'weichie_load_more');

function weichie_load_more() {
    $paged = intval($_POST['paged']);
    $page_cat = $_POST['page_cat'];
    
    $args = [
        'post_type' => 'post',
        'post_status' => 'publish',
        'posts_per_page' => 9,
        'orderby' => 'date',
        'order' => 'DESC',
        'paged' => $paged,
    ];
    
    if (!empty($page_cat)) {
        $args['cat'] = $page_cat;
    }
    
    $posts = new WP_Query($args);
    
    ob_start();
    if ($posts->have_posts()) {
        // 保持文章计数正确,避免第一页之后的布局错乱
        $i = ($paged - 1) * 9 + 1;
        while ($posts->have_posts()) : $posts->the_post();
            $author_id = get_the_author_meta('ID');
            $profilepicture = get_user_meta( $author_id, 'profilepicture', 'true' );
            ?>
            <div class="catpage_post_col col-md-<?php if ($i == 1) {echo "12";}else{echo "6";} ?>">
                <div>
                    <a href="<?php echo get_permalink(); ?>"><img src="<?php echo wp_get_attachment_url( get_post_thumbnail_id($post->ID) ); ?>" class="img-fluid catpage_post_feature_img<?php if ($i == 1) {echo '-01';}?>"></a>
                </div>
                <div>
                    <span class="post_author_info">
                        <img src="<?php echo $profilepicture; ?>" class="post_author_img">
                        <span class="single_post_author_name">
                            <a href="<?php echo esc_url( get_author_posts_url( $author_id ) ); ?>"><?php the_author(); ?></a>
                        </span>
                    </span>
                    <span class="post_date_info">
                        <?php echo get_the_date(); ?>
                    </span>
                    <?php if ($i == 1) { ?>
                        <span class="post_read_info">
                            <?php echo do_shortcode('[rt_reading_time postfix="MINS READ" postfix_singular="minute"]') ?>
                        </span>
                    <?php } ?>
                </div>
                <h4 class="catpage_post_title"><a href="<?php echo get_permalink(); ?>" class="catpage_post_title_link"><?php echo get_the_title(); ?></a></h4>
                <p class="catpage_post_excerpt">
                    <?php
                        $excerpt = get_the_excerpt(); 
                        $excerpt = substr( $excerpt, 0, 150 );
                        $result = substr( $excerpt, 0, strrpos( $excerpt, ' ' ) );
                        echo $result; 
                    ?>
                </p>
                <a href="<?php echo get_permalink(); ?>" class="catpage_post_link">CONTINUE READING</a>
            </div>
            <?php
            $i++;
        endwhile;
    }
    $html = ob_get_clean();
    
    wp_send_json([
        'html' => $html,
        'max' => $posts->max_num_pages,
    ]);
    wp_die();
}

完成以上修改后,页面就会只展示ACF字段中选中分类下的文章,且加载更多功能也会同步筛选结果。

内容的提问来源于stack exchange,提问作者Eliana Alvarado

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 01:58:11