添加锚到PAGINATE_LINKS+Safari锚错误

时间:2015-07-22 作者:Pipo

我不太明白pagination_links() 作品这是我的分页功能:

$big = 999999999;
$translated = __( \'Page \', \'epc\' );

echo paginate_links( array(
    \'base\' => str_replace( $big, \'%#%\', esc_url( get_pagenum_link( $big ) ) ),
    \'format\' => \'?page=%#%\', // Here I\'d like to add my anchor #result
    \'current\' => max( 1, get_query_var( \'paged\' ) ),
    \'total\' => $wp_query->max_num_pages,
    \'before_page_number\' => \'<span class="screen-reader-text">\'.$translated.\' </span>\',
    \'prev_text\' => __( \'Précédent\', \'epc\' ),
    \'next_text\' => __( \'Suivant\', \'epc\' ),
    \'type\' => \'list\',
    ) 
);
然而,我已经打开了permalink,所以格式?page=%#% 已更改为/page/#/. 到目前为止还不错。但我有两个问题:

首先,我的查询在permalink中有两个变量,如下所示?programme=10&type=2. 当我进入第二页时,wordpress添加#038;type=2 在permalink的末尾(现在我有?programme=10&type=2#038;type=2). 我不知道为什么。

第二,如果我尝试在格式中添加锚点?page=%#%#result 这行不通。如果我尝试将变量重命名为?nb=%#%#result 它仍然不起作用。我甚至试过/page/#/#result 因为它符合permalink的结构,但仍然没有运气。有人能告诉我正确的方向或解释一下这里发生了什么吗?

谢谢!

<小时>

UPDATE 1

感谢@bonger comment,permalink可以完美地与以下更新的代码配合使用:

$big = 999999999;
$translated = __( \'Page \', \'epc\' );
echo paginate_links( array(
    \'base\' => str_replace( $big, \'%#%\', get_pagenum_link( $big, false ) ),
    \'current\' => max( 1, get_query_var( \'paged\' ) ),
    \'total\' => $wp_query->max_num_pages,
    \'before_page_number\' => \'<span class="screen-reader-text">\'.$translated.\' </span>\',
    \'prev_text\' => __( \'Précédent\', \'epc\' ),
    \'next_text\' => __( \'Suivant\', \'epc\' ),
    \'type\' => \'list\',
    \'add_fragment\' => \'#result\',
) );
然而,在进一步挖掘之后,单击之前的链接就会松开锚in Safari only (在Chrome和Firefox中运行良好)。我读过this old post Safari处理重定向的方式似乎有些奇怪。

知道吗,我的上一个链接显示此hrefhttp://mywebsite.com/page/1/#resulthttp://mywebsite.com/page/1/?programme=10&type=2#result 取决于过滤。但是,当我单击它时,它会重定向到http://mywebsite.com/http://mywebsite.com/?programme=10&type=2. 显然,Safari需要/#anchor但我不知道如何将其添加到fragment arg,它逃跑了。有什么想法吗?

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

如果它对任何人都有帮助,下面是当您想将Wordpress分页和锚定添加到模板页面时可能发生的问题的完整答案。

<小时>

STEP 1

跟随the example on the Codex 因此paginate_links() 函数适用于自定义查询,而不适用于主查询。

<小时>

STEP 2

您的函数应如下所示:

global $wp_query;

$big = 999999999; // need an unlikely integer
$translated = __( \'Page\', \'mytextdomain\' ); // Supply translatable string

echo paginate_links( array(
    \'base\' => str_replace( $big, \'%#%\', esc_url( get_pagenum_link( $big ) ) ),
    \'format\' => \'?paged=%#%\',
    \'current\' => max( 1, get_query_var(\'paged\') ),
    \'total\' => $wp_query->max_num_pages,
    \'before_page_number\' => \'<span class="screen-reader-text">\'.$translated.\' </span>\'
) );
现在,此代码可能会出现几个问题,下面是几个解决方案:

如果您删除\'format\' => \'?paged=%#%\', line and let Wordpress做的是格式化permalink(打开pretty permalink可能会导致问题);

您可能会遇到以下问题:# 如果你逃离get_pagenum_link()功能输出。在这种情况下,只需移除esc_url() 本部分功能esc_url( get_pagenum_link( $big ) ) ;

有一个参数可以添加你的锚,它叫做add_fragment.

查看codex以查看可用于此函数的所有参数。最后,您的代码将如下所示:

$big = 999999999;
$translated = __( \'Page\', \'mytextdomain\' );
echo paginate_links( array(
    \'base\' => str_replace( $big, \'%#%\', get_pagenum_link( $big, false ) ),
    \'current\' => max( 1, get_query_var( \'paged\' ) ),
    \'total\' => $wp_query->max_num_pages,
    \'before_page_number\' => \'<span class="screen-reader-text">\'.$translated.\' </span>\',
    \'prev_text\' => __( \'Précédent\', \'epc\' ), // In case you want to change the previous link text
    \'next_text\' => __( \'Suivant\', \'epc\' ), In case you want to change the next link text
    \'type\' => \'list\', // How you want the return value to be formatted
    \'add_fragment\' => \'#result\', // Your anchor
) );
<小时>

STEP 3

最后,Safari如何处理带有锚点的页面重定向存在问题。返回Safari的第一页时,您可能会发现没有应用锚定。你需要做的(如果你打开了permalink)是过滤你的page/1 防止重定向。像这样:

add_filter( \'paginate_links\', \'custom_pagination_redirect\' );

function custom_pagination_redirect( $link ) {
    return preg_replace( \'%/page/1/%\', \'/\', $link );
}
就这样!非常感谢@bonger提供的宝贵帮助!

结束

相关推荐

Frontpage pagination by week

我正试图建立一个包含本周所有帖子的frontpage。这很简单(查询片段):$query_string = array( \'post_type\' => \'post\', \'date_query\' => array( array( \'year\' => date( \'Y\' ), \'week\' => date( \'W\' ),