So ändern Sie den Filter posts_where nur für die Suchabfrage

8

Ich verwende den Filter posts_where, um die Benutzersuche in einem Web zu ändern, aber ich finde heraus, dass einige Standard-Widgets wie die "neueren Beiträge" diesen Filter ebenfalls verwenden und ihr Verhalten ebenfalls geändert wird. Ich versuche einen Weg zu finden, um zu vermeiden, dass andere als die Benutzersuchen den posts_where-Filter verwenden.

Das ist mein Code:

add_filter( 'posts_where' , 'posts_where_statement' );

function posts_where_statement( $where ) {
   global $wp_query;
   global $expp;
   global $wpdb;
   $local_db = $wpdb->prefix."posts";
   $front_page_id = get_option('page_on_front');

   if ( ('page' != get_option('show_on_front') || $front_page_id != $wp_query->query_vars['page_id']) && (!($wp_query->is_search)) )
       return $where;

   //some $where modifications

   remove_all_actions ( '__after_loop');
   return $where;
}

Gibt es eine andere Funktion oder eine Möglichkeit, diesen Hook / Filter nur für die Suchabfrage zu verwenden? (derjenige, der die Ergebnisse aus der Benutzereingabe abruft)

dtd93
quelle

Antworten:

17

Problem:

Das Problem mit Ihrem aktuellen Snippet besteht darin, dass Sie nur das globale Hauptabfrageobjekt überprüfen, unabhängig davon, um welches aktuelle Abfrageobjekt es sich handelt.

Problemumgehung:

Beachten Sie, dass das zweite Eingabeargument für den posts_whereFilterrückruf das aktuelle Abfrageobjekt ist.

Verwenden Sie dies, um festzustellen, ob es sich um die Hauptsuchabfrage im Front-End handelt mit:

add_filter( 'posts_where', function ( $where, \WP_Query $q ) 
{
    if( ! is_admin() && $q->is_main_query() && $q->is_search()) // No global $wp_query here
    {
        // ... your modifications
    }

    return $where;      

}, 10, 2 ); // Note the priority 10 and number of input arguments is 2

Es gibt auch den posts_searchFilter für den WHERE-Suchteil, falls Sie diesen ändern müssen.

Aber im Allgemeinen würde ich sagen, dass Sie das generierte SQL nur von Hand ändern, wenn Sie wirklich keine anderen Alternativen haben müssen und müssen.

Birgire
quelle
+1 für Typhinweise. Kein Fan von $q.
Michael Ecklund
1
Danke, es wäre schön, eine Schnittstelle zu haben. Ja, es ist ein gültiger Punkt in Bezug auf den Variablennamen. Ich muss zugeben, dass die Code-Bildlaufleisten auf dieser Site Einfluss darauf haben, wie ich Antworten schreibe - ich versuche, sie zu vermeiden ;-) Einige verwenden, $wp_queryaber das könnte mit der globalen $wp_query, anderen Verwendung $qryoder verwechselt werden $query, aber das könnte auch verwirrend sein, wenn wir sind Umgang mit SQL-Abfragen ;-) Ich habe mich $qin diesem kurzen Ausschnitt entschieden und es sieht auch einfacher aus als zB. $wp_query_objNormalerweise nehme ich die mehrfachen if-contidtions in eine separate Zeile @MichaelEcklund
birgire
Was bedeutet \ WP_Query $ q? Ich meine, warum der Schrägstrich?
Brett
@brett Wenn wir in unserem Plugin einen Namespace verwenden , benötigen wir diesen für WordPress-Klassen, da WordPress den globalen Raum verwendet.
Birgire