WordPress.org

Make WordPress Core

Ticket #33920: 33920.4.diff

File 33920.4.diff, 4.4 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..df738cc 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[2] );
     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..a789221
    - +  
     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                $wp_rewrite->flush_rules();
     28        }
     29
     30        public function tearDown() {
     31                parent::tearDown();
     32
     33                $this->old_slug_redirect_url = null;
     34
     35                remove_filter( 'old_slug_redirect_url', array( $this, 'filter_old_slug_redirect_url' ), 10 );
     36
     37                global $wp_rewrite;
     38
     39                $wp_rewrite->set_permalink_structure( '' );
     40                $wp_rewrite->init();
     41        }
     42
     43        public function test_old_slug_redirect() {
     44                $old_permalink = user_trailingslashit( get_permalink( $this->post_id ) );
     45
     46                wp_update_post( array(
     47                        'ID' => $this->post_id,
     48                        'post_name' => 'bar-baz',
     49                ) );
     50
     51                $permalink = user_trailingslashit( get_permalink( $this->post_id ) );
     52
     53                $this->go_to( $old_permalink );
     54                wp_old_slug_redirect();
     55                $this->assertEquals( $permalink, $this->old_slug_redirect_url );
     56        }
     57
     58        public function test_old_slug_redirect_endpoint() {
     59                $old_permalink = user_trailingslashit( trailingslashit( get_permalink( $this->post_id ) ) . 'custom-endpoint' );
     60
     61                wp_update_post( array(
     62                        'ID' => $this->post_id,
     63                        'post_name' => 'bar-baz',
     64                ) );
     65
     66                $permalink = user_trailingslashit( trailingslashit( get_permalink( $this->post_id ) ) . 'custom-endpoint' );
     67
     68                $this->go_to( $old_permalink );
     69                $GLOBALS['wp_query']->query_vars['custom-endpoint'] = true;
     70                wp_old_slug_redirect();
     71                $this->assertEquals( $permalink, $this->old_slug_redirect_url );
     72        }
     73
     74        public function test_old_slug_redirect_feed() {
     75                $old_permalink = user_trailingslashit( trailingslashit( get_permalink( $this->post_id ) ) . 'feed' );
     76
     77                wp_update_post( array(
     78                        'ID' => $this->post_id,
     79                        'post_name' => 'bar-baz',
     80                ) );
     81
     82                $permalink = user_trailingslashit( trailingslashit( get_permalink( $this->post_id ) ) . 'feed' );
     83
     84                $this->go_to( $old_permalink );
     85                wp_old_slug_redirect();
     86                $this->assertEquals( $permalink, $this->old_slug_redirect_url );
     87        }
     88
     89        public function filter_old_slug_redirect_url( $url ) {
     90                $this->old_slug_redirect_url = $url;
     91                return false;
     92        }
     93}