Является ли замена iframe ютуб ролика на lite-youtube таким кодом оптимальной?

Ссылка скопирована
1 ответ

Добрый день! Имеется сайт с высокой посещаемостью на Wordpress, на нем есть блоки с iframe вставкой из ютуб в следствии чего base.js подтягивается очень долго (если на десктопах это еще не так заметно, то на моб девайсах это очень сильно садит производительность)
Нашел решение в интернете через lite-youtube Поясняющий ролик по lite youtube
Далее через str_replace и preg_match хочу проходится по сайту и изменять старый iframe на новый
spoilerКод замены

function replace_video_shortcode($content) {     // Паттерн для проверки наличия кода iframe     $pattern = '/<iframe.*src="https://www.youtube.com/embed/([^"]+)".*</iframe>/';          // Ищем совпадения с паттерном в тексте контента     preg_match_all($pattern, $content, $matches);      // Если найдены совпадения     if ($matches) {         // Проходим по каждому совпадению         foreach ($matches[0] as $match) {             // Извлекаем id видео из совпадения             preg_match($pattern, $match, $video_id);                          // Генерируем новый код для замены             $replacement = '<lite-youtube videoid="' . $video_id[1] . '" params="controls=1"></lite-youtube>';                          // Заменяем найденный код на новый код             $content = str_replace($match, $replacement, $content);         }     }          return $content; } add_filter('the_content', 'replace_video_shortcode');

function replace_video_shortcode($content) { // Паттерн для проверки наличия кода iframe $pattern = '/<iframe.*src="https://www.youtube.com/embed/([^"]+)".*</iframe>/'; // Ищем совпадения с паттерном в тексте контента preg_match_all($pattern, $content, $matches); // Если найдены совпадения if ($matches) { // Проходим по каждому совпадению foreach ($matches[0] as $match) { // Извлекаем id видео из совпадения preg_match($pattern, $match, $video_id); // Генерируем новый код для замены $replacement = '<lite-youtube videoid="' . $video_id[1] . '" params="controls=1"></lite-youtube>'; // Заменяем найденный код на новый код $content = str_replace($match, $replacement, $content); } } return $content; } add_filter('the_content', 'replace_video_shortcode');

Является ли это разумным и оптимизированным решением ?

Дополнительно:

Является ли замена iframe ютуб ролика на lite-youtube таким кодом оптимальной?

Цикл можно оптимизировать:

foreach($matches[1] as $index => $video_id) {     $replacement = '<lite-youtube videoid="' . $video_id . '" params="controls=1"></lite-youtube>';     $content = str_replace($matches[0][$index], $replacement, $content); }

foreach($matches[1] as $index => $video_id) { $replacement = '<lite-youtube videoid="' . $video_id . '" params="controls=1"></lite-youtube>'; $content = str_replace($matches[0][$index], $replacement, $content); }

А существует ли вообще matches?
if(!empty($matches[0]))
Если src не идет первым во фрейме, то Ваша регулярка не сработает, можно сделать так:

'/<iframe[^>]*src="https://www.youtube.com/embed/([^?"]+)(?[^"]*)?"[^>]*></iframe>/';

'/<iframe[^>]*src="https://www.youtube.com/embed/([^?"]+)(?[^"]*)?"[^>]*></iframe>/';

Ответы:

Возможно я не верно понял, что требуется, но как я понимаю, то есть решение без библиотек. Посмотри, может это оно, от вадика макеева ссыль

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Мария Код Ответ

Замена обычного iframe YouTube на lite-youtube — нормальная идея для PageSpeed, потому что настоящий iframe YouTube тянет много JS, cookies и сетевых запросов. Но делать это грубой регуляркой по всему контенту рискованно: можно сломать нестандартные iframe, Gutenberg-блоки, параметры видео и адаптивность.

Оптимальный вариант — подключить web component один раз и выводить контролируемую разметку:

<lite-youtube videoid="dQw4w9WgXcQ" playlabel="Смотреть видео"></lite-youtube>

<lite-youtube videoid="dQw4w9WgXcQ" playlabel="Смотреть видео"></lite-youtube>

Если нужно преобразовывать старые iframe, регулярку лучше ограничить только доменами YouTube и аккуратно доставать ID видео. На уровне WordPress это можно сделать через фильтр the_content, но с проверками:

add_filter('the_content', function ($content) {
    return preg_replace_callback(
        '~<iframe[^&gt]+src=["']https?://www.youtube.com/embed/([^"'?]+)[^"']*["'][sS]*?</iframe>~i',
        function ($m) {
            $id = sanitize_text_field($m[1]);
            return '<lite-youtube videoid="' . esc_attr($id) . '" playlabel="Смотреть видео"></lite-youtube>';
        },
        $content
    );
});

add_filter('the_content', function ($content) { return preg_replace_callback( '~<iframe[^&gt]+src=["']https?://www.youtube.com/embed/([^"'?]+)[^"']*["'][sS]*?</iframe>~i', function ($m) { $id = sanitize_text_field($m[1]); return '<lite-youtube videoid="' . esc_attr($id) . '" playlabel="Смотреть видео"></lite-youtube>'; }, $content ); });

Не забудьте подключить JS/CSS компонента и проверить CLS: у блока должен быть задан aspect-ratio, например 16/9. Для SEO и доступности добавьте понятный playlabel. Если видео критично для контента, можно оставить ссылку на YouTube внутри noscript.

Также важно не загружать скрипт компонента на всех страницах сайта, если видео есть только в отдельных статьях. Подключайте его условно: по наличию shortcode, блока или маркера в контенте. Это сохранит выигрыш по скорости.

После замены проверьте не только Lighthouse, но и реальное поведение: клик запускает видео, полноэкранный режим работает, на мобильном нет горизонтального скролла, а в Safari/Firefox нет ошибок в консоли. Иначе получится красивая оптимизация в отчёте, но неудобный блок для пользователя.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно