Диагностика проблемы: почему не работает ограничение доступа по лицензии в WooCommerce
Частая задача для разработчиков плагинов и интернет-магазинов на WooCommerce — ограничить доступ к товарам, категориям или функциям сайта в зависимости от статуса лицензии пользователя. Проблемы возникают, когда ограничения не срабатывают или работают некорректно: например, пользователи с неактивной лицензией продолжают видеть и покупать товары, либо наоборот, доступ блокируется преждевременно.
Основные причины такой ситуации:
- Неправильная интеграция проверки лицензии с WooCommerce хуками и фильтрами.
- Кэширование страниц и объектов, в результате чего устаревший статус лицензии отображается пользователю.
- Отсутствие или некорректное обновление статуса лицензии в пользовательских метаданных.
- Ошибки в логике проверки лицензии (например, неверная проверка срока действия или количества активаций).
Как правильно ограничить доступ к товарам WooCommerce по лицензии
1. Хранение и проверка статуса лицензии пользователя
Оптимальный способ — сохранять статус лицензии в пользовательском метаполе. Например, user_meta с ключом license_status и значением active или inactive.
Пример обновления статуса лицензии при активации:
update_user_meta($user_id, 'license_status', 'active');
Для проверки статуса лицензии используйте:
$status = get_user_meta($user_id, 'license_status', true);
if ($status !== 'active') {
// запретить доступ
}
2. Ограничение доступа к товарам с помощью WooCommerce хука woocommerce_before_single_product
Добавьте проверку статуса лицензии и редирект незарегистрированных или неактивных пользователей с товарных страниц.
add_action('woocommerce_before_single_product', function() {
if (!is_user_logged_in()) {
wp_redirect(wp_login_url(get_permalink()));
exit;
}
$user_id = get_current_user_id();
$license_status = get_user_meta($user_id, 'license_status', true);
if ($license_status !== 'active') {
wp_die('Доступ к этому товару ограничен. Пожалуйста, активируйте лицензию.');
}
});
3. Запрет добавления в корзину для пользователей без активной лицензии
Чтобы дополнительно защитить процесс покупки, запретите добавление товаров в корзину при неактивной лицензии:
add_filter('woocommerce_add_to_cart_validation', function($passed, $product_id) {
if (!is_user_logged_in()) {
return false;
}
$user_id = get_current_user_id();
$license_status = get_user_meta($user_id, 'license_status', true);
if ($license_status !== 'active') {
wc_add_notice('Для покупки этого товара необходимо иметь активную лицензию.', 'error');
return false;
}
return $passed;
}, 10, 2);
Проверка результата после внедрения
- Войдите на сайт под пользователем с активной лицензией — доступ к товарам и покупка должны работать без ошибок.
- Войдите под пользователем без лицензии или с неактивной лицензией — товары должны быть недоступны, а при попытке добавления в корзину должна появляться ошибка.
- Проверьте поведение для незарегистрированных пользователей — должен быть редирект на страницу входа.
- Отключите кэширование страниц (например, через плагины или сервер) и убедитесь, что изменения статуса лицензии моментально влияют на доступ.
Частые ошибки и способы их устранения
- Ошибка: Статус лицензии не обновляется или сохраняется некорректно.
Решение: Проверьте, чтоupdate_user_metaвызывается с правильным ID пользователя и корректным значением. Добавьте логирование для отладки. - Ошибка: Кэширование страниц мешает обновлению доступа.
Решение: Настройте исключения в плагинах кэширования (например, WP Super Cache, W3 Total Cache) для страниц WooCommerce и личного кабинета. - Ошибка: Пользователи продолжают видеть товары после деактивации лицензии.
Решение: Проверьте логику проверки лицензии и убедитесь, что статус действительно меняется наinactive. Добавьте проверку на все места, где выводится товар. - Ошибка: Ошибки PHP при использовании хуков.
Решение: Используйте отладчик и проверяйте, что все функции вызываются корректно и без конфликтов с другими плагинами.
Практические советы по безопасности и производительности
- Используйте nonce и проверку прав доступа при изменении лицензий через формы или API.
- Минимизируйте количество запросов к базе данных, кешируя статус лицензии в пользовательских сессиях или transient API с небольшим временем жизни.
- Избегайте хранения чувствительных данных лицензий в открытом виде — используйте хеширование или шифрование.
- Для крупных проектов с большим количеством пользователей рассмотрите использование сторонних лицензионных серверов и API вызовов с кэшированием.
Сравнение вариантов реализации ограничения доступа по лицензии в WooCommerce
| Метод | Преимущества | Недостатки |
|---|---|---|
| Хранение статуса в user_meta + хуки WooCommerce | Простота реализации, гибкость, интеграция с WP и WooCommerce | Зависимость от кэширования, возможны задержки обновления |
| Использование стороннего лицензионного сервера и REST API | Централизованное управление, масштабируемость, безопасность | Сложность настройки, задержки при обращении к внешнему сервису |
| Плагины для ограничения доступа (например, MemberPress, Restrict Content Pro) | Готовое решение, поддержка, расширенные возможности | Платные, возможна избыточность, зависят от стороннего кода |