Efectuează o căutare WP Query care să se potrivească exact cu termenul căutat

5 feb. 2015, 15:23:44
Vizualizări: 31.6K
Voturi: 5

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);
1
Comentarii

posibil duplicat al Căutare potrivire exactă în Wordpress

RRikesh RRikesh
5 feb. 2015 16:30:27
Toate răspunsurile la întrebare 2
1
12

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,

5 feb. 2015 15:43:07
Comentarii

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ă.

David Gard David Gard
5 feb. 2015 17:20:29
2
11

Aceasta este de fapt o întrebare complicată, deoarece prin specificarea termenului exact există două moduri în care poți interpreta întrebarea -

  1. 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ă.
  2. 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/

5 feb. 2015 17:12:05
Comentarii

mulțumim, am reușit să rezolvăm singuri, dar ai făcut o descriere foarte bună.

Andrew Welch Andrew Welch
6 feb. 2015 01:36:09

@David Gard Mulțumesc mult. Obțin exact rezultatul pe care îl doream. :)

Ravi Ravi
9 mai 2019 18:24:23