WordPress.org

Make WordPress Core

Ticket #16840: 16840.3.diff

File 16840.3.diff, 6.5 KB (added by DrewAPicture, 4 years ago)
  • src/wp-includes/class-wp-rewrite.php

     
    15101510         * the top of the rules.
    15111511         *
    15121512         * @since 2.1.0
     1513         * @since 4.4.0 Array support was added to the `$redirect` parameter.
    15131514         * @access public
    15141515         *
    1515          * @param string $regex    Regular expression to match against request.
    1516          * @param string $redirect URL regex redirects to when regex matches request.
    1517          * @param string $after    Optional, default is bottom. Location to place rule.
     1516         * @param string       $regex    Regular expression to match against request.
     1517         * @param string|array $redirect URL regex redirects to when regex matches request, or array
     1518         *                               of query vars and values.
     1519         * @param string       $after    Optional, default is bottom. Location to place rule.
    15181520         */
    1519         public function add_rule($regex, $redirect, $after = 'bottom') {
    1520                 //get everything up to the first ?
    1521                 $index = (strpos($redirect, '?') === false ? strlen($redirect) : strpos($redirect, '?'));
    1522                 $front = substr($redirect, 0, $index);
    1523                 if ( $front != $this->index ) { //it doesn't redirect to WP's index.php
    1524                         $this->add_external_rule($regex, $redirect);
     1521        public function add_rule( $regex, $redirect, $after = 'bottom' ) {
     1522                if ( is_array( $redirect ) ) {
     1523                        $external = false;
     1524                        $redirect = add_query_arg( $redirect, 'index.php' );
    15251525                } else {
     1526                        $index = false === strpos( $redirect, '?' ) ? strlen( $redirect ) : strpos( $redirect, '?' );
     1527                        $front = substr( $redirect, 0, $index );
     1528
     1529                        $external = $front != $this->index;
     1530                }
     1531
     1532                // "external" = it doesn't redirect to index.php
     1533                if ( $external ) {
     1534                        $this->add_external_rule( $regex, $redirect );
     1535                } else {
    15261536                        if ( 'bottom' == $after)
    15271537                                $this->extra_rules = array_merge($this->extra_rules, array($regex => $redirect));
    15281538                        else
    15291539                                $this->extra_rules_top = array_merge($this->extra_rules_top, array($regex => $redirect));
    1530                         //$this->extra_rules[$regex] = $redirect;
    15311540                }
    15321541        }
    15331542
  • src/wp-includes/rewrite-functions.php

     
    77 */
    88
    99/**
    10  * Add a straight rewrite rule.
     10 * Adds a straight rewrite rule.
    1111 *
    1212 * @since 2.1.0
     13 * @since 4.4.0 Array support was added to the `$redirect` parameter.
    1314 *
    14  * @global WP_Rewrite $wp_rewrite
     15 * @global WP_Rewrite $wp_rewrite WordPress Rewrite Component.
    1516 *
    16  * @param string $regex    Regular Expression to match request against.
    17  * @param string $redirect Page to redirect to.
    18  * @param string $after    Optional, default is 'bottom'. Where to add rule, can also be 'top'.
     17 * @param string       $regex    Regular Expression to match request against.
     18 * @param string|array $redirect Page to redirect to, or array of query vars and values.
     19 * @param string       $after    Optional, default is 'bottom'. Where to add rule, can also be 'top'.
    1920 */
    20 function add_rewrite_rule($regex, $redirect, $after = 'bottom') {
     21function add_rewrite_rule( $regex, $redirect, $after = 'bottom' ) {
    2122        global $wp_rewrite;
    22         $wp_rewrite->add_rule($regex, $redirect, $after);
     23
     24        $wp_rewrite->add_rule( $regex, $redirect, $after );
    2325}
    2426
    2527/**
  • tests/phpunit/tests/rewrite/addRewriteRule.php

     
     1<?php
     2
     3/**
     4 * @group rewrite
     5 */
     6class Tests_Rewrite_AddRewriteRule extends WP_UnitTestCase {
     7
     8        public function setUp() {
     9                global $wp_rewrite;
     10                parent::setUp();
     11
     12                $wp_rewrite->init();
     13                $wp_rewrite->set_permalink_structure( '/%postname%/' );
     14                $wp_rewrite->flush_rules();
     15        }
     16
     17        public function tearDown() {
     18                global $wp_rewrite;
     19                $wp_rewrite->init();
     20
     21                parent::tearDown();
     22        }
     23
     24        /**
     25         * @ticket 16840
     26         */
     27        public function test_add_rewrite_rule_redirect() {
     28                global $wp_rewrite;
     29
     30                $pattern  = 'path/to/rewrite/([^/]+)/?$';
     31                $redirect = 'index.php?test_var1=$matches[1]&test_var2=1';
     32                add_rewrite_rule( $pattern, $redirect );
     33
     34                flush_rewrite_rules();
     35
     36                $rewrite_rules = $wp_rewrite->rewrite_rules();
     37
     38                $this->assertSame( $redirect, $rewrite_rules[ $pattern ] );
     39        }
     40
     41        /**
     42         * @ticket 16840
     43         */
     44        public function test_add_rewrite_rule_redirect_array() {
     45                global $wp_rewrite;
     46
     47                $pattern  = 'path/to/rewrite/([^/]+)/?$';
     48                $redirect = 'index.php?test_var1=$matches[1]&test_var2=1';
     49
     50                add_rewrite_rule( $pattern, array(
     51                        'test_var1' => '$matches[1]',
     52                        'test_var2' => '1'
     53                ) );
     54
     55                flush_rewrite_rules();
     56
     57                $rewrite_rules = $wp_rewrite->rewrite_rules();
     58
     59                $this->assertSame( $redirect, $rewrite_rules[ $pattern ] );
     60        }
     61}
  • tests/phpunit/tests/rewrite.php

     
    3131                parent::tearDown();
    3232        }
    3333
     34        /**
     35         * @ticket 16840
     36         */
     37        public function test_add_rule() {
     38                global $wp_rewrite;
     39
     40                $pattern  = 'path/to/rewrite/([^/]+)/?$';
     41                $redirect = 'index.php?test_var1=$matches[1]&test_var2=1';
     42
     43                $wp_rewrite->add_rule( $pattern, $redirect );
     44
     45                $wp_rewrite->flush_rules();
     46
     47                $rewrite_rules = $wp_rewrite->rewrite_rules();
     48
     49                $this->assertSame( $redirect, $rewrite_rules[ $pattern ] );
     50        }
     51
     52        /**
     53         * @ticket 16840
     54         */
     55        public function test_add_rule_redirect_array() {
     56                global $wp_rewrite;
     57
     58                $pattern  = 'path/to/rewrite/([^/]+)/?$';
     59                $redirect = 'index.php?test_var1=$matches[1]&test_var2=1';
     60
     61                $wp_rewrite->add_rule( $pattern, array(
     62                        'test_var1' => '$matches[1]',
     63                        'test_var2' => '1'
     64                ) );
     65
     66                $wp_rewrite->flush_rules();
     67
     68                $rewrite_rules = $wp_rewrite->rewrite_rules();
     69
     70                $this->assertSame( $redirect, $rewrite_rules[ $pattern ] );
     71        }
     72
     73        /**
     74         * @ticket 16840
     75         */
     76        public function test_add_rule_top() {
     77                global $wp_rewrite;
     78
     79                $pattern  = 'path/to/rewrite/([^/]+)/?$';
     80                $redirect = 'index.php?test_var1=$matches[1]&test_var2=1';
     81
     82                $wp_rewrite->add_rule( $pattern, $redirect, 'top' );
     83
     84                $wp_rewrite->flush_rules();
     85
     86                $extra_rules_top = $wp_rewrite->extra_rules_top;
     87
     88                $this->assertContains( $redirect, $extra_rules_top[ $pattern ] );
     89        }
     90
    3491        function test_url_to_postid() {
    3592
    3693                $id = $this->factory->post->create();