Пагинация и счетчик результатов в Woocommerce после пользовательского цикла
Я пытаюсь правильно отобразить пагинацию и счетчик результатов после выполнения моего пользовательского запроса.
Сейчас результаты запроса отображаются правильно, но, кажется, что счетчик результатов и пагинация отображается для всех товаров в магазине.
После изучения проблемы я обнаружил, что создал отдельный объект запроса вместо замены основного запроса. Я попытался исправить это, следуя руководству здесь: Как исправить пагинацию для пользовательских циклов?
... но это способ для WordPress, а мне нужно преобразовать это:
global $loop;
$args = array(
'post_type' => 'product',
'posts_per_page' => $per_page,
'meta_query' => array(
array(
'key' => '_product_brand',
'value' => $val,
)
)
);
$loop = new WP_Query($args);
// Исправление пагинации
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $loop;
if ($loop->have_posts()) {
while ($loop->have_posts()) : $loop->the_post();
wc_get_template_part('content', 'product');
endwhile;
} else {
echo __('Товары не найдены');
}
wp_reset_postdata();
$wp_query = NULL;
$wp_query = $temp_query;
...в функцию WooCommerce. Пока я пробовал изменить глобальную переменную $loop на $woocommerce_loop, но это вызывает ошибки.
Я также пробовал передать атрибут $paged следующим образом:
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
'post_type' => 'product',
'posts_per_page' => $per_page,
'paged' => $paged,
'meta_query' => array(
array(
'key' => '_product_brand',
'value' => $val,
)
)
);
А также так:
$args['paged'] = (get_query_var('paged')) ? get_query_var('paged') : 1;
Оба метода не сработали — товары отображаются правильно, но пагинация и счетчик результатов не работают.
В чем проблема? Буду очень признателен за любую помощь, спасибо.
#РЕДАКТИРОВАНИЕ 1 После следования руководству CFX: https://cfxdesign.com/create-a-custom-woocommerce-product-loop-the-right-way/
Пагинация и счетчик результатов наконец заработали. Моей проблемой было использование WP_Query вместо wc_get_products.
Следуя документации WooCommerce для функции wc_get_products: https://github.com/woocommerce/woocommerce/wiki/wc_get_products-and-WC_Product_Query
Я добился правильного отображения товаров с моим пользовательским ключом. Но не все аргументы из документации работают для меня. Например, я не могу отобразить товары из категории или товары с заданной ценой.
$all_products = wc_get_products(array(
'category' => array('suspension'),
'price' => 59.99,
'regular_price' => 59,
'sale_price' => 159,
));
Я пробовал передавать эти аргументы по одному, все согласно документации, но это не работает. Выдается следующая ошибка:
Warning: array_map(): Argument #2 should be an array in E:\xampp\apps\wordpress\htdocs\wp-content\plugins\woocommerce\includes\data-stores\class-wc-product-data-store-cpt.php on line 1673
Warning: array_filter() expects parameter 1 to be array, null given in E:\xampp\apps\wordpress\htdocs\wp-content\plugins\woocommerce\includes\data-stores\class-wc-product-data-store-cpt.php on line 1673
#РЕДАКТИРОВАНИЕ 2
аргументы:
$all_products = wc_get_products(array(
'product_category' => 'suspension',
));
обработчик:
if (!empty($query_vars['product_category'])) {
$query['tax_query'][] = array(
'taxonomy' => 'product_cat',
'terms' => esc_attr($query_vars['product_category']),
);
return $query;
}
Я хочу отобразить товары из родительской категории по заданному слагу. Этот код работает только если я передаю ID категории. Если я передаю слаг как аргумент (как в коде выше), цикл отображает все товары в магазине.

Вы излишне усложняете синтаксис своих запросов, и WooCommerce даже не рекомендует использовать WP_Query()
для получения товаров. Они утверждают, что это может привести к проблемам в будущем.
Недавно я написал статью о том, как правильно сделать то, что вам нужно, с примером вот здесь: https://cfxdesign.com/create-a-custom-woocommerce-product-loop-the-right-way/

Да, это именно то, что я искал. Спасибо! Теперь мне нужно преобразовать все WP_Queries в wc_get_products. У меня к вам вопрос: вы использовали сложные запросы в своем проекте? Я имею в виду те, где указаны meta_key, meta_value, диапазон цен между заданными значениями и т.д.?

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

Я обновил пост. Не могли бы вы посмотреть #EDIT1 и сказать, работают ли у вас эти аргументы?

Они не работают, но если я оформлю их как вы бы оформили WP_Query()
, то запрос по таксономии работает нормально. Я не уверен, что именно вы пытаетесь сделать со значениями цены, но вам может понадобиться пользовательский ключ meta_query
для достижения желаемого. Проверьте класс WC_Product_Query()
на предмет допустимых аргументов.

Это странно, что базовые аргументы не работают. Похоже, мне нужно связаться со службой поддержки WooCommerce. Да, я решил проблему с ценами через meta_query
. К вашему сведению, я использую цены с моими пользовательскими фильтрами - пользователь передает 'price_min' и 'price_max', а затем я отображаю продукты в заданном диапазоне цен. Теперь я просто размышляю, как решить проблему с категориями. Для категорий с заданным ID я использовал tax_query, но что делать с категориями с заданным slug? Для них аргумент category
не работает...

category
строго предназначен для нативной таксономии WordPress category
. Если вам нужно фильтровать по таксономии product_cat
, то вам потребуется tax_query
, который, как я подтвердил, работает как ожидалось. Возможно, вам стоит опубликовать ваше готовое решение в виде обновления.

tax_query
работает как ожидалось, но я могу передавать только ID родительской категории, а мне нужно передавать slug родительской категории в качестве аргумента. Я обязательно сделаю обновление для будущих читателей.

Не могли бы вы обновить информацию, предоставив текущий код, который у вас есть, а также подробности о том, что должно происходить, и детали о том, что происходит вместо этого?

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

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

Я нашел способ отобразить товары из категории, используя ID родительской категории, и добился этого с помощью tax_query
. Теперь я хочу узнать, можно ли настроить tax_query
так, чтобы передавать slug категории вместо ID. || product_category
не является встроенным аргументом, поэтому WooCommerce рассматривает его как пользовательский, а пользовательские аргументы нужно обрабатывать вручную, точно так же, как пользовательские meta_keys (см. документацию)

...но что насчет result count
? Кажется, что он не отображает правильное количество продуктов, полученных с помощью подхода @cfx. Насколько я понял, $total
(woocommerce_result_count()
) берется из wc_get_loop_prop( 'total' )
, и я вижу, что мы изменили его на $products->total
и только потом выполнили do_action('woocommerce_before_shop_loop');
Но $total в строке Showing x - x of x results
не реагирует на это...
