Не удается получить продажи товаров вариаций WooCommerce для товаров определенной категории.

Вопрос или проблема

Не удается получить продажи вариационных товаров в соответствии с определенной категорий товара. Мой код получает только простые товары, а не вариационные.

  $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 всех товаров со скидкой

Объяснение кода

  1. Запрос простых товаров: Первый блок кода создает запрос для получения простых товаров, наличие скидки у которых определяется с помощью метаполя _sale_price.

  2. Запрос вариаций товаров: Второй блок извлекает вариации, проверяя условие на наличие скидки по такому же метаполю _sale_price.

  3. Комбинирование результатов: Оба результата объединяются в массив $sale_products, который теперь будет содержать ID всех товаров со скидкой из запрашиваемой категории.

Заключение

Таким образом, вам удалось адаптировать код для успешной выборки как простых, так и вариативных товаров со скидкой. Это улучшение гарантирует, что вы получите полный список продуктов, соответствующих критериям, что повысит пользовательский опыт на вашем сайте. Если у вас возникнут дополнительные вопросы или сомнения, не стесняйтесь обращаться за помощью!

Оцените материал
Добавить комментарий

Капча загружается...