WordPress.org

Make WordPress Core

Ticket #33920: 33920.6.diff

File 33920.6.diff, 6.5 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 7abd4d4..28cf56f 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_feed() ) {
     4775                        $link = user_trailingslashit( trailingslashit( $link ) . 'feed' );
     4776                } elseif ( isset( $GLOBALS['wp_query']->query_vars['paged'] ) && $GLOBALS['wp_query']->query_vars['paged'] > 1 ) {
     4777                        $link = user_trailingslashit( trailingslashit( $link ) . 'page/' . $GLOBALS['wp_query']->query_vars['paged'] );
     4778                } elseif ( is_404() ) {
     4779                        // Add rewrite endpoints if necessary.
     4780                        foreach ( $wp_rewrite->endpoints as $endpoint ) {
     4781                                if ( $endpoint[2] && false !== get_query_var( $endpoint[2], false ) ) {
     4782                                        $link = user_trailingslashit( trailingslashit( $link ) . $endpoint[1] );
     4783                                }
     4784                        }
     4785                }
     4786
     4787                /**
     4788                 * Filter the old slug redirect URL.
     4789                 *
     4790                 * @since 4.4.0
     4791                 *
     4792                 * @param string $link The redirect URL.
     4793                 */
     4794                $link = apply_filters( 'old_slug_redirect_url', $link );
    47714795
    4772                 if ( !$link )
     4796                if ( ! $link ) {
    47734797                        return;
     4798                }
    47744799
    47754800                wp_redirect( $link, 301 ); // Permanent redirect
    47764801                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..a166d43
    - +  
     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 test_old_slug_redirect_attachment() {
     107                $file          = DIR_TESTDATA . '/images/canola.jpg';
     108                $attachment_id = $this->factory->attachment->create_object( $file, $this->post_id, array(
     109                        'post_mime_type' => 'image/jpeg',
     110                        'post_name'      => 'my-attachment',
     111                ) );
     112
     113                $old_permalink = get_attachment_link( $attachment_id );
     114
     115                wp_update_post( array(
     116                        'ID' => $this->post_id,
     117                        'post_name' => 'bar-baz',
     118                ) );
     119
     120                $this->go_to( $old_permalink );
     121                wp_old_slug_redirect();
     122                $this->assertNull( $this->old_slug_redirect_url );
     123                $this->assertQueryTrue( 'is_attachment', 'is_singular', 'is_single' );
     124        }
     125
     126        public function test_old_slug_redirect_paged() {
     127                wp_update_post( array(
     128                        'ID' => $this->post_id,
     129                        'post_content' => 'Test<!--nextpage-->Test',
     130                ) );
     131
     132                $old_permalink = user_trailingslashit( trailingslashit( get_permalink( $this->post_id ) ) . 'page/2' );
     133
     134                wp_update_post( array(
     135                        'ID' => $this->post_id,
     136                        'post_name' => 'bar-baz',
     137                ) );
     138
     139                $permalink = user_trailingslashit( trailingslashit( get_permalink( $this->post_id ) ) . 'page/2' );
     140
     141                $this->go_to( $old_permalink );
     142                wp_old_slug_redirect();
     143                $this->assertEquals( $permalink, $this->old_slug_redirect_url );
     144        }
     145
     146        public function filter_old_slug_redirect_url( $url ) {
     147                $this->old_slug_redirect_url = $url;
     148                return false;
     149        }
     150}