Ticket #7394: 7394.2.diff
File 7394.2.diff, 7.2 KB (added by , 12 years ago) |
---|
-
wp-includes/deprecated.php
3329 3329 function _save_post_hook() {} 3330 3330 3331 3331 /** 3332 * Formerly used internally to tidy up the search terms. 3333 * 3334 * @access private 3335 * @since 2.9.0 3336 * @deprecated 3.6.0 3337 */ 3338 function _search_terms_tidy( $t ) { 3339 _deprecated_function( __FUNCTION__, '3.5', '' ); 3340 return trim( $t, "\"'\n\r " ); 3341 } 3342 3343 /** 3332 3344 * Check if the installed version of GD supports particular image type 3333 3345 * 3334 3346 * @since 2.9.0 -
wp-includes/functions.php
3561 3561 } 3562 3562 3563 3563 /** 3564 * Used internally to tidy up the search terms.3565 *3566 * @access private3567 * @since 2.9.03568 *3569 * @param string $t3570 * @return string3571 */3572 function _search_terms_tidy($t) {3573 return trim($t, "\"'\n\r ");3574 }3575 3576 /**3577 3564 * Returns true. 3578 3565 * 3579 3566 * Useful for returning true to filters easily. … … 3887 3874 } 3888 3875 3889 3876 /** 3877 * Check if the terms are suitable for searching. 3878 * 3879 * Includes array of stopwords (terms) that are excluded from the separate term matching when searching for posts. 3880 * The list of English stopwords is the approximate search engines list. MySQL has a much longer default list of full-text stopwords. 3881 * 3882 * @since 3.6.0 3883 * @access private 3884 * 3885 * @param array Terms to check 3886 * @return array 3887 */ 3888 function _check_search_terms($terms) { 3889 $strtolower_func = function_exists( 'mb_strtolower' ) ? 'mb_strtolower' : 'strtolower'; 3890 $checked = $stopwords = array(); 3891 3892 $_words = explode( ',', _x( 'about,an,are,as,at,be,by,com,for,from,how,in,is,it,of,on,or,that,the,this,to,was,what,when,where,who,will,with,the,www', 'Comma separated list of common words to exclude when searching (stopwords).' ) ); 3893 3894 foreach( $_words as $word ) { 3895 $word = trim( $word, "\r\n\t " ); 3896 if ( ! $word ) 3897 continue; 3898 $stopwords[] = $word; 3899 } 3900 3901 $stopwords = apply_filters( 'wp_search_stopwords', $stopwords ); 3902 3903 foreach ( $terms as $term ) { 3904 // keep before/after spaces when term is for exact match 3905 if ( preg_match( '/^".+"$/', $term ) ) 3906 $term = trim( $term, "\"'" ); 3907 else 3908 $term = trim( $term, "\"' " ); 3909 3910 // \p{L} matches a single letter that is not a Chinese, Japanese, etc. char 3911 if ( ! $term || preg_match( '/^\p{L}$/u', $term ) ) 3912 continue; 3913 3914 if ( in_array( $strtolower_func( $term ), $stopwords, true ) ) 3915 continue; 3916 3917 $checked[] = $term; 3918 } 3919 3920 return $checked; 3921 } 3922 3923 /** 3890 3924 * Load the auth check for monitoring whether the user is still logged in. 3891 3925 * Can be disabled with remove_action( 'admin_init', 'wp_auth_check_load' ); 3892 3926 * -
wp-includes/query.php
2186 2186 } 2187 2187 2188 2188 // If a search pattern is specified, load the posts that match 2189 if ( !empty($q['s']) ) { 2189 // Sanity check: search string shouldn't be more than 1600 characters. 2190 // See ticket #21688 for more info. 2191 if ( ! empty( $q['s'] ) && strlen( $q['s'] ) < 1600 ) { 2190 2192 // added slashes screw with quote grouping when done early, so done later 2191 2193 $q['s'] = stripslashes($q['s']); 2192 2194 if ( empty( $_GET['s'] ) && $this->is_main_query() ) 2193 2195 $q['s'] = urldecode($q['s']); 2196 // there are no line breaks in <input /> fields 2197 $q['s'] = str_replace( array("\r", "\n"), '', $q['s'] ); 2198 $num_all_terms = 1; 2194 2199 if ( !empty($q['sentence']) ) { 2195 2200 $q['search_terms'] = array($q['s']); 2196 2201 } else { 2197 preg_match_all('/".*?("|$)|((?<=[\r\n\t ",+])|^)[^\r\n\t ",+]+/', $q['s'], $matches); 2198 $q['search_terms'] = array_map('_search_terms_tidy', $matches[0]); 2202 if ( preg_match_all( '/".*?("|$)|((?<=[\t ",+])|^)[^\t ",+]+/', $q['s'], $matches ) ) { 2203 $num_all_terms = count( $matches[0] ); 2204 $q['search_terms'] = _check_search_terms( $matches[0] ); 2205 // if the search string has only short terms or stopwords, or is 10+ terms long, match it as sentence 2206 if ( empty( $q['search_terms'] ) || count( $q['search_terms'] ) > 9 ) 2207 $q['search_terms'] = array( $q['s'] ); 2208 } else { 2209 $q['search_terms'] = array( $q['s'] ); 2210 } 2199 2211 } 2212 2200 2213 $n = !empty($q['exact']) ? '' : '%'; 2201 2214 $searchand = ''; 2202 foreach( (array) $q['search_terms'] as $term ) { 2215 $search_orderby_title = array(); 2216 foreach ( $q['search_terms'] as $term ) { 2203 2217 $term = esc_sql( like_escape( $term ) ); 2218 if ( $n ) 2219 $search_orderby_title[] = "$wpdb->posts.post_title LIKE '%$term%'"; 2220 2204 2221 $search .= "{$searchand}(($wpdb->posts.post_title LIKE '{$n}{$term}{$n}') OR ($wpdb->posts.post_content LIKE '{$n}{$term}{$n}'))"; 2205 2222 $searchand = ' AND '; 2206 2223 } … … 3590 3607 else 3591 3608 $post_type = 'post'; 3592 3609 3610 // Order search results by relevance when another "orderby" is not specified in the query 3611 if ( ! empty( $search_orderby_title ) && empty( $q['orderby'] ) ) { 3612 $search_orderby = ''; 3613 // Allow plugins to override sorting on 'post_title' and/or 'post_content'. 3614 // Passing an empty array would disable sorting. 3615 $search_orderby_on = array( 'post_title', 'post_content' ); 3616 $search_orderby_on = apply_filters( 'posts_search_orderby_on', $search_orderby_on, $this ); 3617 3618 if ( $num_all_terms > 1 ) { 3619 $num_terms = count( $search_orderby_title ); 3620 $search_orderby_s = esc_sql( like_escape( $q['s'] ) ); 3621 3622 if ( in_array( 'post_title', $search_orderby_on, true ) ) { 3623 $search_orderby = '(CASE '; 3624 // sentence match in 'post_title' 3625 $search_orderby .= "WHEN $wpdb->posts.post_title LIKE '%{$search_orderby_s}%' THEN 1 "; 3626 3627 // sanity limit, sort as sentence when more than 6 terms 3628 // (few searches are longer than 6 terms and most titles are not) 3629 if ( $num_terms < 7 ) { 3630 // all words in title 3631 $search_orderby .= 'WHEN ' . implode( ' AND ', $search_orderby_title ) . ' THEN 2 '; 3632 // any word in title, not needed when $num_terms == 1 3633 if ( $num_terms > 1 ) 3634 $search_orderby .= 'WHEN ' . implode( ' OR ', $search_orderby_title ) . ' THEN 3 '; 3635 } 3636 3637 // sentence match in 'post_content' 3638 if ( in_array( 'post_content', $search_orderby_on, true ) ) 3639 $search_orderby .= "WHEN $wpdb->posts.post_content LIKE '%{$search_orderby_s}%' THEN 4 "; 3640 3641 $search_orderby .= 'ELSE 5 END)'; 3642 } elseif ( in_array( 'post_content', $search_orderby_on, true ) ) { 3643 // Not sorting on 'post_title', order by sentence matches in 'post_content' 3644 $search_orderby = "$wpdb->posts.post_content LIKE '%{$search_orderby_s}%' DESC"; 3645 } 3646 } else { 3647 // single word or sentence search 3648 if ( in_array( 'post_title', $search_orderby_on, true ) ) 3649 $search_orderby = reset( $search_orderby_title ) . ' DESC'; 3650 } 3651 // Allow plugins to add/remove/modify the 'order by' for the search section of the database query 3652 $search_orderby = apply_filters( 'posts_search_orderby', $search_orderby, $this ); 3653 if ( $search_orderby ) 3654 $orderby = $orderby ? $search_orderby . ', ' . $orderby : $search_orderby; 3655 } 3656 3593 3657 if ( is_array( $post_type ) ) { 3594 3658 if ( count( $post_type ) > 1 ) 3595 3659 return;