WooCommerce: Автоматическое удаление товаров при нулевом остатке

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

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

Как определить товары с нулевым остатком в WooCommerce?

WooCommerce хранит данные об остатках в метаполях товаров (custom fields) в базе данных. Ключевым для управления запасами является _stock. Если значение 0, значит товар отсутствует на складе.

Проверить наличие товаров с нулевым остатком можно через SQL-запрос:

SELECT ID, post_title FROM wp_posts p
JOIN wp_postmeta pm ON p.ID = pm.post_id
WHERE p.post_type = 'product'
AND pm.meta_key = '_stock'
AND pm.meta_value = '0'
AND p.post_status = 'publish';

Это даст список активных товаров с нулевым запасом.

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

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

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

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

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        foreach ($query->posts as $product_id) {
            wp_trash_post($product_id); // Перемещаем в корзину, чтобы можно было восстановить
        }
    }
}

2. Настраиваем регулярное выполнение через WP-Cron

Чтобы функция запускалась автоматически, нужно зарегистрировать крон-задачу.

add_action('wpdir_daily_out_of_stock_cleanup', 'wpdir_delete_out_of_stock_products');

function wpdir_setup_cron() {
    if (!wp_next_scheduled('wpdir_daily_out_of_stock_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wpdir_daily_out_of_stock_cleanup');
    }
}
add_action('wp', 'wpdir_setup_cron');

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

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

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

  • Для теста создайте тестовый товар с остатком 0.
  • Запустите функцию вручную из админки, добавив временный вызов wpdir_delete_out_of_stock_products() и обновив страницу.
  • Проверьте, что товар переместился в корзину (Trash) в разделе «Товары».
  • После запуска WP-Cron (например, подождите сутки или используйте плагин WP Crontrol для ручного запуска) повторите проверку.

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

  • Функция не запускается автоматически
    WP-Cron зависит от посещений сайта. Если сайт малопосещаемый, задачи не выполняются. Решение: настроить системный cron на сервере для вызова wp-cron.php или использовать плагины для управления cron.
  • Товары не удаляются, хотя остаток 0
    Проверьте, что у товара есть мета _stock с типом строки и значением '0'. Иногда WooCommerce хранит запасы в виде чисел — убедитесь, что сравнение в meta_query корректное. Можно заменить на 'meta_value_num' => 0 и 'compare' => '='.
  • Удаляются не те товары
    Проверьте параметры запроса. Убедитесь, что тип записи — product, и статус — publish. Если нужны другие статусы — добавьте их.

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

  • Всегда перемещайте товары в корзину, а не удаляйте сразу, чтобы избежать случайной потери данных.
  • При большом количестве товаров используйте постраничный запрос с posts_per_page и пакетной обработкой, чтобы избежать превышения лимита памяти.
  • Проверяйте логи ошибок при внедрении — возможны проблемы с правами или нехваткой памяти.
  • Для повышения безопасности убедитесь, что функция не доступна для вызова извне через AJAX или REST без авторизации.

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

МетодПлюсыМинусыПример кода / плагин
WP-Cron + кастомный кодГибко, не требует сторонних плагиновЗависит от посещаемости, требует знаний PHPКод из статьи
Плагин для очистки товаровПростота настройки, UIМожет замедлять сайт, ограничена кастомизацияНапример, "Bulk Delete" с настройками для WooCommerce
Серверный cron + WP-CLIНадежно и быстроТребует доступа к серверу и навыков CLIКоманда: wp post delete $(wp post list --post_type=product --meta_key=_stock --meta_value=0 --format=ids)
Как удалить версии записей в WordPress для оптимизации базы данных
04.02.2026
Как создать и использовать хлебные крошки в WordPress
11.02.2026
Как использовать REST API для автоматизации задач в WordPress
12.04.2026
Как избежать проблем с кэширующими плагинами в WordPress
22.02.2026
Как удалить или заблокировать доступ по IP в WordPress
25.02.2026