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

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

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

  • Проверьте в настройках WooCommerce, включена ли опция «Скрывать товары без наличия» (WooCommerce > Настройки > Товары > Запасы).
  • Убедитесь, что для каждого товара корректно установлено управление запасами и количество товара обновлено.
  • Проверьте, не используются ли кастомные коды или плагины, которые влияют на отображение товаров без запасов.

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

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

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

function wpb_delete_out_of_stock_products() {
    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'meta_query'     => array(
            array(
                'key'     => '_stock_status',
                'value'   => 'outofstock',
                'compare' => '='
            )
        ),
        'fields'         => 'ids',
        'post_status'    => 'publish'
    );

    $products = get_posts($args);

    if (!empty($products)) {
        foreach ($products as $product_id) {
            wp_trash_post($product_id); // Перемещаем товар в корзину
        }
    }
}

2. Регистрация задачи в WP-Cron для ежедневного запуска

// Добавляем событие в расписание при активации темы или плагина
function wpb_schedule_daily_delete() {
    if (!wp_next_scheduled('wpb_daily_delete_hook')) {
        wp_schedule_event(time(), 'daily', 'wpb_daily_delete_hook');
    }
}
add_action('wp', 'wpb_schedule_daily_delete');

// Хук для вызова функции удаления
add_action('wpb_daily_delete_hook', 'wpb_delete_out_of_stock_products');

// Очистка расписания при деактивации
function wpb_clear_schedule() {
    $timestamp = wp_next_scheduled('wpb_daily_delete_hook');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpb_daily_delete_hook');
    }
}
register_deactivation_hook(__FILE__, 'wpb_clear_schedule');

Как проверить, что удаление работает

  • Создайте тестовый товар с нулевым остатком и активным статусом.
  • Запустите вручную функцию wpb_delete_out_of_stock_products через WP-CLI или временно вызовите в шаблоне.
  • Проверьте, что товар переместился в корзину (Trash) в админке WooCommerce.
  • Убедитесь, что товары с запасами не затрагиваются.
  • Мониторьте логи cron-задач, если используете плагин WP Crontrol.

Частые ошибки и способы их исправления

  • Не срабатывает cron-задача: WP-Cron зависит от трафика сайта. Для надежности настройте системный cron или используйте плагин WP Crontrol для теста.
  • Товары не удаляются, а только скрываются: Проверьте, что в функции используется wp_trash_post, а не просто изменение статуса.
  • Ошибка прав доступа: Убедитесь, что пользователь, под которым запускается код (обычно админ), имеет права на удаление товаров.
  • Удаление вариативных товаров: Если в каталоге есть вариативные продукты, их дочерние товары тоже могут иметь статус outofstock. Включите проверку дочерних товаров для полного удаления.

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

  • Перед удалением лучше перемещать товары в корзину, чтобы была возможность восстановления.
  • Не ставьте слишком частый запуск cron-задачи — достаточно один раз в сутки.
  • Для крупных магазинов сделайте пагинацию выборки, чтобы избежать перегрузки памяти и таймаутов.
  • Рекомендуется тестировать скрипт на копии сайта перед запуском в продакшене.
  • Для дополнительной безопасности добавьте логирование удалённых товаров в отдельный файл.

Сравнение решений: плагин vs собственный код

РешениеПлюсыМинусы
Плагин (например, WooCommerce Out of Stock Manager)Простота установки, готовый интерфейс, опции настройкиМожет быть тяжеловесным, не всегда гибкий, лишние функции
Собственный код (как в статье)Лёгкий, точечный, легко адаптируемый, не нагружает системуТребует технических навыков, нет интерфейса управления
Как исправить ошибку 429 Too Many Requests в WordPress при использовании API
27.04.2026
Как отключить автообновление плагинов WordPress: практическое руководство
13.04.2026
Как создать динамические виджеты в WordPress с помощью REST API
03.04.2026
Удалить кэш в WordPress: практические способы и код для очистки
10.11.2025
Как автоматически удалять неиспользуемые медиа файлы в WordPress
04.03.2026