web-dev-qa-db-fra.com

Utilise de tax_query crée un 1 = ou 1 = 1 dans $ wp_query-> request

Ceci est ma première tentative de modification de la requête principale à l'aide de l'action/du filtre pre_get_posts

C'est la fonction qui y est actuellement connectée:

function advanced_product_search_filter($query)
{
  if(!is_admin() &&
     is_main_query() && 
     is_search() && $query->query_vars['post_type'] == 'product')
  {
    $keyword = $_GET['s'];

    if($_GET['exactly'])
      $keyword = $_GET['s'] . ' "'. $_GET['exactly'] . '"';

    if($_GET['without'])
    {
      $excluded = exclude_product_keyword_search($_GET['without'], 
                    $_GET['pname'],
                    $_GET['pcode']
                  );
      $query->set('post__not_in', $excluded);
    }

    if($_GET['pname'])
      $query->set('s', $keyword);
    else
      $query->set('s', '');

    if($_GET['pcode'])
    {
      $tax_queries = $query->get('tax_query');
      $tax_queries[] = array(
        array(
          'taxonomy' => 'pa_ordering-code',
          'field' => 'name',
          'terms' => array($keyword),
          'operator' => 'LIKE'
        )
      );
      $query->set('tax_query', $tax_queries);
    }
  }
}

Ceci est un plugin construit sur une installation WooCommerce. Donc, fondamentalement, cette fonction tente de prendre en charge la recherche d’un produit WooCommerce via la recherche standard (titre et contenu) ou une recherche d’attribut sur un attribut personnalisé appelé Ordering Code qui est pa_ordering-code dans la table term_taxonomy

D'autres parties du code fonctionnent bien, je peux modifier les variables s et post__not_in sans aucun problème, mais si j'essaie d'utiliser le tax_query, la requête semble s'effondrer.

Pour vous donner une idée, quand j'essaie ceci:

?s=foo&post_type=product&pname=1&pcode=1&without=non&exactly=foo+bar

vider la clause WHERE, je vois ceci:

AND wp_posts.ID NOT IN (219) 
AND 0 = 1 
AND 
(
  (
    (wp_posts.post_title LIKE '%foo%') OR 
    (wp_posts.post_content LIKE '%foo%')
  ) AND (
    (wp_posts.post_title LIKE '%foo bar%') OR 
    (wp_posts.post_content LIKE '%foo bar%')
  )
) 
AND wp_posts.post_type = 'product' 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') 
AND
( 
  (
    wp_postmeta.meta_key = '_visibility' AND
    CAST(wp_postmeta.meta_value AS CHAR) IN ('visible','search')
  ) 
)

Notez le AND 0 = 1? Lorsque je vide la clause JOIN, je suis sûr que le paramètre tax_query n'est pas interprété correctement car je ne vois que la table postmeta dans celle-ci. Aucune table terms, term_relationships ou term_taxonomy.

Et j’ai aussi essayé d’écraser simplement le tax_query existant (s’il en existe un) en procédant comme suit:

$args = array(
  array(
    'taxonomy' => 'pa_ordering-code',
    'field' => 'name',
    'terms' => array($keyword),
    'operator' => 'LIKE'
  )
);
$query->set('tax_query', $args);

Mais je ne pouvais toujours pas le faire fonctionner. Des idées sur ce que je peux faire mal?

3
Rolando Cruz

Le 0 = 1 se produit lorsque les termes n'existent pas.

Vous créez une requête pour un ensemble de termes. Avant de pouvoir ajouter le code SQL à cette requête principale, il effectue d’abord une requête secondaire pour obtenir l’identifiant term_id des termes appropriés. Si aucun n'est trouvé, il renvoie 0 = 1 à la place, pour raccourcir la requête principale car aucun terme ne correspond à la requête.

5
Otto

Vérifiez la définition de votre taxonomie "pa_ordering-code".

Il semble que vous puissiez avoir une valeur incorrecte dans l'attribut "query_var".

Ce code pourrait avoir un effet similaire:

    register_taxonomy(...
        'query_var' => true,
    ));

Si tel est le cas, supprimez (ou modifiez) la partie query_var et vérifiez à nouveau.

0
Łukasz Muchlado