使用rewind_posts()按文章类型分组搜索结果时如何显示无结果提示
问题原因
你当前的逻辑只做了全局搜索结果存在的判断,每个post_type对应的标签循环内仅做了内容过滤,没有统计对应类型的结果数量,所以无法识别空结果场景输出提示。
修复后的代码
<?php if ( have_posts() ) { ?> <section class="tabs" id="pages"> <?php $page_count = 0; while( have_posts() ) { the_post(); if ( $post->post_type == 'page' ) { include(locate_template('partials/pages.php', false, false)); $page_count++; } } if($page_count === 0) { echo '<p>No results</p>'; } ?> </section> <?php rewind_posts(); ?> <section class="tabs" id="people"> <?php $people_count = 0; while( have_posts() ) { the_post(); if ( $post->post_type == 'people' ) { include(locate_template('partials/profile.php', false, false)); $people_count++; } } if($people_count === 0) { echo '<p>No results</p>'; } ?> </section> <?php rewind_posts(); ?> <section class="tabs" id="documents"> <?php $doc_count = 0; while( have_posts() ) { the_post(); if ( $post->post_type == 'documents' ) { include(locate_template('partials/document.php', false, false)); $doc_count++; } } if($doc_count === 0) { echo '<p>No results</p>'; } ?> </section> <?php rewind_posts(); ?> </div>
可选优化方案
如果站点搜索结果量级较大,多次循环重绕会产生不必要的性能开销,可以提前把搜索结果按post_type分组存入数组,后续直接遍历对应数组即可,不需要重复执行主循环:
<?php // 仅执行一次主循环完成结果分组 $results_by_type = []; if(have_posts()) { while(have_posts()) { the_post(); $results_by_type[$post->post_type][] = $post; } rewind_posts(); } ?> <!-- page标签输出 --> <section class="tabs" id="pages"> <?php if(!empty($results_by_type['page'])): foreach($results_by_type['page'] as $post) { setup_postdata($post); include(locate_template('partials/pages.php', false, false)); } wp_reset_postdata(); else: ?> <p>No results</p> <?php endif; ?> </section> <!-- 其余people、documents标签逻辑和上述一致,直接读取对应数组即可 -->
该写法后续新增post_type分类标签时扩展效率更高。
内容的提问来源于stack exchange,提问作者blackbear333
相关产品推荐
相关产品推荐

