WooCommerce: как автоматически удалять зависшие варианты товаров с нулевым запасом

Диагностика проблемы зависших вариантов товаров с нулевым запасом

В WooCommerce часто возникают ситуации, когда в базе остаются варианты товаров (вариации), у которых запас равен нулю, но они продолжают отображаться в админке и иногда на сайте. Это замедляет работу магазина и усложняет управление товарами. Как понять, что у вас именно эта проблема?

  • Проверьте список товаров в админке WooCommerce, выбрав тип «Вариации» в фильтре товаров.
  • Воспользуйтесь SQL-запросом, чтобы найти все вариации с нулевым или отрицательным запасом:
SELECT p.ID, pm.meta_value as stock_quantity FROM wp_posts p
JOIN wp_postmeta pm ON p.ID = pm.post_id
WHERE p.post_type = 'product_variation'
AND pm.meta_key = '_stock'
AND CAST(pm.meta_value AS SIGNED) <= 0;

Если запрос возвращает много записей, значит у вас накопились «зависшие» варианты.

Пошаговое решение: автоматическое удаление зависших вариантов товаров

1. Создание функции для удаления вариантов с нулевым запасом

Добавьте в файл functions.php вашей темы или в отдельный плагин следующий код:

function wpexpert_delete_zero_stock_variations() {
    $args = array(
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'meta_query'     => array(
            array(
                'key'     => '_stock',
                'value'   => '0',
                'compare' => '=',
                'type'    => 'NUMERIC'
            ),
        ),
        'fields'         => 'ids',
    );

    $variations = get_posts($args);
    if (!empty($variations)) {
        foreach ($variations as $variation_id) {
            wp_delete_post($variation_id, true); // true - удалить без возможности восстановления
        }
    }
}

2. Планирование автоматического запуска с помощью WP-Cron

Чтобы автоматизировать процесс, добавим событие, которое будет запускать функцию, например, раз в сутки.

if (!wp_next_scheduled('wpexpert_daily_delete_zero_stock_variations')) {
    wp_schedule_event(time(), 'daily', 'wpexpert_daily_delete_zero_stock_variations');
}
add_action('wpexpert_daily_delete_zero_stock_variations', 'wpexpert_delete_zero_stock_variations');

3. Ручной запуск для проверки

Перед автоматизацией рекомендуем запустить функцию вручную, чтобы проверить корректность работы:

add_action('admin_init', function() {
    if (current_user_can('manage_options') && isset($_GET['wpexpert_delete_variations'])) {
        wpexpert_delete_zero_stock_variations();
        echo '<div class="notice notice-success is-dismissible">Удаление зависших вариантов с нулевым запасом выполнено.</div>';
    }
});

После добавления этого кода в админке по адресу https://ваш-сайт/wp-admin/?wpexpert_delete_variations=1 выполнится удаление. Убедитесь, что вы обновили страницу после запуска и получили уведомление.

Проверка результата после внедрения

  • Повторите SQL-запрос из раздела диагностики — количество вариантов с нулевым запасом должно быть равно нулю.
  • Проверьте список вариаций в админке — удалённые варианты должны исчезнуть.
  • Убедитесь, что автоматический запуск сработает на следующий день (можно проверить плагином WP Crontrol).

Частые ошибки и как их исправить

  • Функция не удаляет варианты: Проверьте права пользователя, под которым выполняется код. WP-Cron запускается от имени системы, убедитесь, что нет ошибок в логах. Возможно, стоит добавить error_log внутри цикла для отладки.
  • Варианты удаляются, но остаются в базе: Используйте wp_delete_post($variation_id, true); с параметром true для принудительного удаления.
  • Функция запускается слишком часто: Проверьте, что событие WP-Cron регистрируется один раз — используйте условие !wp_next_scheduled().

Практические советы по безопасности и производительности

  • Перед массовым удалением сделайте резервную копию базы данных.
  • Для больших магазинов с тысячами вариаций разделите удаление на части, чтобы избежать превышения времени выполнения. Например, добавьте параметр posts_per_page с лимитом и используйте пагинацию.
  • Используйте плагин Clearfy Pro для дополнительной оптимизации базы и удаления мусора, включая метаданные и устаревшие записи. Подробнее: https://wpshop.ru/plugins/clearfy

Сравнение способов удаления зависших вариантов

МетодПлюсыМинусы
Ручное удаление через админку Простота; не требует кода Не подходит для большого количества вариантов
SQL-запрос на удаление Быстрое массовое удаление Риск ошибок; требует доступа к базе
Автоматизация через WP-Cron и PHP Автоматический контроль; безопаснее SQL Требует навыков программирования
Как удалить неиспользуемые термины таксономий в WordPress без плагинов
26.02.2026
Как удалить неиспользуемые виджеты в WordPress: практическое руководство
11.03.2026
WooCommerce: отключение автоматического создания заказов при незавершённом оформлении
07.07.2026
Как удалить все незавершённые заказы WooCommerce без плагинов
23.04.2026
Как удалить верхний padding в WordPress без кода
19.01.2026