Проблема: накопление отменённых заказов в WooCommerce
В интернет-магазинах на WooCommerce часто скапливаются отменённые заказы, которые занимают место в базе данных и замедляют работу сайта. Особенно это актуально при большом количестве транзакций. Стандартного инструмента для автоматического удаления таких заказов в WooCommerce нет. В результате база растёт, а администратору приходится вручную очищать заказы.
Диагностика проблемы
Чтобы проверить, есть ли проблема, зайдите в раздел WooCommerce > Заказы и отфильтруйте заказы по статусу отменён (cancelled). Если количество отменённых заказов превышает несколько сотен, стоит задуматься об автоматизации их удаления.
Также проверьте размер таблиц wp_posts и wp_postmeta через phpMyAdmin или с помощью плагина WP-Optimize. Если они значительно выросли, это указывает на необходимость очистки старых данных.
Решение: автоматизация удаления отменённых заказов по сроку
Ниже представлены пошаговые действия и код для реализации автоматического удаления отменённых заказов старше, например, 30 дней.
Шаг 1. Создаём функцию удаления заказов
function wpcoder_delete_old_cancelled_orders() {
$days = 30; // Срок хранения в днях
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = array(
'post_type' => 'shop_order',
'post_status' => 'wc-cancelled',
'date_query' => array(
array(
'column' => 'post_date',
'before' => $date_threshold,
),
),
'posts_per_page' => -1,
'fields' => 'ids',
'no_found_rows' => true,
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // Полное удаление
}
}
}Шаг 2. Запускаем функцию по расписанию с помощью WP-Cron
Добавим еженедельное событие для запуска очистки.
function wpcoder_schedule_order_cleanup() {
if (!wp_next_scheduled('wpcoder_weekly_order_cleanup')) {
wp_schedule_event(time(), 'weekly', 'wpcoder_weekly_order_cleanup');
}
}
add_action('wp', 'wpcoder_schedule_order_cleanup');
add_action('wpcoder_weekly_order_cleanup', 'wpcoder_delete_old_cancelled_orders');Шаг 3. Отключение задачи при деактивации плагина/темы
function wpcoder_clear_scheduled_order_cleanup() {
$timestamp = wp_next_scheduled('wpcoder_weekly_order_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpcoder_weekly_order_cleanup');
}
}
register_deactivation_hook(__FILE__, 'wpcoder_clear_scheduled_order_cleanup');Проверка результата после внедрения
- Через 7 дней после внедрения зайдите в WooCommerce > Заказы, отфильтруйте отменённые заказы и проверьте, что заказы старше 30 дней отсутствуют.
- Проверьте размер таблиц базы данных — они должны уменьшиться.
- Для немедленной проверки вызовите функцию
wpcoder_delete_old_cancelled_orders()вручную через WP-CLI или временно добавьте вызов вfunctions.phpи обновите сайт.
Частые ошибки и их устранение
- Функция не удаляет заказы: проверьте, что статус заказа правильно указан как
wc-cancelled, а не простоcancelled. WooCommerce всегда добавляет префиксwc-к статусам в коде. - WP-Cron не срабатывает: на некоторых хостингах невозможно запускать WP-Cron автоматически. В этом случае настройте системный cron через хостинг или вызовите скрипт вручную.
- Заказы не удаляются полностью: убедитесь, что в
wp_delete_postпередан параметрtrueдля полного удаления, а не перемещения в корзину.
Практические советы по безопасности и производительности
- Используйте WP-Cron с разумным интервалом — слишком частые запуски могут нагрузить сервер.
- При большом количестве заказов разбивайте удаление на части, чтобы избежать превышения времени выполнения. Например, обрабатывайте по 100 заказов за раз.
- Всегда делайте резервное копирование базы перед автоматической очисткой.
- Если у вас много заказов, рассмотрите использование WP-CLI для запуска очистки вручную или по расписанию через системный cron:
wp post delete $(wp post list --post_type=shop_order --post_status=wc-cancelled --date_query_column=post_date --before='30 days ago' --field=ID) --force
Сравнение способов реализации
| Метод | Плюсы | Минусы |
|---|---|---|
| PHP-скрипт с WP-Cron | Полностью автоматический, легко интегрируется | WP-Cron не всегда надёжен, возможна нагрузка при большом объёме |
| WP-CLI команда | Быстрая и точечная очистка, подходит для больших баз | Нужен доступ к серверу и навыки работы с командной строкой |
| Плагины очистки заказов | Графический интерфейс, дополнительные опции | Избыточные функции, нагрузка, зависимость от сторонних решений |