Диагностика задачи: зачем удалять заказы по статусу и датам
В WooCommerce с течением времени накапливается большое количество заказов, часть из которых может быть тестовыми, неактивными или устаревшими. Массовое удаление таких заказов вручную через админку неудобно и занимает много времени. Автоматизация процесса удаления заказов по определённым критериям (например, статусу "отменён" и дате создания старше 6 месяцев) помогает поддерживать базу в чистоте и улучшает производительность сайта.
Как определить заказы для удаления: выбор критериев
Для удаления можно использовать комбинацию следующих параметров:
- Статус заказа: например, "cancelled", "failed", "refunded" и другие.
- Дата создания заказа: удалять заказы старше определённого периода, например, 6 месяцев или 1 года.
- Дополнительные условия: по email покупателя, меткам, способу оплаты и т.д.
В этой статье рассмотрим простой пример удаления заказов со статусом "cancelled" старше 6 месяцев.
Пошаговое решение: код для удаления заказов WooCommerce по статусу и дате
1. Создаём WP-CLI команду для безопасного запуска
Лучший способ массово удалять заказы — использовать WP-CLI. Это позволит избежать таймаутов и ошибок памяти при большом количестве заказов.
if ( defined('WP_CLI') && WP_CLI ) {
WP_CLI::add_command('wc delete_old_cancelled_orders', function() {
$date_threshold = date('Y-m-d H:i:s', strtotime('-6 months'));
$args = [
'post_type' => 'shop_order',
'post_status' => 'wc-cancelled',
'date_query' => [
[
'column' => 'post_date',
'before' => $date_threshold,
],
],
'posts_per_page' => -1,
'fields' => 'ids',
];
$orders = get_posts($args);
$count = 0;
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true = удаление без возможности восстановления
$count++;
}
WP_CLI::success("Удалено {$count} заказов со статусом 'cancelled' старше 6 месяцев.");
});
}2. Запуск команды
В терминале в корне сайта запускаем:
wp wc delete_old_cancelled_ordersЕсли WP-CLI настроен правильно, команда удалит все подходящие заказы и выведет отчёт.
3. Альтернатива: удаление через PHP-скрипт с ограничением по пакетам
Если WP-CLI недоступен, можно использовать PHP-функцию с использованием wp_schedule_single_event для пакетной обработки, чтобы избежать превышения лимитов.
function delete_old_cancelled_orders_batch() {
$date_threshold = date('Y-m-d H:i:s', strtotime('-6 months'));
$args = [
'post_type' => 'shop_order',
'post_status' => 'wc-cancelled',
'date_query' => [
[
'column' => 'post_date',
'before' => $date_threshold,
],
],
'posts_per_page' => 20,
'fields' => 'ids',
];
$orders = get_posts($args);
if (empty($orders)) {
return; // Нет заказов для удаления
}
foreach ($orders as $order_id) {
wp_delete_post($order_id, true);
}
// Запланировать следующий запуск через 1 минуту
wp_schedule_single_event(time() + 60, 'delete_old_cancelled_orders_batch_hook');
}
add_action('delete_old_cancelled_orders_batch_hook', 'delete_old_cancelled_orders_batch');
// Запустить первый раз вручную
// delete_old_cancelled_orders_batch();Проверка результата после внедрения
- В админке WooCommerce перейдите в раздел "Заказы" и примените фильтр по статусу "отменён".
- Выберите период старше 6 месяцев (или используйте SQL-запрос к базе для проверки):
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < DATE_SUB(NOW(), INTERVAL 6 MONTH);Если после запуска удаления количество заказов уменьшилось, значит скрипт сработал.
Частые ошибки и как их исправить
- Заказы не удаляются: Проверьте, что статус заказа указан правильно — WooCommerce использует префикс
wc-в статусах, например,wc-cancelled. - Скрипт зависает или вызывает ошибку памяти: используйте пакетную обработку, ограничивая количество удаляемых заказов за раз.
- WP-CLI команда не доступна: убедитесь, что WP-CLI установлен и доступен в окружении, где выполняется скрипт.
- Заказы восстанавливаются после удаления: используйте
wp_delete_post($order_id, true), где второй параметр означает безвозвратное удаление.
Практические советы по безопасности и производительности
- Создайте резервную копию базы данных перед массовым удалением заказов.
- Выполняйте массовые операции в ночное время с низкой нагрузкой на сервер.
- Для больших магазинов используйте WP-CLI или пакетную обработку, чтобы избежать тайм-аутов.
- Если хотите автоматизировать удаление, настройте cron-задачу, вызывающую WP-CLI команду или wp_schedule_event с аналогичным кодом.
Сравнение подходов удаления заказов WooCommerce
| Метод | Преимущества | Недостатки |
|---|---|---|
| WP-CLI команда | Быстро, безопасно, подходит для больших объёмов | Требует доступа к серверу и установки WP-CLI |
| PHP скрипт с пакетной обработкой | Можно запускать из админки или через cron | Сложнее в настройке, возможны тайм-ауты при неправильной настройке |
| Ручное удаление через админку | Просто и без кода | Неэффективно для большого количества заказов |