WordPress.org

Make WordPress Core

Changeset 38216


Ignore:
Timestamp:
08/08/2016 06:48:53 PM (3 years ago)
Author:
boonebgorges
Message:

Improve category check in redirect_canonical() when permastruct contains category slug.

[37262] changed a check in redirect_canonical() so that it checked
categories in the object cache rather than querying the database. However,
the check was based on the identity of WP_Term objects, which in
certain cases can be augmented by the main WP query routine, causing
failures of the in_array() check. This caused unnecessary redirects
for URLs where is_single() is true, but the URL is different from the
post permalink, such as the embed endpoint.

has_term() also checks the cache, but does not sufer from this bug.

Props cmillerdev.
Fixes #36602.

Location:
trunk
Files:
2 edited

Legend:

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

    r38107 r38216  
    257257        } elseif ( is_single() && strpos($wp_rewrite->permalink_structure, '%category%') !== false && $cat = get_query_var( 'category_name' ) ) {
    258258            $category = get_category_by_path( $cat );
    259             $post_terms = get_the_terms( $wp_query->get_queried_object_id(), 'category' );
    260             if ( ( ! $category || is_wp_error( $category ) ) || ( ! is_wp_error( $post_terms ) && ! empty( $post_terms ) && ! in_array( $category, $post_terms ) ) ) {
     259            if ( ( ! $category || is_wp_error( $category ) ) || ! has_term( $category->term_id, 'category', $wp_query->get_queried_object_id() ) ) {
    261260                $redirect_url = get_permalink($wp_query->get_queried_object_id());
    262261            }
  • trunk/tests/phpunit/tests/canonical/category.php

    r37261 r38216  
    6363            // Nonexistent category will redirect to correct one.
    6464            array( '/foo/post0/', array( 'url' => '/cat0/post0/', 'qv' => array( 'category_name' => 'cat0', 'name' => 'post0', 'page' => '' ) ) ),
     65
     66            // Embed URLs should not redirect to post permalinks.
     67            array( '/cat0/post0/embed/', array( 'url' => '/cat0/post0/embed/', 'qv' => array( 'category_name' => 'cat0', 'name' => 'post0', 'embed' => 'true' ) ) ),
    6568        );
    6669    }
Note: See TracChangeset for help on using the changeset viewer.