Make WordPress Core

Ticket #7394: 7394-3.patch

File 7394-3.patch, 2.3 KB (added by azaozz, 12 years ago)
  • wp-includes/query.php

     
    21852185                                preg_match_all('/".*?("|$)|((?<=[\r\n\t ",+])|^)[^\r\n\t ",+]+/', $q['s'], $matches);
    21862186                                $q['search_terms'] = array_map('_search_terms_tidy', $matches[0]);
    21872187                        }
     2188                        $q['search_terms'] = array_filter( (array) $q['search_terms'] );
     2189
    21882190                        $n = !empty($q['exact']) ? '' : '%';
    21892191                        $searchand = '';
    2190                         foreach( (array) $q['search_terms'] as $term ) {
     2192                        $search_orderby_title = array();
     2193                        foreach ( $q['search_terms'] as $term ) {
    21912194                                $term = esc_sql( like_escape( $term ) );
     2195                                $search_orderby_title[] = "$wpdb->posts.post_title LIKE '%$term%'";
    21922196                                $search .= "{$searchand}(($wpdb->posts.post_title LIKE '{$n}{$term}{$n}') OR ($wpdb->posts.post_content LIKE '{$n}{$term}{$n}'))";
    21932197                                $searchand = ' AND ';
    21942198                        }
     
    23772381                                $orderby .= " {$q['order']}";
    23782382                }
    23792383
     2384                // Order search results by relevance
     2385                if ( !empty( $search_orderby_title ) && empty( $q['exact'] ) ) {
     2386                        $num_terms = count($search_orderby_title);
     2387
     2388                        if ( $num_terms > 1 ) {
     2389                                $search_orderby_s = esc_sql( like_escape( $q['s'] ) );
     2390
     2391                                $search_orderby = '(CASE ';
     2392                                // sentence match in title
     2393                                $search_orderby .= "WHEN $wpdb->posts.post_title LIKE '%$search_orderby_s%' THEN 1 ";
     2394
     2395                                // sanity limit
     2396                                if ( $num_terms < 7 ) {
     2397                                        // all words in title
     2398                                        $search_orderby .= 'WHEN ' . implode( ' AND ', $search_orderby_title ) . ' THEN 2 ';
     2399                                        // any word in title
     2400                                        $search_orderby .= 'WHEN ' . implode( ' OR ', $search_orderby_title ) . ' THEN 3 ';
     2401                                }
     2402
     2403                                // sentence match in content
     2404                                $search_orderby .= "WHEN $wpdb->posts.post_content LIKE '%$search_orderby_s%' THEN 4 ";
     2405                                $search_orderby .= 'ELSE 5 END)';
     2406                        } else {
     2407                                // single word or sentence search
     2408                                $search_orderby = reset($search_orderby_title) . ' DESC';
     2409                        }
     2410                        // Allow plugins to add/remove/modify the 'order by' for the search section of the database query
     2411                        $search_orderby = apply_filters_ref_array( 'posts_search_orderby', array( $search_orderby, &$this ) );
     2412                        if ( $search_orderby )
     2413                                $orderby = $orderby ? $search_orderby . ', ' . $orderby : $search_orderby;
     2414                }
     2415
    23802416                if ( is_array( $post_type ) ) {
    23812417                        $post_type_cap = 'multiple_post_type';
    23822418                } else {