From ed03cc32dc77660cf3020d1f6b854a7abb7df5c4 Mon Sep 17 00:00:00 2001 From: Mark Jaquith Date: Sat, 8 Sep 2007 14:27:24 +0000 Subject: [PATCH] Only urlencode previously existing values in add_query_arg() (more backwards compatible). fixes #4935. see #4084. see #4878 git-svn-id: https://develop.svn.wordpress.org/trunk@6064 602fd350-edb4-49c9-b593-d223f7449a82 --- wp-includes/compat.php | 21 +++++++++++++++------ wp-includes/functions.php | 10 ++++++---- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/wp-includes/compat.php b/wp-includes/compat.php index 38a6652cf0..efbf1b657b 100644 --- a/wp-includes/compat.php +++ b/wp-includes/compat.php @@ -105,25 +105,34 @@ if (!function_exists('http_build_query')) { } // from php.net (modified by Mark Jaquith to behave like the native PHP5 function) -function _http_build_query($data, $prefix=null, $sep=null, $key='') { +function _http_build_query($data, $prefix=null, $sep=null, $key='', $urlencode=true) { $ret = array(); + if ( $urlencode ) { + $lsb = '%5B'; + $rsb = '%5D'; + } else { + $lsb = '['; + $rsb = ']'; + } foreach ( (array) $data as $k => $v ) { - $k = urlencode($k); + if ( $urlencode) + $k = urlencode($k); if ( is_int($k) && $prefix != null ) $k = $prefix.$k; if ( !empty($key) ) $k = $key . '%5B' . $k . '%5D'; - if ( $v === NULL ) continue; elseif ( $v === FALSE ) $v = '0'; if ( is_array($v) || is_object($v) ) - array_push($ret,_http_build_query($v, '', $sep, $k)); - else + array_push($ret,_http_build_query($v, '', $sep, $k, $urlencode)); + elseif ( $urlencode ) array_push($ret, $k.'='.urlencode($v)); - } + else + array_push($ret, $k.'='.$v); + } if ( NULL === $sep ) $sep = ini_get('arg_separator.output'); diff --git a/wp-includes/functions.php b/wp-includes/functions.php index a3b9066449..b6b7a26da0 100644 --- a/wp-includes/functions.php +++ b/wp-includes/functions.php @@ -581,6 +581,10 @@ function is_new_day() { } } +function build_query($data) { + return _http_build_query($data, NULL, '&', '', false); +} + /* add_query_arg: Returns a modified querystring by adding a single key & value or an associative array. @@ -635,6 +639,7 @@ function add_query_arg() { } wp_parse_str($query, $qs); + $qs = urlencode_deep($qs); // this re-URL-encodes things that were already in the query string if ( is_array(func_get_arg(0)) ) { $kayvees = func_get_arg(0); $qs = array_merge($qs, $kayvees); @@ -647,10 +652,7 @@ function add_query_arg() { unset($qs[$k]); } - if ( ini_get('arg_separator.output') === '&') - $ret = http_build_query($qs, '', '&'); - else - $ret = _http_build_query($qs, NULL, '&'); + $ret = build_query($qs); $ret = trim($ret, '?'); $ret = preg_replace('#=(&|$)#', '$1', $ret); $ret = $protocol . $base . $ret . $frag;