Диагностика проблемы: зачем удалять неоплаченные заказы в WooCommerce
В интернет-магазинах на WooCommerce иногда накапливается большое количество неоплаченных заказов, которые занимают место в базе данных и могут мешать аналитике или замедлять работу сайта. Особенно это актуально при использовании платежных систем с длительной задержкой подтверждения оплаты или при тестировании.
Удаление таких заказов вручную через админку неудобно и занимает время. Автоматизация процесса с помощью кода — оптимальное решение.
Пошаговое решение: как написать код для удаления неоплаченных заказов
1. Определяем статус для удаления
В WooCommerce неоплаченные заказы обычно имеют статус pending (ожидает оплаты) или failed (неудачная оплата). В нашем примере будем удалять заказы со статусами pending и failed, созданные более 24 часов назад.
2. Добавляем функцию удаления заказов через WP-Cron
Чтобы не запускать удаление вручную, создадим ежесуточное задание с помощью WP-Cron, выполняющее очистку.
function wpt_remove_old_unpaid_orders() {
$args = array(
'status' => array('pending', 'failed'),
'date_created' => '<' . ( time() - DAY_IN_SECONDS ),
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true );
}
}
if ( ! wp_next_scheduled( 'wpt_daily_remove_unpaid_orders' ) ) {
wp_schedule_event( time(), 'daily', 'wpt_daily_remove_unpaid_orders' );
}
add_action( 'wpt_daily_remove_unpaid_orders', 'wpt_remove_old_unpaid_orders' );3. Как добавить код в тему или плагин
Лучше всего помещать этот код в functions.php дочерней темы или в отдельный site-specific плагин, чтобы не потерять изменения при обновлении.
Проверка результата: как убедиться, что удаление работает
- Создайте тестовый заказ в статусе
pendingилиfailed. - Измените дату создания заказа на более 24 часов назад (через базу или плагин для редактирования заказов).
- Вручную запустите событие WP-Cron:
do_action('wpt_daily_remove_unpaid_orders'); - Проверьте, что заказ удалён из списка заказов WooCommerce.
- Убедитесь, что в дальнейшем удаление будет происходить автоматически раз в сутки.
Частые ошибки и как их исправить
- Заказы не удаляются: Проверьте, что WP-Cron работает на вашем хостинге. Для теста вызовите функцию напрямую через
do_action. - Удаляются не те заказы: Проверьте параметры фильтрации
statusиdate_createdвwc_get_orders. Можно вывести список ID заказов до удаления для отладки. - Код вызывает ошибку: Убедитесь, что WooCommerce активен и функция
wc_get_ordersдоступна. Поместите код вafter_setup_themeили используйте проверку функцииfunction_exists.
Практические советы по безопасности и производительности
- Используйте
wp_delete_post( $order_id, true )с параметромtrue, чтобы полностью удалить заказ без перемещения в корзину, освобождая место. - Не запускайте удаление слишком часто — раз в сутки достаточно, чтобы избежать нагрузки.
- Для больших магазинов с тысячами заказов добавьте пагинацию по ID заказов с ограничением, чтобы не превышать лимиты памяти и времени выполнения.
- Перед внесением изменений сделайте резервную копию базы данных.
Таблица сравнения подходов удаления неоплаченных заказов
| Метод | Преимущества | Недостатки | Пример |
|---|---|---|---|
| Ручное удаление через админку | Просто, не требует кода | Затратно по времени, не автоматично | В админке WooCommerce → Заказы |
| Плагин для очистки заказов | Автоматизация, удобный интерфейс | Нагрузка плагина, ограниченная гибкость | Плагины типа "WooCommerce Order Cleaner" |
| Самописный код с WP-Cron | Полный контроль, автоматизация | Требует навыков, возможны ошибки | Код из статьи |