WordPress中使用WP_Query查询产品时分页链接不显示求助
解决WP_Query自定义查询下分页链接不显示的问题
嘿,这个分页坑我之前也踩过!问题出在next_posts_link()和previous_posts_link()这两个函数默认是依赖全局的$wp_query对象的,而你用的是自己创建的$loop自定义查询对象,所以它们找不到正确的分页数据,自然就不显示链接了。
给你两个靠谱的解决方案,优先用第一个:
方案一:给分页函数传入自定义查询的总页数
next_posts_link()的第二个参数可以指定查询的总页数,也就是你的$loop->max_num_pages,这样函数就能识别到自定义查询的分页信息了。另外注意,用完自定义查询后应该用wp_reset_postdata()而不是wp_reset_query()——后者是用来恢复被query_posts()修改的全局查询,而你用的是WP_Query,恢复全局$post对象用wp_reset_postdata()更合适。
修改后的完整代码:
<?php // 获取当前页码,静态首页需要特殊处理(后面会说) $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1; $args = array( 'post_type' => 'product', 'posts_per_page' => 3, 'paged' => $paged ); $loop = new WP_Query( $args ); while ( $loop->have_posts() ) : $loop->the_post(); global $product; echo '<br /><a href="'.get_permalink().'">' . woocommerce_get_product_thumbnail().' '.get_the_title().'</a>'; endwhile; // 给next_posts_link传入自定义查询的总页数 next_posts_link( '下一页', $loop->max_num_pages ); previous_posts_link( '上一页' ); // 恢复全局$post对象 wp_reset_postdata(); ?>
额外提示:静态首页的页码获取
如果你的分页是在静态首页(后台「设置-阅读」里把首页设为了静态页面),那get_query_var('paged')会取不到值,这时候要改用get_query_var('page'),可以把页码获取的代码改成这样:
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1; // 静态首页特殊处理 if ( is_front_page() && !is_home() ) { $paged = ( get_query_var( 'page' ) ) ? get_query_var( 'page' ) : 1; }
方案二:临时替换全局$wp_query对象(不推荐,仅特殊场景用)
这个方法是把自定义查询对象临时赋值给全局的$wp_query,让分页函数误以为是默认查询,用完再恢复。但这个方法可能干扰全局查询的状态,所以除非万不得已,优先用方案一。
代码示例:
<?php $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1; if ( is_front_page() && !is_home() ) { $paged = ( get_query_var( 'page' ) ) ? get_query_var( 'page' ) : 1; } $args = array( 'post_type' => 'product', 'posts_per_page' => 3, 'paged' => $paged ); // 保存全局查询的备份 $temp_query = $wp_query; $wp_query = new WP_Query( $args ); while ( $wp_query->have_posts() ) : $wp_query->the_post(); global $product; echo '<br /><a href="'.get_permalink().'">' . woocommerce_get_product_thumbnail().' '.get_the_title().'</a>'; endwhile; // 现在分页函数可以正常工作了 next_posts_link( '下一页' ); previous_posts_link( '上一页' ); // 恢复全局查询 $wp_query = $temp_query; wp_reset_postdata(); ?>
按照方案一修改后,你的分页链接应该就能正常显示啦!
内容的提问来源于stack exchange,提问作者yogihosting
相关产品推荐
相关产品推荐

