Диагностика проблемы: почему появляются отсутствующие варианты товаров
В WooCommerce при использовании вариативных товаров часто возникают ситуации, когда некоторые варианты перестают быть актуальными — например, когда товарные позиции сняты с производства или закончились без возможности восстановления. Эти варианты продолжают отображаться в админке и даже на сайте, что ведёт к путанице и ухудшению пользовательского опыта.
Чтобы убедиться, что у вас есть такие варианты, проверьте следующие признаки:
- В админке WooCommerce во вкладке "Вариации" есть варианты с нулевым или отрицательным запасом;
- На странице товара в магазине видны вариации, которые фактически отсутствуют на складе;
- Отчёты по запасам показывают неподдерживаемые или устаревшие варианты;
- В базе данных в таблице
wp_postmetaвстречаются мета-данные с указанием статуса "outofstock" для вариаций.
Пошаговое решение: удаление отсутствующих вариантов через код
Рассмотрим, как написать функцию для автоматического удаления вариаций товаров с нулевым запасом (stock_quantity <= 0) и статусом "outofstock".
1. Подключение к хуку для автоматизации процесса
Оптимально запускать очистку при сохранении товара или по расписанию — например, через WP Cron.
add_action('woocommerce_product_save', 'wplab_remove_outofstock_variations', 10, 1);2. Функция удаления отсутствующих вариаций
function wplab_remove_outofstock_variations( $product_id ) {
$product = wc_get_product( $product_id );
if ( ! $product || 'variable' !== $product->get_type() ) {
return;
}
$variations = $product->get_children();
foreach ( $variations as $variation_id ) {
$variation = wc_get_product( $variation_id );
if ( ! $variation ) {
continue;
}
// Проверяем наличие запаса и статус
$stock_qty = $variation->get_stock_quantity();
$stock_status = $variation->get_stock_status();
if ( ( $stock_qty !== null && $stock_qty <= 0 ) || $stock_status === 'outofstock' ) {
wp_delete_post( $variation_id, true ); // Безвозвратное удаление вариации
}
}
}3. Альтернативный запуск по расписанию
Для регулярной очистки можно использовать WP Cron. Добавьте задачу:
if ( ! wp_next_scheduled( 'wplab_cron_remove_outofstock_variations' ) ) {
wp_schedule_event( time(), 'daily', 'wplab_cron_remove_outofstock_variations' );
}
add_action( 'wplab_cron_remove_outofstock_variations', 'wplab_cron_remove_outofstock_variations_callback' );
function wplab_cron_remove_outofstock_variations_callback() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'fields' => 'ids',
'tax_query' => [
[
'taxonomy' => 'product_type',
'field' => 'slug',
'terms' => 'variable',
],
],
];
$products = get_posts( $args );
foreach ( $products as $product_id ) {
wplab_remove_outofstock_variations( $product_id );
}
}Проверка результата после внедрения
- Зайдите в админку WooCommerce, откройте вариативные товары и убедитесь, что вариации с запасом 0 и статусом "outofstock" удалены;
- Проверьте на фронте, что отсутствующие варианты не отображаются на страницах товаров;
- Для проверки в базе данных выполните запрос по таблице
wp_postsс типомproduct_variationи убедитесь, что устаревшие варианты отсутствуют; - Если используете WP Cron, проверьте наличие запланированных задач через плагин WP Crontrol или аналогичный.
Частые ошибки и как их исправить
- Удаление не срабатывает: проверьте, что хук
woocommerce_product_saveвызывается и функция подключена правильно. Логируйте ошибки черезerror_log. - Вариации не удаляются, а только скрываются: убедитесь, что используете
wp_delete_post( $variation_id, true )для безвозвратного удаления, а не просто изменение статуса. - Удаляются лишние вариации: уточните логику проверки запаса и статуса. Возможно, нужно учитывать только вариации с
stock_manageвключённым ($variation->managing_stock()). - Кэш мешает видеть изменения: очистите кэш сайта и браузера, а также кэш WooCommerce (например, кэш сессий).
Практические советы по безопасности и производительности
- Всегда делайте резервную копию сайта и базы данных перед массовым удалением данных.
- Запускайте удаление вариаций в моменты низкой нагрузки сайта, особенно при большом каталоге.
- Для больших магазинов рекомендуется разбивать обработку на порции, чтобы избежать превышения лимита времени выполнения PHP.
- Используйте WP Cron для регулярной очистки, но контролируйте его состояние, чтобы задачи не накапливались.
- Можно добавить дополнительную проверку по дате последнего обновления вариации, чтобы не удалять недавно изменённые элементы.
Сравнение способов удаления отсутствующих вариаций
| Метод | Преимущества | Недостатки |
|---|---|---|
| Удаление вручную через админку | Простота, контроль | Долго при большом количестве товаров, риск пропуска |
Код при сохранении товара (хук woocommerce_product_save) | Автоматизация, моментальное удаление | Не удаляет вариации у неактивных товаров, не применяется к старым товарам без сохранения |
| WP Cron с периодической очисткой | Регулярный аудит, удаление старых вариантов | Зависит от корректности WP Cron, нагрузка при большом каталоге |