При переносе сайта с зарубежного хостинга заметил, что страницы грузятся очень долго, хотя сервер более свежий.
Оказалось, что при встраивании видео с YouTube через embed или через плагин ACF 7 на стороне сервера делается запрос вида
1 | https://www.youtube.com/oembed?maxwidth=640&maxheight=390&url=https%3A%2F%2Fyoutu.be%2&dnt=1&format=json |
А т.к. YouTube замедляется, то запрос падает по таймауту (5с) и отрисовка страницы идет очень долго. Удалить видео со страниц нет возможности, поэтому нужно было найти другое решение.
Просто удаление провайдеров из oembed и отключение embed_oembed_discover не помогает и если проследить по стеку вызовов — acf вызывает wp_oembed_get($url, $args), где в $args передаются только width и height. А нужно туда передать [‘discover’=> false].
Далее проследив по стеку вызовов выясняю, что нигде нет хуков, где можно было бы подменить аргумент discover, вплоть до момента самого запроса через WP_Http::request().
Благо, внутри request есть хук pre_http_request, через который можно перехватить запрос и в ответ прислать заглушку, что и решило вопрос.
Код для встраивания в код темы в файл functions.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php function catch_youtube($response, $args, $url) { if (strstr($url, "youtube")) { return [ "headers" => [], "body" => "", "response" => [ "code" => false, "message" => false, ], "cookies" => [], "http_response" => null, ]; } return $response; } add_filter("pre_http_request", "catch_youtube", 10, 3); add_filter("embed_oembed_discover", "__return_false"); |