Диагностика проблемы с неоплаченными заказами в WooCommerce
В интернет-магазинах на WooCommerce часто возникает ситуация, когда неоплаченные заказы занимают место в базе данных и админке. Это затрудняет управление заказами, создает нагрузку на сервер, а также может привести к путанице в отчетах. Стандартный WooCommerce не удаляет такие заказы автоматически, а лишь меняет их статус на "отменённый" спустя установленное время.
Если вы хотите не просто отменять, а именно удалять неоплаченные заказы, чтобы поддерживать базу данных в чистоте, нужно реализовать дополнительную логику. Однако удаление заказов напрямую должно быть безопасным и учитывать подтверждение действия, чтобы случайно не потерять важные данные.
Как реализовать автоматическое удаление неоплаченных заказов с подтверждением
1. Создаем пользовательский крон-задачу для проверки и удаления
WooCommerce предоставляет статусы заказа, среди которых pending и failed обычно означают неоплаченные заказы. Мы настроим WP-Cron задачу, которая будет запускаться, например, раз в сутки и удалять заказы, которые старше 24 часов и неоплачены.
function wpdocs_schedule_delete_unpaid_orders() {
if ( ! wp_next_scheduled( 'wpdocs_delete_unpaid_orders_hook' ) ) {
wp_schedule_event( time(), 'daily', 'wpdocs_delete_unpaid_orders_hook' );
}
}
add_action( 'wp', 'wpdocs_schedule_delete_unpaid_orders' );
function wpdocs_delete_unpaid_orders() {
$args = array(
'status' => array('pending', 'failed'),
'date_created' => '<' . ( time() - DAY_IN_SECONDS ),
'limit' => -1
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order ) {
// Добавляем проверку подтверждения (например, мета поле)
$confirmed = get_post_meta( $order->get_id(), '_auto_delete_confirmed', true );
if ( $confirmed ) {
wp_delete_post( $order->get_id(), true );
}
}
}
add_action( 'wpdocs_delete_unpaid_orders_hook', 'wpdocs_delete_unpaid_orders' );
2. Добавляем подтверждение удаления через мета-поле
Чтобы избежать случайного удаления, мы можем добавить фильтр на страницу заказов в админке — кнопка для подтверждения удаления конкретного заказа. При нажатии на нее будет выставлено мета-поле _auto_delete_confirmed.
function add_auto_delete_confirmation_button( $actions, $order ) {
if ( in_array( $order->get_status(), array('pending', 'failed'), true ) ) {
$url = wp_nonce_url( admin_url( 'edit.php?post_type=shop_order&auto_delete_confirm=' . $order->get_id() ), 'auto_delete_confirm_' . $order->get_id() );
$actions['auto_delete_confirm'] = '<a href="' . esc_url( $url ) . '" style="color: red;">Подтвердить удаление</a>';
}
return $actions;
}
add_filter( 'woocommerce_admin_order_actions', 'add_auto_delete_confirmation_button', 10, 2 );
function handle_auto_delete_confirmation() {
if ( isset( $_GET['auto_delete_confirm'] ) ) {
$order_id = absint( $_GET['auto_delete_confirm'] );
if ( ! wp_verify_nonce( $_GET['_wpnonce'], 'auto_delete_confirm_' . $order_id ) ) {
wp_die( 'Ошибка проверки безопасности' );
}
update_post_meta( $order_id, '_auto_delete_confirmed', 'yes' );
wp_redirect( admin_url( 'edit.php?post_type=shop_order&message=auto_delete_confirmed' ) );
exit;
}
}
add_action( 'admin_init', 'handle_auto_delete_confirmation' );
Проверка результата после внедрения
- Перейдите в WooCommerce → Заказы и откройте заказ со статусом
pendingилиfailed, который старше 24 часов. - Убедитесь, что появилась кнопка "Подтвердить удаление" рядом с заказом.
- Нажмите кнопку и подтвердите действие (обновление страницы с сообщением).
- Дождитесь запуска крон-задачи (можно вызвать
do_action('wpdocs_delete_unpaid_orders_hook')вручную в тестовом режиме) — заказ должен удалиться из базы. - Проверьте, что заказ действительно удален из админки и базы данных.
Частые ошибки при автоматическом удалении заказов и как их исправить
- Крон-задача не запускается: проверьте, что WP-Cron активен и что сайт получает внешние вызовы. Для надежности можно настроить системный cron на вызов
wp-cron.php. - Заказы не удаляются: убедитесь, что мета-поле
_auto_delete_confirmedвыставляется корректно. Проверьте наличие nonce и правильность URL. - Ошибка безопасности nonce: проверьте правильность передачи nonce в URL и что параметр
_wpnonceне поврежден. - Удаление заказов приводит к ошибкам в отчетах: убедитесь, что удаляете только действительно неоплаченные, старые заказы, чтобы не потерять данные аналитики.
Практические советы по безопасности и производительности
- Всегда используйте nonce для подтверждения действий в админке, чтобы исключить CSRF-атаки.
- Добавляйте ограничения по дате и статусу заказов при удалении, чтобы избежать случайного удаления важных заказов.
- Регулярно делайте резервные копии базы данных перед внедрением таких автоматизаций.
- Если база заказов большая, ограничьте количество заказов, обрабатываемых за раз, чтобы не перегружать сервер:
$args = array(
'status' => array('pending', 'failed'),
'date_created' => '<' . ( time() - DAY_IN_SECONDS ),
'limit' => 20, // обрабатываем пачками
);
| Вариант решения | Преимущества | Недостатки |
|---|---|---|
| Удаление заказов через WP-Cron с подтверждением | Автоматизация с контролем, безопасность | Зависит от правильной настройки cron, требует взаимодействия админа |
| Удаление заказов вручную через админку | Максимальный контроль, нет риска автоматических ошибок | Трудоемко при большом количестве заказов |
| Плагины для очистки заказов | Простота установки, готовые функции | Могут удалять без подтверждения, ограниченная кастомизация |