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

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

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

Как проверить текущий статус наличия товаров

Для начала нужно понять, какие товары сейчас имеют статус «нет в наличии» и как WooCommerce их отображает. В админ-панели перейдите в Товары → Все товары и отфильтруйте по статусу наличия.

Также можно использовать SQL-запрос для быстрого списка товаров с нулевым запасом:

SELECT p.ID, p.post_title, pm.meta_value AS stock_quantity
FROM wp_posts p
JOIN wp_postmeta pm ON p.ID = pm.post_id
WHERE pm.meta_key = '_stock'
AND pm.meta_value <= 0
AND p.post_type = 'product'
AND p.post_status = 'publish';

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

Для автоматизации удаления товаров с отсутствующим запасом можно использовать крон-задачу WordPress с кастомной функцией. Ниже пример кода, который удаляет все опубликованные товары с запасом ≤ 0.

function wc_delete_out_of_stock_products() {
    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'meta_query'     => array(
            array(
                'key'     => '_stock',
                'value'   => 0,
                'compare' => '<=',
                'type'    => 'NUMERIC',
            ),
        ),
        'post_status'    => 'publish',
        'fields'         => 'ids',
    );

    $products = get_posts($args);

    foreach ($products as $product_id) {
        wp_trash_post($product_id); // безопасное удаление с возможностью восстановления
    }
}

// Добавляем крон-задачу, если ещё не добавлена
if (!wp_next_scheduled('wc_delete_out_of_stock_hook')) {
    wp_schedule_event(time(), 'daily', 'wc_delete_out_of_stock_hook');
}
add_action('wc_delete_out_of_stock_hook', 'wc_delete_out_of_stock_products');

Этот код нужно добавить в functions.php активной темы или в кастомный плагин. Он раз в сутки будет отправлять в корзину все товары без наличия.

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

Если хотите полностью удалять товары без возможности восстановления, замените wp_trash_post на wp_delete_post с вторым параметром true:

wp_delete_post($product_id, true);

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

Чтобы проверить, что функция работает корректно:

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

Для ручного запуска функции без ожидания крон-задачи добавьте временно в functions.php:

add_action('init', 'wc_delete_out_of_stock_products');

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

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

  • Крон-задача не срабатывает: проверьте, что кроны WordPress активны (wp-cron.php вызывается), или настройте системный cron на сервере.
  • Товары не удаляются, хотя запас 0: убедитесь, что мета-ключ _stock используется для хранения количества. Если используется другой плагин складского учёта, ключ может отличаться.
  • Удаление товаров приводит к потере связанных данных: если хотите сохранить данные заказов и отчетности, используйте wp_trash_post вместо полного удаления.
  • Функция вызывает ошибки PHP: проверьте наличие необходимых функций WooCommerce и корректность хуков, а также режим отладки.

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

  • Перед автоматическим удалением товаров сделайте резервную копию базы данных.
  • Для больших магазинов с тысячами товаров оптимизируйте запросы, ограничивая количество обрабатываемых товаров за раз.
  • Используйте транзиенты или кеширование для хранения результатов проверки наличия, чтобы снизить нагрузку на базу.
  • Если хотите временно убрать товары с нулевым запасом, рассмотрите вариант их скрытия через изменение статуса на private или использование плагинов для управления видимостью.

Сравнение способов автоматического удаления товаров с отсутствующим наличием

МетодОписаниеПлюсыМинусы
Код с wp_trash_post и WP-CronАвтоматический перенос в корзину с помощью крон-задачиБезопасно, легко восстановить, автоматизацияТовары остаются в корзине, нужно периодически очищать корзину
Код с wp_delete_post (полное удаление)Полное удаление без возможности восстановленияЧистая база, освобождение местаРиск потери данных, требует резервного копирования
Плагины управления запасамиГотовые решения для управления отображением и удалениемУдобство, поддержка, дополнительные функцииЗависимость от стороннего кода, нагрузка
Как отфильтровывать и удалять спам-комментарии в WordPress по IP и User-Agent
05.02.2026
Как использовать хуки в WordPress: подробное руководство с примерами
26.11.2025
Как удалить мета-тег generator из WordPress
10.12.2025
Удаление неиспользуемых атрибутов и метаданных в WooCommerce: практическое руководство
28.04.2026
WooCommerce: автоматическое удаление товаров с отсутствующим наличием
18.07.2026