WordPress.org

Make WordPress Core

Ticket #18734: 18734.diff

File 18734.diff, 1.5 KB (added by kasparsd, 4 years ago)

Compare the full category paths

  • wp-includes/canonical.php

    diff --git wp-includes/canonical.php wp-includes/canonical.php
    index 16ffc7d..d752256 100644
    function redirect_canonical( $requested_url = null, $do_redirect = true ) { 
    253253                                        }
    254254                                }
    255255
     256                                if ( ! empty( $obj->parent ) && false !== strstr( $wp_rewrite->get_category_permastruct(), '%category%' ) ) {
     257                                        $category = get_queried_object();
     258
     259                                        // Gather category ancestor slugs
     260                                        $category_ancestor_slugs = array( $obj->slug );
     261                                        while ( ! empty( $category->parent ) ) {
     262                                                $category = get_category( $category->parent );
     263                                                $category_ancestor_slugs[] = $category->slug;
     264                                        }
     265
     266                                        // Create a combined category path
     267                                        $category_path_slug = implode( '/', array_reverse( $category_ancestor_slugs ) );
     268                                        $category_path = str_replace( '%category%', $category_path_slug, $wp_rewrite->get_category_permastruct() );
     269                                        $request_category_path = str_replace( '%category%', $wp->query_vars['category_name'], $wp_rewrite->get_category_permastruct() );
     270
     271                                        // Redirect if the current category path doesn't include the complete path
     272                                        if ( $category_path !== $request_category_path ) {
     273                                                $redirect['path'] = str_replace( $wp->query_vars['category_name'], $category_path, $redirect['path'] );
     274                                        }
     275                                }
     276
    256277                        }
    257278                } elseif ( is_single() && strpos($wp_rewrite->permalink_structure, '%category%') !== false && $cat = get_query_var( 'category_name' ) ) {
    258279                        $category = get_category_by_path( $cat );