一个分页问题搞了一晚上和一上午,分页函数`paginate_links`生成的链接一直是`/page/2`这种,并且打不开,提示找不到页面。
google+baidu 几乎找遍了也没找到解决方案。最后在看`paginate_links`参数时,发现第一个参数`base`的意思是”Base of the paginated url”,翻译过来就是“分页URL的基础”,忽然意识到是不是这个参数的原因。
由于之前分页代码是在网上随便找的,`base`参数是
$big = 999999999;
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
打印了一下它的值是http://localhost/case/page/%#%
,也就是说生成的分页链接就是/case/page/%#%
这种格式的。
那么到此就可以确定是该参数的问题,解决办法就是不使用该参数,或者使用它的默认值%_%
,即可把分页URL改成http://localhost/case?page=2
这种默认样式。
至于为什么只有默认URL样式才能访问,而page/2
这样样式会找不到页面,就不得而知了。
最终改过之后的代码如下:
global $wp_query;
echo paginate_links( array(
'base' => '%_%',
'format' => '?page=%#%',
'current' => max( 1, get_query_var('page') ),
'total' => $wp_query->max_num_pages
) );
附一个兼容boostrap4的分页样式:
// 兼容bootstrap4的分页
function bootstrap_pagination(\WP_Query $wp_query = null, $echo = true) {
if (null === $wp_query) {
global $wp_query;
}
$pages = paginate_links(
[
//'base' => str_replace( 999999999, '%#%', esc_url( get_pagenum_link( 999999999 ) ) ),
'format' => '?page=%#%',
'current' => max(1, get_query_var('paged')),
'total' => $wp_query->max_num_pages,
'type' => 'array',
'show_all' => false,
'end_size' => 3,
'mid_size' => 1,
'prev_next' => true,
'prev_text' => __('« 上一页'),
'next_text' => __('下一页 »'),
'add_args' => false,
'add_fragment' => ''
]
);
if (is_array($pages)) {
//$paged = ( get_query_var( 'paged' ) == 0 ) ? 1 : get_query_var( 'paged' );
$pagination = '<div class="pagination"><ul class="pagination">';
foreach ($pages as $page) {
$pagination .= '<li class="page-item' . (strpos($page, 'current') !== false ? ' active' : '') . '"> ' . str_replace('page-numbers', 'page-link', $page) . '</li>';
}
$pagination .= '</ul></div>';
if ($echo) {
echo $pagination;
} else {
return $pagination;
}
}
return null;
}
经验教训:复制网上的代码时,要弄懂每一行在干什么,不要随意粘贴到自己的项目中。
本文为“技术点滴”的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。