| 328 | /** |
| 329 | * Test that encoded URLs work when adding as an array of key=>value |
| 330 | * @ticket 17923 |
| 331 | */ |
| 332 | public function test_add_query_arg_with_encoding() { |
| 333 | $old_req_uri = $_SERVER['REQUEST_URI']; |
| 334 | |
| 335 | $qs_urls = array( |
| 336 | '/?baz', |
| 337 | '/2012/07/30/?baz', |
| 338 | 'edit.php?baz', |
| 339 | admin_url( 'edit.php?baz' ), |
| 340 | admin_url( 'edit.php?baz', 'https' ), |
| 341 | admin_url( 'edit.php?baz&za=1' ), |
| 342 | admin_url( 'edit.php?baz=1&za=1' ), |
| 343 | admin_url( 'edit.php?baz=0&za=0' ), |
| 344 | ); |
| 345 | $args = array( |
| 346 | 'p' => '456', |
| 347 | 'q' => 'abc', |
| 348 | 'r' => '&s', |
| 349 | 't' => 'u&v', |
| 350 | 'w' => '@' |
| 351 | ); |
| 352 | $args_str = 'p=456&q=abc&r&s&t=u&v&w=@'; |
| 353 | $encoded_args_str = 'p=456&q=abc&r=%26s&t=u%26v&w=%40'; |
| 354 | foreach ( $qs_urls as $url ) { |
| 355 | $_SERVER['REQUEST_URI'] = $url; |
| 356 | $this->assertEquals( "$url&$args_str", add_query_arg( $args ) ); |
| 357 | $this->assertEquals( "$url&$args_str", add_query_arg( $args, $url ) ); |
| 358 | $this->assertEquals( "$url&$args_str", add_query_arg( $args, $url ) ); |
| 359 | $this->assertEquals( "$url&$encoded_args_str", add_query_arg( $args, false, false, true ) ); |
| 360 | $this->assertEquals( "$url&$encoded_args_str", add_query_arg( $args, $url, false, true ) ); |
| 361 | } |
| 362 | |
| 363 | // Test that encoded URLs work when adding one-by-one |
| 364 | $url = '/wordpress/2011/12/08/sample-post'; |
| 365 | foreach ( $args as $_k => $_v ) |
| 366 | $url = add_query_arg( $_k, $_v, $url, true ); |
| 367 | $this->assertEquals( '/wordpress/2011/12/08/sample-post?p=456&q=abc&r=%26s&t=u%26v&w=%40', $url ); |
| 368 | |
| 369 | // Encoded URLs work (e.g. output matches rawurlencode) |
| 370 | $url = '/wordpress/'; |
| 371 | $args = '!@#$%^&*()_+=-[]{}\|";:\',.<>/?`~'; |
| 372 | $this->assertEquals( $url . '?args=' . $args, add_query_arg('args', $args, $url) ); |
| 373 | $this->assertEquals( $url . '?args=' . rawurlencode($args), add_query_arg('args', $args, $url, true) ); |
| 374 | |
| 380 | // Arg from the end |
| 381 | $url = '/wordpress/?p=123'; |
| 382 | $this->assertEquals( '/wordpress/', remove_query_arg('p', $url) ); |
| 383 | |
| 384 | // Arg from the middle |
| 385 | $url = '/wordpress/?p=123&q=456&r&s'; |
| 386 | $this->assertEquals( '/wordpress/?p=123&q=456&s', remove_query_arg('r', $url) ); |
| 387 | |
| 388 | // Multiple calls |
| 389 | $url = '/wordpress/?p=123&q=456&r&s'; |
| 390 | $url = remove_query_arg('s', $url); |
| 391 | $url = remove_query_arg('r', $url); |
| 392 | $url = remove_query_arg('q', $url); |
| 393 | $url = remove_query_arg('p', $url); |
| 394 | $this->assertEquals( '/wordpress/', $url ); |
| 395 | |
| 396 | // Trailing ampersand |
| 397 | $url = '/wordpress/?p=123&'; |
| 398 | $this->assertEquals( '/wordpress/', remove_query_arg('p', $url) ); |
| 399 | |
| 400 | // From REQUEST_URI |
| 401 | $old_request_uri = $_SERVER['REQUEST_URI']; |
| 402 | $_SERVER['REQUEST_URI'] = '/wordpress/?p=123&q=456&r&s'; |
| 403 | $url = remove_query_arg('s'); |
| 404 | $url = remove_query_arg('r', $url); |
| 405 | $url = remove_query_arg('q', $url); |
| 406 | $url = remove_query_arg('p', $url); |
| 407 | $this->assertEquals( '/wordpress/', $url ); |
| 408 | $_SERVER['REQUEST_URI'] = $old_request_uri; |
| 409 | } |
| 410 | |