Диагностика задачи: зачем нужна собственная логика отмены и возврата заказов в WooCommerce
Стандартный функционал WooCommerce по отмене и возврату заказов зачастую не покрывает все бизнес-сценарии. Например, нужно автоматически отменять заказы по определённым условиям (например, неоплата в течение времени), блокировать возвраты после определённого срока или интегрировать собственную систему учёта возвратов и отмен.
Перед внедрением кастомной логики важно определить конкретные условия и понять, какие хуки и методы WooCommerce вам понадобятся для управления заказами.
Пошаговое решение: как реализовать автоматическую отмену и возврат с проверками
1. Автоматическая отмена заказов, неоплаченных в течение 24 часов
Для этого используем WP-Cron и проверяем статусы заказов:
function wpsync_auto_cancel_unpaid_orders() {
$args = array(
'limit' => -1,
'status' => 'pending',
'date_created' => '<' . ( time() - DAY_IN_SECONDS ),
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order ) {
$order->update_status( 'cancelled', 'Автоматическая отмена заказа из-за отсутствия оплаты более 24 часов.' );
}
}
add_action( 'wpsync_daily_cron', 'wpsync_auto_cancel_unpaid_orders' );
if ( ! wp_next_scheduled( 'wpsync_daily_cron' ) ) {
wp_schedule_event( time(), 'daily', 'wpsync_daily_cron' );
}2. Создание собственной логики возврата с ограничением по времени
Предположим, возврат возможен не позднее 14 дней после даты заказа. Добавим проверку при попытке изменить статус на "refunded":
function wpsync_custom_refund_restriction( $order_id ) {
$order = wc_get_order( $order_id );
$order_date = $order->get_date_created();
if ( ! $order_date ) {
return;
}
$days_passed = ( time() - $order_date->getTimestamp() ) / DAY_IN_SECONDS;
if ( $days_passed > 14 ) {
// Запретить возврат и уведомить администратора
wp_die( 'Возврат невозможен: срок возврата превышен 14 дней.' );
}
}
add_action( 'woocommerce_order_status_refunded', 'wpsync_custom_refund_restriction' );3. Кастомное уведомление пользователя при отмене заказа
Чтобы информировать клиента о причине отмены, добавим письмо с кастомным шаблоном или дополним стандартное:
function wpsync_add_cancel_reason_to_email( $order, $sent_to_admin, $plain_text, $email ) {
if ( $order->has_status( 'cancelled' ) ) {
echo '<p><strong>Причина отмены:</strong> Автоматическая отмена из-за отсутствия оплаты.</p>';
}
}
add_action( 'woocommerce_email_order_details', 'wpsync_add_cancel_reason_to_email', 20, 4 );Проверка результата после внедрения
- Создайте тестовый заказ с статусом
pending, оставьте его более 24 часов — проверьте, что он автоматически изменился наcancelled. - Попробуйте изменить статус заказа старше 14 дней на
refunded— должно появиться сообщение об ошибке. - При отмене заказа проверьте e-mail клиента: должно появиться сообщение с причиной отмены.
Частые ошибки и как их исправить
- Крон не срабатывает: проверьте, активен ли WP-Cron на сайте, или настройте системный cron для вызова
wp-cron.php. - Ошибка при возврате с wp_die(): вместо стандартного wp_die лучше использовать фильтры и возвращать ошибку через WooCommerce API, чтобы не прерывать выполнение скриптов.
- Отсутствие уведомлений клиенту: убедитесь, что добавленная функция выводится только в нужных письмах и не ломает шаблон.
- Некорректное время в проверках: всегда используйте временные функции WordPress (
current_time('timestamp')) вместоtime()для корректного учёта часового пояса.
Практические советы по безопасности и производительности
- Для проверки даты используйте объекты DateTime и методы WooCommerce, чтобы избежать ошибок в форматах.
- Оптимизируйте WP-Cron: если заказов много, обрабатывайте их партиями, чтобы избежать таймаутов.
- Убедитесь, что все пользовательские данные и сообщения проходят санитацию (
esc_html(),wp_kses_post()). - Для критичных операций (возврат денег) делайте логи действий — для аудита и отладки.
Сравнение вариантов реализации автоматической отмены заказов
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| WP-Cron | Регулярная проверка и отмена по времени | Простая реализация, не требует внешних сервисов | Зависит от посещаемости сайта, возможны задержки |
| Внешний cron-сервис | Запуск скрипта с сервера хостинга или внешнего сервиса | Более надёжно и точно по времени | Требует доступа к серверу или сторонним сервисам |
| Триггер на событие | Отмена при событии пользователя (например, попытка оплаты) | Мгновенный отклик | Не подходит для отмены по времени, нужна дополнительная логика |