奇怪的PAGE_LINKS行为。首页链接总是我所在的页面,所有其他链接都是正确的

时间:2013-02-18 作者:John B

我使用以下代码生成一些分页:

$wp_query = new WP_Query();
$wp_query->query(\'posts_per_page=5\'.\'&paged=\'.$paged);
$big = 999999999;
echo \'<div class="pagination">\';
echo paginate_links(array(  \'base\' => \'%_%\',
                            \'format\' => str_replace($big, \'%#%\', esc_url(get_pagenum_link( $big ))),
                            \'current\' => max( 1, get_query_var(\'paged\') ),
                            \'total\' => $wp_query->max_num_pages,
                            \'end_size\' =>4,
                            \'type\' => \'list\'));     
    echo \'</div>\';
它在第一页上正确地生成了我的链接,但是如果我转到任何其他页面,除了第1页的链接始终是我所在页面的url之外,其他一切都是正确的。看来我错过了一些简单的事情,有人知道修复方法吗?

3 个回复
最合适的回答,由SO网友:birgire 整理而成

Short answer:

尝试

\'base\' => str_replace( $big, \'%#%\', esc_url( get_pagenum_link( $big ) ) ),
\'format\' => \'?paged=%#%\',

Long answer:

我看了一下paginate_links() 源代码(v3.5.1) 还有这条线(#)

$link = str_replace(\'%_%\', 1 == $n ? \'\' : $format, $base);
这将为您提供空的第一页链接。

通过您的设置$base = "%_%"$format = "http://example.com/page/%#%/" 这就变成了:

$link = str_replace(\'%_%\', 1 == $n ? \'\' : "http://example.com/page/%#%/", "%_%");
我们有两个案例:

n=1:     $link = str_replace(\'%_%\', \'\', "%_%");

n>1:     $link = str_replace(\'%_%\', "http://example.com/page/%#%/", "%_%");
更换后:

n=1:     $link = \'\';

n>1:     $link = "http://example.com/page/%#%/";
下面是paginate_links():

<ul class=\'page-numbers\'>
    <li><a class="prev page-numbers" href="http://example.com/page/2/">&laquo; Previous</a></li>
    <li><a class=\'page-numbers\' href=\'\'>1</a></li>
    <li><a class=\'page-numbers\' href=\'http://example.com/page/2/\'>2</a></li>
    <li><span class=\'page-numbers current\'>3</span></li>
    <li><a class=\'page-numbers\' href=\'http://example.com/page/4/\'>4</a></li>
    <li><a class=\'page-numbers\' href=\'http://example.com/page/5/\'>5</a></li>
    <li><a class=\'page-numbers\' href=\'http://example.com/page/6/\'>6</a></li>
    <li><a class="next page-numbers" href="http://example.com/page/4/">Next &raquo;</a></li>
</ul>
如果您使用(#):

\'base\' => str_replace( $big, \'%#%\', esc_url( get_pagenum_link( $big ) ) ),
\'format\' => \'?paged=%#%\',
然后您会得到:

$link = str_replace(\'%_%\', 1 == $n ? \'\' : "?paged=%#%", "http://example.com/page/%#%"); 
因为不会更换

$link = "http://example.com/page/%#%";  
在这两种情况下(n=1和n>1),您有一个非空的第一页链接,其输出为paginate_links():

<ul class=\'page-numbers\'>
    <li><a class="prev page-numbers" href="http://example.com/page/2/">&laquo; Previous</a></li>
    <li><a class=\'page-numbers\' href=\'http://example.com/page/1/\'>1</a></li>
    <li><a class=\'page-numbers\' href=\'http://example.com/page/2/\'>2</a></li>
    <li><span class=\'page-numbers current\'>3</span></li>
    <li><a class=\'page-numbers\' href=\'http://example.com/page/4/\'>4</a></li>
    <li><a class=\'page-numbers\' href=\'http://example.com/page/5/\'>5</a></li>
    <li><a class=\'page-numbers\' href=\'http://example.com/page/6/\'>6</a></li>
    <li><a class="next page-numbers" href="http://example.com/page/4/">Next &raquo;</a></li>
</ul>
要有一个非空的首页链接$format 可以是任意字符串,只要$base 不包括字符串"%_%", i、 e.这些应能正常工作:

\'format\' => \'?paged=%#%\',
\'format\' => \'page/%#%\',
\'format\' => \'asdfasdfasdfasdfasdf\',
如果不使用permalinks,那么(#) 还将为您提供非空的首页链接,因为

$link = str_replace(\'%_%\', 1 == $n ? \'\' : "?paged=%#%", "http://example.com/?paged=%#%");   
有替换件。

SO网友:PapaSoft

谢谢伯吉尔的帮助。我正在共享我的paginate\\u links()的结果,这些链接完全按照我的需要处理自定义分类页面。

希望这能帮助别人尽快修复它。

这就是:

if (empty($pagerange)) {
    $pagerange = 2;
}
global $paged;
if (empty($paged)) {
    $paged = 1;
}
if ($numpages == \'\') {
    global $wp_query;
    $numpages = $wp_query->max_num_pages;
    if(!$numpages) {
        $numpages = 1;
    }
}        
    $pagination_args = array(
     \'base\'            => str_replace(\'%_%\', 1 == $paged ? \'\' : "?page=%#%", "?page=%#%"),
     \'format\'          => \'?page=%#%\',
     \'total\'           => $numpages,
     \'current\'         => $paged,
     \'show_all\'        => False,
     \'end_size\'        => 1,
     \'mid_size\'        => $pagerange,
     \'prev_next\'       => True,
     \'prev_text\'       => __(\'<i class="fa fa-angle-left"></i>\'),
     \'next_text\'       => __(\'<i class="fa fa-angle-right"></i>\'),
     \'type\'            => \'list\',
     \'add_args\'        => false,
     \'add_fragment\'    => \'\'
    );

$paginate_links = paginate_links($pagination_args);

if ($paginate_links) {
    echo "<nav class=\'custom-pagination\'><ul>";
    echo $paginate_links;
    echo "</ul></nav>";
}

SO网友:Bobz

我偶然发现了一个相同的问题,并发现我可以替换:

\'current\' => max( 1, get_query_var(\'paged\') ),
使用:

\'current\' => max( 1, get_query_var(\'page\') ),
因此,只需在query var中重命名“paged”>“page”,就可以了。

结束

相关推荐

Pagination on custom query

我正在使用以下代码query_posts 要组合自定义搜索,请执行以下操作:$args = array( \'post_type\' => \'species\', \'meta_query\' => $meta_query, \'tax_query\' => $tax_query ); $meta_query 由以下几段代码组成:if (!empty($_POST[\"s_aquarium_H\"])) {