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
相关产品推荐
相关产品推荐

