Вопрос или проблема
Я пытаюсь отфильтровать продукты на странице магазина на основе уровня запасов, добавив условие в запрос метаданных. Для вариативных продуктов я получаю нулевые результаты, но простые продукты работают.
Я запускаю следующее в хуке 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')
.
Применение:
Чтобы интегрировать это в ваш функционал, вам нужно модифицировать подход к фильтрации на странице вашего магазина:
-
Измените типы постов: Убедитесь, что ваш запрос включает типы постов
product
иproduct_variation
. Это позволит вам работать с дочерними вариациями. -
Используйте правильную фильтрацию с подкреплением данных: Для ваших нужд может быть необходимо извлекать идентификаторы родительских продуктов на основе найденных вариаций, как показано в предоставленном вами примере с использованием
get_post_field('post_parent')
. -
Регистровый сброс данных: После выполнения вашего кастомного WP_Query, не забудьте сбросить данные постов с помощью
wp_reset_postdata()
, чтобы избежать конфликтов с другими запросами на странице.
С точки зрения бизнеса, правильно реализованная фильтрация по уровню запасов может улучшить пользовательский опыт, снизив количество недовольных клиентов из-за отсутствующих товаров. Не забудьте протестировать изменения в безопасной среде перед их применением на основном сайте магазина.