Почему важно удалять забытые товары в WooCommerce
Забытые или неактивные товары в WooCommerce занимают место в базе данных и могут замедлять работу сайта, особенно если товары добавлены давно и больше не актуальны. Автоматическое удаление таких товаров позволяет поддерживать базу данных в чистоте и улучшать производительность магазина.
Диагностика проблемы: как определить забытые товары
Сначала нужно понять, какие товары считать "забытыми". К типичным критериям относят:
- Отсутствие продаж за определённый период, например, 6 месяцев
- Отсутствие обновлений товара (например, дата последнего изменения более 6 месяцев назад)
- Статус товара — черновик или архив
Для диагностики используйте SQL-запросы напрямую в базе или через плагины, например, Query Monitor, чтобы найти товары, которые не продавались и не обновлялись долгое время.
Пошаговое решение: автоматизация удаления забытых товаров
1. Создаем WP-Cron задачу
WP-Cron позволяет запускать регулярные задачи в WordPress. Для удаления забытых товаров создадим задачу, которая будет запускаться еженедельно.
function schedule_delete_old_products() {
if ( ! wp_next_scheduled( 'delete_old_products_hook' ) ) {
wp_schedule_event( time(), 'weekly', 'delete_old_products_hook' );
}
}
add_action( 'wp', 'schedule_delete_old_products' );2. Обрабатываем удаление товаров по условию
Добавим функцию, которая будет искать товары без продаж и старше 6 месяцев, и удалять их.
add_action( 'delete_old_products_hook', 'delete_old_products' );
function delete_old_products() {
global $wpdb;
$six_months_ago = date('Y-m-d H:i:s', strtotime('-6 months'));
// Получаем ID товаров, которые не продавались и не обновлялись
$product_ids = $wpdb->get_col( $wpdb->prepare(
"SELECT p.ID FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->prefix}woocommerce_order_items oi ON oi.order_item_name = p.post_title
LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oi.order_item_id = oim.order_item_id
WHERE p.post_type = 'product'
AND p.post_modified < %s
AND p.post_status = 'publish'
GROUP BY p.ID
HAVING COUNT(oim.meta_value) = 0",
$six_months_ago
));
if ( ! empty( $product_ids ) ) {
foreach ( $product_ids as $product_id ) {
wp_trash_post( $product_id ); // Перемещаем товар в корзину
}
}
}Обратите внимание: запрос ищет товары с датой последнего изменения старше 6 месяцев и без заказов. По желанию можно изменить логику или добавить дополнительные проверки.
3. Очистка корзины WooCommerce
Удаление товаров помещает их в корзину. Чтобы окончательно удалить их, можно настроить дополнительную задачу для очистки корзины.
function schedule_empty_trash() {
if ( ! wp_next_scheduled( 'empty_product_trash_hook' ) ) {
wp_schedule_event( time(), 'weekly', 'empty_product_trash_hook' );
}
}
add_action( 'wp', 'schedule_empty_trash' );
add_action( 'empty_product_trash_hook', 'empty_product_trash' );
function empty_product_trash() {
$trashed = get_posts([
'post_type' => 'product',
'post_status' => 'trash',
'posts_per_page' => -1,
'fields' => 'ids',
]);
foreach ( $trashed as $product_id ) {
wp_delete_post( $product_id, true ); // Удаляем безвозвратно
}
}Проверка результата после внедрения
- Запустите задачу вручную для теста, вызвав функцию
delete_old_products()через WP-CLI или временно добавив вызов в шаблон. - Проверьте наличие удалённых товаров в корзине WooCommerce в админке.
- Проверьте, что товары, которые должны были удалиться, действительно исчезли.
- Посмотрите логи cron-задач с помощью плагина WP Control, чтобы убедиться, что задачи выполняются по расписанию.
Частые ошибки и как их исправить
- Товары не удаляются: Проверьте, что WP-Cron активен и задачи запланированы. На некоторых хостингах WP-Cron не работает без внешних вызовов.
- Запрос SQL не находит товары: Убедитесь, что в таблицах заказа есть необходимые связи. Иногда нужно адаптировать запрос под структуру данных.
- Удаляются нужные товары: Проверьте логику условий, возможно, стоит добавить дополнительные фильтры, например, по категории или меткам.
- Перманентное удаление не происходит: Убедитесь, что функция
wp_delete_post($id, true)вызывается корректно и права позволяют удалять товары.
Практические советы по безопасности и производительности
- Перед удалением товаров делайте резервные копии базы данных.
- Запускайте удаление в низконагруженное время, чтобы не перегружать сервер.
- Добавьте логирование действий, чтобы отслеживать, какие товары и когда удалялись.
- Используйте транзиты или опции для временного кеширования результатов запроса, если товаров много.
- Для больших магазинов разбивайте удаление на чанки, чтобы избежать тайм-аутов.
Сравнение вариантов реализации: плагин vs код
| Параметр | Плагин | Ручной код (WP-Cron) | Компромисс |
|---|---|---|---|
| Гибкость | Средняя — готовый функционал | Высокая — точечные настройки | Код можно адаптировать под любые задачи |
| Производительность | Может быть избыточным | Оптимизирован под сайт | Вручную можно оптимизировать запросы |
| Безопасность | Зависит от качества плагина | Контроль над каждым этапом | Код требует тестирования |
| Сложность внедрения | Низкая | Средняя — требует навыков | Баланс зависит от задачи |