Диагностика проблемы: зачем ограничивать видео в WooCommerce
В интернет-магазинах на WordPress с WooCommerce часто возникает задача ограничить доступ к видео-контенту только для авторизованных пользователей. Это особенно актуально, если видео — это часть товара (например, обучающие курсы, инструкции, демонстрации), и вы хотите защитить контент от бесплатного распространения.
Проблема появляется, когда видео встроено в описания товаров или на странице товара через шорткоды или HTML-вставки — любой посетитель может просмотреть или скопировать ссылку, если доступ не ограничен.
Как определить, что видео не защищено
- Видео доступно и воспроизводится без входа на сайт.
- URL видео можно получить из исходного кода страницы.
- Пользователи без авторизации способны видеть видео в описаниях товаров.
Пошаговое решение: запретить вывод видео для гостей в WooCommerce
1. Добавление проверки авторизации вокруг видео
Самый надежный способ — обернуть видео-контент в условие, которое проверит, залогинен ли пользователь. Если нет — показать сообщение с предложением войти или зарегистрироваться.
function restrict_video_for_guests($content) {
if (is_product()) { // только на страницах товаров
if (!is_user_logged_in()) {
// Ищем видео-теги и заменяем их на сообщение
$content = preg_replace('/<iframe.*?<\/iframe>|<video.*?<\/video>/is',
'<p>Видео доступно только для зарегистрированных пользователей. Пожалуйста, <a href="'.wp_login_url(get_permalink()).'">войдите</a> или <a href="'.wp_registration_url().'">зарегистрируйтесь</a>.</p>', $content);
}
}
return $content;
}
add_filter('the_content', 'restrict_video_for_guests', 20);2. Запрет на прямой доступ к видеофайлам (если видео хранится локально)
Если видео загружено на сервер, стоит ограничить прямой доступ к файлам через .htaccess или правила сервера. Например, в .htaccess можно добавить:
# Запретить прямой доступ к видеофайлам для неавторизованных
<FilesMatch "\.(mp4|webm|ogg)$">
RewriteEngine On
RewriteCond %{HTTP_COOKIE} !wordpress_logged_in_
RewriteRule .* - [F]
</FilesMatch>Этот код блокирует доступ к видеофайлам, если HTTP_COOKIE не содержит куки авторизации WordPress.
3. Использование плагинов для защиты видео (альтернативный вариант)
Если не хочется писать код, можно использовать плагины для защиты видео, например, OmniVideo, который поддерживает ограничение по ролям пользователей.
Проверка результата после внедрения
- Откройте страницу товара в режиме инкогнито или из браузера, где не выполнен вход — видео должно быть заменено на сообщение с предложением авторизации.
- Войдите под учетной записью — видео должно отображаться корректно.
- Попробуйте напрямую перейти по URL видеофайла (если локальное хранение) — должен быть отказ в доступе (403 ошибка).
Частые ошибки и как их исправить
- Видео не скрывается для гостей. Причина: фильтр
the_contentсрабатывает слишком рано или поздно, либо видео вставлено не через контент (например, отдельным плеером в шаблоне). Решение: убедитесь, что фильтр подключен с приоритетом 20 или выше и проверьте, как выводится видео. - Появляется ошибка регулярного выражения в preg_replace. Причина: сложный HTML видео, вложенные теги. Решение: используйте более точные парсеры, например, DOMDocument, или плагин с готовыми решениями.
- Прямой доступ к видеофайлам не блокируется. Причина: сервер не поддерживает .htaccess или правило не корректно. Решение: настройте серверные правила (nginx, Apache) или перенесите видео в защищенное облако.
Практические советы по безопасности и производительности
- Не храните видеофайлы в общедоступных папках без ограничений доступа.
- Используйте CDN с поддержкой токенов доступа для видео, чтобы ограничить время доступа.
- При большом количестве товаров и видео обрабатывайте вывод через кеширование, но не кешируйте страницы для незалогиненных пользователей, чтобы не показывать видео случайно.
- Для защиты можно использовать временные ссылки на видео (signed URLs), если видео хранится на внешних сервисах.
Сравнение вариантов ограничения видео в WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
| PHP-фильтр the_content с проверкой is_user_logged_in() | Легко реализовать, гибко настраивается | Не работает, если видео выводится вне контента |
| Серверные правила в .htaccess | Надежно блокирует прямой доступ | Сложно настроить, зависит от сервера |
| Плагины защиты видео (например, OmniVideo) | Полноценные функции, удобный интерфейс | Зависимость от стороннего софта, возможны накладные расходы |