Проблема: накопление старых заказов в WooCommerce и необходимость их массового удаления
С течением времени в базе WooCommerce накапливаются заказы с различными статусами: отменённые, завершённые, в ожидании оплаты и др. Хранение большого количества старых заказов может замедлять работу сайта и усложнять администрирование. Стандартного функционала для массового удаления заказов по статусу и дате в WooCommerce нет, поэтому приходится искать решения через код.
Диагностика проблемы
Чтобы проверить, есть ли в базе избыточные заказы, выполните запрос к базе данных:
SELECT post_status, COUNT(ID) AS count_orders FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;Это покажет количество заказов по статусам. Если вы видите тысячи заказов со статусами wc-cancelled, wc-failed или wc-completed, стоит рассмотреть автоматическое удаление или архивирование.
Как настроить автоматическое удаление старых заказов по статусу и дате
Решение — добавить PHP-функцию в файл functions.php вашей темы или в кастомный плагин, которая будет запускаться по расписанию через WP-Cron.
Шаг 1. Создаём функцию удаления заказов
function wps_delete_old_orders() {
// Параметры: статусы и дата
$statuses = array('wc-cancelled', 'wc-failed'); // статусы для удаления
$days = 30; // количество дней хранения
$date_query = array(
'column' => 'post_date',
'before' => date('Y-m-d H:i:s', strtotime("-" . $days . " days")),
);
foreach ($statuses as $status) {
$args = array(
'post_type' => 'shop_order',
'post_status' => $status,
'date_query' => array($date_query),
'posts_per_page' => -1,
'fields' => 'ids',
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true — без перемещения в корзину
}
}
}
}Шаг 2. Добавляем крон-задачу для регулярного запуска
Добавьте в functions.php следующий код для регистрации задачи, которая будет запускаться ежедневно:
if (!wp_next_scheduled('wps_delete_old_orders_hook')) {
wp_schedule_event(time(), 'daily', 'wps_delete_old_orders_hook');
}
add_action('wps_delete_old_orders_hook', 'wps_delete_old_orders');Шаг 3. Как отменить задачу при необходимости
$timestamp = wp_next_scheduled('wps_delete_old_orders_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wps_delete_old_orders_hook');
}Проверка результата после внедрения
Для проверки выполните следующие действия:
- Выполните SQL-запрос из раздела диагностики до запуска задачи.
- Запустите функцию вручную:
wps_delete_old_orders();через консоль WP-CLI (wp eval 'wps_delete_old_orders();') или временно вызовите её в коде. - Снова выполните запрос к базе — количество заказов с указанными статусами и старше 30 дней должно уменьшиться.
- Проверьте в админке WooCommerce, что удалённые заказы исчезли.
Частые ошибки и как их исправить
- Функция не запускается по расписанию: проверьте, активирован ли wp-cron (запрос в браузере
yoursite.com/wp-cron.php?doing_wp_cron), и не отключён ли он вwp-config.php. - Заказы не удаляются: убедитесь, что статусы указаны с префиксом
wc-(например,wc-cancelled), и функцияwp_delete_postвызывается с параметромtrueдля полного удаления. - Удаляются не те заказы: проверьте параметры даты и статус в запросе
get_posts, а также формат даты вdate_query. - Проблемы с производительностью при большом количестве заказов: вместо
posts_per_page = -1используйте постраничную обработку, чтобы не перегружать память.
Практические советы по безопасности и производительности
- Создайте резервную копию базы перед запуском автоматического удаления.
- Реализуйте постраничную обработку, если заказов очень много, например, по 100 за раз.
- Добавьте проверку текущих прав пользователя, если вызываете функцию из административного интерфейса.
- Логируйте удалённые заказы в файл для аудита.
- Для управления задачами WP-Cron используйте плагин WP Crontrol для мониторинга и отладки.
Таблица сравнения способов удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Удаление вручную через админку WooCommerce | Просто, не требует кода | Много времени при большом количестве заказов |
| SQL-запросы напрямую к базе | Быстрое удаление | Риск повредить данные, требует знаний SQL |
| Автоматизация через WP-Cron + PHP-код | Автоматически очищает, гибко настраивается | Требует написания и тестирования кода |
| Плагины для очистки WooCommerce (например, WP Sweep) | Упрощают процесс | Могут удалять ненужные данные, риск ошибок |