Диагностика проблемы: зачем автоматически удалять товары
В WooCommerce часто возникает задача удалить товары, связанные с завершёнными, отменёнными или долго неактивными заказами. Это актуально для магазинов с ограниченным ассортиментом, сезонных товаров или тех, кто не хочет вручную отслеживать устаревшие позиции.
Проблема: вручную отслеживать и удалять товары неудобно и рискованно — можно случайно удалить нужный товар. Автоматизация решит эту задачу.
Пошаговое решение: удаление товаров по статусу заказов
1. Определяем критерии удаления
Например, удалять товары, которые не связаны с заказами со статусом completed, или которые были в заказах со статусом cancelled более 30 дней назад.
2. Получаем ID товаров из заказов по статусу
Используем WP_Query и запросы к таблицам WooCommerce для выборки товаров.
3. Пишем функцию для удаления товаров
function wpbit_delete_products_by_order_status( $statuses = array('cancelled'), $days = 30 ) {
global $wpdb;
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Получаем ID заказов с нужным статусом и датой
$orders = wc_get_orders(array(
'status' => $statuses,
'date_modified' => '<' . $date_threshold,
'limit' => -1,
'return' => 'ids',
));
if (empty($orders)) {
return 'Нет заказов для обработки';
}
// Получаем ID товаров из этих заказов
$product_ids = array();
foreach ($orders as $order_id) {
$order = wc_get_order($order_id);
foreach ($order->get_items() as $item) {
$product_ids[] = $item->get_product_id();
}
}
$product_ids = array_unique($product_ids);
if (empty($product_ids)) {
return 'Нет товаров для удаления';
}
// Удаляем товары
foreach ($product_ids as $pid) {
wp_delete_post($pid, true); // true - без перемещения в корзину
}
return count($product_ids) . ' товаров удалено';
}
4. Добавляем запуск задачи по Cron
if (!wp_next_scheduled('wpbit_delete_products_cron')) {
wp_schedule_event(time(), 'daily', 'wpbit_delete_products_cron');
}
add_action('wpbit_delete_products_cron', function() {
$result = wpbit_delete_products_by_order_status(array('cancelled'), 30);
error_log('[WPBit Cron] ' . $result);
});
Проверка результата после внедрения
- Проверьте логи ошибок (error_log) для сообщений от функции.
- В админ-панели WooCommerce проверьте наличие заказов со статусом
cancelledстарше 30 дней. - Убедитесь, что соответствующие товары исчезли из каталога (проверьте по ID или названию).
- Тестируйте на тестовом сайте перед запуском на боевом.
Частые ошибки и как их исправить
- Ошибка: Товары не удаляются.
- Причина: функция не вызывается. Проверьте регистрацию Cron задачи и наличие хука.
- Ошибка: Удаляются нужные товары.
- Причина: некорректно определены критерии или переданы статусы заказов. Проверьте входные параметры функции.
- Ошибка: Перегрузка сервера при большом количестве заказов.
- Решение: разбейте удаление на партии, используйте WP-CLI или фоновые задачи через Action Scheduler.
Практические советы по безопасности и производительности
- Перед удалением делайте бэкап базы данных.
- Добавьте проверку прав пользователя, если запускаете удаление через панель.
- Используйте
wp_delete_post($pid, true)для полного удаления без перемещения в корзину, чтобы сэкономить место. - Для крупных магазинов вынесите логику в WP-CLI команду или в плагин с Action Scheduler, чтобы избежать таймаутов.
- Логируйте результаты удаления в отдельный файл для последующего аудита.
Сравнение вариантов удаления товаров
| Метод | Плюсы | Минусы | Рекомендуется для |
|---|---|---|---|
| Ручное удаление через админку | Простота, контроль | Трудозатратно, риск ошибки | Маленькие магазины |
| Автоматизация через Cron и кастомный код | Автоматизация, точный контроль | Требует навыков, возможны ошибки в логике | Средние магазины |
| Использование плагинов для очистки каталога | Простота, готовые решения | Могут удалять лишнее, нагрузка | Начинающие, быстрые решения |