Диагностика проблемы неактивных товаров в WooCommerce
В интернет-магазинах на WooCommerce накапливаются товары, которые долгое время не продаются и не обновляются. Это ведет к раздуванию базы данных, замедлению работы сайта и усложнению управления каталогом. Важно своевременно выявлять и удалять такие товары, чтобы поддерживать актуальность ассортимента и улучшать производительность.
Как определить неактивный товар?
Критерии могут быть разными, но распространённые варианты:
- Отсутствие продаж в течение N месяцев.
- Отсутствие обновлений товара в течение N месяцев.
- Статус товара — опубликован, но без активности.
Для реализации автоматического удаления нужно использовать первую метрику — отсутствие продаж. Это более объективный критерий.
Пошаговое решение: автоматическое удаление товаров без продаж дольше 6 месяцев
1. Подготовка и резервное копирование
Перед внесением изменений обязательно сделайте резервную копию базы данных и файлов сайта. Удаление товаров — необратимая операция.
2. Создание функции для удаления товаров
Добавьте следующий код в файл functions.php вашей дочерней темы или создайте небольшой плагин для удобства:
function wpcoder_delete_inactive_products() {
global $wpdb;
$months_inactive = 6; // Период без продаж
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$months_inactive} months"));
// Получаем ID товаров, у которых не было заказов после даты порога
$product_ids = $wpdb->get_col($wpdb->prepare(
"SELECT p.ID FROM {$wpdb->posts} p
WHERE p.post_type = 'product'
AND p.post_status = 'publish'
AND p.ID NOT IN (
SELECT DISTINCT oi.order_item_id
FROM {$wpdb->prefix}woocommerce_order_items oi
INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oi.order_item_id = oim.order_item_id
INNER JOIN {$wpdb->posts} o ON o.ID = oi.order_id
WHERE o.post_type = 'shop_order'
AND o.post_status IN ('wc-completed', 'wc-processing')
AND o.post_date > %s
AND oim.meta_key = '_product_id'
)",
$date_threshold
));
if (!empty($product_ids)) {
foreach ($product_ids as $product_id) {
wp_trash_post($product_id); // Перемещаем в корзину, можно заменить на wp_delete_post для удаления безвозвратно
}
}
}
// Запускаем функцию по расписанию раз в неделю
if (!wp_next_scheduled('wpcoder_weekly_inactive_product_cleanup')) {
wp_schedule_event(time(), 'weekly', 'wpcoder_weekly_inactive_product_cleanup');
}
add_action('wpcoder_weekly_inactive_product_cleanup', 'wpcoder_delete_inactive_products');3. Разбор кода и настройка
$months_inactive— количество месяцев без продаж, после которого товар считается неактивным.- Запрос выбирает опубликованные товары, которые не связаны с заказами со статусом
wc-completedилиwc-processingза указанный период. wp_trash_postпомещает товар в корзину, что безопаснее, чем удаление.- Запланированное задание в WP-Cron запускает функцию еженедельно.
Проверка результата после внедрения
Чтобы убедиться, что всё работает корректно:
- Запустите функцию вручную через
do_action('wpcoder_weekly_inactive_product_cleanup');в консоли WP-CLI или временно вызовите её из кода. - Проверьте, что в корзине появились товары, которые действительно не продавались более 6 месяцев.
- Убедитесь, что активные товары остались без изменений.
- Мониторьте журнал ошибок и логи сервера на предмет сбоев.
Частые ошибки и способы их исправления
- Неправильные статусы заказов в запросе: Если используете другие статусы оплаты, добавьте их в массив
post_statusв SQL. - Отсутствие cron-задачи: Проверьте через
wp cron event list, что заданиеwpcoder_weekly_inactive_product_cleanupзапланировано. - Функция не запускается автоматически: Убедитесь, что на хостинге включён WP-Cron или настройте системный cron для вызова
wp-cron.php. - Удаляются нужные товары: Проверьте правильность даты и логику выборки, при необходимости увеличьте период без продаж.
Практические советы по безопасности и производительности
- Используйте
wp_trash_postвместоwp_delete_postдля возможности восстановления товара из корзины. - Проводите очистку корзины вручную или настройте автоматическую очистку через плагин, чтобы не накапливать мусор.
- Оптимизируйте SQL-запрос, индексируя таблицы WooCommerce, если база большая.
- Проверяйте влияние на производительность при запуске задачи, лучше запускать её в ночное время.
Сравнение методов удаления неактивных товаров
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| WP-Cron с SQL-запросом | Автоматический запуск функции удаления по расписанию | Автоматизация, гибкость настройки, не требует сторонних плагинов | Зависит от правильной работы WP-Cron, нагрузка на БД при большом каталоге |
| Плагины очистки | Готовые решения для удаления товаров | Простота использования, интерфейс, дополнительные функции | Могут быть платными, избыточны, нагрузка на сайт |
| Ручное удаление | Удаление через админку или SQL-запросы | Полный контроль | Риск ошибок, трудоёмко на больших магазинах |