Диагностика проблемы: почему видео в WooCommerce доступны всем
При продаже видео через WooCommerce часто возникает задача ограничить доступ к видео только для покупателей или авторизованных пользователей. По умолчанию, если вы вставляете видео через стандартные средства WordPress или WooCommerce, прямые URL могут быть доступны любому, кто их узнает. Это снижает безопасность контента и приводит к потере дохода.
Проверка ситуации:
- Зайдите на страницу товара, купите его под тестовым аккаунтом и проверьте, можете ли вы получить прямую ссылку на видео.
- Попробуйте открыть эту ссылку в режиме инкогнито — видео не должно воспроизводиться.
Если видео воспроизводится без авторизации — защита не настроена.
Пошаговое решение: защита видео в WooCommerce с проверкой авторизации
1. Использование приватных ссылок и проверки доступа через PHP
Самый простой способ — хранить видео вне публичной директории и выдавать их через скрипт с проверкой прав пользователя.
Пример реализации:
function serve_protected_video() {
if ( ! is_user_logged_in() ) {
wp_die('Доступ запрещён: войдите в аккаунт для просмотра видео.');
}
// Получаем ID видео из параметров запроса
$video_id = isset($_GET['video_id']) ? intval($_GET['video_id']) : 0;
if ( ! $video_id ) {
wp_die('Видео не найдено.');
}
// Проверяем, купил ли пользователь товар с этим видео
$user_id = get_current_user_id();
$orders = wc_get_orders(array(
'customer_id' => $user_id,
'status' => array('completed', 'processing')
));
$has_access = false;
foreach ($orders as $order) {
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
$video_meta = get_post_meta($product_id, 'protected_video_id', true);
if ($video_meta == $video_id) {
$has_access = true;
break 2;
}
}
}
if ( ! $has_access ) {
wp_die('У вас нет доступа к этому видео.');
}
// Путь к видеофайлу на сервере
$file_path = WP_CONTENT_DIR . '/protected_videos/video_' . $video_id . '.mp4';
if ( ! file_exists($file_path) ) {
wp_die('Файл видео не найден.');
}
// Отдаём файл с правильными заголовками
header('Content-Type: video/mp4');
header('Content-Length: ' . filesize($file_path));
readfile($file_path);
exit;
}
add_action('template_redirect', function() {
if (isset($_GET['serve_video'])) {
serve_protected_video();
}
});В этом примере видео не лежит в публичной директории, а выдаётся через скрипт с проверкой заказов пользователя. Для связи товара и видео добавляем мета-поле protected_video_id.
2. Встраивание видео с защищённой ссылкой в страницу товара
На странице товара вместо прямой вставки URL видео используйте ссылку на скрипт с параметром, например:
<video controls>
<source src="<?php echo site_url('?serve_video=1&video_id=' . $video_id); ?>" type="video/mp4">
</video>Где $video_id — уникальный идентификатор видео, связанный с товаром.
Проверка результата после внедрения
- Авторизуйтесь под аккаунтом, купившим товар, откройте страницу с видео — видео должно воспроизводиться.
- Попробуйте открыть прямой URL
?serve_video=1&video_id=XXв режиме инкогнито — доступ должен быть запрещён. - Проверьте, что без параметра доступа к видео нет.
Частые ошибки и их исправление
- Видео лежит в публичной папке — любой может получить прямую ссылку. Решение: храните видео вне публичных каталогов, отдавайте через PHP.
- Проверка доступа не учитывает статус заказа — пользователь без купленного товара видит видео. Проверьте, что проверяете только статусы
completedиprocessing. - Неправильные заголовки HTTP — видео не воспроизводится или скачивается целиком. Используйте
Content-Type: video/mp4иContent-Length. - Прямая вставка ссылок на видео в редакторе — обходите защиту. Вынесите ссылки из контента и отдавайте через защитный скрипт.
Практические советы по безопасности и производительности
- Используйте
X-Accel-RedirectилиX-Sendfileчерез сервер (nginx/apache) для отдачи больших видеофайлов, чтобы снизить нагрузку PHP. - Обновляйте WooCommerce и WordPress для защиты от уязвимостей.
- Лимитируйте частоту запросов к видео для предотвращения DDoS.
- Храните видео в отдельной директории с ограничениями доступа на уровне сервера.
Сравнение способов защиты видео в WooCommerce
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Прямая ссылка в редакторе | Видео доступно по URL без ограничений | Просто реализовать | Нет защиты, доступно всем |
| Отдача через PHP с проверкой | Видео хранится вне публичных папок, доступ по проверке авторизации | Хорошая защита, гибкость | Нагрузка на сервер, настройка сложнее |
| Использование плагинов DRM | Плагины для защиты видео с DRM | Максимальная защита, готовое решение | Платно, сложность интеграции |