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

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

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

Чтобы определить, есть ли в вашем магазине такие товары, выполните запрос в базе данных или используйте административный интерфейс:

SELECT ID, post_title, post_status FROM wp_posts WHERE post_type = 'product' AND post_status != 'trash';

Далее проверьте наличие запасов у этих товаров (мета-ключ _stock_status или _stock). Отсутствующие товары обычно имеют статус outofstock или нулевой запас.

Почему важно автоматизировать удаление отсутствующих товаров

  • Уменьшается размер базы данных и ускоряется загрузка страниц.
  • Улучшение навигации и пользовательского опыта.
  • Снижение риска ошибок в заказах и отчетах.
  • Оптимизация SEO за счет удаления неактуальных страниц.

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

1. Создаём WP-Cron задачу

WordPress позволяет запускать задачи по расписанию с помощью WP-Cron. Создадим задачу, которая будет запускаться, например, раз в сутки, и будет удалять товары с нулевым запасом.

add_action('wp_loaded', function() {
    if (!wp_next_scheduled('wpdirect_delete_outofstock_products')) {
        wp_schedule_event(time(), 'daily', 'wpdirect_delete_outofstock_products');
    }
});

2. Реализуем функцию удаления товаров

Функция должна искать товары с мета-ключом _stock_status равным outofstock и удалять их программно с помощью wp_delete_post.

add_action('wpdirect_delete_outofstock_products', function() {
    $args = [
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'meta_key'       => '_stock_status',
        'meta_value'     => 'outofstock',
        'fields'         => 'ids',
        'post_status'    => ['publish', 'private', 'draft']
    ];
    $query = new WP_Query($args);

    if (!$query->have_posts()) {
        return;
    }

    foreach ($query->posts as $product_id) {
        wp_delete_post($product_id, true); // true — удаление без перемещения в корзину
    }
});

3. Добавляем уведомление в лог (опционально)

Для отладки и контроля полезно вести лог удалённых товаров.

add_action('wpdirect_delete_outofstock_products', function() {
    $args = [
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'meta_key'       => '_stock_status',
        'meta_value'     => 'outofstock',
        'fields'         => 'ids',
        'post_status'    => ['publish', 'private', 'draft']
    ];
    $query = new WP_Query($args);

    if (!$query->have_posts()) {
        error_log('WPDirect: Нет товаров для удаления.');
        return;
    }

    foreach ($query->posts as $product_id) {
        wp_delete_post($product_id, true);
        error_log('WPDirect: Удалён товар ID ' . $product_id);
    }
});

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

  • Убедитесь, что в базе данных больше нет товаров с _stock_status = outofstock. Проверьте через phpMyAdmin или WP_Query.
  • Проверьте логи ошибок сервера или debug.log WordPress (если включён) на наличие записей об удалении.
  • Проверьте, что запланированная задача существует и запускается: wp cron event list (через WP-CLI) или плагин WP Crontrol.

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

  • Задача не запускается: WP-Cron запускается только при посещениях сайта. Для гарантированной работы настройте системный cron на сервере: wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1.
  • Товары не удаляются: Проверьте правильность мета-ключа и значения. В WooCommerce иногда используются другие поля или кастомные статусы.
  • Удаление без подтверждения: Используйте второй параметр true в wp_delete_post, чтобы обойти корзину и полностью удалить товар.
  • Проблемы с правами: Код должен работать в контексте администратора или с достаточными правами, чтобы удалять посты.

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

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

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

МетодПлагинКодКомпромисс
Удаление вручнуюТрудозатратно, риск ошибок, не масштабируемо
Плагин очистки каталогаДа (например, "WooCommerce Bulk Stock Management")Простота, но нагрузка на сайт, часто платные
Автоматизация через кодWP-Cron + wp_delete_postГибко, бесплатно, требует навыков и тестирования

Чек-лист для внедрения автоматического удаления товаров

  • Определить критерии отсутствия товара (например, _stock_status = outofstock).
  • Написать функцию для выборки и удаления товаров.
  • Создать WP-Cron задачу для регулярного запуска.
  • Настроить системный cron для надёжности (опционально).
  • Внедрить логирование удаления.
  • Провести тестирование на staging-сайте.
  • Сделать резервную копию базы перед запуском на продакшене.
Как использовать REST API в WordPress для расширения функционала
11.11.2025
Как автоматически изменять статус заказа WooCommerce по условиям
26.04.2026
WooCommerce: автоматическое удаление неактивных заказов по расписанию с оптимизацией
06.07.2026
Как добавить собственные типы постов в WordPress
07.11.2025
WooCommerce: автоматическое изменение статуса заказа по условиям
07.05.2026