Диагностика проблемы возврата платежа в LearnPress с WooCommerce
Проблема: при возврате платежа через WooCommerce статус заказа обновляется, но в LearnPress статус курса ученика не меняется, что приводит к путанице в доступах и ошибкам отчетности.
Для начала проверьте, правильно ли связаны статусы заказов между WooCommerce и LearnPress. Основная причина — отсутствие обработки события возврата платежа в LearnPress, поскольку стандартная интеграция WooCommerce с LearnPress не всегда учитывает возвраты.
Проверьте логи WooCommerce (WooCommerce > Статус > Логи) на наличие ошибок при выполнении возврата. Также проверьте, вызывается ли хук woocommerce_order_refunded при возврате платежа.
Пошаговое решение: синхронизация статусов возврата платежей
1. Добавление обработки возврата через хук WooCommerce
Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин, чтобы LearnPress получал уведомления о возвратах и корректно обновлял статусы курса:
add_action('woocommerce_order_refunded', 'lp_handle_refund_update_course_access', 10, 2);
function lp_handle_refund_update_course_access($order_id, $refund_id) {
$order = wc_get_order($order_id);
if (!$order) return;
// Получаем ID пользователя
$user_id = $order->get_user_id();
if (!$user_id) return;
// Получаем все курсы из заказа
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
// Проверяем, что продукт связан с курсом LearnPress
if (!lp_is_course($product_id)) continue;
// Отзываем доступ к курсу пользователю
lp_remove_user_course($user_id, $product_id);
}
}
// Вспомогательная функция для проверки, является ли продукт курсом LearnPress
function lp_is_course($product_id) {
$course = learn_press_get_course($product_id);
return $course && $course->exists();
}
// Функция удаления доступа пользователя к курсу
function lp_remove_user_course($user_id, $course_id) {
global $wpdb;
$table = $wpdb->prefix . 'learnpress_user_courses';
$wpdb->delete($table, array(
'user_id' => $user_id,
'course_id' => $course_id
));
}
2. Проверка корректности работы кода
Для проверки сделайте возврат платежа в WooCommerce тестовым заказом с курсом LearnPress, затем:
- Перейдите в панель администратора LearnPress > Студенты и проверьте, что у пользователя отозван доступ к курсу.
- Проверьте таблицу базы данных
wp_learnpress_user_coursesна отсутствие записей с данным пользователем и курсом. - Убедитесь, что больше не доступны уроки курса для этого пользователя.
Частые ошибки и их исправление
- Хук не срабатывает: Проверьте, что в WooCommerce включено логирование и что возврат платежа происходит через стандартный механизм, вызывающий
woocommerce_order_refunded. - Курс не удаляется из LearnPress: Убедитесь, что функция
lp_is_courseкорректно определяет курсы. Проверьте, что ID продукта совпадает с ID курса LearnPress. - Ошибка базы данных при удалении: Проверьте префикс таблиц в базе данных и права пользователя базы данных.
- Доступ к курсу остается, но статус заказа в WooCommerce изменился: Возможно, у вас кастомные роли или плагины, которые блокируют удаление доступа. Проверьте конфликты с другими плагинами.
Практические советы по безопасности и производительности
- Добавляйте проверку nonce и прав пользователя, если расширяете функционал с фронтенда.
- Оптимизируйте запросы к базе данных, избегайте лишних циклов.
- Резервно храните данные пользователя LearnPress перед удалением доступа для возможности восстановления.
- Регулярно обновляйте WooCommerce и LearnPress, чтобы использовать актуальные хуки и методы.
Таблица сравнения подходов решения проблемы возврата платежей
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Кодовое решение через хук | Обработка woocommerce_order_refunded, удаление доступа вручную | Гибкость, контроль, бесплатно | Нужно тестировать, зависит от правильности кода |
| Плагины интеграции WooCommerce и LearnPress | Готовые решения с поддержкой возвратов | Простота установки, поддержка | Может быть платным, ограниченная кастомизация |
| Ручное управление доступом | Администратор вручную меняет доступ после возврата | Нет необходимости в коде | Ручной труд, ошибки, задержки |
Проверка результата после внедрения
Для проверки результата выполните следующие шаги:
- Создайте тестовый заказ курса с оплатой через WooCommerce.
- Выполните возврат платежа в WooCommerce (через админку или тестовые платежные шлюзы).
- Проверьте, что у пользователя в LearnPress отозван доступ к курсу.
- Проверьте, что статус заказа в WooCommerce изменился на «Возврат» или аналогичный.
- Убедитесь, что пользователь не может получить доступ к урокам курса.