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

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

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

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

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

Использование WP-Cron для периодической проверки и удаления товаров

Для решения подойдет кастомный код, который будет запускаться по расписанию (например, раз в сутки) и удалять товары с остатком 0 или меньше.

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

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

add_action( 'wpmeta_delete_out_of_stock_products', 'wpmeta_delete_out_of_stock_products_callback' );

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

    $query = new WP_Query( $args );

    if ( ! empty( $query->posts ) ) {
        foreach ( $query->posts as $product_id ) {
            wp_delete_post( $product_id, true );
        }
    }
}

Объяснение:

  • wp_schedule_event создает ежедневное событие.
  • Хук wpmeta_delete_out_of_stock_products запускает функцию удаления.
  • Функция ищет все товары с мета-полем _stock меньше или равным 0 и удаляет их wp_delete_post с параметром true (без возможности восстановления из корзины).

Вариант с использованием сторонних плагинов

Если вы предпочитаете не писать код, можно использовать плагины автоподдержки WooCommerce, например:

ПлагинФункционалПлюсыМинусы
WooCommerce Advanced Bulk EditМассовое редактирование товаров, фильтрация по остатку, удалениеИнтерфейс, без кодаРучное действие, нет автоматизации
WP All Import + WP All ExportИмпорт и экспорт с фильтрацией, можно настроить удаление через импортГибкостьСложнее в настройке

Пошаговое руководство по внедрению кода

  1. Сделайте резервную копию сайта (базы данных и файлов).
  2. Подключитесь к сайту через FTP или файловый менеджер хостинга.
  3. Откройте functions.php активной темы или создайте плагин с этим кодом.
  4. Вставьте код и сохраните файл.
  5. Проверьте, что в админке в разделе «Инструменты» - «Запланированные события» (если установлен WP Crontrol) появилось событие wpmeta_delete_out_of_stock_products.
  6. Подождите 24 часа или запустите событие вручную (через WP Crontrol или программно).

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

  • Создайте тестовый товар с остатком 0.
  • Вручную запустите хук (через WP Crontrol или временно добавьте вызов wpmeta_delete_out_of_stock_products_callback() в код).
  • Обновите список товаров — тестовый товар должен исчезнуть.
  • Убедитесь, что другие товары с остатком > 0 не удаляются.

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

Товар не удаляется, хотя остаток 0

  • Проверьте, что остаток хранится в метаполе _stock. Некоторые плагины или кастомные решения могут использовать другие метаполя.
  • Убедитесь, что товар имеет тип product, а не вариацию или кастомный тип.

Планировщик событий не запускается

  • Проверьте, включен ли WP-Cron на сайте (иногда его отключают в wp-config.php через define('DISABLE_WP_CRON', true);).
  • Если отключен, настройте системный cron на вызов wp-cron.php или запускайте вручную.

Удаление происходит слишком часто или не по расписанию

  • Проверьте, нет ли дублированных хук-событий через WP Crontrol.
  • Если нужно изменить период, замените 'daily' на 'hourly' или 'twicedaily', но учитывайте нагрузку.

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

  • При удалении товаров используйте wp_delete_post( $product_id, true ) для полного удаления без попадания в корзину, иначе база может разрастаться.
  • Перед массовым удалением сделайте экспорт списка товаров на всякий случай.
  • Не запускайте удаление чаще одного раза в сутки без необходимости — нагрузка на базу может повыситься.
  • Если магазин большой, ограничьте удаление партиями по 100 товаров за раз, добавив пагинацию в WP_Query.
  • Для контроля и лога добавьте запись в файл или базу данных о количестве удаленных товаров за запуск.

Пример кода с ограничением на 100 товаров за запуск и логированием

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

    $query = new WP_Query( $args );
    $deleted_count = 0;

    if ( ! empty( $query->posts ) ) {
        foreach ( $query->posts as $product_id ) {
            if ( wp_delete_post( $product_id, true ) ) {
                $deleted_count++;
            }
        }
    }
    if ( $deleted_count > 0 ) {
        error_log( "[wpmeta] Deleted $deleted_count out of stock products on " . date('Y-m-d H:i:s') );
    }
}
WooCommerce: как настроить автоматическое удаление товаров при отсутствии на складе
03.06.2026
Как создать автоматический вывод оценок на основе WPMeta в WordPress
13.03.2026
WooCommerce: как автоматически отключать неактивные аккаунты клиентов
11.07.2026
Как сделать автоматический импорт из XML в WordPress
08.03.2026
Как создать динамические таблицы в WordPress с помощью плагинов и кода
13.12.2025

Совсем скоро здесь откроется ресурс о вордпресс.