WordPress功能函数add_query_arg(),检索修改后的URL查询字符串。
用法:
add_query_arg( $args )
描述
您可以使用此函数重新生成URL,并将查询变量追加到URL查询。有两种方式使用这个函数;可以是单个键和值,也可以是关联数组。
使用单个键和值:
add_query_arg( ‘key’, ‘value’, ‘http://ex**ple.com’ );
使用关联数组:
add_query_arg( array(
‘key1’ => ‘value1’,
‘key2’ => ‘value2’,
), ‘http://ex**ple.com’ );
从任何一个使用中忽略URL都会导致当前使用的URL ($_SERVER[‘REQUEST_URI’]的值)。
值应该使用urlencode()或rawurlencode()进行适当编码。
将任何查询变量的值设置为布尔值false将删除键(请参阅remove_query_arg())。
重要提示:add_query_arg()的返回值默认情况下不转义。输出应该使用esc_url()或类似的方法进行后期转义,以帮助防止跨站点脚本攻击(XSS)的漏洞。
参数:
$key
(string|array) (必需) 查询变量键或查询变量的关联数组。
$value
(string) (可选) 可以是查询变量值,也可以是要操作的URL。
$url
(string) (可选) 要根据的URL。
返回
(string)新的URL查询字符串(未转义)。
更多信息
使用:
// Par**eters as separate arguments
add_query_arg( $par**1, $par**2, $old_query_or_uri );
// Par**eters as array of key => value pairs
add_query_arg(
array(
‘key1’ => ‘value1’,
‘key2’ => ‘value2’,
…
),
$old_query_or_uri
);
来源:
文件: wp-includes/functions.php
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 ) = e**lode( ‘?’, $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( ‘#=(&**p;|$)#’, ‘$1’, $ret );
$ret = $protocol . $base . $ret . $frag;
$ret = rtrim( $ret, ‘?’ );
return $ret;
}
更新日志:
用户贡献的笔记
(由Codex – 6年前贡献)
假设我们在WordPress的URL“http://blog.ex**ple.com/client/?”请注意在输出链接之前使用了esc_url()。这是必要的,因为该函数不转义url,如果输出不转义,将使页面容易受到XSS脚本的攻击。
// This would output ‘/client/?s=word&**p;foo=bar’
echo esc_url( add_query_arg( ‘foo’, ‘bar’ ) );
// This would output ‘/client/?s=word&**p;foo=bar&**p;baz=tiny’
$arr_par**s = array( ‘foo’ => ‘bar’, ‘baz’ => ‘tiny’ );
echo esc_url( add_query_arg( $arr_par**s ) );
(Ah**d Awais于5年前贡献)
安全地将用户重定向到plugins.php中的自定义页面
// Redirect to Welcome Page.
// Redirects to your-do**in.com/wp-admin/plugin.php?page=your_plugin_page.
wp_safe_redirect( add_query_arg( array( ‘page’ => ‘your_plugin_page’ ), admin_url( ‘plugins.php’ ) ) );
(由Codex – 6年前贡献)
由于get_per**link()返回一个完整的URL,所以当您想要向post的页面添加变量时,可以使用它。
/*
* This would output whatever the URL to post ID 9 is, with ‘hello=there’
* appended with either ? or &**p;, depending on what’s needed.
*/
echo esc_url( add_query_arg( ‘hello’, ‘there’, get_per**link( 9 ) ) );
(由Codex – 6年前贡献)
通过关联数组移除值和设置:
$query = ‘http://ex**ple.com/link?foo=bar’;
$new_query = add_query_arg( array(
‘foo’ => false,
‘baz’ => ‘qux’
), $query );
print( $new_query );
// http://ex**ple.com/link?baz=qux
(由Codex – 6年前贡献)
通常情况下,您可能会发现自己在当前页面中使用以下方法创建url。在这些情况下,可以使用希望影响的URL作为最后一个参数。这里不需要使用esc_url(),因为这个值是安全的。
// This would output ‘http://blog.ex**ple.com/2009/04/16/?hello=world’
echo esc_url( add_query_arg( ‘hello’, ‘world’, ‘http://blog.ex**ple.com/2009/04/16/’ ) );
(由gardelin贡献- 2个月前)
如果查询字符串值以==结束,则去掉一个=。
add_query_arg( array( ‘something’ => ‘blabla==’ ), ‘https://www.google.com’ );
结果将是
https://www.google.com?something=blabla=
但是应该是
https://www.google.com?something=blabla==
(由janw贡献。5年前)
一种使用add_query_arg获取当前总url的方法
home_url( add_query_arg( null, null ));
暂无评论内容