WordPress.org

Make WordPress Core

Ticket #3177: search-with-quotes.diff

File search-with-quotes.diff, 2.1 KB (added by snakefoot, 7 years ago)

Patch for branch 2.0

  • classes.php

     
    425425 
    426426                // If a search pattern is specified, load the posts that match 
    427427                if (!empty($q['s'])) { 
    428                         $q['s'] = addslashes_gpc($q['s']); 
    429                         $search = ' AND ('; 
    430                         $q['s'] = preg_replace('/, +/', ' ', $q['s']); 
    431                         $q['s'] = str_replace(',', ' ', $q['s']); 
    432                         $q['s'] = str_replace('"', ' ', $q['s']); 
    433                         $q['s'] = trim($q['s']); 
    434                         if ($q['exact']) { 
    435                                 $n = ''; 
    436                         } else { 
    437                                 $n = '%'; 
     428                        // added slashes screw with quote grouping when done early, so done later  
     429                        $q['s'] = stripslashes($q['s']); 
     430                        if ($q['sentence']) { 
     431                                $q['search_terms'] = array($q['s']); 
    438432                        } 
    439                         if (!$q['sentence']) { 
    440                                 $s_array = explode(' ',$q['s']); 
    441                                 $q['search_terms'] = $s_array; 
    442                                 $search .= '((post_title LIKE \''.$n.$s_array[0].$n.'\') OR (post_content LIKE \''.$n.$s_array[0].$n.'\'))'; 
    443                                 for ( $i = 1; $i < count($s_array); $i = $i + 1) { 
    444                                         $search .= ' AND ((post_title LIKE \''.$n.$s_array[$i].$n.'\') OR (post_content LIKE \''.$n.$s_array[$i].$n.'\'))'; 
    445                                 } 
    446                                 $search .= ' OR (post_title LIKE \''.$n.$q['s'].$n.'\') OR (post_content LIKE \''.$n.$q['s'].$n.'\')'; 
    447                                 $search .= ')'; 
    448                         } else { 
    449                                 $search = ' AND ((post_title LIKE \''.$n.$q['s'].$n.'\') OR (post_content LIKE \''.$n.$q['s'].$n.'\'))'; 
     433                        else { 
     434                                preg_match_all('/".*?("|$)|((?<=[\\s",+])|^)[^\\s",+]+/', $q[s], $matches); 
     435                                $q['search_terms'] = array_map(create_function('$a', 'return trim($a, "\\"\'\\n\\r ");'), $matches[0]); 
    450436                        } 
     437                        $n = ($q['exact']) ? '' : '%'; 
     438                        $searchand = ''; 
     439                        foreach((array)$q['search_terms'] as $term) { 
     440                                $term = addslashes_gpc($term); 
     441                                $search .= "{$searchand}((post_title LIKE '{$n}{$term}{$n}') OR (post_content LIKE '{$n}{$term}{$n}'))"; 
     442                                $searchand = ' AND '; 
     443                        } 
     444                        $term = addslashes_gpc($q['s']); 
     445                        if (!$q['sentence'] && count($q['search_terms']) > 1 && $q['search_terms'][0] != $q['s'] ) $search .= " OR (post_title LIKE '{$n}{$term}{$n}') OR (post_content LIKE '{$n}{$term}{$n}')"; 
     446 
     447                        $search = " AND ({$search}) "; 
    451448                } 
    452449 
    453450                // Category stuff