Диагностика проблемы: что считать неактивным товаром в WooCommerce
В интернет-магазинах на WooCommerce часто копятся товары, которые не продаются, не обновлялись или не показывались длительное время. Это приводит к нагромождению ассортимента, ухудшению производительности и снижению удобства управления. Чтобы понять, какие товары можно считать неактивными, определимся с критериями:
- Отсутствие продаж за последние N месяцев.
- Товар имеет статус «черновик» или «в ожидании» длительное время.
- Отсутствие просмотров или активности (если настроена аналитика).
Чаще всего достаточно ориентироваться на дату последней продажи и статус товара.
Пошаговое решение: скрипт для автоматического удаления неактивных товаров
Реализуем функцию на PHP, которая:
- Получит ID товаров, у которых не было продаж за последние 6 месяцев.
- Удалит эти товары из базы.
- Добавит возможность запускать скрипт вручную или по Cron.
1. Получение товаров без продаж
WooCommerce не хранит напрямую дату последней продажи в метаполях товара, но можно получить заказы и собрать ID проданных товаров, затем исключить их из выборки.
function get_inactive_products_ids( $months = 6 ) {
global $wpdb;
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$months} months"));
// Получаем ID проданных товаров за последние $months месяцев
$sold_products = $wpdb->get_col($wpdb->prepare(
"SELECT DISTINCT order_item_meta.meta_value
FROM {$wpdb->prefix}woocommerce_order_items as order_items
LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta as order_item_meta ON order_items.order_item_id = order_item_meta.order_item_id
LEFT JOIN {$wpdb->posts} as posts ON posts.ID = order_items.order_id
WHERE order_items.order_item_type = 'line_item'
AND order_item_meta.meta_key = '_product_id'
AND posts.post_type = 'shop_order'
AND posts.post_status IN ('wc-completed','wc-processing')
AND posts.post_date >= %s
", $date_threshold
));
// Получаем все опубликованные товары
$args = [
'post_type' => 'product',
'post_status' => 'publish',
'fields' => 'ids',
'posts_per_page' => -1,
];
$all_products = get_posts($args);
// Исключаем проданные товары
$inactive_products = array_diff($all_products, $sold_products);
return $inactive_products;
}2. Удаление неактивных товаров
Функция для удаления по списку ID товаров с возможностью безопасного удаления (с перемещением в корзину):
function delete_products_by_ids( $product_ids ) {
foreach ( $product_ids as $product_id ) {
wp_trash_post( $product_id ); // Можно заменить на wp_delete_post для полного удаления
}
}3. Запуск по Cron
Добавим хук для регулярного запуска очистки, например, раз в месяц:
if ( ! wp_next_scheduled( 'delete_inactive_products_monthly' ) ) {
wp_schedule_event( time(), 'monthly', 'delete_inactive_products_monthly' );
}
add_action( 'delete_inactive_products_monthly', function() {
$inactive_products = get_inactive_products_ids(6); // 6 месяцев
if ( ! empty( $inactive_products ) ) {
delete_products_by_ids( $inactive_products );
}
});Проверка результата после внедрения
Чтобы убедиться, что скрипт работает корректно:
- Вызовите вручную функции
get_inactive_products_ids()и проверьте, что возвращаются ожидаемые ID. - Перед удалением выведите список товаров на экран или в лог.
- После запуска удаления проверьте, что товары перемещены в корзину (Trash) в админке WooCommerce.
- Убедитесь, что товары с продажами за последние 6 месяцев не удалены.
Частые ошибки и как их исправить
- Удаляются не те товары: Проверьте правильность временного порога и статусов заказов. Например, заказы в статусах «отменен» или «в ожидании» не учитываются.
- Пустой список неактивных товаров: Возможно, в базе нет заказов с нужными статусами или интервал слишком короткий. Проверьте параметры функции.
- Ошибка памяти при большом количестве товаров: Реализуйте обработку по партиям (пагинация) в запросах и удалении.
- Удаление происходит сразу, нет возможности отменить: Используйте
wp_trash_post()вместоwp_delete_post()для возможности восстановления.
Практические советы по безопасности и производительности
- Резервное копирование: Перед массовым удалением товаров сделайте полную резервную копию базы данных.
- Логирование: Ведите лог удалений, чтобы при необходимости откатить изменения.
- Оптимизация запросов: Используйте индексы и минимизируйте количество тяжелых запросов к базе.
- Тестирование на копии сайта: Проверяйте работу кода на тестовом сервере, чтобы избежать потери данных.
Сравнение вариантов удаления неактивных товаров
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Плагин (например, WP Bulk Delete) | Быстрое внедрение, интерфейс, гибкие фильтры | Дополнительная нагрузка, зависимости, возможные конфликты | Если нужен быстрый результат без кода |
| Самописный код (как в статье) | Полный контроль, минимум нагрузки, легко интегрировать в Cron | Требует навыков программирования, тестов | Для опытных разработчиков и кастомных задач |
| Ручное удаление в админке | Простота, нет технических навыков | Долго, риск ошибок при большом количестве товаров | Для единичных случаев |