it-swarm.com.de

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

Ich verwende den posts_where-Filter, 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 werden. Ich versuche einen Weg zu finden, um zu vermeiden, dass etwas anderes als die Benutzersuche den posts_where-Filter verwendet.

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 mit der Suchabfrage arbeiten zu lassen? (derjenige, der die Ergebnisse von der Benutzereingabe abruft)

7
dtd93

Problem:

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

Problemumgehung:

Beachten Sie, dass das zweite Eingabeargument für den Rückruf des posts_where-Filters 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_search Filter für den WHERE Suchteil, falls Sie das ändern müssen.

Aber generell würde ich nur sagen, das generierte SQL von Hand zu modifizieren, wenn man wirklich keine anderen Alternativen haben muss.

15
birgire