WordPress.org

Make WordPress Core

Ticket #15397: 15397.diff

File 15397.diff, 2.5 KB (added by solarissmoke, 7 years ago)
  • wp-includes/canonical.php

     
    391391        if ( !get_query_var('name') )
    392392                return false;
    393393
    394         $where = $wpdb->prepare("post_name LIKE %s", like_escape( get_query_var('name') ) . '%');
     394        $where = $wpdb->prepare( "post_name LIKE %s", like_escape( get_query_var('name') ) . '%' );
    395395
    396         // if any of post_type, year, monthnum, or day are set, use them to refine the query
    397         if ( get_query_var('post_type') )
    398                 $where .= $wpdb->prepare(" AND post_type = %s", get_query_var('post_type'));
    399         if ( get_query_var('year') )
    400                 $where .= $wpdb->prepare(" AND YEAR(post_date) = %d", get_query_var('year'));
    401         if ( get_query_var('monthnum') )
    402                 $where .= $wpdb->prepare(" AND MONTH(post_date) = %d", get_query_var('monthnum'));
    403         if ( get_query_var('day') )
    404                 $where .= $wpdb->prepare(" AND DAYOFMONTH(post_date) = %d", get_query_var('day'));
     396        // if post_type is set, use it to refine query
     397        if ( $post_type = get_query_var('post_type') )
     398                $where .= $wpdb->prepare( " AND post_type = %s", $post_type );
     399               
     400        $possible_posts = $wpdb->get_results( "SELECT ID, post_date FROM $wpdb->posts WHERE $where AND post_status = 'publish'" );
     401        $n = count( $possible_posts );
     402       
     403        if( 0 == $n )   // no match
     404                return false;
     405        if( 1 == $n )   // only one match
     406                return get_permalink( $possible_posts[0]->ID );
     407       
     408        // more than one match - try to refine based on year, month, date
     409        $y = get_query_var('year');
     410        $m = get_query_var('monthnum');
     411        $d = get_query_var('day');
     412       
     413        $best_fits = array();
     414        foreach( $possible_posts as $key => $data ) {
     415                $best_fits[$key] = 0;
     416                if( $y && mysql2date( 'Y', $data->post_date ) == $y ) {
     417                        $best_fits[$key] ++;
     418                        if( $m && mysql2date( 'm', $data->post_date ) == $m ) {
     419                                $best_fits[$key] ++;
     420                                if( $d && mysql2date( 'j', $data->post_date ) == $d )
     421                                        $best_fits[$key] ++;
     422                        }
     423                }
     424        }
     425       
     426        // if something came up trumps, use that, otherwise we're shooting in the dark
     427        $max = max( $best_fits );
     428        if( $max > 0 && count( array_keys( $best_fits, $max ) ) == 1 )
     429                return get_permalink( $possible_posts[ array_search( $max, $best_fits ) ]->ID );
    405430
    406         $post_id = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE $where AND post_status = 'publish'");
    407         if ( !$post_id )
    408                 return false;
    409         return get_permalink($post_id);
     431        return false;
    410432}
    411433
    412434add_action('template_redirect', 'redirect_canonical');
    413435
    414 ?>
     436?>
     437 No newline at end of file