#wordpress #woocommerce
Вопрос:
Я пытаюсь добавить фильтры как на страницу магазина, так и на страницы категорий товаров в WooCommerce, чтобы пользователи могли фильтровать список товаров по тегу product_tag.
Сначала я подключаюсь woocommerce_before_shop_loop
, чтобы вывести список тегов перед списком продуктов
public function render_category_tag_id_filters(): void {
// Get a list of all product IDs
if ( is_shop() ) {
$product_ids = wc_get_products(
[
'limit' => PHP_INT_MAX,
'return' => 'ids',
]
);
// Get a list of product IDs in this category
} else if ( is_product_category() ) {
$product_cat = get_query_var( 'product_cat' );
$product_ids = wc_get_products(
[
'category' => $product_cat,
'limit' => PHP_INT_MAX,
'return' => 'ids',
]
);
// Don't continue
} else {
return;
}
// Render template part here etc. etc.
}
add_action( 'woocommerce_before_shop_loop', [ $this, 'render_category_tag_id_filters' ] );
Щелчок по фильтрам создает разделенный запятыми список идентификаторов product_tag в var запроса, который выглядит следующим образом…
/product-category/candles/?tag_ids=31,32,35
Затем я подключаюсь woocommerce_product_query_tax_query
, чтобы отфильтровать основной список продуктов, используя значения из var запроса
public function apply_category_tag_id_filters( array $tax_query, WC_Query $wc_query ): array {
// Abort if not the main query
if(
! ( $wc_query->get_main_query() instanceof WP_Query )
|| ! $wc_query->get_main_query()->is_main_query()
) {
return $tax_query;
}
// Get the filter tag IDs
$filter_tag_ids = $this->get_category_filter_tag_ids();
if (
! is_array( $filter_tag_ids )
|| 0 === count( $filter_tag_ids )
) {
return $tax_query;
}
//
$tax_query[] = array(
'taxonomy' => 'product_tag',
'field' => 'term_id',
'terms' => $filter_tag_ids,
'operator' => 'AND',
);
//
return $tax_query;
}
Вот тут-то я и расклеиваюсь. Он отлично работает на страницах категорий товаров. Проблема в том, что ни один из запросов на главной странице магазина, похоже, не помечен как основной запрос. Это означает, что моя функция фильтрации завершается рано. Если я удалю проверку для основного запроса, это сработает, но мой список фильтров тегов в верхней части страницы также фильтруется по идентификатору активного тега
Это ошибка? Правильно ли я ориентируюсь на основной запрос?