Диагностика проблемы с неоплаченными заказами в WooCommerce
В интернет-магазинах на WooCommerce часто накапливаются заказы со статусом pending или on-hold, которые так и не были оплачены. Это приводит к раздутой базе данных, замедлению работы админки и усложнению аналитики. Для магазинов с большим трафиком и частыми заказами это может стать серьёзной проблемой.
Проверить наличие таких заказов можно через админку WooCommerce в разделе Заказы с фильтром по статусу «Ожидает оплаты» или запросом к базе:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-on-hold');Если количество таких заказов велико и они долго не меняют статус, пора автоматизировать их удаление.
Пошаговое решение: автоматическое удаление неоплаченных заказов через WP-Cron
1. Создание функции для удаления заказов
Ниже пример кода, который удаляет заказы со статусами wc-pending и wc-on-hold, созданные более 48 часов назад:
function wc_delete_old_unpaid_orders() {
$args = array(
'post_type' => 'shop_order',
'post_status' => array('wc-pending', 'wc-on-hold'),
'date_query' => array(
array(
'column' => 'post_date',
'before' => '48 hours ago',
),
),
'fields' => 'ids',
'posts_per_page' => -1,
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true);
}
}
}2. Регистрация WP-Cron задачи для периодического запуска
Добавляем событие, которое будет запускать удаление каждый час:
function wc_schedule_delete_unpaid_orders() {
if (!wp_next_scheduled('wc_delete_unpaid_orders_hook')) {
wp_schedule_event(time(), 'hourly', 'wc_delete_unpaid_orders_hook');
}
}
add_action('wp', 'wc_schedule_delete_unpaid_orders');
add_action('wc_delete_unpaid_orders_hook', 'wc_delete_old_unpaid_orders');3. Очистка CRON при деактивации плагина или темы
function wc_clear_delete_unpaid_orders_schedule() {
$timestamp = wp_next_scheduled('wc_delete_unpaid_orders_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wc_delete_unpaid_orders_hook');
}
}
register_deactivation_hook(__FILE__, 'wc_clear_delete_unpaid_orders_schedule');Проверка результата после внедрения
- Выполните вручную функцию
wc_delete_old_unpaid_orders()через консоль WP-CLI или временно вызовите ее в коде и проверьте, что старые заказы удаляются. - С помощью SQL-запроса проверьте количество неоплаченных заказов до и после запуска cron-задачи.
- В админке WooCommerce убедитесь, что заказы со статусом
pendingиon-holdстарше 48 часов пропали. - Проверьте логи cron (плагин WP Crontrol или аналогичные) для подтверждения регулярного запуска задачи.
Частые ошибки и как их исправить
- Код не удаляет заказы: проверьте, что статусы заказов указаны корректно с префиксом
wc-. Также убедитесь, что у вас есть права на удаление постов. - Задача WP-Cron не запускается: на хостинге может быть отключён WP-Cron. Проверьте, что файл
wp-cron.phpвызывается регулярно через системный cron или настройте внешний триггер. - Удаляются нужные заказы: строго проверьте условие
'before' => '48 hours ago'и статусы, чтобы не удалить оплаченные. - Производительность падает при выборке: если заказов очень много, используйте постраничный запрос с
'posts_per_page'и цикл, чтобы не перегружать память.
Практические советы по безопасности и производительности
- Создавая функцию удаления, используйте
wp_delete_post($order_id, true)для полного удаления без помещения в корзину. - Добавьте в функцию логи или уведомления (например, через
error_log()), чтобы отслеживать удалённые заказы. - Если нужно более гибко управлять временем удаления, добавьте в настройки темы или плагина опцию для изменения интервала через административный интерфейс.
- Для больших магазинов рассмотрите использование WP-CLI команд, которые можно запускать по расписанию из консоли хостинга.
Сравнение способов удаления неоплаченных заказов
| Способ | Плюсы | Минусы |
|---|---|---|
| WP-Cron с PHP-кодом | Гибкость, кастомизация, нет сторонних плагинов | Зависит от работы WP-Cron, требует навыков разработки |
| Плагины очистки заказов (например, "WooCommerce Cancel Abandoned Order") | Простота установки, интерфейс | Могут быть платными, нагрузка на сайт, ограниченная кастомизация |
| WP-CLI скрипты | Максимальная производительность, надежность | Требуется доступ к командной строке, навыки работы с WP-CLI |