WordPress.org

Make WordPress Core

Ticket #33920: 33920.5.diff

File 33920.5.diff, 5.0 KB (added by swissspidy, 4 years ago)
  • src/wp-includes/query.php

    diff --git src/wp-includes/query.php src/wp-includes/query.php
    index f56bd81..218f4f3 100644
    class WP_Query { 
    47254725 *
    47264726 * @since 2.1.0
    47274727 *
    4728  * @global WP_Query $wp_query Global WP_Query instance.
    4729  * @global wpdb     $wpdb     WordPress database abstraction object.
     4728 * @global WP_Query   $wp_query   Global WP_Query instance.
     4729 * @global wpdb       $wpdb       WordPress database abstraction object.
     4730 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
    47304731 */
    47314732function wp_old_slug_redirect() {
    4732         global $wp_query;
    4733         if ( is_404() && '' != $wp_query->query_vars['name'] ) :
     4733        global $wp_query, $wp_rewrite;
     4734
     4735        if ( '' !== $wp_query->query_vars['name'] ) :
    47344736                global $wpdb;
    47354737
    47364738                // Guess the current post_type based on the query vars.
    function wp_old_slug_redirect() { 
    47674769                if ( ! $id )
    47684770                        return;
    47694771
    4770                 $link = get_permalink($id);
     4772                $link = get_permalink( $id );
     4773
     4774                if ( is_404() ) {
     4775                        // Add rewrite endpoints if necessary.
     4776                        foreach ( $wp_rewrite->endpoints as $endpoint ) {
     4777                                if ( $endpoint[2] && false !== get_query_var( $endpoint[2], false ) ) {
     4778                                        $link = user_trailingslashit( trailingslashit( $link ) . $endpoint[1] );
     4779                                }
     4780                        }
     4781                } elseif ( is_feed() ) {
     4782                        $link = user_trailingslashit( trailingslashit( $link ) . 'feed' );
     4783                }
    47714784
    4772                 if ( !$link )
     4785                /**
     4786                 * Filter the old slug redirect URL.
     4787                 *
     4788                 * @since 4.4.0
     4789                 *
     4790                 * @param string $link The redirect URL.
     4791                 */
     4792                $link = apply_filters( 'old_slug_redirect_url', $link );
     4793
     4794                if ( ! $link ) {
    47734795                        return;
     4796                }
    47744797
    47754798                wp_redirect( $link, 301 ); // Permanent redirect
    47764799                exit;
  • new file tests/phpunit/tests/rewrite/oldSlugRedirect.php

    diff --git tests/phpunit/tests/rewrite/oldSlugRedirect.php tests/phpunit/tests/rewrite/oldSlugRedirect.php
    new file mode 100644
    index 0000000..040600b
    - +  
     1<?php
     2
     3/**
     4 * @group rewrite
     5 * @ticket 33920
     6 */
     7class Tests_Rewrite_OldSlugRedirect extends WP_UnitTestCase {
     8        protected $old_slug_redirect_url;
     9
     10        protected $post_id;
     11
     12        public function setUp() {
     13                parent::setUp();
     14
     15                $this->post_id = $this->factory->post->create( array(
     16                        'post_title'   => 'Foo Bar',
     17                        'post_name'   => 'foo-bar',
     18                ) );
     19
     20                add_filter( 'old_slug_redirect_url', array( $this, 'filter_old_slug_redirect_url' ), 10, 1 );
     21
     22                global $wp_rewrite;
     23
     24                $wp_rewrite->init();
     25                $wp_rewrite->set_permalink_structure( '/%postname%/' );
     26                add_rewrite_endpoint( 'custom-endpoint', EP_PERMALINK );
     27                add_rewrite_endpoint( 'second-endpoint', EP_PERMALINK, 'custom' );
     28                $wp_rewrite->flush_rules();
     29        }
     30
     31        public function tearDown() {
     32                parent::tearDown();
     33
     34                $this->old_slug_redirect_url = null;
     35
     36                remove_filter( 'old_slug_redirect_url', array( $this, 'filter_old_slug_redirect_url' ), 10 );
     37
     38                global $wp_rewrite;
     39
     40                $wp_rewrite->set_permalink_structure( '' );
     41                $wp_rewrite->init();
     42        }
     43
     44        public function test_old_slug_redirect() {
     45                $old_permalink = user_trailingslashit( get_permalink( $this->post_id ) );
     46
     47                wp_update_post( array(
     48                        'ID' => $this->post_id,
     49                        'post_name' => 'bar-baz',
     50                ) );
     51
     52                $permalink = user_trailingslashit( get_permalink( $this->post_id ) );
     53
     54                $this->go_to( $old_permalink );
     55                wp_old_slug_redirect();
     56                $this->assertEquals( $permalink, $this->old_slug_redirect_url );
     57        }
     58
     59        public function test_old_slug_redirect_endpoint() {
     60                $old_permalink = user_trailingslashit( trailingslashit( get_permalink( $this->post_id ) ) . 'custom-endpoint' );
     61
     62                wp_update_post( array(
     63                        'ID' => $this->post_id,
     64                        'post_name' => 'bar-baz',
     65                ) );
     66
     67                $permalink = user_trailingslashit( trailingslashit( get_permalink( $this->post_id ) ) . 'custom-endpoint' );
     68
     69                $this->go_to( $old_permalink );
     70                $GLOBALS['wp_query']->query_vars['custom-endpoint'] = true;
     71                wp_old_slug_redirect();
     72                $this->assertEquals( $permalink, $this->old_slug_redirect_url );
     73        }
     74
     75        public function test_old_slug_redirect_endpoint_custom_query_var() {
     76                $old_permalink = user_trailingslashit( trailingslashit( get_permalink( $this->post_id ) ) . 'second-endpoint' );
     77
     78                wp_update_post( array(
     79                        'ID' => $this->post_id,
     80                        'post_name' => 'bar-baz',
     81                ) );
     82
     83                $permalink = user_trailingslashit( trailingslashit( get_permalink( $this->post_id ) ) . 'second-endpoint' );
     84
     85                $this->go_to( $old_permalink );
     86                $GLOBALS['wp_query']->query_vars['custom'] = true;
     87                wp_old_slug_redirect();
     88                $this->assertEquals( $permalink, $this->old_slug_redirect_url );
     89        }
     90
     91        public function test_old_slug_redirect_feed() {
     92                $old_permalink = user_trailingslashit( trailingslashit( get_permalink( $this->post_id ) ) . 'feed' );
     93
     94                wp_update_post( array(
     95                        'ID' => $this->post_id,
     96                        'post_name' => 'bar-baz',
     97                ) );
     98
     99                $permalink = user_trailingslashit( trailingslashit( get_permalink( $this->post_id ) ) . 'feed' );
     100
     101                $this->go_to( $old_permalink );
     102                wp_old_slug_redirect();
     103                $this->assertEquals( $permalink, $this->old_slug_redirect_url );
     104        }
     105
     106        public function filter_old_slug_redirect_url( $url ) {
     107                $this->old_slug_redirect_url = $url;
     108                return false;
     109        }
     110}