Автоматическое удаление отсутствующих вариантов товаров в WooCommerce

Диагностика проблемы: почему появляются отсутствующие варианты товаров

В 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, нагрузка при большом каталоге
Автоматизация создания резервных копий WordPress: скрипты и плагины
29.11.2025
Как создать собственный виджет WordPress с примерами кода WPLab
14.11.2025
Как добавить и настроить пользовательские статусы заказов в WooCommerce
26.03.2026
Как удалить неактивных пользователей WordPress с помощью кода
29.03.2026
Как избежать конфликтов между плагинами WordPress
23.01.2026