it-swarm.com.de

Filtern Sie die Abfrage NUR für die Suchergebnisseite

Ich versuche, die Suchergebnisse für eine allgemeine Suche anzupassen, aber nur wenn die Vorlage search.php verwendet wird. Ich habe andere Suchanfragen auf meiner Website, und ich möchte nicht, dass dieser Filter sie stört. Alles funktioniert mit dem folgenden Code, mit Ausnahme von is_page_template('search.php').

Sobald ich diese Codezeile als Bedingung eingebe, wird nur die normale Suchfilterung wiederhergestellt, da meine IF-Bedingung fehlschlägt. Wie führe ich meinen Code nur aus, wenn wir auf der Seite search.php sind?

    //Filter the search for only posts and parts
    function SearchFilter($query)
    {
        if ($query->is_search && is_page_template('search')) {
            $query->set('post_type', array('post', 'parts'));
            $query->set('meta_key', 'Manufacturer');
            $query->set('orderby', 'meta_value');
            $query->set('order', 'ASC');
        }
        return $query;
    }

    add_filter('pre_get_posts', 'SearchFilter');
2
Jordan Carter

Es gibt eine Problemumgehung, die möglicherweise eine zusätzliche Abfrage kostet. @Milo hat jedoch einmal erwähnt, dass WordPress das Zwischenspeichern von Abfragen ziemlich schlau macht, sodass dies für Sie keine große Sache sein sollte.

Sie können die Abfrage im pre_get_posts ausführen und dann einige Überprüfungen durchführen. Wenn die Situation Ihren Anforderungen entsprach, filtern Sie die Abfrage:

//Filter the search for only posts and parts
function SearchFilter($query)
{
    remove_action('pre_get_posts', 'SearchFilter');
    // Run the query to fetch the results
    $posts = get_posts( $query->query );
    if(!empty($posts)) {
        // Check the template for the first post 
        if( get_page_template_slug( $posts[0]->ID ) == 'YOUR SLUG HERE' ){
            $search_template = true; 
        } else {
            $search_template = false; 
        }
    }
    // Now filter the posts
    if ($query->is_main_query() & $query->is_search && $search_template) {
        $query->set('post_type', array('post', 'parts'));
        $query->set('meta_key', 'Manufacturer');
        $query->set('orderby', 'meta_value');
        $query->set('order', 'ASC');
    }
    return $query;
}

add_action('pre_get_posts', 'SearchFilter');
1
Jack Johansson

Lassen Sie es uns Schritt für Schritt aufschlüsseln:

if ($query->is_search && is_page_template('search')) {

Hier gibt es 3 Probleme

is_page_template

search.php ist keine Seitenvorlage, daher wird die Suchvorlage nicht geladen. Das wird also nicht funktionieren.

Aber wenn es funktioniert hat, gibt es ein neues Problem. Funktionen wie is_page_template usw. hängen von der Hauptabfrage ab, aber wir befinden uns in einem pre_get_posts-Filter. Sie wissen nicht, ob diese Abfrage bereits festgelegt wurde oder ob Sie diese oder eine andere Abfrage filtern.

Also müssen wir:

  • entfernen Sie die is_page_template Prüfung, es tut nicht was Sie denken, dass es tut
  • Fügen Sie eine $query->is_main_query()-Prüfung hinzu, damit der Filter Widgets und andere Abfragen nicht beeinträchtigt

Methoden vs Mitgliedsvariablen

if ($query->is_search

Dies funktioniert nicht und sollte PHP Warnungen für Sie generieren. Das Problem ist, dass is_search eine Funktion/Methode ist, keine Variable. Es sollte sein:

if ( $query->is_search() && $query->is_main_query() ) {

Aber search.php?

WordPress entscheidet anhand der Hauptabfrage, welche Vorlage geladen wird. Wenn es die Hauptabfrage ist und is_search wahr ist, wird search.php geladen.

Aus diesem Grund hat WordPress nicht entschieden, welche Vorlage verwendet werden soll, wenn Ihr Filter auftritt. Tatsächlich können Sie WordPress veranlassen, die geladene Vorlage zu ändern, indem Sie die Abfragevariablen ändern. Wenn Sie zum Beispiel alle Variablen deaktivieren und zum Laden eines einzelnen Posts auffordern, erhalten Sie wahrscheinlich keinen search.php oder überhaupt kein Archiv. Stattdessen erhalten Sie wahrscheinlich single.php

Was ist mit Suchanfragen in Seitenvorlagen?

is_main_query wird falsch sein, also kein Problem

1
Tom J Nowell