每当我的URL有多个查询字符串时,分页链接就会生成其他#038

时间:2018-05-11 作者:Mavichow

我生成的分页链接结果将包含其他#038; 在url中,我可以知道如何删除它吗?

<小时/>Blog page url :http://localhost/wordpress/blog/

我已经用函数设置了分页paginate_links, 当我按第[2]页时:

Blog page Page 2 url :http://localhost/wordpress/blog/page/2/

(以上一切正常)


但是,每当我的博客页面URL有某些参数用于我的WP\\U查询筛选/排序时,paginate\\u链接结果将有额外的参数,请参阅下面的URL

Blog page with Params Url :http://localhost/wordpress/blog/?filter=23&orderby=oldest

Blog page with Params Page 2 Url : http://localhost/wordpress/blog/page/2/?filter=23&orderby=oldest#038;orderby=oldest

我需要实现的URL是http://localhost/wordpress/blog/page/2/?filter=23&orderby=oldest

以下是我的分页链接功能:

global $wp_query;
$big = 99999999999;    

paginate_links([
    \'base\'      => str_replace( $big, \'%#%\', esc_url( get_pagenum_link( $big ) ) ),
    \'format\'    => \'?paged=%#%\',
    \'prev_text\' => __(\'&lt;\'),
    \'next_text\' => __(\'&gt;\'),
    \'current\'   => max( 1, get_query_var(\'paged\') ),
    \'type\'      => \'list\',
    \'total\'     => $wp_query->max_num_pages,
    ]);

2 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

无需两次转义URL-get_pagenum_link() 默认情况下,返回转义URL&mdash;当第二个参数为true, esc_url() 使用;其他的esc_url_raw() 使用时间:

esc_url(): http://localhost/wordpress/blog/?filter=23&#038;orderby=oldest

带有esc_url_raw(): http://localhost/wordpress/blog/?filter=23&orderby=oldest

And the problem occurs when the base contains ?, or a query string, and that the URL is escaped (e.g. using esc_url()).

因为esc_url() 转换& (与号)到其HTML实体,即&#038;, 当base 包含查询字符串,paginate_links() 将分析base 值/URL,以及& 都逃了出来& 和最近的= 被视为查询字符串名称,并添加到base\'s查询字符串:

http://localhost/wordpress/blog/?filter=23&orderby=oldest#038;orderby=oldest
在上面的示例中,URL是这样的,因为paginate_links() (或者更准确地说,wp_parse_str() used 在里面paginate_links()) 已解释#038;orderby 作为oldest; i、 e。#038;orderby=oldest &mdash;应该是这样的&orderby=oldest 钥匙在哪里orderby.

(当然,浏览器在# 作为URL片段。如果你点击链接,在下一页,$_GET 将没有的条目#038;orderby; i、 e。$_GET[\'#038;orderby\'] 不存在。)

So here are several ways to fix/avoid the problem:

    使用html_entity_decode() 就像WordPress一样does 通过paginate_links():

    \'base\' => str_replace( $big, \'%#%\', html_entity_decode( get_pagenum_link( $big ) ) )
    
    打电话时get_pagenum_link(), 将第二个参数设置为false:

    \'base\' => str_replace( $big, \'%#%\', get_pagenum_link( $big, false ) )
    
    使用str_replace() 更换&#038; 具有&:

    \'base\' => str_replace( [ $big, \'&#038;\' ], [ \'%#%\', \'&\' ], get_pagenum_link( $big ) )
    
不要担心无法逃脱base 因为paginate_links() 实际转义返回结果中的所有链接/URL。

友好警告:此答案中的一些链接指向一个巨大的HTML文件/网页

SO网友:Krzysiek Dróżdż

看起来这是一个known issue 具有paginate_links 作用

这里有一个快速的解决方法,只要查询参数值中没有符号,它就会很好地工作:

<?php
    global $wp_query;
    $big = 99999999999;

    echo paginate_links(array(
        \'base\'      => str_replace( array($big, \'#038;\'), array(\'%#%\', \'\'), esc_url( get_pagenum_link( $big ) ) ),
        \'format\'    => \'?paged=%#%\',
        \'prev_text\' => __(\'&lt;\'),
        \'next_text\' => __(\'&gt;\'),
        \'current\'   => max( 1, get_query_var(\'paged\') ),
        \'type\'      => \'list\',
        \'total\'     => $wp_query->max_num_pages,
    ));
?>

结束

相关推荐