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

8

J'utilise le filtre posts_where afin de modifier les recherches des utilisateurs sur un web, mais je découvre que certains widgets par défaut comme les "publications les plus récentes" utilisent également ce filtre et leur comportement est également modifié. J'essaie de trouver un moyen d'éviter que quoi que ce soit d'autre que les recherches des utilisateurs utilisent le filtre posts_where.

Voici 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 fonctionner ce hook / filtre uniquement avec la requête de recherche? (celui qui récupère les résultats de l'entrée utilisateur)

dtd93
la source

Réponses:

17

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 posts_whererappel de filtre est l'objet de requête actuel.

Utilisez-le pour déterminer s'il s'agit de la requête de recherche principale sur le front-end 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 y a aussi le posts_searchfiltre pour la partie de recherche WHERE, si c'est ce que vous devez modifier.

Mais en général, je dirais que ne modifiez le SQL généré à la main que si, vous devez vraiment et n'avez pas d'autre alternative.

Birgire
la source
+1 pour l'indication de type. Pas fan $qcependant.
Michael Ecklund
1
merci, ce serait bien d'avoir une interface. oui c'est un point valide concernant le nom de la variable. Je dois admettre que les barres de défilement du code sur ce site affectent la façon dont j'écris les réponses - j'essaye de les éviter ;-) Certains utilisent $wp_querymais cela pourrait être confondu avec le global $wp_query, d'autres $qryou ou $query, mais cela peut aussi être déroutant lorsque nous sommes traitant de la requête SQL ;-) Je me suis contenté de $qce court extrait et il semble également plus simple que par exemple. $wp_query_objHabituellement, je prends les multiples if-contidtions dans une ligne séparée @MichaelEcklund
birgire
que signifie \ WP_Query $ q? Je veux dire pourquoi la barre oblique?
brett
@brett Si nous utilisons un espace de noms dans notre plugin, nous en avons besoin pour les classes WordPress, car WordPress utilise l'espace global.
birgire