Диагностика проблемы с обновлением статусов возврата платежа
Многие разработчики и администраторы сайтов на WordPress с интеграцией LearnPress и WooCommerce сталкиваются с проблемой: при возврате платежа в WooCommerce статус заказа меняется, но LearnPress не обновляет статус пользователя курса. Это приводит к ситуации, когда пользователь продолжает иметь доступ к курсу несмотря на возврат денег.
Для диагностики проблемы проверьте следующие моменты:
- Активна ли интеграция LearnPress с WooCommerce (проверить настройки плагина LearnPress → Интеграции);
- Проверить, обновляется ли статус заказа в WooCommerce корректно (например, «refunded»);
- Отсутствуют ли ошибки в логах WordPress (wp-content/debug.log) при изменении статуса заказа;
- Проверить, срабатывают ли хуки WooCommerce при возврате платежа (например,
woocommerce_order_status_refunded); - Убедиться, что LearnPress слушает эти хуки и корректно обрабатывает их.
Инструменты для проверки хуков WooCommerce
Для проверки, вызывается ли нужный хук, можно добавить временный отладочный код в файл functions.php темы или в кастомный плагин:
add_action('woocommerce_order_status_refunded', function($order_id) {
error_log('Order refunded: ' . $order_id);
});После возврата платежа проверьте файл wp-content/debug.log. Если запись появилась, значит хук срабатывает корректно.
Пошаговое решение: синхронизация возврата платежа WooCommerce и LearnPress
LearnPress не всегда автоматически обновляет статус пользователя при возврате платежа в WooCommerce. Для решения создадим кастомный обработчик, который будет слушать событие возврата платежа и обновлять статус пользователя курса.
1. Добавление обработчика хука возврата платежа
В functions.php темы или отдельном плагине добавьте следующий код:
add_action('woocommerce_order_status_refunded', 'lp_sync_refund_status_with_learnpress', 10, 1);
function lp_sync_refund_status_with_learnpress($order_id) {
if (!$order_id) {
return;
}
$order = wc_get_order($order_id);
if (!$order) {
return;
}
// Получаем все курсы, связанные с заказом
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
// Проверяем, является ли товар курсом LearnPress
if (learn_press_is_course($product_id)) {
$user_id = $order->get_user_id();
if (!$user_id) {
continue;
}
// Отменяем подписку/доступ пользователя к курсу
learn_press_update_user_course_status($user_id, $product_id, 'cancelled');
}
}
}2. Объяснение кода
- Хук
woocommerce_order_status_refundedвызывается при возврате платежа. - Функция получает объект заказа.
- Перебирает все товары внутри заказа, проверяя, является ли товар курсом LearnPress.
- Если да, то получает ID пользователя и меняет статус курса на
cancelled, что лишает доступа.
3. Дополнительная проверка и логирование
Для отладки можно добавить запись в лог, чтобы убедиться, что функция срабатывает:
error_log("LearnPress refund sync: user {$user_id} course {$product_id} set to cancelled");Проверка результата после внедрения
- Сделайте тестовый заказ курса в WooCommerce.
- Выполните возврат платежа через админ-панель WooCommerce.
- Проверьте, что статус заказа сменился на «refunded».
- Войдите под пользователем курса и убедитесь, что доступ к курсу закрыт (статус курса в LearnPress «cancelled»).
- Проверьте файл логов на наличие сообщений из функции (если добавляли логирование).
Частые ошибки и их исправление
- Ошибка: Функция
learn_press_update_user_course_statusне существует.
Решение: Проверьте версию LearnPress и его API. В некоторых версиях функция может отсутствовать. Можно использовать альтернативный способ обновления статуса через WP_User_Meta или кастомные запросы. - Ошибка:
$order->get_user_id()возвращает 0.
Решение: Если заказ сделан гостем, связь с пользователем отсутствует. В этом случае автоматическое обновление статуса курса невозможно без дополнительной логики по сопоставлению email или другого идентификатора. - Ошибка: Пользователь продолжает иметь доступ к курсу после возврата.
Решение: Проверьте, что LearnPress слушает статусcancelledи корректно ограничивает доступ. Если нет, потребуется дополнительно реализовать логику ограничения доступа.
Практические советы по безопасности и производительности
- Добавляйте обработчики статусов только для необходимых событий, чтобы не нагружать сайт лишними вызовами.
- Используйте встроенный логгер WordPress через
error_logтолько для отладки, отключайте в продакшене. - При работе с возвратами и доступом к курсам важно, чтобы права пользователя корректно синхронизировались, иначе возможны утечки контента.
- Рекомендуется протестировать решение на тестовом окружении перед внедрением на живой сайт.
Сравнение вариантов решения проблемы
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Использование стандартных хуков WooCommerce и API LearnPress | Добавление обработчика на woocommerce_order_status_refunded с вызовом API LearnPress | Простота, надежность, прямое решение | Требуется актуальная версия LearnPress с нужными функциями |
| Кастомный SQL-запрос для обновления статуса | Обновление данных напрямую в базе LearnPress | Работает даже без официального API | Риск повреждения данных, требует знаний структуры БД |
| Использование сторонних плагинов-синхронизаторов | Готовые решения для интеграции LearnPress и WooCommerce | Может иметь дополнительный функционал | Может быть дорогим, не всегда гибким |