Sortieren Sie die WordPress-Suche nach Relevanz

Lesezeit: 7 Minuten

Benutzeravatar von powerbuoy
Powerboje

Ich habe eine ziemlich fortgeschrittene Suche für eine WordPress-Site erstellt, an der ich atm arbeite. Besucher können Ergebnisse nach verschiedenen Taxonomien filtern, nach Datum oder benutzerdefinierten Feldern sowie der normalen Freitextsuche (die WP standardmäßig anbietet) sortieren.

Ich habe dies mit dem erreicht pre_get_posts filtern und einfach meine Sachen zur Abfrage hinzufügen, etwa so: (beachten Sie, dass ich einige Plausibilitätsprüfungen und anderen Code ausgelassen habe)

<?php
add_filter('pre_get_posts', 'my_search');

function my_search ($qry) {
    # Include more post types
    $qry->set('post_type', array('foo', 'bar'));

    if ($_GET['myorder'] == 'price') {
        $qry->set('orderby', 'meta_value_num');
        $qry->set('meta_key', 'price');
        $qry->set('order', 'ASC');
    }
    else {
        $qry->set('orderby', 'date');
        $qry->set('order', 'DESC');
    }
}

Nun möchte ich eine weitere Möglichkeit hinzufügen, die Beiträge zu sortieren, nämlich nach Relevanz. Ich verstehe, dass dies eine sehr häufige Anfrage ist und die meisten Lösungen für das Problem, die ich gesehen habe, beinhalten die Verwendung des Relevanssi-Plugins. Da ich bereits mein eigenes “Plugin” geschrieben habe (na ja, zumindest Code) und alle meine Suchformulare und Einträge so eingerichtet habe, dass es verwendet werden kann, wird der Wechsel zu Relevanssi an dieser Stelle nicht allzu einfach sein.

Sooo, ich würde gerne wissen, ob jemand eine (vorzugsweise) einfache Möglichkeit kennt, dies mit dem Code hinzuzufügen, den ich bereits habe?

Soweit ich weiß, führt WP seine Suche mit LIKE Anstatt von MATCH() und deswegen auch nicht haben eine Relevanzbewertung zum Sortieren. Wenn dies richtig ist, nehme ich an, dass ich meine eigene Abfrage insgesamt schreiben müsste? Wie kann ich das tun, ohne die Paginierung von WP usw. durcheinander zu bringen? Oder könnte ich etwas hinzufügen wie $qry->set('WHERE', "MATCH(post_content) AGAINST('$q' IN BOOLEAN MODE) AS relevance"); $qry->set('sortby', 'relevance') meinst du?

  • Ich weiß, dass dieses Plugin sehr gute Arbeit leistet: Relevanz. Vielleicht hilft es, die Lücken zu füllen.

    – Brasilo

    20. Juli 2013 um 1:29 Uhr

  • Danke, aber wenn Sie die ganze Frage lesen, werden Sie sehen, warum ich das nicht verwenden möchte.

    – Powerboje

    20. Juli 2013 um 11:30 Uhr

  • Ja, das habe ich verstanden, dachte nur, vielleicht lassen sich daraus nützliche Dinge extrahieren. Viel Glück, tolles Q!

    – Brasilo

    20. Juli 2013 um 11:33 Uhr

  • Relevanssi kommt mit Nicht-Englisch nicht gut zurecht.

    – Khom Nazid

    9. April um 23:49 Uhr

Der Benutzer-Avatar des Alphas
Das Alpha

Ich denke, Sie können verwenden Relevanssi ohne Probleme, müssen aber a verwenden filter Haken, prüfen relevanssi_modify_wp_query Weitere Informationen finden Sie im folgenden Code

function func_reli($qry){
    $qry->set( 'post_type', array( 'post', 'page', 'restaurant', 'products' ) );

    if ($_GET['myorder'] == 'price') {
        $qry->set('orderby', 'meta_value_num');
        $qry->set('meta_key', 'price');
        $qry->set('order', 'ASC');
    }
    else {
        $qry->set('orderby', 'date');
        $qry->set('order', 'DESC'); // <-- set (in your code 'add' is used)
    }
    return $qry; // <-- must return, in your code you didn't
}
add_filter('relevanssi_modify_wp_query', 'func_reli');

Ich habe diesen Code getestet und funktioniert einfach gut. In diesem Beispiel habe ich verwendet 'restaurant' und 'products' benutzerdefinierte Beitragstypen und die Suche funktionieren wirklich gut, nur die relevanten Ergebnisse. Sie können auch if verwenden php 5.3+ ist installiert

add_filter('relevanssi_modify_wp_query', function($qry){
    // Same code
});

Auch wenn Sie verwenden Relevanz Plugin, können Sie die Setup-Seite verwenden, um es einzustellen post_type anstatt dies zu verwenden ($qry->set( 'post_type', array(...) )) in deiner functions.php Datei.

Scree Shot unten angegeben

Geben Sie hier die Bildbeschreibung ein

  • Vielen Dank für eine wirklich gute Antwort, ich werde Relevanssi ausprobieren und wiederkommen.

    – Powerboje

    21. Juli 2013 um 22:04 Uhr

  • Ok, das sah vielversprechend aus, aber aus irgendeinem Grund funktioniert es nicht. Ich scheine in der Lage zu sein, nach Datum zu sortieren, aber der Versuch, nach meinen benutzerdefinierten Feldergebnissen zu sortieren, erfolgt in derselben Reihenfolge wie die Relevanz (oder nichts festgelegt). Keine Ahnung warum. Es scheint, dass die meisten Leute die verwenden relevanssi_hits_filter filtern, um eine eigene Sortierung hinzuzufügen, aber das sieht viel komplizierter aus (das WPQuery-Objekt kann nicht verwendet werden, sondern Sie müssen ein Array selbst sortieren). Ideen?

    – Powerboje

    22. Juli 2013 um 19:50 Uhr

  • Ich brauche es auch, um mit leeren Suchen zu arbeiten und nach benutzerdefinierten Taxonomien zu filtern. Scheint nicht so einfach zu sein, wie diese Antwort vermuten lässt.

    – Powerboje

    22. Juli 2013 um 19:55 Uhr

  • Ok, am Ende habe ich Relevanssi verwendet, aber mit einem anderen Hook und einem völlig anderen Code (the relevanssi_hits_filter habe ich schon erwähnt). Ich musste usort() das Array von Posts selbst zu erstellen, anstatt sich auf die “orderby”-Einstellung von WP zu verlassen. Es funktioniert aber.

    – Powerboje

    23. Juli 2013 um 1:12 Uhr

  • Freut mich, das zu wissen, hättest du etwas dagegen, es mit der Community zu teilen?

    – Das Alpha

    23. Juli 2013 um 1:16 Uhr

Ok, also habe ich schließlich doch Relevanssi verwendet. Allerdings mit einigen Modifikationen.

Zunächst einmal war das Filtern nach Taxonomien recht einfach, da dies in Relevanssi integriert ist. Alles, was ich tun musste, war, die Namen meiner zu ändern <select> Elemente in die Taxonomienamen + ändern Sie die Werte in die Slugs:

<select name="custom_taxonomy">
    <option value="some-term">Some term</option>
    ...
</select>

Zweitens musste ich die verwenden, um die Sortierung nach einem benutzerdefinierten Feld zu ermöglichen relevanssi_hits_filter Filter. nicht wie pre_get_posts oder relevanssi_modify_wp_query (was Sheikh Heera freundlicherweise vorgeschlagen hat), wird dieser Filter durch die Reihe von Beiträgen und geleitet nicht ein WP_Query-Objekt. Als ich versuchte, das WP_Query-Objekt zu verwenden, weigerte sich die Reihenfolge einfach, sich zu ändern. Hier ist im Grunde, wie Sie Ihre eigene Sortierung durchführen können relevanssi_hits_filter:

<?php
add_filter('relevanssi_hits_filter', 'h5b_hits_filter');

function h5b_hits_filter ($hits) {
    global $wp_query;

    if (isset($wp_query->query_vars['orderby']) and $wp_query->query_vars['orderby'] == 'price') {
        if (count($hits[0])) {
            usort($hits[0], 'h5b_sort_by_price');
        }
    }

    return $hits;
}

function h5b_sort_by_price ($a, $b) {
    $priceKey   = 'price';
    $aPrice     = get_post_meta($a->ID, $priceKey, true);
    $bPrice     = get_post_meta($b->ID, $priceKey, true);
    $aPrice     = $aPrice ? $aPrice : 10000000;
    $bPrice     = $bPrice ? $bPrice : 10000000;

    if ($aPrice == $bPrice) {
        return 0;
    }

    return ($aPrice < $bPrice) ? -1 : 1;
}

Dies half auch bei einem früheren Problem, das ich in diesen Beiträgen hatte fehlte Der Schlüssel “Preis” wurde bei der Suche nicht angezeigt. Jetzt tun sie es, und der Grund, warum ich ihnen einen Preis von “10000000” nenne, ist, damit sie auftauchen nach diejenigen, die einen Preis haben.

Schließlich brauchte ich auch leere Suchen arbeiten. Laut dem Relevanssi-Entwickler wird dies nur in der Premium-Version unterstützt, aber ich denke, ich habe es geschafft, es zu umgehen. Zuerst habe ich WP gezwungen, die Suchseite anzuzeigen, auch wenn ?s leer war:

<?php
add_filter('request', 'h5b_allow_empty_search');

function h5b_allow_empty_search ($qryVars) {
    if (isset($_GET['s']) and empty($_GET['s'])) {
        $qryVars['s'] = ' ';
    }

    return $qryVars;
}

Zweitens habe ich Relevanssi gesagt, er solle holen alle posts Wenn ?s leer war, werden standardmäßig überhaupt keine Posts abgerufen. Leider funktionierte dabei das Standardverhalten mit benutzerdefinierten Taxonomien nicht mehr (mein Code hat es überschrieben), sodass ich auch in diesem Code manuell nach Taxonomien suchen musste:

<?php
add_filter('relevanssi_hits_filter', 'h5b_allow_empty_search_filter');

function h5b_allow_empty_search_filter ($hits) {
    if (isset($_GET['s']) and empty($_GET['s']) and !count($hits[0])) {
        $taxQry = array('relation' => 'AND');

        if (!empty($_GET['custom_taxonomy'])) {
            $taxQry[] = array(
                'taxonomy' => 'custom_taxonomy', 
                'field' => 'slug', 
                'terms' => $_GET['custom_taxonomy']
            );
        }

        $args = array(
            'numberposts' => -1, 
            'post_type' => 'any'
        );

        if (count($taxQry) > 1) {
            $args['tax_query'] = $taxQry;
        }

        $hits[0] = get_posts($args);
    }

    return $hits;
}

Und das ist es. Alles scheint zu funktionieren und hoffentlich hilft dies jemandem, der in Zukunft ähnliche Anfragen hat.

Ich hoffe wirklich, dass WP seine lächerliche Suche in Zukunft verbessert. Das Sortieren nach Relevanz sollte im weltweit beliebtesten CMS imo verfügbar sein.

Danke @Sheikh Heera, dass du mich in die richtige Richtung gewiesen hast. Ich bin mir nicht sicher, wem ich die richtige Antwort geben soll, da ich das von Ihnen vorgeschlagene Material wirklich nicht verwenden konnte.

Ich habe gerade herausgefunden, dass WP dies bereits im Kern hat.

Im https://developer.wordpress.org/reference/classes/wp_query/sehen Sie sich den Parameter “orderby” => “relevance” an.

Sortieren Sie nach Suchbegriffen in der folgenden Reihenfolge: Zuerst, ob der gesamte Satz gefunden wird. Zweitens, wenn alle Suchbegriffe in den Titeln enthalten sind. Drittens, wenn einer der Suchbegriffe in den Titeln vorkommt. Und viertens, ob der vollständige Satz im Inhaltsverzeichnis vorkommt.

  • Dies sollte die richtige Antwort sein. Danke fürs Teilen!

    – Khom Nazid

    9. April um 23:53 Uhr

1387180cookie-checkSortieren Sie die WordPress-Suche nach Relevanz

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy