Проблема: отсутствие миниатюр видео в карточках товаров WooCommerce
В WooCommerce стандартно нет автоматической поддержки установки миниатюр (thumbnail) для видео, добавленных в описание или галерею товара. Это приводит к пустым или неинформативным изображениям в каталоге, ухудшая UX и конверсию. Решение — автоматически генерировать и назначать миниатюры видео как изображения товара.
Диагностика проблемы
Чтобы проверить, что миниатюры видео не установлены или не работают:
- Откройте карточку товара в админке WooCommerce.
- Проверьте, есть ли установленное изображение товара (featured image).
- Если видео вставлено в описание или галерею, но нет миниатюры, значит автоматического создания нет.
- Проверьте, не конфликтует ли тема или плагины с установкой миниатюр.
Пошаговое решение: автоматическая установка миниатюр видео в WooCommerce
1. Используем PHP-библиотеку ffmpeg для создания скриншота из видео
Для извлечения кадра из видео на сервере нам потребуется ffmpeg, установленный на хостинге. Проверить наличие можно командой ffmpeg -version в SSH.
2. Добавляем код обработки загрузки видео и создания миниатюры
В functions.php вашей темы или в кастомном плагине добавьте следующий код:
function wpvideo_set_video_thumbnail_woocommerce($post_id) {
// Проверяем, что это продукт WooCommerce
if (get_post_type($post_id) !== 'product') return;
// Получаем URL видео из произвольного поля (например, 'product_video_url')
$video_url = get_post_meta($post_id, 'product_video_url', true);
if (!$video_url) return;
// Путь к временной папке для скачивания видео
$upload_dir = wp_upload_dir();
$temp_video_path = $upload_dir['basedir'] . '/temp_video_' . $post_id . '.mp4';
// Скачиваем видео локально
$video_data = wp_remote_get($video_url);
if (is_wp_error($video_data)) return;
file_put_contents($temp_video_path, wp_remote_retrieve_body($video_data));
// Путь для миниатюры
$thumbnail_path = $upload_dir['basedir'] . '/video_thumbnail_' . $post_id . '.jpg';
// Формируем команду ffmpeg для создания кадра на 3 секунде
$cmd = "ffmpeg -ss 00:00:03 -i " . escapeshellarg($temp_video_path) . " -frames:v 1 -q:v 2 " . escapeshellarg($thumbnail_path);
exec($cmd);
// Проверяем, создан ли файл миниатюры
if (!file_exists($thumbnail_path)) {
@unlink($temp_video_path);
return;
}
// Импортируем миниатюру в медиабиблиотеку
$filetype = wp_check_filetype(basename($thumbnail_path), null);
$attachment = array(
'post_mime_type' => $filetype['type'],
'post_title' => 'Video thumbnail ' . $post_id,
'post_content' => '',
'post_status' => 'inherit'
);
$attach_id = wp_insert_attachment($attachment, $thumbnail_path, $post_id);
require_once(ABSPATH . 'wp-admin/includes/image.php');
$attach_data = wp_generate_attachment_metadata($attach_id, $thumbnail_path);
wp_update_attachment_metadata($attach_id, $attach_data);
// Устанавливаем миниатюру товара
set_post_thumbnail($post_id, $attach_id);
// Удаляем временный видеофайл
@unlink($temp_video_path);
}
// Хук на сохранение товара
add_action('save_post_product', 'wpvideo_set_video_thumbnail_woocommerce');3. Как использовать
Добавьте в карточку товара метаполе с ключом product_video_url и укажите прямую ссылку на видео (mp4). При сохранении товара миниатюра будет создана и автоматически назначена.
Проверка результата после внедрения
- Создайте или отредактируйте товар, добавьте ссылку на видео в метаполе
product_video_url. - Сохраните товар.
- Перейдите в каталог WooCommerce — миниатюра товара должна отображаться как кадр из видео.
- Если миниатюра не появилась — проверьте логи ошибок сервера и права на запись в папке uploads.
Частые ошибки и как их исправить
- ffmpeg не установлен или недоступен: Выдаёт ошибку выполнения команды
exec. Решение — уточните у хостера возможность установки ffmpeg или используйте сторонние сервисы для скриншотов. - Видео недоступно по ссылке: Ошибка скачивания видео. Проверьте, что ссылка ведёт напрямую к видеофайлу (mp4), а не к странице с плеером.
- Нет прав на запись в папку uploads: Миниатюра не сохраняется. Установите права 755 для папки
wp-content/uploadsи вложенных папок. - Миниатюра не устанавливается: Проверьте, что функция
set_post_thumbnailвызывается с корректным ID вложения.
Практические советы по безопасности и производительности
- Не храните видео локально на сервере — скачивайте временно и удаляйте сразу после создания миниатюры.
- Ограничьте размер видео для обработки (например, не более 50 Мб) во избежание перегрузки сервера.
- Используйте
execосторожно — убедитесь, что параметры команды экранированы черезescapeshellarg. - Для повышения производительности можно добавить очередь обработки видео через WP-Cron вместо синхронного выполнения при сохранении товара.
Сравнение вариантов автоматической установки миниатюр видео
| Метод | Плагин | Код | Компромисс |
|---|---|---|---|
| ffmpeg на сервере | Нет стандартного плагина | Требует настройки сервера, гибкий | Зависит от хостинга, требует ресурсов |
| Сторонний API (например, YouTube API) | Плагины для YouTube | Простая реализация для YouTube | Зависимость от внешнего сервиса, ограниченный контент |
| Ручная загрузка миниатюр | Любой плагин галереи | Простая, но требует времени | Нет автоматизации, человеческий фактор |