Почему важно удалять отменённые и отложенные заказы в WooCommerce
В интернет-магазинах на WooCommerce с большим количеством заказов база данных быстро растёт и начинает тормозить. Особенно проблема усугубляется, если в базе накапливаются отменённые и отложенные заказы, которые не несут коммерческой ценности, но занимают место и влияют на производительность.
Удаление таких заказов позволяет:
- Снизить размер таблиц
wp_postsиwp_postmeta, связанных с заказами; - Уменьшить время выполнения запросов к базе данных;
- Оптимизировать работу WooCommerce и ускорить админ-панель;
- Облегчить резервное копирование и восстановление данных.
Диагностика: как определить, что база перегружена неактуальными заказами
Для начала нужно оценить, сколько в базе отменённых и отложенных заказов:
SELECT post_status, COUNT(ID) as total FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;Основные статусы заказов WooCommerce:
wc-cancelled— отменённые;wc-pending— ожидающие оплаты (часто отложенные);wc-processing— в обработке;wc-completed— завершённые.
Если количество отменённых и ожидающих оплаты заказов исчисляется тысячами, есть смысл их удалить для оптимизации.
Пошаговое решение: автоматическое удаление через WP-CLI и cron
1. Создаём PHP-функцию для удаления заказов по статусу
Добавьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин:
function wpdebug_delete_orders_by_status( $statuses = array() ) {
if ( empty( $statuses ) ) {
return 0;
}
$args = array(
'post_type' => 'shop_order',
'post_status' => $statuses,
'posts_per_page' => -1,
'fields' => 'ids',
);
$orders = get_posts( $args );
$deleted_count = 0;
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true ); // true - без перемещения в корзину
$deleted_count++;
}
return $deleted_count;
}2. Создаём WP-CLI команду для запуска удаления из терминала
if ( defined( 'WP_CLI' ) && WP_CLI ) {
WP_CLI::add_command( 'wpdebug delete-orders', function( $args, $assoc_args ) {
$statuses = isset( $assoc_args['status'] ) ? explode( ',', $assoc_args['status'] ) : array();
if ( empty( $statuses ) ) {
WP_CLI::error( 'Необходимо указать статус(-ы) заказов через параметр --status' );
}
$count = wpdebug_delete_orders_by_status( $statuses );
WP_CLI::success( "Удалено заказов: $count" );
} );
}Пример запуска в терминале (в корне сайта):
wp wpdebug delete-orders --status=wc-cancelled,wc-pending3. Автоматизация через WP-Cron
Чтобы удалять заказы автоматически, добавьте в functions.php следующий код:
add_action( 'wpdebug_delete_old_orders_cron', function() {
$statuses = array( 'wc-cancelled', 'wc-pending' );
$deleted = wpdebug_delete_orders_by_status( $statuses );
error_log( "WPDebug: удалено заказов по крону - $deleted" );
});
// Регистрируем событие, если оно ещё не запущено
if ( ! wp_next_scheduled( 'wpdebug_delete_old_orders_cron' ) ) {
wp_schedule_event( time(), 'daily', 'wpdebug_delete_old_orders_cron' );
}Этот код запустит удаление отменённых и ожидающих оплат заказов раз в сутки.
Проверка результата после внедрения
После запуска кода или WP-CLI команды:
- Выполните SQL-запрос из раздела диагностики и убедитесь, что количество заказов со статусами
wc-cancelledиwc-pendingуменьшилось. - Проверьте, что новые заказы с этими статусами создаются и не удаляются преждевременно (например, если вы хотите не удалять заказы младше 7 дней, добавьте фильтр даты).
- В административной панели WooCommerce обновите список заказов и убедитесь, что отменённые и отложенные заказы исчезли.
Частые ошибки и как их исправить
- Удаление заказов не происходит: проверьте, активирован ли WP-CLI и правильно ли подключён код. Ошибка в названии статусов.
- Заказы удаляются слишком рано: добавьте фильтрацию по дате создания, чтобы удалять заказы старше определённого срока. Например, в функцию
wpdebug_delete_orders_by_statusможно добавить аргументdate_queryвget_posts. - Cron не запускается: убедитесь, что на сайте есть трафик для активации WP-Cron или настройте системный cron для вызова
wp-cron.php. - Потеря важных данных: перед удалением сделайте резервную копию базы данных.
Практические советы по безопасности и производительности
- Удаляйте заказы с помощью
wp_delete_postс вторым параметромtrue, чтобы удаление было полным и не оставляло «мусор» в базе. - При большом количестве заказов разбивайте удаление на порции, чтобы избежать тайм-аутов сервера.
- Используйте WP-CLI для пакетной работы — это быстрее и надёжнее, чем удаление через интерфейс.
- Добавьте логирование в файл ошибок для контроля удаления.
- Ограничьте доступ к WP-CLI и кода удаления только администраторам.
Дополнительно: фильтрация заказов по дате для безопасного удаления
Пример изменения функции с учётом удаления только заказов старше 30 дней:
function wpdebug_delete_old_orders( $statuses = array(), $days_old = 30 ) {
if ( empty( $statuses ) ) {
return 0;
}
$date_query = array(
'before' => date( 'Y-m-d', strtotime("-{$days_old} days") ),
'inclusive' => true,
);
$args = array(
'post_type' => 'shop_order',
'post_status' => $statuses,
'posts_per_page' => -1,
'fields' => 'ids',
'date_query' => array( $date_query ),
);
$orders = get_posts( $args );
$deleted_count = 0;
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true );
$deleted_count++;
}
return $deleted_count;
}Так вы защититесь от удаления свежих заказов.
Таблица сравнения вариантов удаления отменённых заказов
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| WP-CLI команда | Быстрое удаление, контроль из консоли | Требуется доступ к серверу и WP-CLI | Использовать для разовых и регулярных операций |
| WP-Cron автоматизация | Автоматическое удаление без участия | Зависит от посещаемости сайта, сложнее отладить | Рекомендуется для регулярного обслуживания |
| Ручное удаление через админку | Просто для небольших объёмов | Неэффективно при большом количестве заказов | Использовать для единичных случаев |