Make WordPress Core

Changeset 47878


Ignore:
Timestamp:
06/01/2020 06:47:41 PM (6 years ago)
Author:
whyisjake
Message:

Canonical: Add the ability to disable redirect_guess_404_permalink().

This also adds a few more filters to make adding redirects easier. Notably:

  1. do_redirect_guess_404_permalink
  2. pre_redirect_guess_404_permalink
  3. strict_redirect_guess_404_permalink

Fixes: #16557.
Props: msafi, nacin, simonwheatley, westi, mboynes, joostdevalk, Lex_Robinson, MikeSchinkel, haukep, paulschreiber, DrewAPicture, ravenswd, esemlabel, stevegibson12, martychc23, DrLightman, jivanpal, neonkowy, laternastudio, apedog, audrasjb, davidbaumwald, Confridin, donmhico, ryotsun.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/canonical.php

    r47855 r47878  
    836836        global $wpdb;
    837837
     838        /**
     839         * Filters whether to do redirect guess of 404 requests.
     840         *
     841         * Returning a false value from the filter will disable redirect guess 404 permalink.
     842         * and return early.
     843         *
     844         * @since 5.5.0
     845         *
     846         * @param bool     $do_redirect_guess  Whether to do redirect guess 404 permalink. Default true.
     847         */
     848        if ( false === apply_filters( 'do_redirect_guess_404_permalink', true ) ) {
     849                return false;
     850        }
     851
     852        /**
     853         * Filters whether to short-circuit redirect guess of 404 requests.
     854         *
     855         * Return a non-false value from the filter will short-circuit the handling and return early.
     856         *
     857         * @since 5.5.0
     858         *
     859         * @param bool     $pre  Whether to short-circuit redirect guess 404 permalink. Default null.
     860         */
     861        $pre = apply_filters( 'pre_redirect_guess_404_permalink', null );
     862        if ( null !== $pre ) {
     863                return $pre;
     864        }
     865
    838866        if ( get_query_var( 'name' ) ) {
    839                 $where = $wpdb->prepare( 'post_name LIKE %s', $wpdb->esc_like( get_query_var( 'name' ) ) . '%' );
     867
     868                /**
     869                 * Filters whether to do a strict or loose guess.
     870                 *
     871                 * Returning true value from the filter will guess redirect only exact post_name matches.
     872                 *
     873                 * @since 5.5.0
     874                 *
     875                 * @param bool     $strict_guess  Whether to do a strict/exact guess. Default false.
     876                 */
     877                $strict_guess = apply_filters( 'strict_redirect_guess_404_permalink', false );
     878
     879                if ( $strict_guess ) {
     880                        $where = $wpdb->prepare( 'post_name = %s', get_query_var( 'name' ) );
     881                } else {
     882                        $where = $wpdb->prepare( 'post_name LIKE %s', $wpdb->esc_like( get_query_var( 'name' ) ) . '%' );
     883                }
    840884
    841885                // If any of post_type, year, monthnum, or day are set, use them to refine the query.
  • trunk/tests/phpunit/tests/canonical.php

    r47781 r47878  
    232232
    233233        /**
     234         * @ticket 16557
     235         */
     236        public function test_do_redirect_guess_404_permalink() {
     237                // Test disable do_redirect_guess_404_permalink().
     238                add_filter( 'do_redirect_guess_404_permalink', '__return_false' );
     239                $this->go_to( '/child-page-1' );
     240                $this->assertFalse( redirect_guess_404_permalink() );
     241        }
     242
     243        /**
     244         * @ticket 16557
     245         */
     246        public function test_pre_redirect_guess_404_permalink() {
     247                // Test short-circuit filter.
     248                add_filter(
     249                        'pre_redirect_guess_404_permalink',
     250                        function() {
     251                                return 'wp';
     252                        }
     253                );
     254                $this->go_to( '/child-page-1' );
     255                $this->assertEquals( 'wp', redirect_guess_404_permalink() );
     256        }
     257
     258        /**
     259         * @ticket 16557
     260         */
     261        public function test_strict_redirect_guess_404_permalink() {
     262                $post = self::factory()->post->create(
     263                        array(
     264                                'post_title' => 'strict-redirect-guess-404-permalink',
     265                        )
     266                );
     267
     268                $this->go_to( 'strict-redirect' );
     269
     270                // Test default 'non-strict' redirect guess.
     271                $this->assertEquals( get_permalink( $post ), redirect_guess_404_permalink() );
     272
     273                // Test 'strict' redirect guess.
     274                add_filter( 'strict_redirect_guess_404_permalink', '__return_true' );
     275                $this->assertFalse( redirect_guess_404_permalink() );
     276        }
     277
     278        /**
    234279         * @ticket 43745
    235280         */
Note: See TracChangeset for help on using the changeset viewer.