#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
не перехватывается чем-то другим до или обрабатывается после вашего действия, ваше действие вообще добавляется (потому что, возможно, оно не добавлено в конценужное время) и т.д. Другими словами, синтаксис выглядит правильно, это действительно способ добавления atax_query
в awoocommerce_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.