WordPress.org

Make WordPress Core

Ticket #5989: canonical_rewrite.diff

File canonical_rewrite.diff, 3.6 KB (added by filosofo, 6 years ago)
  • wp-includes/link-template.php

     
    286286        return apply_filters('post_comments_feed_link', $url); 
    287287} 
    288288 
     289/** get_permalink_from_query() - return a permalink for posts query 
     290 *  
     291 * Returns the permalink for a posts query. 
     292 *  
     293 * @package WordPress 
     294 * @subpackage Feed 
     295 * @since 2.5 
     296 *  
     297 * @param $query_vars array The query variables 
     298 * @return string The permalink representing the query 
     299 */ 
     300 function get_permalink_from_query( $query_vars = array() ) { 
     301        global $wp_rewrite; 
     302        preg_match_all('/%.+?%/', $wp_rewrite->permalink_structure, $tokens); 
     303 
     304        // create category_name from cat 
     305        if ( ! empty( $query_vars['cat'] ) && empty( $query_vars['category_name'] ) ) { 
     306                $category = get_category($query_vars['cat']); 
     307                if ( ! is_wp_error( $category ) ) { 
     308                        if ( $parent = $category->parent ) { 
     309                                $query_vars['category_name'] = get_category_parents($parent, false, '/', true) . $category->slug; 
     310                        } 
     311                } 
     312        } 
     313        if ( empty( $tokens[0] ) ) 
     314                return false; 
     315        $permalink = ''; 
     316        foreach( (array) $tokens[0] as $key => $token ) { 
     317                $query_token = rtrim(str_replace($wp_rewrite->rewritecode, $wp_rewrite->queryreplace, $token), '='); 
     318                if ( ! empty($query_vars[$query_token]) ) { 
     319                        $permalink .= '/' . $query_vars[$query_token]; 
     320                        unset($query_vars[$query_token]); 
     321                } else 
     322                        break; 
     323        } 
     324        foreach ( array('single', 'category', 'page', 'day', 'month', 'year') as $type ) { 
     325                $func = 'is_' . $type; 
     326                if ( call_user_func($func) ) 
     327                        $user_ts_type = $type; 
     328                        break; 
     329        } 
     330        if ( empty( $permalink ) ) 
     331                return false; 
     332        $permalink = user_trailingslashit($permalink, $user_ts_type); 
     333        return get_option('home') . $permalink; 
     334 } 
     335 
    289336/** post_comments_feed_link() - Output the comment feed link for a post. 
    290337 * 
    291338 * Prints out the comment feed link for a post.  Link text is placed in the 
  • wp-includes/canonical.php

     
    3333 * @return null|false|string Null, if redirect not needed. False, if redirect not needed or the string of the URL 
    3434 */ 
    3535function redirect_canonical($requested_url=null, $do_redirect=true) { 
    36         global $wp_rewrite, $is_IIS; 
     36        global $wp_query, $wp_rewrite, $is_IIS; 
    3737 
    3838        if ( is_feed() || is_trackback() || is_search() || is_comments_popup() || is_admin() || $is_IIS || ( isset($_POST) && count($_POST) ) || is_preview() ) 
    3939                return; 
     
    4848        $original = @parse_url($requested_url); 
    4949        if ( false === $original ) 
    5050                return; 
    51  
    5251        // Some PHP setups turn requests for / into /index.php in REQUEST_URI 
    5352        $original['path'] = preg_replace('|/index\.php$|', '/', $original['path']); 
    5453 
     
    5857        // These tests give us a WP-generated permalink 
    5958        if ( is_404() ) { 
    6059                $redirect_url = redirect_guess_404_permalink(); 
     60        } elseif ( is_object($wp_query) && ! empty( $wp_query->query_vars ) && $redirect_url = get_permalink_from_query($wp_query->query_vars) ){ 
     61                $redirect['query'] = remove_query_arg(array_keys((array) $wp_query->query_vars), $redirect['query']); 
    6162        } elseif ( is_object($wp_rewrite) && $wp_rewrite->using_permalinks() ) { 
    6263                // rewriting of old ?p=X, ?m=2004, ?m=200401, ?m=20040101 
    6364                if ( is_single() && isset($_GET['p']) ) { 
     
    163164                                if ( call_user_func($func) ) 
    164165                                        $user_ts_type = $type; 
    165166                                        break; 
    166                                 } 
    167167                        } 
     168                } 
    168169                $redirect['path'] = user_trailingslashit($redirect['path'], $user_ts_type); 
    169170        } elseif ( is_home() ) { 
    170171                $redirect['path'] = trailingslashit($redirect['path']);