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

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

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

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

WooCommerce хранит остатки товаров в мета-данных продукта с ключом _stock. Товары с _stock равным 0 считаются отсутствующими. Проверить наличие таких товаров можно через запрос к базе или WP_Query:

$args = [
    'post_type' => 'product',
    'meta_query' => [
        [
            'key' => '_stock',
            'value' => '0',
            'compare' => '=',
            'type' => 'NUMERIC'
        ]
    ],
    'posts_per_page' => -1
];
$query = new WP_Query($args);
foreach ($query->posts as $product) {
    echo $product->ID . ' - ' . get_the_title($product->ID) . "\n";
}

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

Для регулярного удаления товаров с нулевым остатком лучше использовать WP-Cron. Ниже – пошаговая инструкция и пример кода для functions.php вашей темы или кастомного плагина.

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

function wpnews_delete_zero_stock_products() {
    $args = [
        'post_type' => 'product',
        'meta_query' => [
            [
                'key' => '_stock',
                'value' => '0',
                'compare' => '=',
                'type' => 'NUMERIC'
            ]
        ],
        'posts_per_page' => 50,
        'fields' => 'ids'
    ];

    $query = new WP_Query($args);
    if (!empty($query->posts)) {
        foreach ($query->posts as $product_id) {
            wp_delete_post($product_id, true); // true — удалить насовсем
        }
    }
}

2. Регистрируем новый WP-Cron хук

add_action('wpnews_delete_zero_stock_hook', 'wpnews_delete_zero_stock_products');

3. Планируем еженедельное событие (активация темы или плагина)

function wpnews_schedule_zero_stock_cleanup() {
    if (!wp_next_scheduled('wpnews_delete_zero_stock_hook')) {
        wp_schedule_event(time(), 'weekly', 'wpnews_delete_zero_stock_hook');
    }
}
add_action('wp', 'wpnews_schedule_zero_stock_cleanup');

4. Очистка расписания при деактивации плагина или темы

function wpnews_clear_zero_stock_cleanup_schedule() {
    $timestamp = wp_next_scheduled('wpnews_delete_zero_stock_hook');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpnews_delete_zero_stock_hook');
    }
}
register_deactivation_hook(__FILE__, 'wpnews_clear_zero_stock_cleanup_schedule');

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

  • Проверьте наличие товаров с _stock = 0 в базе. После срабатывания крона они должны исчезнуть.
  • Запустите функцию вручную, например, добавьте временный вызов wpnews_delete_zero_stock_products(); и убедитесь, что товары удаляются.
  • Используйте WP-Cron Control или Query Monitor для проверки расписания и факта выполнения задачи.

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

  • Товары не удаляются: Проверьте, что у пользователя, от имени которого выполняется WP-Cron, есть права на удаление товаров. Функция wp_delete_post требует соответствующих прав. Для безопасности лучше запускать на уровне администратора.
  • WP-Cron не срабатывает: Реальный запуск WP-Cron зависит от посещений сайта. Для надежности настройте системный cron на сервере или используйте плагины типа WP Crontrol.
  • Удаляются не те товары: При использовании мета-запроса проверьте правильность ключа и типа данных. Иногда WooCommerce хранит остаток в другом метаполе, если используется сторонний склад.

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

  • Перед удалением всегда делайте резервную копию базы данных.
  • Удаляйте товары пакетами по 50-100, чтобы не перегружать сервер.
  • Если у вас очень большой каталог, рассмотрите перенос задачи на системный cron и оптимизацию запроса через прямые SQL-запросы.
  • Добавьте логирование удалённых товаров, чтобы отслеживать процесс и предотвратить случайную потерю данных.

Таблица сравнения вариантов реализации

МетодПлюсыМинусыРекомендуемый сценарий
WP-Cron + PHP (как в статье)Простота, не требует сторонних сервисов, гибкостьЗависит от посещаемости сайта, может сработать с задержкойМалые и средние магазины с регулярным трафиком
Системный cron + WP-CLIНадежность, точность по времени, подходит для больших сайтовТребует доступа к серверу, настройка сложнееБольшие магазины, требующие регулярной очистки
Плагины очисткиУдобство, интерфейс, дополнительные функцииЗависимость от сторонних разработчиков, нагрузка на сайтПользователи без навыков программирования
Как избежать проблем с AJAX в WordPress при загрузке файлов
23.02.2026
Как создать свой шорткод в WordPress
03.11.2025
Как отключить XML-RPC в WordPress для повышения безопасности
02.01.2026
Как использовать REST API для установки и управления WP-Cron задачами в WordPress
08.06.2026
Как создать автоматическое резервное копирование WordPress
02.12.2025