web-dev-qa-db-de.com

Mach ein WP Die Abfragesuche stimmt genau mit dem Suchbegriff überein

Ich verwende WP Abfrage und die Ergebnisse, die bei der Verwendung des Suchbegriffs angezeigt werden, funktionieren nicht wie gewünscht. Die Suche nach "art" gibt beispielsweise auch Ergebnisse für Wörter zurück, die "art" enthalten, z. B. "part". Wie kann ich das vermeiden? und einfach die Ergebnisse für 'art' zurückgeben, die das exakte Wort 'art' enthalten.

3
Andrew Welch

Dies ist eine schwierige Frage, da es zwei Möglichkeiten gibt, Ihre Frage zu interpretieren, indem Sie genau angeben:

  1. Finde nur Beiträge, bei denen der gesamte Titel oder der gesamte Inhalt genau übereinstimmt. Wenn Sie beispielsweise nach Mein Beitrag ist super suchen, hätten Sie keinen Beitrag mit dem Titel Mein Beitrag ist super fantastisch zurückgegeben.
  2. Gute Beiträge, bei denen die exakte Phrase existiert, nicht nur ein Teil einer Phrase. Wenn Sie zum Beispiel sein Haus durchsuchen, hätten Sie keinen Beitrag mit dem Titel ich liebe dieses Haus zurückgegeben, aber Sie würden einen Beitrag mit dem Titel ich gehe zu seinem Haus (Ruby Beispiele, aber hoffentlich bekommen Sie den Punkt).

Zum Glück können Sie dies auch tun, aber Methode 1 ist bei weitem einfacher. Fügen Sie eines dieser Beispiele zu Ihrer functions.php -Datei hinzu -


Methode 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;

}

Die Funktion my_make_search_exact() wird bei jeder Abfrage mit dem Aktions-Hook pre_get_posts aufgerufen.

Um sicherzustellen, dass wir uns nicht mit der Abfrage anlegen, wenn dies nicht erforderlich ist, überprüfen wir innerhalb der Funktion, dass der Administrationsbereich NICHT angezeigt wird, dass wir die Hauptabfrage erstellen und dass wir eine Suche durchführen.


Methode 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;

}

Dank an tinyGod für diese Antwort - http://tinygod.pt/make-wordpress-search-exact/

5
David Gard

Ich denke, jemand anderes hat dies schon einmal beantwortet: Überprüfe diese Antwort , von @Sunyatasattva

Anscheinend unterstützt WP_Query jedoch einige zusätzliche Suchparameter:

's' => $ s, // (string) - Übergibt die Abfragezeichenfolgenvariable einer Suche.

'exact' => true, // (bool) - Flag, damit nur ganze Titel/Posts gefunden werden. - Standardwert ist false.

'sentence' => true, // (bool) - Flag, mit dem eine Phrasensuche durchgeführt wird. - Standardwert ist false.

Mehr unter: https://Gist.github.com/luetkemj/2023628

Ich hoffe es hilft,

5
Renato Gomes