Фильтрация переменных продуктов WooCommerce по уровню стоков с использованием meta_query

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

Я пытаюсь отфильтровать продукты на странице магазина на основе уровня запасов, добавив условие в запрос метаданных. Для вариативных продуктов я получаю нулевые результаты, но простые продукты работают.

Я запускаю следующее в хуке woocommerce_product_query:

$metaQuery = $q->get('meta_query');
$metaQuery[] = array(
  'key' => '_stock',
  'value' => $quantity,
  'compare' => '>='
);
$q->set( 'meta_query', $metaQuery );

Я пытался явно добавить вариации в запрос, но это не помогло:

$q->set( 'post_type', array('product', 'product_variation') );

Какие-нибудь идеи, где я ошибаюсь? Буду признателен за любую помощь!

вы не показываете $quantity, может быть, в этом ошибка?

этот точно работает:

$args = [
    'post_type' => 'product_variation',
    'posts_per_page' => 100,
    'meta_query' => [
        [
            'key' => '_stock',
            'value' => 0,
            'compare' => '>',
            'type' => 'NUMERIC'
        ]
   ]
];
$query = new WP_Query($args);

с этим запросом вы получаете все вариации, которые есть в наличии. оттуда вы можете получить родителя по ID через get_post_field('post_parent')

if ($query->have_posts()) :
    echo '<ul>';
    while ($query->have_posts()) :
        $query->the_post();
        echo '<li>' . get_the_title() . ': ' . get_post_meta(get_the_ID(), '_stock') . ', ' . get_post_field('post_parent') . '</li>';
    endwhile;
    echo '</ul>';

    wp_reset_postdata();
else :
    echo '<pre>nothing found</pre>';
endif;

Ответ или решение

Фильтрация переменных продуктов WooCommerce по уровню запасов с использованием meta_query может быть сложной задачей, особенно когда вы столкнулись с тем, что запрос возвращает ноль результатов для переменных продуктов. Чтобы понять причину и найти решение, нужно учесть несколько факторов, связанных c архитектурой и особенностями хранения данных в WooCommerce.

Теория:

Основная причина, по которой ваши существующие запросы не дают результатов для переменных продуктов, заключается в том, как данные о запасах хранятся и управляются в WooCommerce. В отличие от простых продуктов, параметр _stock для переменных продуктов сохраняется в метаданных дочерних вариаций, а не в родительском продукте. Таким образом, для доступа к информации о запасах необходимо работать именно с вариациями, а не только с родительским продуктом.

Пример:

Рассмотрите следующий пример кода, который уже предложен в вашем описании. В нем создается новый объект WP_Query, который ориентирован на тип поста product_variation и фильтрует продукты, у которых количество запасов больше нуля:

$args = [
    'post_type' => 'product_variation',
    'posts_per_page' => 100,
    'meta_query' => [
        [
            'key' => '_stock',
            'value' => 0,
            'compare' => '>',
            'type' => 'NUMERIC'
        ]
    ]
];
$query = new WP_Query($args);

Этот код успешно извлекает все вариации товаров, где запасы больше нуля. Чтобы получить родительские продукты, можно использовать get_post_field('post_parent').

Применение:

Чтобы интегрировать это в ваш функционал, вам нужно модифицировать подход к фильтрации на странице вашего магазина:

  1. Измените типы постов: Убедитесь, что ваш запрос включает типы постов product и product_variation. Это позволит вам работать с дочерними вариациями.

  2. Используйте правильную фильтрацию с подкреплением данных: Для ваших нужд может быть необходимо извлекать идентификаторы родительских продуктов на основе найденных вариаций, как показано в предоставленном вами примере с использованием get_post_field('post_parent').

  3. Регистровый сброс данных: После выполнения вашего кастомного WP_Query, не забудьте сбросить данные постов с помощью wp_reset_postdata(), чтобы избежать конфликтов с другими запросами на странице.

С точки зрения бизнеса, правильно реализованная фильтрация по уровню запасов может улучшить пользовательский опыт, снизив количество недовольных клиентов из-за отсутствующих товаров. Не забудьте протестировать изменения в безопасной среде перед их применением на основном сайте магазина.

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

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