Вопрос или проблема
Не удается получить продажи вариационных товаров в соответствии с определенной категорий товара. Мой код получает только простые товары, а не вариационные.
$cat_id = $_GET['catid'];
$args = array(
'post_type' => 'product',
'post_status' => 'publish',
'posts_per_page' => -1,
'meta_query' => array(
'relation' => 'OR',
array( // Тип вариационных товаров
'key' => '_min_variation_sale_price',
'value' => 0,
'compare' => '>',
'type' => 'numeric'
),
array( // Тип простых товаров
'key' => '_sale_price',
'value' => 0,
'compare' => '>',
'type' => 'numeric'
)
),
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'term_id', // Это необязательно, так как по умолчанию используется 'term_id'
'terms' => $cat_id,
'include_children' => true,
'operator' => 'IN' // Возможные значения: 'IN', 'NOT IN', 'AND'.
)
)
);
$products = new WP_Query($args);
WooCommerce использует ‘product_variation’ в качестве типа записи для вариационных товаров.
Таким образом, верхний уровень для вариационного товара — это тип записи ‘product’, в то время как каждая вариация является типом записи ‘product_variation’.
Данные, связанные с конкретной вариацией, хранятся в соответствующей записи ‘product_variation’.
Ответ или решение
Чтобы решить проблему с выборкой товарных вариаций со скидкой для определенной категории в WooCommerce, необходимо учитывать несколько важных аспектов, связанных с особенностями хранения данных в WordPress и WooCommerce. Рассмотрим ваши текущие проблемы и предложим корректное решение.
Проблема
Ваш текущий код выборки продуктов только для простых товаров, в то время как для получения товара с вариацией необходимо учитывать, что вариации сохраняются как отдельные посты с типом product_variation
. Это значит, что метаполя, связанные с акциями, находятся именно в записях вариаций, а не в родительских товарах.
Решение
Чтобы корректно извлекать как простые, так и вариативные товары, вам нужно изменить ваш код. Мы будем выполнять два запроса. Первым будет запрос к родительским товарам, а вторым — к их вариациям. Давайте рассмотрим обновлённое решение:
$cat_id = $_GET['catid'];
$sale_products = [];
// Первый запрос для получения простых товаров со скидкой
$args_simple = array(
'post_type' => 'product',
'post_status' => 'publish',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => '_sale_price',
'value' => 0,
'compare' => '>',
'type' => 'numeric',
),
),
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'term_id',
'terms' => $cat_id,
'operator' => 'IN',
),
),
);
$simple_products = new WP_Query($args_simple);
if ($simple_products->have_posts()) {
while ($simple_products->have_posts()) {
$simple_products->the_post();
$sale_products[] = get_the_ID();
}
}
// Второй запрос для получения вариаций товаров со скидкой
$args_variation = array(
'post_type' => 'product_variation',
'post_status' => 'publish',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => '_sale_price',
'value' => 0,
'compare' => '>',
'type' => 'numeric',
),
),
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'term_id',
'terms' => $cat_id,
'operator' => 'IN',
),
),
);
$variation_products = new WP_Query($args_variation);
if ($variation_products->have_posts()) {
while ($variation_products->have_posts()) {
$variation_products->the_post();
$sale_products[] = get_the_ID();
}
}
// Сбросить посты
wp_reset_postdata();
// $sale_products теперь содержит ID всех товаров со скидкой
Объяснение кода
-
Запрос простых товаров: Первый блок кода создает запрос для получения простых товаров, наличие скидки у которых определяется с помощью метаполя
_sale_price
. -
Запрос вариаций товаров: Второй блок извлекает вариации, проверяя условие на наличие скидки по такому же метаполю
_sale_price
. -
Комбинирование результатов: Оба результата объединяются в массив
$sale_products
, который теперь будет содержать ID всех товаров со скидкой из запрашиваемой категории.
Заключение
Таким образом, вам удалось адаптировать код для успешной выборки как простых, так и вариативных товаров со скидкой. Это улучшение гарантирует, что вы получите полный список продуктов, соответствующих критериям, что повысит пользовательский опыт на вашем сайте. Если у вас возникнут дополнительные вопросы или сомнения, не стесняйтесь обращаться за помощью!