Диагностика задачи: зачем нужно удалять заказы автоматически
В WooCommerce накапливаются заказы с разными статусами, включая отменённые, просроченные и черновики. Это влияет на производительность базы данных и может замедлять работу административной панели и сайта. Ручное удаление неудобно при большом количестве заказов. Автоматизация этого процесса помогает поддерживать базу в чистоте и улучшать отклик сайта.
Как настроить автоматическое удаление заказов по статусу и дате
Выбор статусов и срока удаления
Перед реализацией нужно определить, какие статусы удалить (например, 'cancelled', 'failed', 'pending') и за какой период (например, старше 30 дней). Это позволит избежать удаления важных заказов.
Реализация через WP-Cron
Оптимальный способ — использовать WP-Cron для регулярного запуска удаления. Добавим функцию в файл functions.php вашей темы или в плагин.
if ( ! wp_next_scheduled( 'wpdev_auto_delete_orders' ) ) {
wp_schedule_event( time(), 'daily', 'wpdev_auto_delete_orders' );
}
add_action( 'wpdev_auto_delete_orders', 'wpdev_delete_old_orders' );
function wpdev_delete_old_orders() {
$statuses_to_delete = array( 'cancelled', 'failed', 'pending' );
$days_old = 30;
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_old} days" ) );
$args = array(
'post_type' => 'shop_order',
'post_status' => $statuses_to_delete,
'date_query' => array(
array(
'before' => $date_threshold,
'inclusive' => true,
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$orders = get_posts( $args );
if ( empty( $orders ) ) {
return;
}
foreach ( $orders as $order_id ) {
wp_trash_post( $order_id ); // Переместить заказ в корзину
// Для полного удаления используйте wp_delete_post( $order_id, true );
}
}Проверка результата после внедрения
Чтобы убедиться, что скрипт работает:
- Запустите WP-Cron вручную с помощью плагина WP Crontrol или вызовите функцию
wpdev_delete_old_orders()через консоль WP-CLI (wp eval 'wpdev_delete_old_orders();'). - Проверьте на странице заказов WooCommerce в админке, что старые заказы со статусами, указанными в массиве, переместились в корзину или удалились.
- Посмотрите таблицу
wp_postsв базе данных, отфильтровав поpost_type = 'shop_order'и соответствующим статусам, чтобы убедиться в отсутствии старых записей.
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, работает ли WP-Cron. На хостинге WP-Cron может быть отключен, тогда нужно настроить системный cron или запускать вручную.
- Удаляются нужные заказы: убедитесь, что массив статусов
$statuses_to_deleteсодержит только безопасные для удаления статусы. - Проблемы с датой: формат даты и временная зона должны совпадать с настройками сайта, иначе фильтр по дате не сработает корректно.
- Производительность: если заказов очень много, ограничьте количество обрабатываемых заказов за один запуск, добавив пагинацию в запрос.
Практические советы по безопасности и производительности
- Используйте
wp_trash_post()вместоwp_delete_post(), чтобы иметь возможность восстановить заказ при ошибочном удалении. - Добавьте логирование удалений в файл или базу — это поможет отслеживать работу скрипта и быстро реагировать на ошибки.
- Для сайтов с большим количеством заказов разбивайте удаление на части, например, по 100 заказов за запуск, чтобы избежать таймаутов.
- Если используете плагин кеширования, убедитесь, что кеш очищается после массового удаления заказов, чтобы не показывать устаревшую информацию.
Сравнение вариантов реализации автоматического удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron с кастомным кодом | Гибкость, контроль, без сторонних плагинов | Зависимость от WP-Cron, требует навыков разработки |
| Плагины для очистки базы WooCommerce | Простота использования, готовые настройки | Может быть избыточным, риск удаления лишнего |
| Ручное удаление через админку | Безопасность, контроль | Трудозатратно, не подходит для больших магазинов |