Диагностика проблемы: зачем удалять отменённые заказы в WooCommerce
Отменённые заказы в WooCommerce накапливаются со временем, особенно на крупных сайтах с высокой конверсией и частыми отменами. Это приводит к увеличению размера базы данных, замедлению запросов и росту нагрузки на сервер. Стандартный WooCommerce не удаляет такие заказы автоматически — они остаются навсегда, что негативно влияет на производительность.
Чтобы оптимизировать работу магазина, необходимо регулярно очищать базу от ненужных записей с отменённым статусом заказов (cancelled или failed).
Как проверить наличие отменённых заказов и их влияние
Для оценки объёма отменённых заказов можно выполнить SQL-запрос к базе данных:
SELECT post_status, COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;Обратите внимание на количество записей со статусом wc-cancelled или wc-failed. Чем их больше, тем больше выгода от очистки.
Пошаговое решение: автоматическое удаление отменённых заказов с помощью кода
1. Создаём функцию для удаления заказов
Добавьте следующий код в файл functions.php вашей дочерней темы или в специальный плагин для кастомных функций.
function wpmg_delete_cancelled_orders() {
if ( ! current_user_can( 'manage_woocommerce' ) ) {
return;
}
$args = array(
'post_type' => 'shop_order',
'post_status' => array('wc-cancelled', 'wc-failed'),
'date_query' => array(
array(
'before' => '30 days ago',
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$orders = get_posts( $args );
if ( ! empty( $orders ) ) {
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true ); // true - удаление без возможности восстановления
}
}
}2. Автоматизация с помощью WP-Cron
Чтобы функция запускалась регулярно, добавим задачу в планировщик WordPress:
if ( ! wp_next_scheduled( 'wpmg_delete_cancelled_orders_event' ) ) {
wp_schedule_event( time(), 'daily', 'wpmg_delete_cancelled_orders_event' );
}
add_action( 'wpmg_delete_cancelled_orders_event', 'wpmg_delete_cancelled_orders' );Этот код запустит очистку один раз в день, удаляя отменённые и проваленные заказы старше 30 дней.
Как проверить, что удаление работает
- Перед внедрением сделайте резервную копию базы.
- Выполните SQL-запрос из раздела диагностики и запомните количество отменённых заказов.
- Вручную создайте тестовые заказы с статусом
cancelledи датой старше 30 дней. - Запустите функцию напрямую или дождитесь выполнения WP-Cron (можно вызвать вручную через WP-CLI или плагин для управления задачами).
- Повторно выполните SQL-запрос — количество удалённых заказов должно уменьшиться.
Частые ошибки и их исправление
- Функция не запускается по Cron: Проверьте, работает ли WP-Cron на вашем сайте. Для теста вызовите функцию вручную через
do_action('wpmg_delete_cancelled_orders_event'). - Заказы не удаляются, хотя функция вызывается: Убедитесь, что статусы заказов указаны корректно (
wc-cancelled,wc-failed). Проверьте права пользователя и возможности. - Удаляются не те заказы: Проверьте условие
date_query, возможно, даты заданы неправильно. - Потеря данных из-за удаления: Рекомендуется делать полный бэкап перед внедрением.
Практические советы по безопасности и производительности
- Не запускайте удаление слишком часто — лучше раз в сутки или неделю.
- Используйте
wp_delete_post( $order_id, true )с осторожностью — удаление без возможности восстановления. - Для больших магазинов с тысячами заказов разделяйте удаление на порции, чтобы избежать таймаутов:
function wpmg_delete_cancelled_orders_batch( $batch_size = 100 ) {
$args = array(
'post_type' => 'shop_order',
'post_status' => array('wc-cancelled', 'wc-failed'),
'date_query' => array(
array(
'before' => '30 days ago',
),
),
'posts_per_page' => $batch_size,
'fields' => 'ids',
);
$orders = get_posts( $args );
if ( empty( $orders ) ) {
return false;
}
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true );
}
return true;
}- Используйте серверные инструменты мониторинга для отслеживания влияния на производительность.
- Регулярно делайте резервные копии базы данных перед очисткой.
Сравнение подходов к удалению отменённых заказов
| Подход | Плюсы | Минусы | Пример |
|---|---|---|---|
| Ручное удаление из админки | Простота, контроль | Трудозатратно, риск пропуска | Удаление заказов по фильтру в WooCommerce |
| Автоматический скрипт с WP-Cron | Автоматизация, регулярность | Нужна настройка, возможны ошибки | Код из статьи |
| Плагин Clearfy Pro | Готовое решение, дополнительные опции | Платный, лишний функционал | Clearfy Pro |