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

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

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

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

Как автоматически удалять отсутствующие товары по расписанию

Определение отсутствующих товаров

Первый шаг — определить критерий «отсутствия» товара. Чаще всего это:

  • Статус товара: 'outofstock' (нет на складе);
  • Пользовательское поле или мета-данные, указывающие на отсутствие;
  • Дата последнего обновления товара — если товар не обновлялся длительное время.

Для примера используем стандартный статус 'outofstock' и удаляем товары, которые находятся в этом статусе более 30 дней.

Реализация кода для удаления товаров

Реализуем WP-Cron задание, которое ежедневно проверяет и удаляет товары с статусом 'outofstock' старше 30 дней.

function wpdirect_schedule_delete_outofstock_products() {
    if ( ! wp_next_scheduled( 'wpdirect_delete_outofstock_products_daily' ) ) {
        wp_schedule_event( time(), 'daily', 'wpdirect_delete_outofstock_products_daily' );
    }
}
add_action( 'wp', 'wpdirect_schedule_delete_outofstock_products' );

function wpdirect_delete_outofstock_products() {
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( '-30 days' ) );

    $args = [
        'post_type'      => 'product',
        'post_status'    => 'publish',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => '_stock_status',
                'value'   => 'outofstock',
                'compare' => '=',
            ],
        ],
        'date_query'     => [
            [
                'column' => 'post_modified_gmt',
                'before' => $date_threshold,
            ],
        ],
        'fields' => 'ids',
    ];

    $products = get_posts( $args );

    foreach ( $products as $product_id ) {
        wp_delete_post( $product_id, true );
    }
}
add_action( 'wpdirect_delete_outofstock_products_daily', 'wpdirect_delete_outofstock_products' );

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

  1. Добавьте код в файл functions.php вашей дочерней темы или создайте небольшой плагин.
  2. Убедитесь, что WP-Cron активен. Для проверки можно использовать плагин WP Crontrol.
  3. Настройте сервер, если хотите использовать системный cron вместо WP-Cron для повышения надежности.
  4. Проверьте, что товары со статусом outofstock и датой изменения более 30 дней действительно удаляются после запуска cron.

Как проверить, что решение работает

  • Вручную запустите функцию wpdirect_delete_outofstock_products (например, через консоль WP-CLI или временно вызвав функцию на странице).
  • Проверьте список товаров до и после выполнения функции — отсутствующие товары старше 30 дней должны быть удалены.
  • Используйте плагин WP Crontrol для просмотра запланированных задач и их логов.
  • Проверьте базу данных: таблица wp_posts не должна содержать удалённых товаров.

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

  • WP-Cron не срабатывает — проверьте, что на сайте есть посещения, запускающие WP-Cron, или настройте системный cron для вызова wp-cron.php.
  • Удаляются не те товары — убедитесь, что критерии поиска товаров (статус, дата) заданы корректно.
  • Удаление не происходит из-за прав доступа — проверьте, что функция запускается с достаточными правами (например, не из гостевого контекста).
  • Ошибка памяти или таймаут — если товаров много, разбейте задачу на партии с помощью параметра 'posts_per_page' => 50 и реализуйте пагинацию.

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

  • Всегда делайте резервные копии перед внедрением автоматического удаления.
  • Используйте wp_delete_post( $post_id, true ) с параметром true для полного удаления с мета-данными.
  • Для больших магазинов лучше разбивать удаление на партии, чтобы не перегружать базу.
  • Регулярно проверяйте логи ошибок и работы WP-Cron.

Сравнение вариантов решения

МетодПлюсыМинусыКогда использовать
Ручное удалениеПолный контрольТрудозатратно, риск пропуститьМаленькие магазины, редкие изменения
Плагин (например, WP Bulk Delete)Простота настройкиДополнительная нагрузка, может быть не гибкимДля большинства пользователей без навыков кода
Код с WP-Cron (описанный)Автоматизация, гибкость, без сторонних плагиновНужны навыки разработки, настройка WP-CronСредние и крупные магазины с регулярными обновлениями
WooCommerce: автоматическое изменение статуса заказа по условиям
07.05.2026
Как использовать REST API в WordPress для расширения функционала
11.11.2025
Как правильно использовать wp_enqueue_script для удалённой загрузки JS в WooCommerce
22.04.2026
WooCommerce: автоматическое удаление отменённых заказов по расписанию
11.05.2026
Как создать уникальные шорткоды в WordPress
03.11.2025