Диагностика проблемы: зачем удалять неактивные товары в WooCommerce
В интернет-магазинах на WooCommerce с течением времени накапливаются товары, которые перестали быть актуальными: снятые с продажи, устаревшие или временно недоступные. Они занимают место в базе данных, замедляют работу сайта и мешают пользователям. Ручное удаление — трудоёмкий процесс, особенно при большом каталоге. Автоматизация удаления неактивных товаров поможет поддерживать магазин в порядке без лишних усилий.
Определение «неактивных» товаров
Под неактивными товарами здесь понимаются продукты, которые:
- В статусе
draftилиpendingболее 30 дней; - Отмечены как
outofstockи не меняли статус в течение 60 дней; - Имеют статус
privateилиtrashболее 7 дней.
Эти параметры можно настроить под свои нужды, изменив количество дней или критерии.
Пошаговое решение: автоматическое удаление неактивных товаров
1. Добавление пользовательской функции в functions.php
Вставьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин для кастомных функций:
function wpcatalog_delete_inactive_products() {
if ( ! current_user_can('manage_woocommerce') ) return;
$args = array(
'post_type' => 'product',
'post_status' => array('draft', 'pending', 'private', 'trash'),
'date_query' => array(
array(
'column' => 'post_modified_gmt',
'before' => '30 days ago',
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$products = get_posts($args);
foreach ($products as $product_id) {
wp_delete_post($product_id, true); // true - полностью удалить без корзины
}
// Удаление outofstock товаров старше 60 дней
$outofstock_args = array(
'post_type' => 'product',
'post_status' => 'publish',
'meta_query' => array(
array(
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '=',
),
),
'date_query' => array(
array(
'column' => 'post_modified_gmt',
'before' => '60 days ago',
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$outofstock_products = get_posts($outofstock_args);
foreach ($outofstock_products as $product_id) {
wp_delete_post($product_id, true);
}
}
// Запуск через WP-Cron каждый день
if ( ! wp_next_scheduled('wpcatalog_daily_inactive_products_cleanup') ) {
wp_schedule_event(time(), 'daily', 'wpcatalog_daily_inactive_products_cleanup');
}
add_action('wpcatalog_daily_inactive_products_cleanup', 'wpcatalog_delete_inactive_products');2. Проверка и очистка WP-Cron
Убедитесь, что задачи WP-Cron работают корректно. Для этого можно использовать плагин Clearfy, который позволяет управлять кронами и оптимизировать сайт.
Проверка результата после внедрения
- Зайдите в админку WooCommerce → Товары → Все товары.
- Отфильтруйте товары по статусам
draft,pending,privateиtrash. Они должны исчезнуть, если были старее 30 дней. - Проверьте товары со статусом
outofstock— если они не менялись более 60 дней, их также не должно быть. - Для полной проверки можно временно заменить
wp_delete_post($product_id, true);наerror_log('Удаляем товар ID: ' . $product_id);и посмотреть логи, какие товары будут удалены.
Частые ошибки и как их исправить
- Не срабатывает WP-Cron: Задача не запускается, если на сайте мало трафика или WP-Cron отключен. Решение — настроить системный cron на сервере, вызывающий wp-cron.php.
- Удаление не тех товаров: Проверьте корректность условий
date_queryиmeta_query, чтобы не удалить актуальные товары. - Отсутствие прав доступа: Функция запускается только если есть права
manage_woocommerce. Проверьте, что cron запускается под админом.
Практические советы по безопасности и производительности
- Перед удалением добавьте резервное копирование базы, чтобы избежать потери данных.
- Удаляйте товары пакетами по 50-100, если каталог большой, чтобы не перегружать сервер.
- Используйте транзакции или логи для восстановления при ошибках.
- Оптимизируйте WP-Cron, устанавливая системный cron вместо запуска при заходе посетителей.
Сравнение вариантов удаления неактивных товаров
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Код в functions.php с WP-Cron | Полный контроль, настраиваемые условия, бесплатно | Нужны базовые навыки, возможны ошибки при неправильном коде | Для опытных разработчиков и кастомных требований |
| Плагины очистки (например WP Sweep, Advanced Database Cleaner) | Простота, интерфейс, много функций | Могут удалять лишнее, нагрузка при больших базах | Для быстрой очистки и базовой оптимизации |
| Ручное удаление в админке | Простота, нет риска ошибок кода | Трудоемко при большом каталоге | Маленькие магазины или единичные случаи |