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

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

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

Подходы к решению задачи

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

  • Ручное удаление — неудобно и неэффективно при большом количестве товаров.
  • Использование готовых плагинов — может добавить избыточный функционал и нагрузку.
  • Реализация кастомного кода, который на основе хука запускает проверку и удаляет товары без остатков.

В этой статье рассмотрим именно последний метод с примером рабочего кода.

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

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

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

function wc_remove_out_of_stock_products() {
    // Параметры запроса для получения товаров без остатка
    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'fields'         => 'ids',
        'meta_query'     => array(
            array(
                'key'     => '_stock_status',
                'value'   => 'outofstock',
                'compare' => '='
            )
        ),
        'post_status'    => 'publish'
    );

    $products = get_posts($args);

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

2. Запуск функции по расписанию через WP-Cron

Чтобы удалять товары регулярно (например, ежедневно), зарегистрируем событие и повесим на него функцию:

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

// Обработчик события
add_action('wc_daily_product_cleanup', 'wc_remove_out_of_stock_products');

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

3. Дополнительная проверка: удалять только простые товары или все типы

По умолчанию код удалит все товары с мета _stock_status = outofstock. Если нужно исключить вариации или определённые типы товаров, добавьте параметр post_type с нужными значениями. Например, чтобы исключить вариации:

'post_type' => 'product', // без 'product_variation'

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

  • После добавления кода и активации WP-Cron, проверьте через админку WooCommerce - раздел «Товары», что товары без склада перемещаются в корзину (Статус «Корзина»).
  • Для теста можно запустить функцию вручную через консоль WP-CLI:
    wp eval 'wc_remove_out_of_stock_products();'
  • Также проверьте в базе данных таблицу wp_posts, что статус записей у удалённых товаров изменён на trash.

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

  • Функция не запускается автоматически: проверьте, работает ли WP-Cron на вашем хостинге (например, запустите wp cron event list через WP-CLI). Если нет — настройте системный cron для вызова wp-cron.php.
  • Некорректное удаление вариаций: убедитесь, что в запросе post_type указан правильно, чтобы не удалить нужные элементы.
  • Товары не удаляются, хотя статус outofstock: проверьте, что все товары обновлены и мета _stock_status соответствует текущему состоянию. Иногда WooCommerce кеширует эту информацию.

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

  • Перед массовым удалением товаров всегда делайте резервную копию базы данных.
  • Для больших магазинов с тысячами товаров используйте постраничный запрос с posts_per_page и batch-обработку, чтобы избежать таймаута.
  • Чтобы избежать негативного влияния на SEO, вместо удаления можно рассмотреть перевод товаров в статус черновик или использование плагина Clearfy Pro для управления видимостью.
  • Для контроля процесса добавьте логирование удалённых товаров в файл или таблицу.

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

МетодПлюсыМинусы
Ручное удалениеПростота, контрольТрудозатратно, неэффективно при большом каталоге
Готовый плагинБыстрое решение, дополнительные функцииМожет замедлить сайт, избыточные возможности
Кастомный код (описанный)Лёгкий, точечный, без лишнего кодаНужны базовые навыки разработки, требует тестирования
Как удалить неиспользуемые таблицы в базе данных WordPress для оптимизации
06.03.2026
WooCommerce: решение проблемы с отображением товаров после обновления кеша
11.05.2026
WordPress: отладка и решение ошибок через логи
27.12.2025
Как отключить регистрацию по бесплатным email в WordPress
21.03.2026
Как удалить все комментарии на сайте WordPress: подробное руководство от WPFAQ
25.11.2025