WP_Query с атрибутом таксономии не возвращает результаты

#wordpress #woocommerce

#wordpress #woocommerce

Вопрос:

Я пытаюсь выполнить поиск продукта по атрибуту в качестве таксономии, но запрос не возвращает никакого результата. В моем примере я жестко запрограммировал идентификатор 58 , к которому прикреплены 3 продукта. Мой атрибут вызывается Make , и я использую pa_make .

 function custom_search($q)
{
  if ($q->is_search()) { 
    $tax_query = array(
      array(
        'taxonomy' => 'pa_make',
        'field' => 'id',
        'terms' => [58],
        'operator' => 'IN'
      )
    );
    $q->set("tax_query", $tax_query);
  }
}
add_action("woocommerce_product_query", "custom_search");
 

Редактировать:

 <form action="/" id="search-form" class="filters-wrapper">
  <input type="hidden" name="s" value="" />
  <input type="hidden" name="post_type" value="product" />
  <input type="checkbox" name="search_make" value="58" checked />
</form>
 

Форма отправляется при нажатии флажка через JS. Не знаю, как это поможет, но все же.

РЕДАКТИРОВАТЬ 2:

 function custom_search($q)
{
    $tax_query = (array)$q->get('tax_query');
    if ($q->is_search()) { 
      $tax_query = array(
        'taxonomy' => 'pa_make',
        'field' => 'id',
        'terms' => [58],
        'operator' => 'IN'
      );
      $q->set("tax_query", $tax_query);
    }
}

echo "<pre>";
var_dump($tax_query);die;
add_action("woocommerce_product_query", "custom_search");
 

Таким образом, добавив мой tax_query в предыдущий массив, отображается дамп var:

 array(3) {
  ["relation"]=>
  string(3) "AND"
  [0]=>
  array(4) {
    ["taxonomy"]=>
    string(18) "product_visibility"
    ["field"]=>
    string(16) "term_taxonomy_id"
    ["terms"]=>
    array(1) {
      [0]=>
      int(9)
    }
    ["operator"]=>
    string(6) "NOT IN"
  }
  [1]=>
  array(4) {
    ["taxonomy"]=>
    string(11) "pa_make"
    ["field"]=>
    string(2) "id"
    ["terms"]=>
    array(1) {
      [0]=>
      int(58)
    }
    ["operator"]=>
    string(2) "IN"
  }
}
 

Комментарии:

1. Вы уверены field , что этого не должно быть term_id ?

2. Пробовал и с этим. По-прежнему ничего.

3. Тогда, боюсь, вам придется показать нам еще какой-нибудь релевантный код. На данный момент я не вижу ничего плохого в коде, который я вижу.

4. Это весь код функции. pa_make имеет два значения с идентификаторами 58,60 . Не уверен, что еще я должен предоставить. Я помещу форму, которая вызывает поиск.

5. Ну, это должно сработать, но у меня нет способа определить, является ли $q->is_search() true pa_make это правильным именем таксономии, in правильным именем поля, woocommerce_product_query не перехватывается чем-то другим до или обрабатывается после вашего действия, ваше действие вообще добавляется (потому что, возможно, оно не добавлено в конценужное время) и т.д. Другими словами, синтаксис выглядит правильно, это действительно способ добавления a tax_query в a woocommerce_product_query , но кроме этого здесь больше ничего нельзя увидеть.

Ответ №1:

Надеюсь, вы все еще не застряли в этой проблеме, но у меня возникла аналогичная проблема, и я обнаружил, что woocommerce_product_query поиск даже не выполняется. В моем случае я пытался заставить скрытые продукты не отображаться в поиске. Мне пришлось использовать pre_get_posts вместо этого.

Я не знаю, является ли это предполагаемым поведением или ошибкой. Похоже, что это может быть предназначено, поскольку поиск не обязательно является запросом продукта WC, даже если он запрашивает продукты.

Может быть, что-то подобное может сработать для вас, как это было для меня:

 function custom_search( $q )
{
    if ( $q->is_search() /*amp;amp; ! is_admin() amp;amp; $q->is_main_query()*/ )
    {
        $q->set( 'tax_query', [
            [
                'taxonomy' => 'pa_make',
                'field'    => 'id',
                'terms'    => [ 58 ],
                'operator' => 'IN'
            ]
        ] );
    }

    return $q;
}

add_action( "pre_get_posts", "custom_search" );
 

В моем у меня есть тот бит, который я прокомментировал в операторе if, но, возможно, вам это не нужно для вашего.

Для этого также есть фильтр woocommerce_product_query_tax_query , который я также не смог заставить работать над ним, вероятно, по той же причине, что это не обязательно запрос продукта WC.