wake-up-neo.com

Die Verwendung von tax_query erzeugt eine 1 = oder 1 = 1 in $ wp_query-> request

Dies ist mein erster Versuch, die Hauptabfrage mithilfe der Aktion/des Filters pre_get_posts zu ändern

Dies ist die Funktion, die derzeit daran gebunden ist:

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);
    }
  }
}

Dies ist ein Plugin, das auf einer WooCommerce-Installation aufbaut. Diese Funktion versucht also, die Suche nach einem WooCommerce-Produkt entweder über die Standardsuche (Titel und Inhalt) oder eine Attributsuche nach einem benutzerdefinierten Attribut namens Ordering Code zu unterstützen, das pa_ordering-code in der term_taxonomy-Tabelle ist

Andere Teile des Codes funktionieren einwandfrei. Ich kann die Variablen s und post__not_in problemlos ändern. Wenn ich jedoch versuche, den tax_query zu verwenden, scheint die Abfrage nicht mehr zu funktionieren.

Um Ihnen eine Idee zu geben, wenn ich das versuche:

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

wenn ich die WHERE-Klausel abspeichere, sehe ich Folgendes:

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')
  ) 
)

Beachten Sie den AND 0 = 1? Wenn ich die JOIN-Klausel lösche, stelle ich sicher, dass der tax_query-Parameter nicht richtig interpretiert wird, da ich nur die postmeta-Tabelle dort sehe. Keine terms-, term_relationships- oder term_taxonomy-Tabelle.

Und ich habe auch versucht, einfach den vorhandenen tax_query (falls vorhanden) zu überschreiben:

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

Aber ich konnte es immer noch nicht zum Laufen bringen. Irgendwelche Ideen, was ich falsch machen könnte?

3
Rolando Cruz

Der 0 = 1 tritt auf, wenn die Begriffe nicht existieren.

Sie erstellen eine Abfrage für eine Reihe von Begriffen. Bevor es die SQL zu dieser Hauptabfrage hinzufügen kann, führt es zunächst eine sekundäre Abfrage durch, um die term_ids für die relevanten Begriffe abzurufen. Wenn keine gefunden werden, wird stattdessen 0 = 1 zurückgegeben, um die Hauptabfrage zu verknüpfen, da keine Begriffe mit der Anforderung übereinstimmen.

5
Otto

Überprüfen Sie die Definition Ihrer Taxonomie "pa_ordering-code".

Es sieht so aus, als ob Sie im Attribut "query_var" einen falschen Wert haben könnten.

Dieser Code könnte ähnliche Auswirkungen haben:

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

Wenn ja, entfernen (oder ändern) Sie den query_var-Teil und überprüfen Sie ihn erneut.

0