老实说,我真的认为你所有的痛苦都是由分页功能造成的,正如我们刚才简要讨论的那样。
您确实有几个问题是导致您遇到问题的原因
无论出于何种原因,将主查询更改为自定义查询几乎总是一件令人头痛的事,应该始终避免。主查询可以通过pre_get_posts
满足您的需求。我已经做了a post 刚才关于这个完整的问题,你可以去读一下
取消主查询与使用query_posts
, 你永远不应该使用它。这可能是分页彻底失败的主要原因之一
Note: 此功能不适用于插件或主题。如后文所述,有更好、性能更好的选项来更改主查询。query\\u posts()是一种过于简单且有问题的方法,通过将页面的主查询替换为新的查询实例来修改它。它效率低下(重新运行SQL查询),并且在某些情况下会彻底失败(尤其是在处理POST分页时)。
我认为调试这个问题并继续前进的最简单方法是去掉自定义查询。复制此代码并将其粘贴到分类中。php文件。
<div class="container">
<?php
while( have_posts() ) {
the_post();
?>
<!--product image and title-->
<div>
<a href="<?php the_permalink(); ?>"><img src="<?php the_field(\'image\'); ?>" alt="Name of Product"></a>
</div><!--product-image-->
<div>
<?php the_field(\'title\'); ?>
</div><!--title end-->
<?php } ?>
<?php
//getting paginations in numbers
global $wp_query;
$total_pages = $wp_query->max_num_pages;
$current_page = max(1, get_query_var(\'paged\'));
echo paginate_links(array(
\'base\' => get_pagenum_link(1) . \'%_%\',
\'format\' => \'/page/%#%\',
\'current\' => $current_page,
\'total\' => $total_pages,
\'before_page_number\' => \'<div class="pagination-navigation">\',
\'after_page_number\' => \'</div>\'
));
?>
</div><!--container end-->
你现在至少应该得到正确的帖子,按照发布日期的顺序。首先,确保其工作正常。如果分页不起作用,请不要担心,正如我所说的,我知道您的函数有问题
您现在可以使用pre_get_posts
更改帖子顺序并添加自定义posts_per_page
在函数中粘贴以下内容。php
add_action( \'pre_get_posts\', function ( $q ) {
if( !is_admin() && $q->is_main_query() && $q->is_tax() ) {
$q->set( \'posts_per_page\', 10 );
$q->set( \'orderby\', \'rand\' );
}
});
默认情况下,分类法页面上应包含帖子类型,因此无需将其添加到
pre_get_posts
行动
这将为您提供模板的正确输出。正如我所说的,确保这是有效的,如果分页不起作用,现在不要担心这一点,首先获得应该得到的输出。
如果除了分页之外,所有功能都正常工作,则需要查看分页函数。进行所有这些更改后,如果分页不起作用,请告诉我
问题
当您导航到结果的第二页时,这些帖子会再次随机返回,您会得到一组完全不同的帖子,其中可能包含也可能不包含您已经查看过的帖子
解决方案。。。我们将使用MySQL’s RAND()
函数,并为其提供种子值,以便在每次后续页面加载时使用相同的随机顺序。为此,我们将随机字符串存储为PHP会话变量,以便MySQL可以使用它作为每个页面使用顺序的参考。
请注意,关于代码,您将在该代码段的第7行注意到一个额外的操作–每次加载文章的第一页时,我们都会重置种子值。这意味着,只要有人停留在分页页面上,他们就会看到一组一致的结果,但一旦他们回到第一页,随机性就会重置,他们会以完全不同的顺序看到帖子。
session_start();
add_filter( \'posts_orderby\', \'randomise_with_pagination\' );
function randomise_with_pagination( $orderby ) {
if( is_tax() ) {
// Reset seed on load of initial archive page
if( ! get_query_var( \'paged\' ) || get_query_var( \'paged\' ) == 0 || get_query_var( \'paged\' ) == 1 ) {
if( isset( $_SESSION[\'seed\'] ) ) {
unset( $_SESSION[\'seed\'] );
}
}
// Get seed from session variable if it exists
$seed = false;
if( isset( $_SESSION[\'seed\'] ) ) {
$seed = $_SESSION[\'seed\'];
}
// Set new seed if none exists
if ( ! $seed ) {
$seed = rand();
$_SESSION[\'seed\'] = $seed;
}
// Update ORDER BY clause to use seed
$orderby = \'RAND(\' . $seed . \')\';
}
return $orderby;
}
编辑2这段代码工作得很好,我现在已经一遍又一遍地测试了它。如果这对您不起作用,您必须重新检查代码。你必须注意以下几点。
给定的代码only 以分类法归档页为目标,这就是is_tax()
使用条件标记。如果您需要在任何其他模板上使用该标记,则需要修改/更改该条件标记
贴子不重复,贴子only 重置当访问第一篇帖子时,其他页面不受影响。确保未缓存您的结果。
作为最后一次尝试,以下是only 您应该从函数中的此答案获得的代码。php
add_action( \'pre_get_posts\', function ( $q ) {
if( !is_admin() && $q->is_main_query() && $q->is_tax() ) {
$q->set( \'posts_per_page\', 10 );
$q->set( \'orderby\', \'rand\' );
}
});
session_start();
add_filter( \'posts_orderby\', \'randomise_with_pagination\' );
function randomise_with_pagination( $orderby ) {
if( is_tax() ) {
// Reset seed on load of initial archive page
if( ! get_query_var( \'paged\' ) || get_query_var( \'paged\' ) == 0 || get_query_var( \'paged\' ) == 1 ) {
if( isset( $_SESSION[\'seed\'] ) ) {
unset( $_SESSION[\'seed\'] );
}
}
// Get seed from session variable if it exists
$seed = false;
if( isset( $_SESSION[\'seed\'] ) ) {
$seed = $_SESSION[\'seed\'];
}
// Set new seed if none exists
if ( ! $seed ) {
$seed = rand();
$_SESSION[\'seed\'] = $seed;
}
// Update ORDER BY clause to use seed
$orderby = \'RAND(\' . $seed . \')\';
}
return $orderby;
}