Диагностика проблемы несинхронизации статусов заказов
Основная задача LearnPress при интеграции с WooCommerce — получать актуальные статусы заказов для открытия доступа к курсам. Чаще всего несинхронизация проявляется так: пользователь оплачивает заказ в WooCommerce, статус меняется, а в LearnPress статус заказа не обновляется, и курс не становится доступным.
Проверка первичных признаков:
- Оплата в WooCommerce прошла успешно, статус заказа изменился (например, на «Завершен»).
- В LearnPress курс по этому заказу не активируется.
- В логах ошибок PHP или WooCommerce могут быть сообщения об ошибках в хуках или API LearnPress.
Для диагностики выполните следующие шаги:
- Включите WP_DEBUG и WP_DEBUG_LOG в
wp-config.phpдля сбора ошибок:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);- Просмотрите файл
wp-content/debug.logна предмет ошибок, связанных с LearnPress или WooCommerce. - Проверьте, вызывается ли функция синхронизации статусов после изменения статуса заказа в WooCommerce — это обычно делает хук
woocommerce_order_status_changed.
Пошаговое решение проблемы
1. Проверка и добавление хука обновления статуса
Убедитесь, что в теме или плагине есть обработчик для синхронизации статусов заказов:
add_action('woocommerce_order_status_changed', 'lp_sync_order_status_with_learnpress', 10, 4);
function lp_sync_order_status_with_learnpress($order_id, $old_status, $new_status, $order) {
if (!$order instanceof WC_Order) {
$order = wc_get_order($order_id);
}
// Только для оплаченных или завершенных заказов
if (in_array($new_status, array('processing', 'completed'))) {
// Получаем 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 (learn_press_is_course($product_id)) {
// Добавляем курс пользователю
LP_User_Item::get_user_item($user_id, $product_id)->set_status('enrolled');
}
}
}
// Для отмененных или возвращенных заказов — отписываем пользователя
if (in_array($new_status, array('cancelled', 'refunded', 'failed'))) {
$user_id = $order->get_user_id();
if (!$user_id) {
return;
}
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
if (learn_press_is_course($product_id)) {
LP_User_Item::get_user_item($user_id, $product_id)->set_status('cancelled');
}
}
}
}Если подобной функции нет, добавьте её в файл functions.php вашей дочерней темы или в отдельный плагин для кастомных функций.
2. Проверка функции learn_press_is_course()
Эта функция должна возвращать true, если ID продукта связан с курсом LearnPress. Если в вашей версии LearnPress такой функции нет, можно использовать следующий код:
function learn_press_is_course($product_id) {
$post_type = get_post_type($product_id);
return $post_type === 'lp_course';
}3. Очистка кэша и повторное тестирование
После внесения изменений очистите кэш сайта и браузера, затем сделайте тестовый заказ в WooCommerce и проверьте, обновился ли статус курса в LearnPress.
Проверка результата после внедрения
Для проверки корректности работы решения:
- Создайте тестовый заказ на курс через WooCommerce и оплатите его.
- Проверьте в админке LearnPress, что для данного пользователя статус курса изменился на «Активен» (
enrolled). - Попробуйте зайти под пользователем и убедитесь, что доступ к урокам курса открыт.
- Измените статус заказа на «Отменен» или «Возвращен» и проверьте, что курс деактивирован.
Частые ошибки и способы их исправления
- Отсутствие хука
woocommerce_order_status_changed
Решение: Добавьте обработчик вfunctions.phpили в плагин с кастомными функциями. - Неверная проверка типа продукта
Решение: Используйте корректную функцию для определения курсов LearnPress, например, проверку пост-типаlp_course. - Кэширование препятствует обновлению статусов
Решение: Очистите кэш и отключите сторонние кеширующие плагины на время тестирования. - Пользователь не авторизован или ID пользователя не получен
Решение: Убедитесь, что заказы привязаны к зарегистрированным пользователям, а не гостевым. - Ошибки в PHP
Решение: Включите режим отладки и исправьте синтаксические ошибки в коде.
Практические советы по безопасности и производительности при интеграции LearnPress и WooCommerce
- Используйте проверенные версии LearnPress и WooCommerce, совместимые друг с другом.
- Не меняйте ядро плагинов, создавайте отдельные плагины для кастомных функций.
- Минимизируйте нагрузку, не вызывайте лишних запросов в функциях, обрабатывающих статусы.
- Логируйте ошибки в отдельный файл для быстрого выявления проблем.
- Регулярно обновляйте плагины и тему, чтобы избежать уязвимостей и багов.
Сравнение подходов к синхронизации статусов заказов
| Метод | Преимущества | Недостатки |
|---|---|---|
Хук woocommerce_order_status_changed с кастомным кодом | Гибкость, полное управление процессом синхронизации | Требует навыков разработки, возможны ошибки при неправильной реализации |
| Использование готовых плагинов интеграции | Простота установки, поддержка разработчиками | Может быть тяжелее, не всегда учитывает все кастомные сценарии |
| Автоматическая синхронизация через REST API | Подходит для сложных интеграций с внешними сервисами | Сложность настройки, требуется знание API и безопасности |