Выпиливаем интеграцию Ютуб

Выпиливаем интеграцию Ютуб

В свете последних блокировок, включая популярный Юутб в веб-интеграциях на различных сайтах, которые я создавал и создаю, приходится делать дополнительные конструкции, чтобы выпиливать эти интеграции из исходного кода окольными путями) Результатом является — ускоренная загрузка сайта, без бесконечной попытки что-то там подгрузить.)))

Особенность задачи состоит в том, что в теме-шаблоне сайта используется плагин jQuery.tubular (строка $.fn.tubular). Этот плагин предназначен для создания фонового видео из YouTube на всю страницу. Он жёстко прописывает загрузку //www.youtube.com/iframe_api прямо внутри себя. Поскольку мы работаем через дочернюю тему, самым элегантным и правильным решением будет «обмануть» этот скрипт. Мы заблокируем реальный запрос к YouTube, но создадим в памяти браузера виртуальную «заглушку» плеера. Тогда плагин tubular подумает, что всё в порядке, не выдаст ошибок и сайт загрузится мгновенно.

Вот основные тезисы результата рабочего процесса:

  • Внедрение заглушки YouTube API до загрузки основного скрипта;
  • Создаем фальшивый объект YouTube API, чтобы плагин tubular не выдавал ошибок;
  • Перехватываем создание элемента скрипта YouTube и блокируем его запрос;
  • Если скрипт пытается загрузить YouTube, подменяем ссылку на пустую заглушку;
  • Имитируем успешную загрузку для зависимых скриптов темы;
  • Подключаем этот перехватчик в самый верх страницы (в <head>) раньше всех остальных скриптов;
  • Готово!

Рабочий код

Добавляем в файл functions.php дочерней темы следующий код:

// Внедрение заглушки YouTube API до загрузки основного скрипта
function inject_youtube_api_mock() {
    ?>
    <script>
    // Создаем фальшивый объект YouTube API, чтобы плагин tubular не выдавал ошибок
    window.YT = window.YT || {};
    window.YT.Player = window.YT.Player || function() {
        return {
            playVideo: function() {},
            pauseVideo: function() {},
            stopVideo: function() {},
            destroy: function() {}
        };
    };
    // Перехватываем создание элемента скрипта YouTube и блокируем его запрос
    const originalCreateElement = document.createElement;
    document.createElement = function(tagName) {
        const element = originalCreateElement.call(document, tagName);
        if (tagName.toLowerCase() === 'script') {
            Object.defineProperty(element, 'src', {
                set: function(value) {
                    if (value && value.indexOf('youtube.com/iframe_api') !== -1) {
                        // Если скрипт пытается загрузить YouTube, подменяем ссылку на пустую заглушку
                        this.setAttribute('data-blocked-yt', value);
                        value = 'data:text/javascript,console.log("YouTube API blocked for speed");';
                        // Имитируем успешную загрузку для зависимых скриптов темы
                        setTimeout(() => {
                            if (typeof window.onYouTubeIframeAPIReady === 'function') {
                                window.onYouTubeIframeAPIReady();
                            }
                        }, 50);
                    }
                    this.setAttribute('src', value);
                },
                get: function() {
                    return this.getAttribute('src');
                }
            });
        }
        return element;
    };
    </script>
    <?php
}
// Подключаем этот перехватчик в самый верх страницы (в <head>) раньше всех остальных скриптов
add_action('wp_head', 'inject_youtube_api_mock', 1);

Что делает этот код:

  1. Он внедряется в самый верх сайта (wp_head с приоритетом 1) и начинает «слушать» браузер.
  2. Как только скрипт плагина tubular пытается создать тег < script src="//www.youtube.com/iframe_api" >, наш перехватчик мгновенно ловит этот запрос и меняет адрес на безопасную пустую строку (data:text/javascript...).
  3. Браузер вообще не отправляет запрос к серверам YouTube, поэтому ошибкаnet::ERR_CONNECTION_RESET в консоли браузера полностью исчезает.
  4. Спустя 0.05 секунды код сам даёт команду сайту: «Всё готово, якобы загрузились!», чтобы плагин tubular не завис в ожидании, а сайт продолжил работу.

После сохранения файла обязательно сбросьте кэш в вашем плагине оптимизации/кэширования WordPress.
5/5 (1 отзыв)
Поделитесь постом

Начните вводить текст и нажмите Enter для поиска.

Корзина