WordPress搜索结果中普通页面无链接,如何兼容文章与页面?
WordPress搜索结果兼容文章与页面的正确实现
核心问题
WordPress默认搜索仅包含post类型内容,所以你的页面不会出现在搜索结果里,原有循环只处理主查询返回的文章,自然看不到页面的跳转链接。
推荐实现方法:修改主查询(简洁且兼容分页)
直接在主题的functions.php中添加钩子,让主查询包含文章和页面:
function include_pages_in_search( $query ) { if ( $query->is_search() && $query->is_main_query() && ! is_admin() ) { $query->set( 'post_type', array( 'post', 'page' ) ); } } add_action( 'pre_get_posts', 'include_pages_in_search' );
添加后,你原有的循环代码无需改动:
<?php if( have_posts() ): while( have_posts() ): the_post();?> <!-- 这里的模板标签对文章和页面都生效 --> <div class="search-result"> <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2> <?php the_excerpt(); ?> </div> <?php endwhile; else: ?> <p>未找到匹配内容</p> <?php endif; ?>
the_permalink()、the_title()等模板标签会自动适配当前循环的内容类型(文章/页面),页面的跳转链接自然就能正常显示。
你用get_pages失败的常见原因
- 未关联搜索关键词:
get_pages默认不会过滤搜索词,你需要手动传入当前搜索的关键词,否则会返回所有页面,不是匹配搜索结果的页面:// 正确的带搜索过滤的get_pages用法 $search_term = get_search_query(); $pages = get_pages( array( 's' => $search_term, 'post_status' => 'publish' ) ); - 循环逻辑冲突:如果同时保留原文章循环和
get_pages循环,需要分别处理两个数据集,且the_permalink()这类依赖全局$post的标签,在get_pages循环里需要用get_permalink($page->ID)替代:// 单独循环页面的示例(不推荐,分页会出问题) foreach( $pages as $page ) { echo '<h3><a href="' . get_permalink( $page->ID ) . '">' . $page->post_title . '</a></h3>'; } - 分页问题:
get_pages的分页逻辑和主查询不兼容,单独处理会导致搜索结果分页混乱,这也是不推荐用这种方法的主要原因。
内容的提问来源于stack exchange,提问作者Dannie
相关产品推荐
相关产品推荐

