WordPress.org

Make WordPress Core

Ticket #21688: 21688-4.patch

File 21688-4.patch, 3.7 KB (added by azaozz, 6 years ago)
  • wp-includes/default-filters.php

     
    192192add_filter( 'editable_slug',            'urldecode'                           );
    193193add_filter( 'editable_slug',            'esc_textarea'                        );
    194194add_filter( 'nav_menu_meta_box_object', '_wp_nav_menu_meta_box_object'        );
     195add_filter( 'wp_search_stopwords',      'wp_search_stopwords'                 );
    195196
    196197// Actions
    197198add_action( 'wp_head',             'wp_enqueue_scripts',              1     );
  • wp-includes/functions.php

     
    36373637        return true;
    36383638}
    36393639
     3640/**
     3641 * Common stopwords (terms) that are excluded from the separate term matching when searching for posts.
     3642 * The list of English stopwords is the approximate search engines list. MySQL has a much longer default list of full-text stopwords.
     3643 *
     3644 * @since 3.5.0
     3645 * @param array optional Terms to exclude when searching
     3646 *
     3647 * @return array
     3648 */
     3649function wp_search_stopwords( $in = array() ) {
     3650        $_words = explode( ',', _x('about,are,com,for,from,how,that,the,this,was,what,when,where,who,will,with,www', 'Comma separated list of common words to exclude when searching.') );
     3651        $words = array();
     3652
     3653        foreach( $_words as $word ) {
     3654                $word = trim($word, "\r\n\t ");
     3655                if ( !$word )
     3656                        continue;
     3657                $words[] = $word;
     3658        }
     3659
     3660        return array_merge( $in, $words );
     3661}
     3662
  • wp-includes/query.php

     
    21732173                        }
    21742174                }
    21752175
    2176                 // If a search pattern is specified, load the posts that match
    2177                 if ( !empty($q['s']) ) {
     2176                // If a search pattern is specified, load the posts that match.
     2177                // Sanity check: search string shouldn't be more than 1600 characters.
     2178                // See ticket #21688 for more info.
     2179                if ( !empty($q['s']) && strlen($q['s']) < 1600 ) {
    21782180                        // added slashes screw with quote grouping when done early, so done later
    21792181                        $q['s'] = stripslashes($q['s']);
    21802182                        if ( empty( $_GET['s'] ) && $this->is_main_query() )
     
    21832185                                $q['search_terms'] = array($q['s']);
    21842186                        } else {
    21852187                                preg_match_all('/".*?("|$)|((?<=[\r\n\t ",+])|^)[^\r\n\t ",+]+/', $q['s'], $matches);
    2186                                 $q['search_terms'] = array_map('_search_terms_tidy', $matches[0]);
     2188                                $_search_terms = array_map('_search_terms_tidy', $matches[0]);
     2189                                $q['search_terms'] = array();
     2190                                $stopwords = apply_filters_ref_array( 'wp_search_stopwords', array( array(), &$this ) );
     2191                                $strtolower_func = function_exists('mb_strtolower') ? 'mb_strtolower' : 'strtolower';
     2192
     2193                                foreach ( (array) $_search_terms as $term ) {
     2194                                        if ( empty( $term{2} ) || in_array( $strtolower_func($term), $stopwords, true ) )
     2195                                                continue;
     2196                                        $q['search_terms'][] = $term;
     2197                                }
     2198
     2199                                unset($_search_terms);
     2200                                // if the search string has only short terms or stopwords, or is more than 10 terms long, match it as sentence
     2201                                if ( empty($q['search_terms']) || count($q['search_terms']) > 10 )
     2202                                        $q['search_terms'] = array($q['s']);
    21872203                        }
     2204
    21882205                        $n = !empty($q['exact']) ? '' : '%';
    21892206                        $searchand = '';
    2190                         foreach( (array) $q['search_terms'] as $term ) {
     2207                        foreach( $q['search_terms'] as $term ) {
    21912208                                $term = esc_sql( like_escape( $term ) );
    21922209                                $search .= "{$searchand}(($wpdb->posts.post_title LIKE '{$n}{$term}{$n}') OR ($wpdb->posts.post_content LIKE '{$n}{$term}{$n}'))";
    21932210                                $searchand = ' AND ';