web-dev-qa-db-fra.com

Comment modifier le filtre posts_where uniquement pour la requête de recherche

J'utilise le filtre posts_where pour modifier les recherches des utilisateurs sur le Web, mais je constate que certains widgets par défaut, tels que les "publications plus récentes", utilisent également ce filtre et que leur comportement est également modifié. J'essaie de trouver un moyen d'éviter que le filtre posts_where soit utilisé autrement que par les recherches des utilisateurs.

Ceci est mon 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;
}

Existe-t-il une autre fonction ou un moyen de faire en sorte que ce crochet/filtre ne fonctionne qu'avec la requête de recherche? (celui qui récupère les résultats de la saisie de l'utilisateur)

7
dtd93

Problème:

Le problème avec votre extrait de code actuel est que vous ne faites que vérifier l'objet de requête principal global, quel que soit l'objet de requête actuel.

Solution de contournement:

Notez que le deuxième argument d'entrée pour le rappel de filtre posts_where est l'objet de requête actuel.

Utilisez cela pour déterminer s’il s’agit de la requête de recherche principale sur le serveur avec:

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

Il existe également le filtre posts_search pour la partie de recherche WHERE, si c'est ce que vous devez modifier.

Mais en général, je ne dirais que modifier le code SQL généré à la main si, vous devez vraiment et n’avoir aucune autre alternative.

15
birgire