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

WordPress面包屑提前获取$post_counter变量问题求助

解决面包屑提前获取筛选后帖子数量的问题

我明白你遇到的问题了——面包屑要显示筛选后的房产数量,但因为它在文章循环上方,而$post_counter是在循环里才定义和赋值的,所以调用的时候变量还不存在,自然会报错。咱们来一步步解决这个问题:

核心问题分析

原来的代码里,$post_counter是在循环内部逐步累加的,而且get_posts查询也是在循环代码块里执行的。面包屑在循环之前,这时候查询还没执行,变量也没定义,根本拿不到正确的数量。

解决方案:把查询和计数逻辑提前

我们可以把筛选参数处理、get_posts查询的逻辑移到面包屑代码之前,然后直接用count($posts)来获取筛选后的房产总数(比循环累加更高效),这样面包屑就能直接拿到这个数值了。

步骤1:提前执行查询与计数

先把筛选参数处理和get_posts查询的代码放在最前面:

<?php
// 处理筛选参数
if($_GET['min_price'] && !empty($_GET['min_price'])){ 
    $min_price = $_GET['min_price']; 
}else{ 
    $min_price = 0; 
} 
if($_GET['max_price'] && !empty($_GET['max_price'])){ 
    $max_price = $_GET['max_price']; 
}else{ 
    $max_price = 10000000; 
} 
if($_GET['min_beds'] && !empty($_GET['min_beds'])){ 
    $min_beds = $_GET['min_beds']; 
}else{ 
    $min_beds = '1'; 
} 
if($_GET['max_beds'] && !empty($_GET['max_beds'])){ 
    $max_beds = $_GET['max_beds']; 
}else{ 
    $max_beds = '6+'; 
} 
if($_GET['location'] && !empty($_GET['location'])){ 
    $location = $_GET['location']; 
    $location_val = stripslashes($location); 
} 
if($_GET['type'] && !empty($_GET['type'])){ 
    $type = $_GET['type']; 
}else{ 
    $type = array("Detached", "Semi-Detached", "Terraced", "End of Terrace", "Apartment", "Bungalow", "Commercial"); 
} 
if($_GET['flash_type'] && !empty($_GET['flash_type'])){ 
    $flash_type = $_GET['flash_type']; 
}else{ 
    $flash_type = array("Ideal First Time Buy", "Ideal Investment", "Under Offer", "Nothing Selected"); 
}

// 执行查询
$posts = get_posts(array( 
    'posts_per_page' => -1, 
    'post_type' => 'property', 
    'orderby' => 'date', 
    'meta_query' => array( 
        'relation' => 'AND', 
        array( 
            'key' => 'property_status', 
            'value' => 'For Sale' 
        ), 
        array( 
            'key' => 'property_price', 
            'type' => 'NUMERIC', 
            'value' => array($min_price, $max_price), 
            'compare' => 'BETWEEN' 
        ), 
        array( 
            'key' => 'bedrooms', 
            'value' => array($min_beds, $max_beds), 
            'compare' => 'BETWEEN' 
        ), 
        array( 
            'relation' => 'OR', 
            array( 
                'key' => 'street', 
                'value' => $location_val, 
                'compare' => 'LIKE' 
            ), 
            array( 
                'key' => 'town', 
                'value' => $location_val, 
                'compare' => 'LIKE' 
            ), 
            array( 
                'key' => 'county', 
                'value' => $location_val, 
                'compare' => 'LIKE' 
            ), 
            array( 
                'key' => 'postcode', 
                'value' => $location_val, 
                'compare' => 'LIKE' 
            ) 
        ), 
        array( 
            'key' => 'type_of_property', 
            'value' => $type, 
            'compare' => 'IN' 
        ), 
        array( 
            'key' => 'optional_category', 
            'value' => $flash_type, 
            'compare' => 'IN' 
        ), 
    ) 
));

// 获取房产总数
$post_counter = count($posts);
?>

步骤2:修正后的面包屑代码

现在面包屑可以直接使用$post_counter了,同时修复原来代码里的标签闭合错误:

<div class="container">
    <div class="row">
        <div class="col">
            <div id="crumb">
                <p>Now showing <?php echo $post_counter; ?> properties</p>
                <?php 
                // 显示选中的房产类型
                if( isset($_GET['type']) && !empty($_GET['type']) ){ 
                    $crumb_type = $_GET['type']; 
                    foreach($crumb_type as $val) { 
                        echo '<span>'.$val.'</span>';
                        // 如果不是最后一个元素,添加分隔符
                        if($val != end($crumb_type)){
                            echo ', ';
                        }
                    }
                }
                ?>
            </div>
        </div>
    </div>
</div>

步骤3:调整后的文章循环代码

现在循环部分可以直接使用提前查询好的$posts变量,不需要再重新执行查询,而且$post_counter已经提前计算好了,循环里的累加可以去掉(如果不需要在循环里做其他计数逻辑的话):

<section id="properties">
    <div class="container">
        <div class="row">
            <div class="col">
                <div class="row">
                    <?php if( $posts ):?>
                        <?php foreach( $posts as $post ): setup_postdata( $post ); ?>
                            <div class="col-sm-6 col-md-4 col-lg-3">
                                <div class="shadowwrapper2">
                                    <a href="<?php the_permalink(); ?>">
                                        <?php 
                                        $main_field = get_field('images'); 
                                        $first_row = $main_field[0]; 
                                        $img = $first_row['image']; 
                                        $img_med = $img['sizes']['medium']; 
                                        ?>
                                        <div class="propertywrapper">
                                            <img class="img-fluid gal_imgs" src="<?php echo $img_med ?>" alt="<?php echo $img['alt']; ?>"/>
                                            <?php $secondary_flash = get_field('optional_category'); ?>
                                            <?php if($secondary_flash == "Ideal First Time Buy"): ?>
                                                <span class="second_flash">Ideal First Time Buy</span>
                                            <?php elseif($secondary_flash == "Ideal Investment"): ?>
                                                <span class="second_flash">Ideal Investment</span>
                                            <?php elseif($secondary_flash == "Under offer"): ?>
                                                <span class="second_flash">Under offer</span>
                                            <?php endif; ?>
                                        </div>
                                        <div class="cornerflash">
                                            <img src="<?php bloginfo('template_directory'); ?>/imgs/forsale.svg" alt="corner flash">
                                        </div>
                                        <div class="propertyinfo">
                                            <div class="row m-0">
                                                <div class="col-6 p-0 mt-2"><?php the_field('type_of_property'); ?></div>
                                                <div class="col-6 p-0 mt-2"><?php the_field('bedrooms'); ?> bedrooms</div>
                                            </div>
                                        </div>
                                        <div class="streetpricewrapper">
                                            <p class="streetname">
                                                <?php the_field('street'); ?>, <?php the_field('town'); ?>
                                            </p>
                                            <p class="price">
                                                £<?php the_field('property_price'); ?>
                                            </p>
                                        </div>
                                    </a>
                                </div>
                            </div>
                        <?php endforeach; ?>
                        <?php wp_reset_postdata(); ?>
                    <?php endif; ?>
                </div>
            </div>
        </div>
    </div>
</section>

额外优化点

  • 用count($posts)替代循环累加,代码更简洁高效,避免重复逻辑
  • 给面包屑里的类型标签添加了分隔符判断,避免最后一个元素后面多一个逗号
  • 修复了原来面包屑代码里未闭合的<span>标签错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:22:00