Диагностика проблемы с синхронизацией статусов заказов
Проблема, когда статус заказа WooCommerce не обновляется в LearnPress, обычно возникает из-за неправильной обработки вебхуков или несинхронизированных пользовательских мета-данных. Это критично для автоматического присвоения доступа к курсам после оплаты.
Чтобы проверить проблему, выполните следующие действия:
- Перейдите в WooCommerce > Заказы и найдите проблемный заказ.
- Измените статус заказа вручную (например, со «Ожидание» на «Завершён»).
- Проверьте в LearnPress, изменился ли статус курса или доступ у пользователя.
- Посмотрите логи ошибок PHP и WooCommerce для обнаружения исключений или предупреждений.
Если статус заказа меняется в WooCommerce, но LearnPress не обновляет доступ, значит, синхронизация не работает.
Пошаговое решение проблемы с кодом
LearnPress использует свой механизм для отслеживания статусов заказов WooCommerce. Иногда в кастомных темах или плагинах этот процесс нарушается.
Решение — вручную подключить обработчик изменения статуса заказа WooCommerce и обновить статус LearnPress:
add_action('woocommerce_order_status_completed', 'lp_sync_order_status_with_learnpress', 10, 1);
function lp_sync_order_status_with_learnpress( $order_id ) {
if ( ! $order_id ) return;
$order = wc_get_order( $order_id );
if ( ! $order ) return;
$user_id = $order->get_user_id();
if ( ! $user_id ) return;
// Получаем курсы из заказа
foreach ( $order->get_items() as $item ) {
$product_id = $item->get_product_id();
// Проверяем, относится ли товар к курсам LearnPress
if ( learn_press_get_course_id( $product_id ) ) {
$course_id = learn_press_get_course_id( $product_id );
// Обновляем статус курса у пользователя
learn_press_update_user_course_status( $user_id, $course_id, 'enrolled' );
}
}
}
/**
* Функция для получения ID курса LearnPress по ID продукта WooCommerce
*/
function learn_press_get_course_id( $product_id ) {
// Предполагается, что ID курса совпадает с ID продукта
// Или используйте мета-данные для связи
return get_post_type( $product_id ) === 'lp_course' ? $product_id : false;
}
/**
* Функция обновления статуса курса пользователя
*/
function learn_press_update_user_course_status( $user_id, $course_id, $status ) {
if ( ! $user_id || ! $course_id ) return;
update_user_meta( $user_id, '_lp_course_status_' . $course_id, $status );
}
Этот код подключается к хуку woocommerce_order_status_completed, который срабатывает при смене статуса заказа на «Завершён». Далее он обновляет статус курса в LearnPress для пользователя.
Как проверить, что решение сработало
- Создайте тестовый заказ в WooCommerce с привязкой к курсу LearnPress.
- Оплатите заказ или измените статус вручную на «Завершён» в админке WooCommerce.
- Зайдите в профиль пользователя и убедитесь, что курс стал доступен (статус курса «enrolled» или аналогичный).
- Проверьте базу данных, в таблице usermeta появится ключ вида
_lp_course_status_{ID_курса}со значением «enrolled».
Частые ошибки и способы их устранения
- Неверная связь продукта и курса: проверьте, что ID курса совпадает с продуктом WooCommerce или правильно сделана связь через метаполя.
- Отсутствие ID пользователя у заказа: если заказ создаётся без регистрации (гость), LearnPress не сможет обновить статус. Решение — требовать регистрацию при покупке.
- Кэширование: кэширование страниц или объектов может скрывать обновления статусов. Очистите кэш после внесения изменений.
- Конфликты с другими плагинами: отключите сторонние плагины, чтобы проверить, не мешают ли они обработке статусов.
Практические советы по безопасности и производительности
- При работе с хуками WooCommerce используйте правильные приоритеты и проверяйте входные данные.
- Не храните статус курсов в пользовательских метаданных без проверки — используйте стандартные функции LearnPress, если они доступны.
- Минимизируйте запросы к базе внутри циклов, кэшируйте результаты при необходимости.
- Для массовых обновлений статусов используйте WP-CLI или фоновые задачи, чтобы не перегружать сервер.
Сравнение вариантов решения
| Способ | Плюсы | Минусы |
|---|---|---|
| Использование стандартных хуков LearnPress | Простота, поддержка обновлений | Могут не сработать при кастомных настройках |
| Ручная синхронизация через хуки WooCommerce (код выше) | Гибкость, контроль процесса | Требует поддержки кода при обновлениях |
| Плагины для интеграции WooCommerce и LearnPress | Готовое решение, техподдержка | Могут быть платными, ограничены функционалом |