Диагностика проблемы: зачем удалять неактивные товары в WooCommerce
В магазинах на WooCommerce с большим ассортиментом часто накапливаются товары, которые долгое время не обновлялись, не продаются и имеют статус «неактивен» или «черновик». Это ведёт к разрастанию базы данных, замедлению админки и ухудшению UX для покупателей. Ручное удаление таких товаров занимает много времени и чревато ошибками.
Автоматизация удаления неактивных товаров помогает поддерживать базу в актуальном состоянии и ускоряет работу магазина.
Как определить неактивные товары для удаления
В WooCommerce товар — это тип записи product. Неактивными обычно считаются товары со статусом draft, pending или private, или те, у которых дата последнего изменения более определённого срока назад (например, 180 дней).
Перед удалением важно чётко определить критерии:
- Статус товара:
draftилиprivate - Дата последнего обновления: старше 180 дней
- Отсутствие продаж за этот период (опционально)
Пошаговое решение: автоматическое удаление неактивных товаров через WP-Cron
1. Создаём функцию удаления
Добавьте следующий код в файл functions.php вашей активной темы или в кастомный плагин:
function wc_delete_inactive_products() {
$args = array(
'post_type' => 'product',
'post_status' => array('draft', 'pending', 'private'),
'date_query' => array(
array(
'column' => 'post_modified_gmt',
'before' => '180 days ago',
),
),
'fields' => 'ids',
'posts_per_page' => 50,
);
$query = new WP_Query($args);
if (!$query->have_posts()) {
return;
}
foreach ($query->posts as $product_id) {
wp_delete_post($product_id, true); // true - без перемещения в корзину
}
}2. Регистрируем WP-Cron задачу
Добавьте код для планирования задачи, если она ещё не существует:
add_action('wc_delete_inactive_products_hook', 'wc_delete_inactive_products');
function wc_schedule_delete_inactive_products() {
if (!wp_next_scheduled('wc_delete_inactive_products_hook')) {
wp_schedule_event(time(), 'daily', 'wc_delete_inactive_products_hook');
}
}
add_action('wp', 'wc_schedule_delete_inactive_products');3. Удаляем запланированную задачу при деактивации темы/плагина
function wc_unschedule_delete_inactive_products() {
$timestamp = wp_next_scheduled('wc_delete_inactive_products_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wc_delete_inactive_products_hook');
}
}
add_action('switch_theme', 'wc_unschedule_delete_inactive_products');Проверка результата после внедрения
- В админке WooCommerce проверьте наличие товаров со статусом
draft,pendingиprivate, изменённых более 180 дней назад — их должно стать меньше или они должны исчезнуть после запуска cron. - Проверьте логи сервера или добавьте временно логирование в функцию
wc_delete_inactive_productsдля отслеживания удалённых ID. - Запустите cron вручную с помощью WP-CLI:
wp cron event run wc_delete_inactive_products_hookи просмотрите результаты.
Частые ошибки и их исправление
- Ошибка: Функция не удаляет товары.
Причина: Не настроен WP-Cron или задача не запланирована.
Решение: Проверьте, что cron-задание есть:wp cron event list, запустите вручную. - Ошибка: Удаляются товары, которые не нужно трогать.
Причина: Некорректные критерии запроса.
Решение: Проверьте параметрыpost_statusиdate_query, измените условия. - Ошибка: Производительность падает при большом количестве товаров.
Решение: Уменьшитеposts_per_page, добавьте пагинацию или пакетную обработку.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы данных перед автоматическим удалением.
- Используйте
wp_delete_post($id, true)для полного удаления, но будьте осторожны — восстановить удалённые товары будет нельзя. - Для магазинов с большим количеством товаров используйте пакетную обработку с ограничением по времени выполнения PHP, чтобы избежать таймаутов.
- Добавьте логирование действий удаления в отдельный файл или в системные логи для аудита.
- Проверяйте, не используются ли удаляемые товары в заказах, чтобы не сломать логику.
Сравнение способов удаления неактивных товаров
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Ручное удаление через админку | Простота, контроль | Трудоёмко, неэффективно для большого каталога | Админка WooCommerce |
| Автоматический WP-Cron скрипт | Автоматизация, экономия времени | Нужны навыки, риск удаления нужных товаров | Код из статьи |
| Плагины очистки (например, Clearfy Pro) | Готовое решение, дополнительные функции | Может быть платным, лишние функции | Clearfy Pro |