Диагностика проблемы: почему важен автоматический возврат средств
В магазине на WooCommerce могут возникать ситуации, когда заказ долго не обрабатывается, клиент отменяет покупку или товар не может быть доставлен. Ручное отслеживание таких заказов и возврат средств — трудоемкий процесс, особенно при большом потоке заказов. Автоматизация этого процесса позволит минимизировать задержки и улучшить опыт клиентов.
Как определить устаревшие заказы для возврата
Под «устаревшими» обычно понимают заказы, в которых статус не менялся определенное время (например, 30 дней), либо заказы со статусом «в ожидании» или «обработка», которые не были завершены.
Для диагностики можно выполнить SQL-запрос в базе данных, чтобы увидеть количество таких заказов:
SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-processing') AND post_date < NOW() - INTERVAL 30 DAY;Если таких заказов много — пора автоматизировать возврат средств.
Пошаговое решение: автоматический возврат средств по устаревшим заказам
1. Создание крон-задачи для проверки заказов
Добавим в functions.php или в кастомный плагин функцию, которая будет запускаться ежедневно и проверять заказы старше 30 дней:
function wprobot_auto_refund_old_orders() {
$args = [
'status' => ['wc-pending', 'wc-processing'],
'date_created' => '<' . ( new WC_DateTime() )->modify('-30 days')->date('Y-m-d H:i:s'),
'limit' => -1,
];
$orders = wc_get_orders($args);
foreach ($orders as $order) {
if ($order->get_total_refunded() >= $order->get_total()) {
continue; // Уже возвращено
}
$refund = wc_create_refund([
'amount' => $order->get_total() - $order->get_total_refunded(),
'reason' => 'Автоматический возврат по истечению срока обработки',
'order_id' => $order->get_id(),
'refund_payment' => true,
]);
if ( is_wp_error($refund) ) {
error_log('Ошибка возврата заказа #' . $order->get_id() . ': ' . $refund->get_error_message());
continue;
}
$order->update_status('refunded', 'Автоматический возврат средств по истечении 30 дней.');
}
}
add_action('wprobot_daily_auto_refund', 'wprobot_auto_refund_old_orders');2. Регистрация ежедневного события WP-Cron
Чтобы функция запускалась автоматически, добавим регистрацию крон-задачи:
function wprobot_schedule_auto_refund() {
if (! wp_next_scheduled('wprobot_daily_auto_refund')) {
wp_schedule_event(time(), 'daily', 'wprobot_daily_auto_refund');
}
}
add_action('wp', 'wprobot_schedule_auto_refund');3. Отмена задачи при деактивации плагина
Если вы реализуете в плагине, не забудьте очистить крон-задачу:
function wprobot_clear_auto_refund_schedule() {
$timestamp = wp_next_scheduled('wprobot_daily_auto_refund');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wprobot_daily_auto_refund');
}
}
register_deactivation_hook(__FILE__, 'wprobot_clear_auto_refund_schedule');Проверка результата после внедрения
Чтобы убедиться, что автоматический возврат работает корректно:
- Создайте тестовый заказ со статусом «Ожидает оплаты» или «В обработке» и датой старше 30 дней (можно вручную изменить дату в базе или с помощью плагина для редактирования дат).
- Принудительно запустите крон-задачу через WP-CLI:
wp cron event run wprobot_daily_auto_refundили используйте плагин для управления WP-Cron. - Проверьте, что заказ получил статус «refunded» и создан возврат средств, а также записи в журнале ошибок отсутствуют.
Частые ошибки и как их исправить
- Ошибка: Возврат не создаётся, появляется ошибка
refund_payment.
Причина: Метод оплаты не поддерживает автоматический возврат или отсутствует подключение к платёжному шлюзу.
Решение: Проверьте настройки платежного шлюза, убедитесь, что API ключи актуальны. - Ошибка: Крон-задача не запускается.
Причина: WP-Cron запускается при посещении сайта, если трафика мало — задачи не выполняются.
Решение: Настройте системный cron на сервере для вызоваwp-cron.php. - Ошибка: Статус заказа не меняется после возврата.
Причина: В коде не обновился статус или конфликт с другим плагином.
Решение: Логируйте ошибки, временно отключите плагины, влияющие на статусы заказов.
Практические советы по безопасности и производительности
- Используйте транзакции и проверки ошибок при создании возвратов, чтобы избежать частичного выполнения кода.
- Ограничьте количество заказов в одном запуске, чтобы избежать таймаутов сервера (например,
limit20-50). - Логируйте события возвратов в отдельный файл для аудита и отладки.
- Проверьте совместимость с другими плагинами, особенно с кэшированием и оптимизацией.
Сравнение вариантов автоматизации возврата средств
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Ручной возврат | Полный контроль, простота | Трудозатратно, ошибки человека | Подходит для малого магазина |
| Плагины автоматизации (например, WooCommerce Smart Refunder) | Удобство, настройки из админки | Доп. нагрузка, платные решения | Хорошо для средних магазинов |
| Кастомный код (как в статье) | Гибкость, отсутствие доп. затрат | Требует навыков, поддержка кода | Оптимально для разработчиков и крупных проектов |