WordPress分页改不了分页URL的问题,并且分页 页面提示“找不到页面”

一个分页问题搞了一晚上和一上午,分页函数`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 版权协议,转载请附上原文出处链接及本声明。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注