WordPress分页失败或分页计算不准的原因

2022-03-08 0 776

今天在写个分类法功能,然后用到query_posts 和tax_query函数,查出分类筛选结果发现,分页无论如何都不正常,比如我设置每页显示10条,一共有30条,正确的应该有三个分页,而实际查询显示出的分页却是6页,第4/5/6页实际打开是显示没有结果的,为此,花费了我近两小时查找原因。下面记录解决此问题中更新到的知识点。

应该使用WP_Query而不是query_posts

WP_Query是WordPress自带的的一个用于处理复杂请求的类,是WordPress的主查询类,而query_posts函数官方则直接说明要尽量少用。

  • 注意:query_posts函数将完全覆盖主查询,不适用于插件或主题。其过于简单的修改主查询的方法可能会有问题,应尽可能避免。在大多数情况下,有更好的,更高性能的选项来修改主查询,例如通过WP_Query中的'pre_get_posts'操作。
  • query_posts()是一种改变WordPress用于显示帖子的主查询的方法。它通过将主查询放在一边,并用新查询替换它来完成此操作。要在调用query_posts后进行清理,请调用wp_reset_query(),并恢复原始主查询。
  • 对于一般的帖子查询,请使用WP_Query或get_posts()。

WordPress分页失败或分页计算不准的原因

理解wp查询功能

例如,在主页上,您通常会看到最新的10个帖子。如果你只想显示5个帖子(并且不关心分页),你可以像这样使用query_posts():

query_posts - 您永远不应该使用query_posts。除了上文所说的,query_posts真正的大问题是,它破坏了主查询对象(存储在$wp_query中)。很多插件和自定义代码都依赖于主查询对象,因此打破主查询对象意味着您打破了插件和自定义代码的功能。主函数影响分页功能,所以如果你打破了主要查询,就会破坏分页。

要证明query_posts有多糟糕,请在任何模板上执行以下操作并比较结果

var_dump( $wp_query );
query_posts( '&posts_per_page=-1' );
var_dump( $wp_query );

get_postsWP_Query是构建辅助查询(如静态首页上的相关文章,滑块,精选内容)的正确方法。应该注意的是,不应该在主页,单页或任何类型的归档页面上使用两者中的任何一个,因为它会破坏页面功能。如果需要修改主查询,请使用pre_get_posts来完成,而不是自定义查询。

你可能忘记wp_reset_postdata了

wp_reset_postdata函数可将模板标记的上下文从辅助查询循环还原回主查询循环。这里的重点你要看好,是从辅助查询循环还原回主查询循环,这非常关键,也可以理解为为什么WordPress分页失败或计算不准确的原因,你使用了辅助查询,但却没有在查询完后还原回主查询,这样就造成了分页失败。

示例

标准循环

<?php
// The Query
$the_query = new WP_Query( $args );
// The Loop
if ( $the_query->have_posts() ) {
	echo '<ul>';
	while ( $the_query->have_posts() ) {
		$the_query->the_post();
		echo '<li>' . get_the_title() . '</li>';
	}
	echo '</ul>';
	/* Restore original Post Data */
	wp_reset_postdata();
} else {
	// no posts found
}

多重循环

如果您有多个查询,则需要执行多个循环。像这样……

<?php
// The Query
$query1 = new WP_Query( $args );
if ( $query1->have_posts() ) {
	// The Loop
	while ( $query1->have_posts() ) {
		$query1->the_post();
		echo '<li>' . get_the_title() . '</li>';
	}
	
	/* Restore original Post Data 
	 * NB: Because we are using new WP_Query we aren't stomping on the 
	 * original $wp_query and it does not need to be reset with 
	 * wp_reset_query(). We just need to set the post data back up with
	 * wp_reset_postdata().
	 */
	wp_reset_postdata();
}
/* The 2nd Query (without global var) */
$query2 = new WP_Query( $args2 );
if ( $query2->have_posts() ) {
	// The 2nd Loop
	while ( $query2->have_posts() ) {
		$query2->the_post();
		echo '<li>' . get_the_title( $query2->post->ID ) . '</li>';
	}
	// Restore original Post Data
	wp_reset_postdata();
}
?>

每页显示条数应该使用posts_per_page

在我查到的很多参考文章中,多数都在使用showposts来设置每页显示的条数,但在官方文档中明确说了:

  • posts_per_page(int) - 每页显示的帖子数(自2.1版以来可用,替换了showposts参数)。使用'posts_per_page'=> - 1显示所有帖子('offset'参数被忽略,值为-1)。

目前最新版本已经是WordPress 5.1.1,应该跟上步伐。

正确使用paged分页参数

  • paged(int) - 页数。使用“旧条目”链接显示通常在第X页上显示的帖子。

实例

// 每页显示3条数据
$query = new WP_Query( array( 'posts_per_page' => 3 ) );
// 在一个页面显示所有数据
$query = new WP_Query( array( 'posts_per_page' => -1 ) );
// 通过禁用分页显示所有数据
$query = new WP_Query( array( 'nopaging' => true ) );
// 显示第6页的数据
$query = new WP_Query( array( 'paged' => 6 ) );

显示当前页面中的帖子,并在未设置查询变量时将“paged”参数设置为1(第一页)。

$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$query = new WP_Query( array( 'paged' => $paged ) );

显示最近的一条最新的置顶数据,如果没有返回发布的最后一篇帖子:

$sticky = get_option( 'sticky_posts' );
$args = array(
	'posts_per_page'      => 1,
	'post__in'            => $sticky,
	'ignore_sticky_posts' => 1,
);
$query = new WP_Query( $args );

等等。

参考

:本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可, 转载请附上原文出处链接。
1、本站提供的源码不保证资源的完整性以及安全性,不附带任何技术服务!
2、本站提供的模板、软件工具等其他资源,均不包含技术服务,请大家谅解!
3、本站提供的资源仅供下载者参考学习,请勿用于任何商业用途,请24小时内删除!
4、如需商用,请购买正版,由于未及时购买正版发生的侵权行为,与本站无关。
5、本站部分资源存放于百度网盘或其他网盘中,请提前注册好百度网盘账号,下载安装百度网盘客户端或其他网盘客户端进行下载;
6、本站部分资源文件是经压缩后的,请下载后安装解压软件,推荐使用WinRAR和7-Zip解压软件。
7、如果本站提供的资源侵犯到了您的权益,请邮件联系: 442469558@qq.com 进行处理!

猪小侠源码-最新源码下载平台 WordPress教程 WordPress分页失败或分页计算不准的原因 http://www.20zxx.cn/365236/wordpres/wordpressq.html

猪小侠源码,优质资源分享网

常见问题
  • 本站所有资源版权均属于原作者所有,均只能用于参考学习,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,建议提前注册好百度网盘账号,使用百度网盘客户端下载
查看详情

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务