Efectuează o căutare WP Query care să se potrivească exact cu termenul căutat
Folosesc WP Query și rezultatele returnate când utilizez termenul de căutare nu funcționează așa cum îmi doresc. De exemplu, căutarea pentru 'art' returnează și rezultate pentru cuvinte care conțin 'art' precum 'parte'. Cum pot evita acest lucru? și să returnez doar rezultate pentru 'art' care conțin exact cuvântul 'art'.
$args = array(
'post_type' => 'post',
'posts_per_page' => -1,
'search_exact' => true, // adaugă acest parametru
's' => '\b' . $search_term . '\b' // folosește delimitatori de cuvinte
);
$query = new WP_Query($args);

Cred că altcineva a răspuns deja la asta: Vezi acest răspuns, de la @Sunyatasattva
Dar se pare că WP_Query suportă câțiva parametri suplimentari de căutare:
's' => $s, //(string) - Transmite variabila șirului de interogare dintr-o căutare.
'exact' => true, //(bool) - indicator pentru a potrivi doar titlurile/postări întregi - Valoarea implicită este false.
'sentence' => true, //(bool) - indicator pentru a face o căutare de frază - Valoarea implicită este false.
Mai multe la: https://gist.github.com/luetkemj/2023628
Sper să fie de ajutor,

Din păcate, parametrul sentence => true
nu face ceea ce dorește utilizatorul. Mai degrabă, înseamnă că WP va returna doar postările în care o parte dintr-o propoziție există, unde de obicei ar returna potriviri pentru parte SAU
din SAU
o SAU
propoziție. În ambele cazuri, rezultatele nu ar fi cele dorite dacă s-ar face o căutare pentru artă.

Aceasta este de fapt o întrebare complicată, deoarece prin specificarea termenului exact există două moduri în care poți interpreta întrebarea -
- Găsește doar postările în care întregul titlu sau întregul conținut se potrivesc exact. De exemplu, dacă cauți Postarea mea este super nu ar trebui să returnezi o postare cu titlul Postarea mea este super minunată.
- Găsește postări în care exact fraza există, nu doar o parte a frazei. De exemplu, dacă cauți casa lui nu ar trebui să returnezi o postare cu titlul Iubesc această casă, dar ai returna o postare cu titlul Mă duc la casa lui (exemple proaste, dar sper că ai înțeles ideea).
Din fericire, poți face oricare dintre acestea, dar metoda 1 este cu mult mai simplă. Adaugă oricare dintre aceste exemple în fișierul tău functions.php -
Metoda 1
add_action('pre_get_posts', 'my_make_search_exact', 10);
function my_make_search_exact($query){
if(!is_admin() && $query->is_main_query() && $query->is_search) :
$query->set('exact', true);
endif;
}
Funcția my_make_search_exact()
va fi apelată de fiecare dată când se face o interogare, folosind hook-ul de acțiune pre_get_posts
.
Pentru a ne asigura că nu interferăm cu interogarea atunci când nu este necesar, în cadrul funcției verificăm că NU vizualizăm zona de administrare, că construim interogarea principală și că facem o căutare.
Metoda 2
add_filter('posts_search', 'my_search_is_exact', 20, 2);
function my_search_is_exact($search, $wp_query){
global $wpdb;
if(empty($search))
return $search;
$q = $wp_query->query_vars;
$n = !empty($q['exact']) ? '' : '%';
$search = $searchand = '';
foreach((array)$q['search_terms'] as $term) :
$term = esc_sql(like_escape($term));
$search.= "{$searchand}($wpdb->posts.post_title REGEXP '[[:<:]]{$term}[[:>:]]') OR ($wpdb->posts.post_content REGEXP '[[:<:]]{$term}[[:>:]]')";
$searchand = ' AND ';
endforeach;
if(!empty($search)) :
$search = " AND ({$search}) ";
if(!is_user_logged_in())
$search .= " AND ($wpdb->posts.post_password = '') ";
endif;
return $search;
}
Credit către tinyGod pentru acest răspuns - http://tinygod.pt/make-wordpress-search-exact/
