web-dev-qa-db-fra.com

Une recherche sur '0' renvoie les résultats

J'ai un CPT mis en place avec une taxonomie personnalisée qui y est attachée. J'ai récemment remarqué que si je cherchais 0 (zéro), à la fois dans le back-end et dans le front-end, cela me donnait des résultats. Aucun de ces messages résultants n'a 0 nulle part dans le titre ainsi que dans le contenu. De toute façon, je n’ai pas modifié la boucle, c’est juste le modèle de recherche classique. Cela me fait penser à 2 choses:

  1. Que recherche WP par défaut?
  2. Y a-t-il un moyen de l'empêcher de rechercher 0?

Des idées?

Update:

D'après les commentaires ci-dessous, je mets à jour mon exigence:

Existe-t-il un moyen de rechercher les publications contenant 0 dans le titre ou dans le contenu, lorsque 0 est entré comme clé de recherche?

6
Rutwick Gangurde

Considérant le commentaire de @Mayeenul Islam:

Je viens de tester un thème vierge avec des données factices, la recherche avec 0 (zéro) a lancé une recherche vide - cela signifie tout:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type IN ('post', 'page', 'attachment') AND (wp_posts.post_status = 'publish') ORDER BY wp_posts.post_date DESC LIMIT 0, 10

et le fait que wp-includes/query.php contient

if ( ! empty( $q['s'] ) ) {
    $search = $this->parse_search( $q );
}

, nous pouvons voir que !empty($q['s']), où $q['s'] == 0 (or "0") retournera FALSE. Cela signifie que la requête de recherche n'aura pas de partie LIKE, lorsque $q['s'] == 0 et retournera "toutes" les publications, car rien ne restreint la requête avec des conditions spécifiques, qui devrait se trouver dans la partie LIKE.

Ceci est confirmé par empty() documentation de la fonction:

Les éléments suivants sont considérés comme vides:

...

  • 0 (0 as an integer)
  • "0" (0 sous forme de chaîne)

...

Pour cette raison, nous ne sommes pas en mesure de filtrer/mettre à jour, "0" afin de transmettre la logique conditionnelle if-empty. Ce que je suggère est une requête mise à jour au cas où les utilisateurs vont rechercher "0".

Voici une solution permettant d'autoriser les utilisateurs à rechercher "0".

add_filter("posts_where", "search_hotfix", 10, 1);
function search_hotfix($where_clause){

    if(get_query_var('s') == 0){
      $where_clause .=  " AND (((wp_posts.post_title LIKE '%0%') OR (wp_posts.post_content LIKE '%0%'))) ";
    }

    return $where_clause; 
}

UPDATE:

Et voici une solution rapide pour arrêter WP rechercher "0". Ce code obligera WP_Query à ne fournir aucun résultat.

add_action('pre_get_posts', 'search_hotfix_reset_q');
function search_hotfix_reset_q($query){
    if ( get_query_var('s') == 0) {
        $query->query_vars['post__in'] = array(0);
    }
}
5
Ignat B.