WordPress.org

Make WordPress Core

Ticket #5989: canonical_rewrite.diff

File canonical_rewrite.diff, 3.6 KB (added by filosofo, 10 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']);