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

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

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

Как проверить наличие товаров без остатков в WooCommerce

Для начала убедитесь, что у вас есть товары с нулевым или отрицательным запасом. Это можно сделать через админку:

  • Перейдите в Товары > Все товары.
  • Используйте фильтр по статусу наличия (в наличии / отсутствует).
  • Или экспортируйте товары в CSV и проверьте столбец stock_quantity.

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

$args = [
    'post_type' => 'product',
    'meta_query' => [
        [
            'key' => '_stock',
            'value' => 0,
            'compare' => '<=',
            'type' => 'NUMERIC'
        ]
    ],
    'posts_per_page' => -1
];
$query = new WP_Query($args);
if ($query->have_posts()) {
    while ($query->have_posts()) {
        $query->the_post();
        echo get_the_title() . "\n";
    }
}
wp_reset_postdata();

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

Для удаления товаров без остатков мы реализуем WP-Cron задачу, которая будет запускаться регулярно и удалять такие товары. Это поможет держать базу в актуальном состоянии.

Шаг 1. Добавьте cron-хук и функцию удаления

add_action('wpma_delete_out_of_stock_products', 'wpma_delete_products_without_stock');
function wpma_delete_products_without_stock() {
    $args = [
        'post_type' => 'product',
        'meta_query' => [
            [
                'key' => '_stock',
                'value' => 0,
                'compare' => '<=',
                'type' => 'NUMERIC'
            ]
        ],
        'posts_per_page' => -1,
        'fields' => 'ids'
    ];
    $query = new WP_Query($args);
    if ($query->posts) {
        foreach ($query->posts as $product_id) {
            wp_delete_post($product_id, true); // Полное удаление
        }
    }
    wp_reset_postdata();
}

Шаг 2. Запланируйте событие WP-Cron

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

Этот код нужно добавить в файл functions.php вашей темы или в отдельный плагин.

Шаг 3. Очистка cron при деактивации плагина (если используете плагин)

register_deactivation_hook(__FILE__, function() {
    $timestamp = wp_next_scheduled('wpma_delete_out_of_stock_products');
    wp_unschedule_event($timestamp, 'wpma_delete_out_of_stock_products');
});

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

  • Подождите до следующего срабатывания WP-Cron (обычно ежедневно) или вызовите функцию вручную через do_action('wpma_delete_out_of_stock_products'); в админке.
  • Проверьте, что товары с запасом ≤ 0 удалены из списка товаров.
  • Можно вывести логи или добавить запись в файл лога для контроля.

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

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

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

  • Перед удалением можно добавить дополнительный статус — например, переводить товары в черновики или помечать меткой, чтобы избежать случайного удаления.
  • Для крупных магазинов с тысячами товаров используйте постраничное удаление с posts_per_page 50-100, чтобы не перегружать сервер.
  • Используйте транзакции и логи для отслеживания удалённых товаров.
  • Регулярно делайте резервные копии с помощью плагинов или WP-CLI.

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

МетодПреимуществаНедостаткиПример
Ручное удалениеТочный контрольТрудоёмко, не автоматизированоЧерез админку WooCommerce
WP-Cron с кодомАвтоматизация, гибкостьЗависимость от cron, требует навыковКод из статьи выше
Плагины очисткиПростота установкиМожет быть избыточно, не всегда гибкоWP-Optimize, Clearfy Pro
Как использовать WP-Cron для автоматизации задач в WordPress
26.04.2026
Как автоматически удалять старые изображения в WordPress
06.02.2026
Создать динамические формы в WordPress на AJAX без плагинов
04.01.2026
WooCommerce: автоматическое удаление товаров без остатков
20.07.2026
WooCommerce: установка отзывов после покупки с автоподтверждением
20.04.2026