Почему важно удалять закрытые заказы в WooCommerce
В WooCommerce с течением времени накапливаются заказы со статусом completed или cancelled. Если магазин работает давно и объем заказов большой, база данных разрастается, что замедляет запросы и увеличивает размер резервных копий. Автоматическое удаление закрытых заказов помогает поддерживать базу данных в оптимальном состоянии, снижать нагрузку и ускорять работу сайта.
Диагностика проблемы: как понять, что база нуждается в очистке
- Проверьте размер таблицы
wp_postsи связанных таблиц (wp_postmeta,wp_woocommerce_order_items,wp_woocommerce_order_itemmeta) через phpMyAdmin или консоль MySQL. - Выявите количество заказов со статусами
completed,cancelledи другими закрытыми. - Отслеживайте замедления в админке WooCommerce при открытии списка заказов.
SELECT post_status, COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;Если количество закрытых заказов превышает десятки тысяч, стоит подумать об автоматизации их удаления.
Пошаговое решение: как автоматически удалять закрытые заказы
1. Создание WP-Cron задачи для удаления заказов
Добавим в файл functions.php вашей темы или в кастомный плагин код, который будет запускать функцию очистки регулярно.
if ( ! wp_next_scheduled( 'wpengine_delete_old_closed_orders' ) ) {
wp_schedule_event( time(), 'daily', 'wpengine_delete_old_closed_orders' );
}
add_action( 'wpengine_delete_old_closed_orders', 'wpengine_delete_old_closed_orders_callback' );
function wpengine_delete_old_closed_orders_callback() {
global $wpdb;
$days = 30; // удалять заказы старше 30 дней
$date = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
// Получаем ID заказов со статусом completed или cancelled старше $days
$order_ids = $wpdb->get_col( $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts}
WHERE post_type = 'shop_order'
AND post_status IN ('wc-completed', 'wc-cancelled')
AND post_date < %s",
$date
) );
if ( ! empty( $order_ids ) ) {
foreach ( $order_ids as $order_id ) {
wp_delete_post( $order_id, true ); // true — удаление без возможности восстановления
}
}
}2. Запуск задания вручную для проверки
Чтобы проверить работу функции до автоматического запуска, можно вызвать функцию напрямую:
add_action('admin_init', function() {
if ( current_user_can('manage_options') && isset($_GET['delete_old_orders_test']) ) {
wpengine_delete_old_closed_orders_callback();
echo 'Старые закрытые заказы удалены';
exit;
}
});Перейдите в админку с параметром ?delete_old_orders_test=1 для теста.
Проверка результата после внедрения
- До и после запуска функции проверьте количество заказов с помощью SQL-запроса, приведенного в разделе диагностики.
- Проверьте таблицы базы данных на уменьшение объема записей.
- Убедитесь, что удаленные заказы не отображаются в админке WooCommerce.
- Проверьте, что работа сайта и админки не замедлилась и не возникло ошибок.
Частые ошибки и как их исправить
- Отсутствие прав доступа при удалении заказов. Убедитесь, что функция вызывается с правильными правами и в нужном контексте (WP-Cron или админка).
- Удаление не тех заказов. Проверьте правильность условий в SQL-запросе, особенно статус заказов и дату.
- Задание WP-Cron не запускается. Проверьте, активен ли WP-Cron на сайте и не блокируется ли вызов wp-cron.php сервером.
- Удаление заказов приводит к потере нужных данных. Настройте правильный период хранения заказов, например, 30-60 дней, чтобы сохранить историю.
Практические советы по безопасности и производительности
- Всегда делайте резервные копии базы данных перед запуском автоматического удаления.
- Используйте
wp_delete_post( $order_id, true )для полного удаления, включая метаданные, чтобы не оставлять мусор в базе. - Если заказов очень много, разбивайте удаление на части, чтобы избежать превышения лимита времени выполнения PHP. Например, удаляйте по 100 заказов за один запуск.
- Для улучшения производительности можно отключить триггеры и индексы в базе, но это требует глубоких знаний и доступа к серверу.
- Проверяйте логи сервера и WordPress на предмет ошибок после внедрения кода.
Сравнение подходов к удалению закрытых заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Простота, контроль | Трудозатратно, риск пропуска |
| WP-Cron с кастомным кодом | Автоматизация, гибкость, настройка периода | Необходим опыт, возможны ошибки при неправильном коде |
| Плагины для очистки базы | Удобство, дополнительные функции (оптимизация, очистка кэша) | Зависимость от сторонних разработчиков, нагрузка на сайт |