分页功能在 WordPress 中不起作用
Posted
技术标签:
【中文标题】分页功能在 WordPress 中不起作用【英文标题】:Pagination function doesn't work in WordPress 【发布时间】:2018-03-10 05:15:29 【问题描述】:尽管完全遵循the example in the codex,但我在单击分页next
链接(http://localhost:3000/my_project/news/page/2/)时到达的页面不存在(“找不到页面”)。
为什么?
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1; echo 'paged = ' . $paged;
$regular_posts = new WP_Query('posts_per_page=3&paged=' . $paged);
while ($regular_posts->have_posts()): $regular_posts->the_post();
the_title();
endwhile;
echo get_next_posts_link('Older Entries', $regular_posts->max_num_pages);
此代码包含在我的“home.php”模板中,用于管理我在仪表板中创建并在“阅读设置”中设置为“帖子页面”的“新闻”页面。
【问题讨论】:
您是要在静态主页还是存档页面上执行此操作? (它看起来像一个存档页面,但我只是想确认一下)。它是一个存档页面,如果它用于帖子或自定义帖子? 对不起,我应该提到这一点。此代码属于“home.php”模板,管理我在仪表板中创建并在“阅读设置”中设置为“帖子页面”的“新闻”页面。它适用于常规的 WP 帖子。 【参考方案1】:静态主页与存档略有不同,因为它是page
参数而不是paged
。
Codex Pagination 页面包含此静态主页代码,它实际上适用于所有情况(即甚至存档页面),因为它会检查两个参数:
if ( get_query_var( 'paged' ) ) $paged = get_query_var( 'paged' );
elseif ( get_query_var( 'page' ) ) $paged = get_query_var( 'page' );
else $paged = 1;
但是如果您只需要它在主页上工作,将 $paged 变量的代码更改为以下代码也应该可以:
$paged = (get_query_var('page')) ? get_query_var('page') : 1;
【讨论】:
实际上我意识到localhost:3000/my_project/news/page/2 给出了“找不到页面”,这就是它没有显示任何内容的原因。 localhost:3000/my_project/news 是我的帖子页面。使用您的代码时,我仍然收到“找不到页面”,您知道接下来要尝试什么吗? @drake035 您是否使用带有“新闻”标签的自定义帖子类型?如果没有,您是否使用页面和自定义模板在“新闻”页面下显示帖子? 是的,我正在使用一个名为“新闻”的 WP 页面(在仪表板中创建的常规 WP 页面),并且该 WP 页面在“阅读设置”中设置为“帖子页面”。【参考方案2】:你可以把这段代码放在function.php文件中,
function pagination($pages = '', $range = 4)
$showitems = ($range * 2) + 1;
global $paged;
if (empty($paged))
$paged = 1;
if ($pages == '')
global $wp_query;
$pages = $wp_query->max_num_pages;
if (!$pages)
$pages = 1;
if (1 != $pages)
echo "<div class=\"fl-w-left main-pagination\">";
if ($paged > 2 && $paged > $range + 1 && $showitems < $pages)
echo "<a href='" . get_pagenum_link(1) . "'>« First</a>";
if ($paged > 1 && $showitems < $pages)
echo "<a href='" . get_pagenum_link($paged - 1) . "'>‹ Previous</a>";
echo '<ul>';
for ($i = 1; $i <= $pages; $i++)
if (1 != $pages && (!($i >= $paged + $range + 1 || $i <= $paged - $range - 1) || $pages <= $showitems ))
echo ($paged == $i) ? "<li class=\"active\">" . $i . "</li>" : "<a href='" . get_pagenum_link($i) . "'>" . $i . "</a>";
echo '</ul>';
if ($paged < $pages && $showitems < $pages)
echo "<a href=\"" . get_pagenum_link($paged + 1) . "\">Next ›</a>";
if ($paged < $pages - 1 && $paged + $range - 1 < $pages && $showitems < $pages)
echo "<a href='" . get_pagenum_link($pages) . "'>Last »</a>";
echo "</div>\n";
另外,将此代码放在您的页面或发布模板文件中,
<?php if (function_exists("pagination")) ?>
<?php pagination($post_query->max_num_pages); ?>
<?php
?>
【讨论】:
WordPress 核心已经有一个分页助手paginate_links()
并且当页面 2 返回 404 时,不会执行页面或帖子模板文件,404.php
将【参考方案3】:
用WP_Query
的新实例更改模板中的$wp_query->posts_per_page
不起作用,因为在执行模板之前,WordPress 已经根据$wp_query->max_num_pages
验证了请求的页码。由于请求的页面大于主查询的此值,因此会提供 404.php
模板,而您在 home.php
模板中的代码甚至不会执行。
诀窍是让$wp_query->max_num_pages
在执行主查询之前通过操作主查询以使用您的自定义参数来匹配真正的最大页数。然后$wp_query->posts_per_page
和$wp_query->found_posts
将匹配您的结果,从而产生$wp_query->max_num_pages
。
在我看来,最好的方法是在主查询获得其帖子之前编辑主查询参数。例如,您可以在主题的 functions.php 中添加以下内容:
function custom_main_query($query)
if(is_admin()) return;
if(!$query->is_main_query()) return;
if(is_home()) $query->set('posts_per_page', 3);
add_action('pre_get_posts', 'custom_main_query');
这意味着标准循环也可以解决问题:
// Standard loop
while (have_posts()) : the_post();
the_title();
endwhile;
// Navigation links
previous_posts_link('Newer Entries');
next_posts_link('Older Entries');
如果您只控制每页的帖子数量,最好通过转到 WordPress 管理员中的 Options => Reading
并在此处将 Blog pages show at most
设置为 3 来更改每页的默认帖子。
【讨论】:
【参考方案4】:发生此错误的原因通常是对模板上显示的帖子数量设置了限制。这有可能设置为小于 4。所以转到您的 WordPress 仪表板并导航到 Settings->Reading
。查找 博客页面最多显示,如果该值小于 4,则将其增加到模板上显示的帖子总数,加上分页链接(在您的情况下,这应该在至少 4)。
【讨论】:
以上是关于分页功能在 WordPress 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
使用动态数据时,搜索和分页功能在 DataTable 中不起作用