WooCommerce: автоматическое удаление вариаций товаров без остатка на складе

Проблема: как автоматически удалять вариации товаров с нулевым остатком в WooCommerce

В больших интернет-магазинах на WooCommerce часто возникают ситуации, когда вариации товаров полностью распродаются и остаются в базе с нулевым запасом. Это ведёт к путанице в панели администратора и ухудшает производительность сайта из-за большого количества неактивных вариаций. Ручное удаление требует много времени, особенно если товаров и вариаций сотни или тысячи.

Диагностика проблемы

Чтобы понять, есть ли в магазине вариации с нулевым остатком, можно выполнить простой запрос к базе данных или использовать WP-CLI:

wp db query "SELECT ID, post_title FROM wp_posts WHERE post_type = 'product_variation' AND ID IN (SELECT post_id FROM wp_postmeta WHERE meta_key = '_stock' AND meta_value = '0')";

Если результат содержит много записей, имеет смысл автоматизировать удаление таких вариаций.

Пошаговое решение: скрипт автоматического удаления вариаций с нулевым запасом

Для автоматизации можно использовать PHP-код, который будет запускаться по Cron или вручную. Он проверит все вариации с запасом 0 и удалит их средствами WooCommerce для корректного удаления данных.

Код для удаления вариаций с нулевым запасом

function wpset_delete_zero_stock_variations() {
    $args = [
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'   => '_stock',
                'value' => '0',
                'compare' => '=',
                'type'  => 'NUMERIC'
            ]
        ],
        'fields' => 'ids',
        'post_status' => 'publish'
    ];

    $variations = get_posts($args);

    if (empty($variations)) {
        error_log('Нет вариаций с нулевым запасом для удаления.');
        return;
    }

    foreach ($variations as $variation_id) {
        wp_delete_post($variation_id, true); // true — принудительное удаление
        error_log("Вариация #$variation_id удалена");
    }
}

// Запуск функции вручную или через WP Cron
// add_action('wpset_delete_zero_stock_hook', 'wpset_delete_zero_stock_variations');
// wp_schedule_event(time(), 'daily', 'wpset_delete_zero_stock_hook');

Этот код выбирает все вариации с остатком 0 и удаляет их без возможности восстановления (параметр true для wp_delete_post).

Как добавить автоматический запуск по Cron

Чтобы автоматизировать процесс, добавьте хук и запланируйте задачу в functions.php темы или в плагине:

if (!wp_next_scheduled('wpset_delete_zero_stock_hook')) {
    wp_schedule_event(time(), 'daily', 'wpset_delete_zero_stock_hook');
}

add_action('wpset_delete_zero_stock_hook', 'wpset_delete_zero_stock_variations');

Это позволит запускать удаление ежедневно.

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

  • Запустите функцию вручную через WP-CLI или временно вызовите в коде.
  • Проверьте логи ошибок либо добавьте вывод в админку.
  • Зайдите в раздел вариаций в админке WooCommerce, убедитесь, что вариации с нулевым запасом отсутствуют.
  • Для проверки базы данных выполните SQL-запрос из раздела диагностики — он должен вернуть пустой результат.

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

  • Вариации не удаляются: Проверьте права пользователя, под которым запускается код. Код должен выполняться с правами администратора.
  • Удаление происходит, но вариации остаются в базе: Убедитесь, что используете wp_delete_post($id, true) для полного удаления, а не в корзину.
  • Потеря данных из-за неправильного удаления: Удаляйте только вариации с запасом 0, проверяйте условия в meta_query.
  • Код запускается слишком часто и тормозит сайт: Используйте WP Cron с интервалом не чаще раза в сутки, чтобы не нагружать сервер.

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

  • Перед запуском автоматического удаления сделайте резервную копию базы данных.
  • Для больших магазинов оптимизируйте запрос, выбирая вариации порционно, например, по 100 штук за раз.
  • Добавьте логирование действий, чтобы отслеживать, когда и какие вариации были удалены.
  • Используйте transient для кеширования списка вариаций, если запуск кода происходит часто.
  • Запускать удаление лучше в ночное время, чтобы не мешать работе сайта.

Сравнение способов удаления вариаций с нулевым запасом

МетодПлюсыМинусы
Ручное удаление через админкуПросто, не требует кодаТрудозатратно при большом количестве вариаций
Плагины для очистки WooCommerceУдобный интерфейс, дополнительные функцииМогут нагружать сайт, требуют обновлений
Собственный PHP-скрипт с WP CronПолный контроль, автоматизация, лёгкий кастомингТребуется базовое знание PHP, настройка Cron