分页:第 3 页未在 WordPress 安装中找到
Pagination : Page 3 Not Found in a WordPress installation
我的问题是我在 Wordpress 中使用的分页。我使用了插件 WP Pagenavi。我不太确定它有什么问题。
我使用以下代码找到了问题的答案:
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php query_posts('cat=4&posts_per_page=15'.'&paged=' . $paged); ?>
但令我失望的是,当我将 posts_per_page 减少到 5 时,我可以让分页工作到第 2 页,但是当我单击第 3 页等时,WordPress 找不到它。我使用了我研究中的另一种解决方案:
<?php
$limit = '5';
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
query_posts('cat=4&showposts=' . $limit . '&paged=' . $paged);
$wp_query->is_archive = true; $wp_query->is_home = false;
?>
还是没有用。我不想碰 functions.php。我只编辑 category.php.
检查下面我的代码块:
<?php if (is_category('category1')) { ?>
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php query_posts('cat=1&posts_per_page=15'.'&paged=' . $paged); ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<!-- SOME CODE TO POST THE POST -->
<?php endwhile; ?>
<?php wp_pagenavi() ?>
<?php endif; ?>
<?php } else if (is_category('category2')) { ?>
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php query_posts('cat=2&posts_per_page=15'.'&paged=' . $paged); ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<!-- SOME CODE TO POST THE POST -->
<?php endwhile; ?>
<?php wp_pagenavi() ?>
<?php endif; ?>
<?php } else if (is_category('category3')) { ?>
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php query_posts('cat=3&posts_per_page=5'.'&paged=' . $paged); ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<!-- SOME CODE TO POST THE POST -->
<?php endwhile; ?>
<?php wp_pagenavi() ?>
<?php endif; ?>
<?php } else if (is_category('category4')) { ?>
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php query_posts('cat=4&posts_per_page=5'.'&paged=' . $paged); ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<!-- SOME CODE TO POST THE POST -->
<?php endwhile; ?>
<?php wp_pagenavi() ?>
<?php endif; ?>
<?php } else { ?>
<!-- SOME CODE -->
<?php } ?>
请注意,类别 1 和类别 2 显示 5 个帖子,而其他 2 个类别将显示 15 个帖子。这些都在 category.php 中。我不想使用在“设置”>“阅读”中设置的帖子数。
如果您认为 if 语句 和 cat ID 是多余的,那么它不会获得该类别的帖子名字.
更新
我使用了这个代码:
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php $args = array ('post_type' => 'post','cat' => '4','posts_per_page' => '5','paged' => $paged);?>
<?php $my_query = new WP_Query ($args);?>
同样,它起作用了,但只显示了两页!连第3页在哪都不知道,应该有第3页吧
您的代码存在一些严重问题
永远不要使用 query_posts
,永远不要。它破坏了这么多插件和功能所依赖的主要查询对象,它也破坏了分页并默默地失败,所以当它失败时很难调试分页。如果您真的必须使用自定义查询,请改用 WP_Query
。您应该花时间阅读 this post 和所有链接的 post。它非常有用,因为它告诉您为什么不应该使用 query_posts
以及何时应该使用自定义查询以及何时不应该使用
这一点是耦合到第一个和链接post。您绝不能更改主查询以在主页或任何类型的存档页面上使用自定义查询。这总是导致比实际解决的问题多得多的问题。在运行之前始终使用 pre_get_posts
来更改主查询。这样,您就可以让主查询正确处理所有繁重的工作,而不会费力。
现在,解决您的问题:
首先,删除所有查询,然后将此代码添加到 category.php(记得替换您的分页功能,wp_pagenavi()
)
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
// Your loop with template tags and html mark up
}
wp_pagenavi();
}
你会立即看到你的类别posts正确显示,但posts的数量将与你在后端设置的阅读
相同]
我们现在将使用 pre_get_posts
来改变每个类别的 post 数量。为此,将以下代码添加到您的 functions.php(需要 PHP 5.3+ 且代码未经测试)
add_action( 'pre_get_posts', function ( $q )
{
if ( !is_admin() // Very important, otherwise back end queries will be affected as well
&& $q->is_main_query() // Very important, we just need to modify the main query
&& $q->is_category() // Only target category pages
) {
// Check on which category page we are and set posts_per_page accordingly
if ( $q->is_category( array( 1, 2 ) ) )
$q->set( 'posts_per_page', 15 );
if ( $q->is_category( array( 3, 4 ) ) )
$q->set( 'posts_per_page', 5 );
}
});
这基本上应该做到了。
我们终于得到了最终答案和工作代码!
如果您阅读了上面 Pieter Goosen 先生的回答,将会对您有所帮助。它真的帮助了我。所以,我要给你最后的答案。这实际上是每个类别中 post 的自定义数量,忽略设置中的设置。
所以在我的 category.php
<?php if (is_category('category1')) { ?>
<?php if ( have_posts() ) {
while ( have_posts() ) {
the_post();
// Your loop with template tags and html mark up
}
wp_pagenavi();
}
?>
<?php } else if (is_category('category2')) { ?>
<?php if ( have_posts() ) {
while ( have_posts() ) {
the_post();
// Your loop with template tags and html mark up
}
wp_pagenavi();
}
?>
<?php } else if (is_category('category3')) { ?>
<?php if ( have_posts() ) {
while ( have_posts() ) {
the_post();
// Your loop with template tags and html mark up
}
wp_pagenavi();
}
?>
<?php } else if (is_category('category4')) { ?>
<?php if ( have_posts() ) {
while ( have_posts() ) {
the_post();
// Your loop with template tags and html mark up
}
wp_pagenavi();
}
?>
<?php } ?>
WHERE category1 和 category2 将显示 5 posts, category3 和 category4 将显示 15 posts.
这就是您要放入 functions.php.
中的内容
add_action( 'pre_get_posts', function($q) {
if (!is_admin() && $q->is_main_query() && $q->is_category()) {
if ($q->is_category( array(1,2) )) {
$q->set('posts_per_page', 5);
}
if ($q->is_category( array(3,4) )) {
$q->set('posts_per_page', 15);
}
}
return;
});
WHERE数组中的数字是类别ID。
如果您比较我的代码和 Sir Pieter 的代码,它几乎是一样的,但是我在 add_action()
关闭之前添加了一个 return;
。但我引用了彼得爵士的话:
It is really strange that you should return. pre_get_posts is a
action, not a filter. But any way, glad it is solved
如果它仍然不适合你,我的永久链接设置为:
http://www.example.com/sample-post/[/%postname%/].
我还有一个 WP No Category Base 插件来消除我的类别 URL 中的 /category/。所以不是www.example.com/category/category1,而是www.example.com/category1.
假设这可以帮助那些像我一样使用 DIVI 儿童主题 !
的人
通过搜索divi pagination终于找到了解决方案。
事实上,就我而言,我构建了一个 divi 子主题。但是,我的自定义类别页面中的每页 post 设置为 3,但在我的 divi > 主题选项中,类别页面上显示的帖子数设置为 6。
这就是第 3 页显示错误 404 的原因。所以,我将其设置为 1。
我在 post 上读到 博客页面最多显示 到 设置 > 阅读选项 有在 post_per_page 自定义查询(主页)下,否则,它会创建一个 404 页面。
但是,Divi 选项中显示的帖子数似乎最多覆盖显示的博客页面。这就是为什么进入我的 category.php 页面时,我卡在了第 3 页。
我给你留下了我的关于我的自定义 category.php divi 主题儿童页面的小代码:
<?php
//query{
//print_r(get_queried_object());
$category = get_queried_object();
$the_cat_nicename = $category->slug;
$the_cat_name = $category->name;
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args_s = new WP_Query(array(
'post_type' => 'post',
'category_name' => $the_cat_nicename,
'posts_per_page' => 3,
'paged' => $paged,
'orderby'=>'date',
'order'=>'DESC'));
//query}
if ( $args_s->have_posts())
{
echo $the_cat_name;
echo '<br/>';
while ( $args_s->have_posts())
{
$args_s->the_post();
$the_id=get_the_ID($post->ID);
echo $the_id.'<br/>';
}
if ($args_s->max_num_pages > 1)
{
echo get_next_posts_link( $GLOBALS['older_post_lang'], $args_s->max_num_pages );
echo get_previous_posts_link( $GLOBALS['newer_post_lang'] );
}
}
//wordpress _have_posts}
?>
不要忘记在 Divi > 主题选项.
中将类别页面上显示的帖子数设置为 1
我的问题是我在 Wordpress 中使用的分页。我使用了插件 WP Pagenavi。我不太确定它有什么问题。
我使用以下代码找到了问题的答案:
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php query_posts('cat=4&posts_per_page=15'.'&paged=' . $paged); ?>
但令我失望的是,当我将 posts_per_page 减少到 5 时,我可以让分页工作到第 2 页,但是当我单击第 3 页等时,WordPress 找不到它。我使用了我研究中的另一种解决方案:
<?php
$limit = '5';
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
query_posts('cat=4&showposts=' . $limit . '&paged=' . $paged);
$wp_query->is_archive = true; $wp_query->is_home = false;
?>
还是没有用。我不想碰 functions.php。我只编辑 category.php.
检查下面我的代码块:
<?php if (is_category('category1')) { ?>
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php query_posts('cat=1&posts_per_page=15'.'&paged=' . $paged); ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<!-- SOME CODE TO POST THE POST -->
<?php endwhile; ?>
<?php wp_pagenavi() ?>
<?php endif; ?>
<?php } else if (is_category('category2')) { ?>
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php query_posts('cat=2&posts_per_page=15'.'&paged=' . $paged); ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<!-- SOME CODE TO POST THE POST -->
<?php endwhile; ?>
<?php wp_pagenavi() ?>
<?php endif; ?>
<?php } else if (is_category('category3')) { ?>
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php query_posts('cat=3&posts_per_page=5'.'&paged=' . $paged); ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<!-- SOME CODE TO POST THE POST -->
<?php endwhile; ?>
<?php wp_pagenavi() ?>
<?php endif; ?>
<?php } else if (is_category('category4')) { ?>
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php query_posts('cat=4&posts_per_page=5'.'&paged=' . $paged); ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<!-- SOME CODE TO POST THE POST -->
<?php endwhile; ?>
<?php wp_pagenavi() ?>
<?php endif; ?>
<?php } else { ?>
<!-- SOME CODE -->
<?php } ?>
请注意,类别 1 和类别 2 显示 5 个帖子,而其他 2 个类别将显示 15 个帖子。这些都在 category.php 中。我不想使用在“设置”>“阅读”中设置的帖子数。
如果您认为 if 语句 和 cat ID 是多余的,那么它不会获得该类别的帖子名字.
更新
我使用了这个代码:
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php $args = array ('post_type' => 'post','cat' => '4','posts_per_page' => '5','paged' => $paged);?>
<?php $my_query = new WP_Query ($args);?>
同样,它起作用了,但只显示了两页!连第3页在哪都不知道,应该有第3页吧
您的代码存在一些严重问题
永远不要使用
query_posts
,永远不要。它破坏了这么多插件和功能所依赖的主要查询对象,它也破坏了分页并默默地失败,所以当它失败时很难调试分页。如果您真的必须使用自定义查询,请改用WP_Query
。您应该花时间阅读 this post 和所有链接的 post。它非常有用,因为它告诉您为什么不应该使用query_posts
以及何时应该使用自定义查询以及何时不应该使用这一点是耦合到第一个和链接post。您绝不能更改主查询以在主页或任何类型的存档页面上使用自定义查询。这总是导致比实际解决的问题多得多的问题。在运行之前始终使用
pre_get_posts
来更改主查询。这样,您就可以让主查询正确处理所有繁重的工作,而不会费力。
现在,解决您的问题:
首先,删除所有查询,然后将此代码添加到 category.php(记得替换您的分页功能,
wp_pagenavi()
)if ( have_posts() ) { while ( have_posts() ) { the_post(); // Your loop with template tags and html mark up } wp_pagenavi(); }
你会立即看到你的类别posts正确显示,但posts的数量将与你在后端设置的阅读
相同]我们现在将使用
pre_get_posts
来改变每个类别的 post 数量。为此,将以下代码添加到您的 functions.php(需要 PHP 5.3+ 且代码未经测试)add_action( 'pre_get_posts', function ( $q ) { if ( !is_admin() // Very important, otherwise back end queries will be affected as well && $q->is_main_query() // Very important, we just need to modify the main query && $q->is_category() // Only target category pages ) { // Check on which category page we are and set posts_per_page accordingly if ( $q->is_category( array( 1, 2 ) ) ) $q->set( 'posts_per_page', 15 ); if ( $q->is_category( array( 3, 4 ) ) ) $q->set( 'posts_per_page', 5 ); } });
这基本上应该做到了。
我们终于得到了最终答案和工作代码!
如果您阅读了上面 Pieter Goosen 先生的回答,将会对您有所帮助。它真的帮助了我。所以,我要给你最后的答案。这实际上是每个类别中 post 的自定义数量,忽略设置中的设置。
所以在我的 category.php
<?php if (is_category('category1')) { ?>
<?php if ( have_posts() ) {
while ( have_posts() ) {
the_post();
// Your loop with template tags and html mark up
}
wp_pagenavi();
}
?>
<?php } else if (is_category('category2')) { ?>
<?php if ( have_posts() ) {
while ( have_posts() ) {
the_post();
// Your loop with template tags and html mark up
}
wp_pagenavi();
}
?>
<?php } else if (is_category('category3')) { ?>
<?php if ( have_posts() ) {
while ( have_posts() ) {
the_post();
// Your loop with template tags and html mark up
}
wp_pagenavi();
}
?>
<?php } else if (is_category('category4')) { ?>
<?php if ( have_posts() ) {
while ( have_posts() ) {
the_post();
// Your loop with template tags and html mark up
}
wp_pagenavi();
}
?>
<?php } ?>
WHERE category1 和 category2 将显示 5 posts, category3 和 category4 将显示 15 posts.
这就是您要放入 functions.php.
add_action( 'pre_get_posts', function($q) {
if (!is_admin() && $q->is_main_query() && $q->is_category()) {
if ($q->is_category( array(1,2) )) {
$q->set('posts_per_page', 5);
}
if ($q->is_category( array(3,4) )) {
$q->set('posts_per_page', 15);
}
}
return;
});
WHERE数组中的数字是类别ID。
如果您比较我的代码和 Sir Pieter 的代码,它几乎是一样的,但是我在 add_action()
关闭之前添加了一个 return;
。但我引用了彼得爵士的话:
It is really strange that you should return. pre_get_posts is a action, not a filter. But any way, glad it is solved
如果它仍然不适合你,我的永久链接设置为:
http://www.example.com/sample-post/[/%postname%/].
我还有一个 WP No Category Base 插件来消除我的类别 URL 中的 /category/。所以不是www.example.com/category/category1,而是www.example.com/category1.
假设这可以帮助那些像我一样使用 DIVI 儿童主题 !
的人通过搜索divi pagination终于找到了解决方案。
事实上,就我而言,我构建了一个 divi 子主题。但是,我的自定义类别页面中的每页 post 设置为 3,但在我的 divi > 主题选项中,类别页面上显示的帖子数设置为 6。
这就是第 3 页显示错误 404 的原因。所以,我将其设置为 1。
我在 post 上读到 博客页面最多显示 到 设置 > 阅读选项 有在 post_per_page 自定义查询(主页)下,否则,它会创建一个 404 页面。
但是,Divi 选项中显示的帖子数似乎最多覆盖显示的博客页面。这就是为什么进入我的 category.php 页面时,我卡在了第 3 页。
我给你留下了我的关于我的自定义 category.php divi 主题儿童页面的小代码:
<?php
//query{
//print_r(get_queried_object());
$category = get_queried_object();
$the_cat_nicename = $category->slug;
$the_cat_name = $category->name;
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args_s = new WP_Query(array(
'post_type' => 'post',
'category_name' => $the_cat_nicename,
'posts_per_page' => 3,
'paged' => $paged,
'orderby'=>'date',
'order'=>'DESC'));
//query}
if ( $args_s->have_posts())
{
echo $the_cat_name;
echo '<br/>';
while ( $args_s->have_posts())
{
$args_s->the_post();
$the_id=get_the_ID($post->ID);
echo $the_id.'<br/>';
}
if ($args_s->max_num_pages > 1)
{
echo get_next_posts_link( $GLOBALS['older_post_lang'], $args_s->max_num_pages );
echo get_previous_posts_link( $GLOBALS['newer_post_lang'] );
}
}
//wordpress _have_posts}
?>
不要忘记在 Divi > 主题选项.
中将类别页面上显示的帖子数设置为 1