Диагностика проблемы с отложенными оплатами в WooCommerce
Отложенные оплаты — распространённая практика для интернет-магазинов. Клиент может выбрать оплату позже, но если срок оплаты затягивается, заказ остаётся в статусе "отложенный", что мешает актуализации склада и обработке заказов. Проблема — как автоматически отменять или отключать такие отложенные оплаты по истечении заданного срока, чтобы не блокировать ресурсы магазина и не создавать ложные ожидания.
Как определить, что отложенный платеж просрочен?
В WooCommerce отложенный платеж обычно создаёт заказ со статусом on-hold или pending. Для автоматизации нужно проверять дату создания заказа или дату последнего изменения и сравнивать с текущей датой.
Пошаговое решение: автоматическое отключение отложенных оплат
Для автоматизации задачи используем WP-Cron и кастомный PHP-код. Основная идея — запускать задачу, которая проверяет заказы со статусом on-hold или pending и дату их создания. Если прошло больше, чем установленный лимит дней, заказ переводится в статус cancelled или удаляется.
1. Добавляем функцию проверки и обновления статусов заказов
function wpaction_cancel_expired_pending_orders() {
$days_limit = 3; // Лимит дней для оплаты
$date_limit = date('Y-m-d H:i:s', strtotime("-{$days_limit} days"));
$args = array(
'status' => array('pending', 'on-hold'),
'limit' => -1,
'date_created' => '<' . $date_limit,
'return' => 'ids',
);
$orders = wc_get_orders($args);
foreach ($orders as $order_id) {
$order = wc_get_order($order_id);
// Меняем статус на отменённый
$order->update_status('cancelled', 'Заказ отменён автоматически из-за превышения срока оплаты.');
}
}2. Регистрируем WP-Cron задачу для ежедневного запуска
add_action('wpaction_daily_cancel_expired_orders', 'wpaction_cancel_expired_pending_orders');
function wpaction_schedule_daily_cancel() {
if (!wp_next_scheduled('wpaction_daily_cancel_expired_orders')) {
wp_schedule_event(time(), 'daily', 'wpaction_daily_cancel_expired_orders');
}
}
add_action('wp', 'wpaction_schedule_daily_cancel');3. Очистка WP-Cron при деактивации темы или плагина
function wpaction_clear_scheduled_cancel() {
$timestamp = wp_next_scheduled('wpaction_daily_cancel_expired_orders');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpaction_daily_cancel_expired_orders');
}
}
add_action('switch_theme', 'wpaction_clear_scheduled_cancel');Как проверить, что решение работает
- Создайте заказ в WooCommerce со статусом
pendingилиon-hold. - Установите дату создания заказа в прошлое (можно через базу данных или плагин для редактирования заказов).
- Запустите вручную функцию
wpaction_cancel_expired_pending_orders()или дождитесь выполнения WP-Cron (один раз в сутки). - Проверьте, что заказ изменился на статус
cancelledи в комментариях заказа появилась запись о причине.
Частые ошибки и как их исправить
- WP-Cron не запускается автоматически: Убедитесь, что на сайте посещения есть, либо настройте системный cron для запуска
wp-cron.php. - Заказы не меняют статус: Проверьте, что функция
wc_get_ordersвозвращает заказы. Возможно, фильтрdate_createdприменяется некорректно в вашей версии WooCommerce, попробуйте альтернативный запрос через WP_Query. - Статус заказа не подходит: Убедитесь, что используете правильные статусы в массиве
'status' => ['pending','on-hold']. - Функция запускается слишком часто: WP-Cron настроена на daily, не меняйте период на слишком частый без необходимости.
Практические советы по безопасности и производительности
- Не удаляйте заказы, лучше менять статус — сохраняется история.
- Для магазинов с большим количеством заказов используйте пагинацию в запросах
wc_get_orders, чтобы избежать превышения лимита памяти или таймаута. - Логируйте действия отмены заказов, чтобы можно было отследить автоматические изменения.
- Используйте кэширование и проверяйте нагрузку на сервер при запуске WP-Cron.
Сравнение вариантов автоматического отключения отложенных оплат
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| WP-Cron + кастомный PHP-код | Собственная функция для отмены просроченных заказов | Гибкость, не требует сторонних плагинов | Зависит от работы WP-Cron, нужен кодинг |
| Плагин автоматизации заказов | Готовые решения с настройками срока отмены | Простота настройки, поддержка | Дополнительная нагрузка, лицензия, ограниченная кастомизация |
| Ручная очистка через админку | Администратор вручную отменяет просроченные заказы | Простота, без кода | Трудозатратно, риск забыть |