WordPress函数:add_query_arg 给 url 拼接参数

追格官方小助手/ 2022年08月30日/ WordPress/ 浏览 2983


开发中,总是需要给 url 拼接参数,为此,WordPress非常贴心的提供了一个函数 add_query_arg。


add_query_arg 支持两种调用方式,即单个的参数,或参数数组:


add_query_arg( 'key', 'value', 'http://www.zhuige.com' );

add_query_arg( array(
    'key1' => 'value1',
    'key2' => 'value2',
), 'http://www.zhuige.com' );


add_query_arg 绝不仅仅是把参数拼接到 URL 尾部,还做了很多兼容,优化,安全等工作。另外,WordPress 官方强烈建议,对返回的 url ,要使用 esc_url 进行处理。


add_query_arg 的源码,还是比较复杂的:


function add_query_arg( ...$args ) {
    if ( is_array( $args[0] ) ) {
        if ( count( $args ) < 2 || false === $args[1] ) {
            $uri = $_SERVER['REQUEST_URI'];
        } else {
            $uri = $args[1];
        }
    } else {
        if ( count( $args ) < 3 || false === $args[2] ) {
            $uri = $_SERVER['REQUEST_URI'];
        } else {
            $uri = $args[2];
        }
    }
 
    $frag = strstr( $uri, '#' );
    if ( $frag ) {
        $uri = substr( $uri, 0, -strlen( $frag ) );
    } else {
        $frag = '';
    }
 
    if ( 0 === stripos( $uri, 'http://' ) ) {
        $protocol = 'http://';
        $uri      = substr( $uri, 7 );
    } elseif ( 0 === stripos( $uri, 'https://' ) ) {
        $protocol = 'https://';
        $uri      = substr( $uri, 8 );
    } else {
        $protocol = '';
    }
 
    if ( strpos( $uri, '?' ) !== false ) {
        list( $base, $query ) = explode( '?', $uri, 2 );
        $base                .= '?';
    } elseif ( $protocol || strpos( $uri, '=' ) === false ) {
        $base  = $uri . '?';
        $query = '';
    } else {
        $base  = '';
        $query = $uri;
    }
 
    wp_parse_str( $query, $qs );
    $qs = urlencode_deep( $qs ); // This re-URL-encodes things that were already in the query string.
    if ( is_array( $args[0] ) ) {
        foreach ( $args[0] as $k => $v ) {
            $qs[ $k ] = $v;
        }
    } else {
        $qs[ $args[0] ] = $args[1];
    }
 
    foreach ( $qs as $k => $v ) {
        if ( false === $v ) {
            unset( $qs[ $k ] );
        }
    }
 
    $ret = build_query( $qs );
    $ret = trim( $ret, '?' );
    $ret = preg_replace( '#=(&|$)#', '$1', $ret );
    $ret = $protocol . $base . $ret . $frag;
    $ret = rtrim( $ret, '?' );
    $ret = str_replace( '?#', '#', $ret );
    return $ret;
}


如果,我们自己拼接 url 基本不可能考虑的这么周全,所以,强烈建议使用 add_query_arg 拼接url。


使用举例:


// This would output 'https://www.zhuige.com/product.html?free=1'
echo esc_url(add_query_arg('free', '1', 'https://www.zhuige.com/product.html'));

// This would output 'https://www.zhuige.com/product.html?cat=22&free=1'
$arr_params = array('cat' => '22', 'free' => '1');
echo esc_url(add_query_arg($arr_params, 'https://www.zhuige.com/product.html'));

发表评论

暂无评论,抢个沙发...

客服 工单