Проблема: накопление отменённых заказов в WooCommerce
В интернет-магазинах на WooCommerce со временем может возникать большое количество отменённых заказов. Они занимают место в базе данных, замедляют работу административной панели и влияют на отчёты. Ручное удаление неудобно и трудозатратно, особенно при большом объёме.
Диагностика проблемы
Для начала проверьте, сколько отменённых заказов хранится в базе. Для этого можно выполнить SQL-запрос через phpMyAdmin или любой другой инструмент работы с базой данных:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled';Если число превышает несколько сотен, автоматизация удаления оправдана.
Пошаговое решение: создание задачи для автoматического удаления отменённых заказов
1. Создаём функцию удаления отменённых заказов
function wpdirect_delete_cancelled_orders() {
global $wpdb;
// Получаем ID отменённых заказов старше 30 дней
$order_ids = $wpdb->get_col(
$wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < NOW() - INTERVAL 30 DAY"
)
);
if (empty($order_ids)) {
return;
}
foreach ($order_ids as $order_id) {
wp_delete_post($order_id, true); // Полное удаление без перемещения в корзину
}
}2. Регистрируем WP-Cron событие для ежедневного запуска
function wpdirect_schedule_cancelled_orders_deletion() {
if (!wp_next_scheduled('wpdirect_daily_delete_cancelled_orders')) {
wp_schedule_event(time(), 'daily', 'wpdirect_daily_delete_cancelled_orders');
}
}
add_action('wp', 'wpdirect_schedule_cancelled_orders_deletion');
add_action('wpdirect_daily_delete_cancelled_orders', 'wpdirect_delete_cancelled_orders');3. Добавляем возможность запуска вручную из админки (опционально)
add_action('admin_post_wpdirect_manual_delete_cancelled', 'wpdirect_delete_cancelled_orders');
function wpdirect_add_manual_delete_button() {
if (current_user_can('manage_woocommerce')) {
echo '<form method="post" action="'.admin_url('admin-post.php').'">';
echo '<input type="hidden" name="action" value="wpdirect_manual_delete_cancelled" />';
submit_button('Удалить отменённые заказы вручную');
echo '</form>';
}
}
add_action('woocommerce_reports_orders', 'wpdirect_add_manual_delete_button');Проверка результата после внедрения
- Запустите функцию вручную через созданную кнопку или вызовите
wpdirect_delete_cancelled_orders()из консоли WP-CLI:wp eval 'wpdirect_delete_cancelled_orders();'. - Проверьте количество отменённых заказов через SQL-запрос, приведённый выше.
- Убедитесь, что в админке WooCommerce в разделе заказов отменённые заказы исчезли.
- Для проверки работы cron можно использовать плагин WP Crontrol, чтобы увидеть, запланировано ли событие
wpdirect_daily_delete_cancelled_ordersи выполняется ли оно.
Частые ошибки и как их исправить
- Ничего не удаляется: проверьте правильность временного интервала в SQL-запросе, убедитесь, что даты заказов корректно записаны и что посты имеют статус
wc-cancelled. - Удаление слишком частое или не нужно каждый день: настройте интервал cron на еженедельный, заменив
'daily'на'weekly'или создайте кастомный интервал. - Проблемы с производительностью при большом количестве заказов: удаляйте заказы частями, добавив лимит и пагинацию в запросы.
- Функция не запускается: убедитесь, что WP-Cron работает (например, посетите сайт, чтобы запустить cron), либо настройте системный cron для вызова
wp-cron.php.
Практические советы по безопасности и производительности
- Используйте
wp_delete_post($order_id, true)для полного удаления, чтобы избежать накопления мусора в корзине. - Добавьте проверку прав доступа при запуске функции вручную, чтобы исключить несанкционированное удаление заказов.
- Чтобы не нагружать базу, при большом объёме заказов внедрите пакетное удаление (например, по 50 заказов за один запуск).
- Периодически оптимизируйте таблицы базы данных (через phpMyAdmin или WP-CLI) для поддержания производительности.
- Если используете кеширование (Redis, Memcached), после удаления заказов — сбрасывайте кеш для актуализации данных.
Сравнение подходов удаления отменённых заказов
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Ручное удаление через админку WooCommerce | Просто, без кода | Трудозатратно, не подходит для большого объёма | Удаление по одному заказу или массовое выделение |
| Использование плагинов (например, WP Bulk Delete) | Автоматизация, удобный интерфейс | Дополнительная нагрузка, зависит от обновлений плагина | Плагин с настройкой фильтров по статусу и дате |
| Кодовое решение с WP-Cron (как в статье) | Гибкость, отсутствие сторонних плагинов, можно оптимизировать | Требует навыков разработки, возможны ошибки при неправильной настройке | Функция на PHP + wp_schedule_event |