Диагностика проблемы: зачем удалять неоплаченные заказы
В интернет-магазинах на WooCommerce часто накапливаются неоплаченные заказы, которые занимают место в базе данных и могут создавать путаницу в админке. Если не очистить такие заказы, это влияет на производительность сайта и усложняет управление заказами. В стандартном WooCommerce нет встроенной функции автоматического удаления неоплаченных заказов через заданный промежуток времени.
Как настроить автоматическое удаление неоплаченных заказов
Выбор подходящего статуса заказа для удаления
Неоплаченные заказы обычно имеют статус pending или failed. В нашем примере мы будем удалять заказы со статусом pending, которые старше 24 часов.
Пошаговое решение с кодом
Добавьте следующий код в файл functions.php вашей дочерней темы или в функциональный плагин:
function wpshab_delete_old_pending_orders() {
$args = array(
'status' => 'pending',
'date_created' => '<' . ( time() - DAY_IN_SECONDS ),
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders( $args );
if ( empty( $orders ) ) {
return;
}
foreach ( $orders as $order_id ) {
wp_trash_post( $order_id );
}
}
// Запускаем удаление ежедневно
add_action( 'wpshab_daily_delete_orders', 'wpshab_delete_old_pending_orders' );
// Регистрируем WP-Cron событие при активации темы или плагина
function wpshab_activate_cron() {
if ( ! wp_next_scheduled( 'wpshab_daily_delete_orders' ) ) {
wp_schedule_event( time(), 'daily', 'wpshab_daily_delete_orders' );
}
}
add_action( 'wp', 'wpshab_activate_cron' );
// Очищаем WP-Cron при деактивации
function wpshab_deactivate_cron() {
$timestamp = wp_next_scheduled( 'wpshab_daily_delete_orders' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wpshab_daily_delete_orders' );
}
}
register_deactivation_hook( __FILE__, 'wpshab_deactivate_cron' );Объяснение:
- Функция
wpshab_delete_old_pending_ordersполучает все заказы со статусомpending, созданные более 24 часов назад, и перемещает их в корзину. - Используем WP-Cron для запуска функции один раз в сутки.
- Функция активации регистрирует событие, если оно ещё не существует.
- При деактивации плагина или темы удаляем задание из cron.
Как изменить время удаления
В строке с date_created => '<' . ( time() - DAY_IN_SECONDS ) можно заменить DAY_IN_SECONDS (24 часа) на любое нужное количество секунд, например, 12 * HOUR_IN_SECONDS для 12 часов.
Проверка результата после внедрения
Чтобы проверить, что функция работает корректно:
- Создайте тестовый заказ со статусом
pending. - Измените дату создания заказа в базе данных (например, через phpMyAdmin), установив дату старше 24 часов.
- Запустите крон задачу вручную, добавив временный вызов
wpshab_delete_old_pending_orders()или подождите до следующего запуска WP-Cron. - Проверьте, что заказ переместился в корзину (Trash) в админке WooCommerce Заказы.
Частые ошибки и их исправление
- Заказы не удаляются: Убедитесь, что WP-Cron работает на сайте. Для этого можно установить плагин WP Crontrol и проверить наличие и запуск задачи
wpshab_daily_delete_orders. - Функция удаляет неправильные заказы: Проверьте параметры фильтра в
wc_get_orders, особенно статус и дату. - Удаление происходит мгновенно, а не по расписанию: Убедитесь, что код с регистрацией cron события запускается только один раз и при активации темы/плагина.
- Заказы остаются в базе и не попадают в корзину: Используйте
wp_trash_postвместоwp_delete_post, чтобы иметь возможность восстановить заказ при необходимости.
Практические советы по безопасности и производительности
- Используйте
wp_trash_post, а неwp_delete_postдля безопасного удаления, чтобы избежать потери данных без возможности восстановления. - Не запускайте удаление с частотой чаще раза в день — это снизит нагрузку на сервер.
- Регулярно очищайте корзину заказов вручную или с помощью плагинов, так как WP-Cron не удаляет заказы из корзины.
- Для сайтов с большим количеством заказов включите пагинацию в
wc_get_ordersи обрабатывайте заказы порционно, чтобы избежать превышения лимита памяти или времени выполнения. - Используйте плагин Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpshab.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-udalenie-neoplachennyh-zakazov) для дополнительной оптимизации и управления задачами WP-Cron.
Сравнение способов удаления неоплаченных заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron с кодом (как в статье) | Полный контроль, гибкость, нет доп. плагинов | Зависимость от WP-Cron, требует навыков программирования |
| Плагины для очистки WooCommerce (например, WooCommerce Order Cleaner) | Простота использования, интерфейс | Дополнительная нагрузка, ограниченная кастомизация |
| Ручное удаление через админку | Безопасно, простой контроль | Неавтоматично, трудозатратно на больших сайтах |