Диагностика проблемы с обновлением статусов возврата платежа
В интеграции WooCommerce и LearnPress часто возникает ситуация, когда возврат платежа в WooCommerce не отражается в статусе заказа курса LearnPress. Это приводит к тому, что пользователи сохраняют доступ к платному курсу после возврата денег, что недопустимо.
Основные признаки проблемы:
- В WooCommerce заказ отмечен как «Возврат» или «Refunded»;
- В LearnPress статус заказа остается «Оплачен» или «Завершен»;
- Пользователь продолжает иметь доступ к курсу после возврата.
Первым шагом проверьте, настроена ли синхронизация статусов между WooCommerce и LearnPress. По умолчанию LearnPress не обновляет статусы заказа курса при изменениях в WooCommerce.
Пошаговое решение: синхронизация статусов возврата WooCommerce с LearnPress
1. Создайте функцию для отслеживания статуса заказа WooCommerce
Для этого используйте хук woocommerce_order_status_refunded, который срабатывает при возврате платежа:
add_action('woocommerce_order_status_refunded', 'lp_sync_order_status_refund', 10, 1);
function lp_sync_order_status_refund($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
// Получаем связанные курсы LearnPress
$items = $order->get_items();
foreach ($items as $item) {
$product_id = $item->get_product_id();
// Проверяем, что товар - курс LearnPress
if (learn_press_is_course($product_id)) {
// Получаем заказ LearnPress для пользователя и курса
$user_id = $order->get_user_id();
$lp_order = LP_Order_DB::get_order_by_course_and_user($product_id, $user_id);
if ($lp_order) {
// Обновляем статус заказа LearnPress на 'refunded' или 'canceled'
$lp_order->update_status('refunded');
}
}
}
}Обратите внимание, что функция LP_Order_DB::get_order_by_course_and_user — часть LearnPress для поиска заказа по курсу и пользователю, а метод update_status обновляет статус.
2. Проверка корректности статусов LearnPress
По умолчанию LearnPress не имеет статуса refunded. Можно использовать статус cancelled или добавить свой статус. Для добавления статуса воспользуйтесь следующим кодом:
add_filter('learn-press/order-statuses', function($statuses) {
$statuses['refunded'] = array(
'label' => __('Возврат', 'learnpress'),
'public' => false,
'exclude_from_order_count' => true
);
return $statuses;
});После этого в функции обновления статуса используйте 'refunded'.
3. Автоматически отзываем доступ к курсу
Обновление статуса заказа LearnPress на возврат должно автоматически отзывать доступ к курсу. Если это не происходит, добавьте вызов удаления доступа вручную:
if ($lp_order) {
$lp_order->update_status('refunded');
// Отзываем доступ
$user_id = $order->get_user_id();
$course = learn_press_get_course($product_id);
if ($course) {
LP_User_Items::instance()->delete_item($user_id, $course->get_id());
}
}Проверка результата после внедрения
- Сделайте тестовый заказ курса через WooCommerce и оплатите.
- Верните деньги через WooCommerce, установив статус заказа в «Refunded».
- Проверьте, что статус заказа LearnPress изменился на «Возврат» (refunded/cancelled).
- Проверьте профиль пользователя: курс должен быть недоступен, уроки и материалы — закрыты.
- Проверьте на стороне администратора и в отчетах LearnPress, что статус заказа обновлен корректно.
Частые ошибки и как их исправить
- Статус LearnPress не меняется: проверьте, что хук
woocommerce_order_status_refundedподключен и срабатывает. Добавьте логирование илиerror_logвнутри функции. - Функции LearnPress не доступны: убедитесь, что код размещён в правильном месте (functions.php или плагине) и LearnPress загружен до выполнения кода.
- Доступ к курсу не отзывается: вызов
LP_User_Items::instance()->delete_item()должен удалять доступ. Проверьте, что переданные ID курсов и пользователя корректны. - Проблемы с кэшированием: очистите кеш сайта и браузера после тестов, чтобы увидеть актуальные изменения.
Практические советы по безопасности и производительности
- Используйте nonce и проверку прав пользователя, если расширяете функционал управления заказами.
- Минимизируйте количество запросов к базе, используя кэширование результатов поиска заказов LearnPress.
- Логируйте изменения статусов для диагностики и аудита.
- Тестируйте интеграцию на staging-сервере перед внедрением в продакшен.
Сравнение вариантов решения
| Метод | Преимущества | Недостатки |
|---|---|---|
Использование хука woocommerce_order_status_refunded и обновление статуса LearnPress | Прямое решение, автоматическое обновление, отзыв доступа | Требует ручной настройки, знание API LearnPress |
| Ручное обновление статусов через админку LearnPress | Простота, не требует кода | Человеческий фактор, ошибки, неудобство при большом количестве заказов |
| Использование сторонних плагинов синхронизации WooCommerce и LearnPress | Готовые решения, поддержка | Возможны конфликты, зависимость от обновлений, лицензии |