Диагностика проблемы: зачем удалять товары без активных заказов?
В интернет-магазинах на WooCommerce часто накапливаются товары, которые не покупают или которые давно не используются. Это увеличивает размер базы данных, замедляет админку и усложняет управление каталогом. Автоматическое удаление таких товаров помогает поддерживать базу в актуальном состоянии без лишних затрат времени.
Как определить товары без активных заказов?
Активные заказы — это заказы, которые не отменены и не завершены отменой возврата. Чтобы выявить товары без таких заказов, нужно проверить наличие связей товара с заказами в статусах, например, processing, on-hold, completed.
Пошаговое решение: код для автоматического удаления товаров без активных заказов
Для реализации решения добавим кастомный WP-Cron, который ежедневно проверяет товары и удаляет те, у которых нет активных заказов.
1. Создаем функцию проверки и удаления товаров
function wpc_remove_products_without_active_orders() {
global $wpdb;
// Получаем все ID товаров
$product_ids = $wpdb->get_col("SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product' AND post_status = 'publish'");
foreach ($product_ids as $product_id) {
// Получаем количество активных заказов с товаром
$order_count = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(DISTINCT p.ID) FROM {$wpdb->prefix}posts p
INNER JOIN {$wpdb->prefix}woocommerce_order_items oi ON p.ID = oi.order_id
INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oi.order_item_id = oim.order_item_id
WHERE p.post_type = 'shop_order'
AND p.post_status IN ('wc-processing', 'wc-on-hold', 'wc-completed')
AND oim.meta_key = '_product_id'
AND oim.meta_value = %d",
$product_id
));
if (intval($order_count) === 0) {
// Удаляем товар без активных заказов
wp_delete_post($product_id, true); // true — принудительное удаление без корзины
}
}
}2. Регистрируем ежедневное событие WP-Cron
function wpc_schedule_daily_product_cleanup() {
if (!wp_next_scheduled('wpc_daily_product_cleanup_event')) {
wp_schedule_event(time(), 'daily', 'wpc_daily_product_cleanup_event');
}
}
add_action('wp', 'wpc_schedule_daily_product_cleanup');
add_action('wpc_daily_product_cleanup_event', 'wpc_remove_products_without_active_orders');3. Отключение cron и запуск вручную (для отладки)
Для проверки можно запускать функцию вручную из админки или через консоль WP-CLI:
wp eval 'wpc_remove_products_without_active_orders();'Проверка результата после внедрения
- Проверьте, что после запуска cron товары без активных заказов удаляются из базы (в админке WooCommerce они должны исчезнуть).
- Включите логирование, добавив
error_logв функцию для вывода ID удаляемых товаров. - Запустите функцию вручную и убедитесь, что товары с активными заказами не затрагиваются.
Частые ошибки и как их исправить
- Нет удаления товаров: Убедитесь, что cron событие запланировано и функция вызывается. Проверьте права пользователя, под которым работает скрипт.
- Удаляются товары с заказами: Проверьте правильность статусов заказов в запросе. По умолчанию учитывайте только
wc-processing,wc-on-holdиwc-completed. - Производительность: При большом количестве товаров запросы могут нагружать базу. Разбейте обработку на порции по 100 товаров в цикле.
- Потеря данных: Обязательно сделайте резервную копию базы перед внедрением удаления.
Практические советы по безопасности и производительности
- Используйте принудительное удаление
wp_delete_post($id, true)только если уверены, что бэкапы есть. - Для больших магазинов реализуйте пакетную обработку — в каждой итерации обрабатывайте 50-100 товаров, чтобы избежать таймаутов.
- Добавьте проверку nonce и прав пользователя, если планируете запускать функцию вручную из админки.
- Для отладки подключите логирование через
error_log, чтобы отслеживать удаляемые товары. - Регулярно контролируйте планировщик WP-Cron, чтобы он не блокировался, особенно на низконагруженных серверах.
Сравнение способов удаления товаров без активных заказов
| Метод | Преимущества | Недостатки | Использование |
|---|---|---|---|
| WP-Cron с кастомным кодом | Полный контроль, автоматизация, гибкость | Требует навыков программирования, нагрузка при большом каталоге | Подходит для магазинов с регулярным обновлением ассортимента |
| Плагины очистки каталога | Простота, готовые решения | Могут не учитывать все бизнес-правила, нагрузка и лишние функции | Для небольших магазинов без специальных условий |
| Ручное удаление в админке | Безопасно, визуальный контроль | Трудоемко, не автоматично | Маленькие магазины или редко обновляемый каталог |