Почему важно удалять отменённые заказы в WooCommerce
Отменённые заказы WooCommerce накапливаются в базе данных, занимая место и замедляя работу сайта, особенно при большом объёме продаж. Их регулярное удаление помогает поддерживать базу данных в порядке и ускоряет выполнение запросов к заказам.
Диагностика проблемы: как определить, что база загружена отменёнными заказами
Для оценки ситуации используйте SQL-запрос к базе данных:
SELECT post_status, COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;Если количество записей с post_status = 'wc-cancelled' исчисляется тысячами, пора автоматизировать их удаление.
Пошаговое решение: как настроить автоматическое удаление отменённых заказов
1. Создаём функцию удаления старых отменённых заказов
Добавьте следующий код в файл functions.php вашей темы или создайте небольшой плагин:
function wplab_delete_old_cancelled_orders() {
global $wpdb;
// Удаляем отменённые заказы старше 30 дней
$date = date('Y-m-d H:i:s', strtotime('-30 days'));
$orders = $wpdb->get_col(
$wpdb->prepare(
"SELECT ID FROM {$wpdb->posts}
WHERE post_type = 'shop_order'
AND post_status = 'wc-cancelled'
AND post_date < %s",
$date
)
);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true - удаление без перемещения в корзину
}
}
}2. Запускаем функцию по расписанию через WP-Cron
Добавьте хук для ежедневного запуска:
// Регистрируем событие при активации темы или плагина
if (!wp_next_scheduled('wplab_daily_delete_cancelled_orders')) {
wp_schedule_event(time(), 'daily', 'wplab_daily_delete_cancelled_orders');
}
// Хук для выполнений функции
add_action('wplab_daily_delete_cancelled_orders', 'wplab_delete_old_cancelled_orders');3. Отменяем крон при деактивации
// При деактивации темы или плагина
function wplab_deactivate_delete_cancelled_orders() {
$timestamp = wp_next_scheduled('wplab_daily_delete_cancelled_orders');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wplab_daily_delete_cancelled_orders');
}
}Проверка результата после внедрения
Спустя сутки после активации скрипта выполните SQL-запрос из блока диагностики снова. Количество заказов со статусом wc-cancelled должно уменьшиться, особенно старше 30 дней. Можно дополнительно проверить наличие удалённых заказов в админке WooCommerce в разделе заказов.
Частые ошибки и как их исправить
- Заказы не удаляются: Проверьте, что WP-Cron работает. Для этого можно установить плагин WP Crontrol и убедиться, что событие
wplab_daily_delete_cancelled_ordersзапланировано. - Удаляются не все заказы: Убедитесь, что дата и время сервера совпадают с вашим часовым поясом. Можно добавить логирование ID удалённых заказов для отладки.
- Удаление приводит к ошибкам: Возможно, другие плагины блокируют удаление заказов. Проверьте логи сервера и исключите конфликты.
Практические советы по безопасности и производительности
- Всегда делайте бэкап базы данных перед внедрением автоматических удалений.
- Для больших баз данных оптимизируйте запросы и при необходимости выполняйте удаление пакетами.
- Не используйте
wp_delete_postбез параметраtrue, чтобы избежать попадания заказов в корзину и двойной нагрузки. - Если WP-Cron не надёжен на вашем хостинге, настройте системный cron и вызов wp-cron.php через curl или wget.
Сравнение вариантов удаления отменённых заказов
| Метод | Плагин | Код | Плюсы | Минусы |
|---|---|---|---|---|
| Автоматическое удаление | Специализированные плагины (например, WP-Optimize) | Код из статьи | Простота, контроль, бесплатность | Требует навыков, возможны конфликты |
| Удаление вручную | Админка WooCommerce | SQL-запросы | Простота для единичных случаев | Не автоматизировано, риск ошибок |