Диагностика проблемы: зачем и когда удалять отменённые заказы
Отменённые заказы в WooCommerce накапливаются в базе данных, занимая место и замедляя работу административной панели. Особенно заметна проблема на крупных магазинах с тысячами заказов. Удаление таких заказов вручную неудобно и рискованно — можно случайно удалить важные данные.
Проблема осложняется тем, что при удалении заказов, связанных с другими данными (например, платежами, сессиями), можно получить ошибки или потерять целостность данных.
Пошаговое решение: автоматическое удаление отменённых заказов через wp-cron
1. Создание функции для удаления заказов со статусом "cancelled" или "refunded"
WooCommerce хранит заказы как записи типа shop_order с разными статусами. Для удаления нужно использовать стандартные функции WordPress и WooCommerce, чтобы не нарушить связи и избежать ошибок.
function wpconfig_delete_cancelled_orders() {
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-cancelled', 'wc-refunded'],
'posts_per_page' => 50, // ограничение на партию для нагрузки
'fields' => 'ids',
];
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_trash_post($order_id); // безопасное удаление через корзину
}
}
}
2. Планирование регулярного запуска через wp-cron
Добавим хук, который будет запускать функцию, например, один раз в день.
add_action('wpconfig_daily_delete_cancelled_orders', 'wpconfig_delete_cancelled_orders');
function wpconfig_activate_cron() {
if (!wp_next_scheduled('wpconfig_daily_delete_cancelled_orders')) {
wp_schedule_event(time(), 'daily', 'wpconfig_daily_delete_cancelled_orders');
}
}
add_action('wp', 'wpconfig_activate_cron');
3. Очистка удалённых заказов из корзины (Trash)
После перемещения в корзину заказы ещё занимают место. Можно автоматически очищать корзину заказов старше 7 дней.
function wpconfig_empty_order_trash() {
global $wpdb;
$interval = 7 * DAY_IN_SECONDS;
$date_threshold = date('Y-m-d H:i:s', time() - $interval);
$orders_in_trash = $wpdb->get_col(
$wpdb->prepare(
"SELECT ID FROM {$wpdb->posts}
WHERE post_type = 'shop_order'
AND post_status = 'trash'
AND post_modified < %s",
$date_threshold
)
);
if (!empty($orders_in_trash)) {
foreach ($orders_in_trash as $order_id) {
wp_delete_post($order_id, true); // окончательное удаление
}
}
}
add_action('wpconfig_daily_delete_cancelled_orders', 'wpconfig_empty_order_trash');
Проверка результата после внедрения
- Проверьте наличие отменённых заказов в админке WooCommerce → Заказы → фильтр "Отменённые". После запуска скрипта их количество должно уменьшаться.
- В базе данных (через phpMyAdmin) можно выполнить запрос:
Число записей должно уменьшаться после запуска функции.SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-refunded'); - Просмотрите логи ошибок сервера и WordPress, чтобы убедиться, что не возникает сбоев при запуске cron-задачи.
Частые ошибки и как их исправить
- Заказы не удаляются: Проверьте, активна ли wp-cron. В некоторых настройках сервера wp-cron отключён. Запустите cron вручную через WP CLI:
wp cron event run wpconfig_daily_delete_cancelled_orders - Удаляются не все заказы: Ограничение
posts_per_pageв 50 заказов — это защитная мера. Если много заказов, функция будет вызываться ежедневно, постепенно очищая базу. - Ошибки при удалении: Убедитесь, что нет конфликтующих плагинов, которые блокируют удаление заказов или меняют их статусы.
- Заказы остаются в корзине: Проверьте, что функция очистки корзины подключена к тому же событию cron.
Практические советы по безопасности и производительности
- Не используйте
wp_delete_post($order_id, true)напрямую без логики, чтобы избежать случайного удаления важных данных. Используйте сначалаwp_trash_post()для безопасного перемещения в корзину. - Ограничивайте количество удаляемых заказов за один запуск, чтобы избежать тайм-аутов или перегрузки сервера.
- Регулярно проверяйте статус wp-cron и при необходимости настраивайте системный cron для вызова
wp-cron.php. - Перед внедрением на живом сайте протестируйте функцию на копии сайта или в тестовом окружении.
- Для магазинов с большим объёмом заказов можно реализовать удаление с пагинацией и логированием, чтобы отслеживать прогресс.
Сравнение вариантов удаления отменённых заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Простота, контроль | Трудоёмко, риск ошибок |
| Плагины очистки WooCommerce | Автоматизация, удобство | Могут быть платными, конфликты с другими плагинами |
| Код через wp-cron (описанный способ) | Гибкость, контроль, бесплатно | Нужно базовое знание кода, настройка wp-cron |