Как отключить oEmbed в WordPress
Для отключения oEmbed в WP можно использовать специальный плагин Disable Embeds. Но также это можно сделать кодом. Ниже рассмотрим вариант с использованием кода.
Отключим oEmbed маршрут (возможность чтобы наш сайт был поставщиком oEmbed):
WP по умолчанию добавляет в HEAD часть сайта подобные ссылки:
<link rel="alternate" type="application/json+oembed" href="https://example.com/api/oembed/1.0/embed?url=https%3A%2F%2Fexample.com%2Fhandbook%2Fcodex%2Foembed" /> <link rel="alternate" type="text/xml+oembed" href="https://example.com/api/oembed/1.0/embed?url=https%3A%2F%2Fexample.com%2Fhandbook%2Fcodex%2Foembed&format=xml" />
Они нужны, чтобы другие сайты могли определить данные встраивания.
Если этот функционал вам не нужен, то его можно полностью вырезать таким кодом:
add_action( 'init', 'wpkama_disable_embed_route', 99 ); function wpkama_disable_embed_route(){ // Remove the REST API endpoint. remove_action( 'rest_api_init', 'wp_oembed_register_route' ); // Remove oEmbed discovery links. remove_action( 'wp_head', 'wp_oembed_add_discovery_links' ); // Remove all embeds rewrite rules. add_filter( 'rewrite_rules_array', function ( $rules ){ foreach( $rules as $rule => $rewrite ){ if( false !== strpos( $rewrite, 'embed=true' ) ){ unset( $rules[$rule] ); } } return $rules; } ); }
Полностью отключаем все встраивания в контенте
Отмена этих хуков полностью отключит возможность встраивать ссылки на отдельной строке в контенте, а также работу шорткода [embed]
.
// Remove [embed] shortcode parser remove_filter( 'the_content', [ $GLOBALS['wp_embed'], 'run_shortcode' ], 8 ); remove_filter( 'widget_text_content', [ $GLOBALS['wp_embed'], 'run_shortcode' ], 8 ); // Remove embed url parser remove_filter( 'the_content', [ $GLOBALS['wp_embed'], 'autoembed' ], 8 ); remove_filter( 'widget_text_content', [ $GLOBALS['wp_embed'], 'autoembed' ], 8 );
Отключаем встраивания конкретных URL (конкретных провайдеров)
-
Отключаем встраивания для внутренних ссылок сайта
Нам нужно чтобы встраивание не работало, когда мы указываем в посте ссылку на текущий сайт на отдельной строке:
// Remove filter of the oEmbed result before any HTTP requests are made. remove_filter( 'pre_oembed_result', 'wp_filter_pre_oembed_result', 10 );
-
Отключаем все неизвестные провайдеры
Это провайдеры, которые не зарегистрированы в WP, но у них есть discovery <link> по которому WP может получить код встраивания. Например, такой ссылкой может быть ссылка на другой сайт на WordPress.
// Remove oEmbed iframes communicate JavaScript from the front-end and back-end. remove_action( 'wp_head', 'wp_oembed_add_host_js' ); // Turn off oEmbed auto discovery request for unknown URLs. add_filter( 'embed_oembed_discover', '__return_false' );
-
Отключаем известных провайдеров. Для этого используем функцию wp_oembed_remove_provider().
В этом случае нам нужно будет точно указать форматы ссылок для провайдеров которые мы хотим отключить.
add_action( 'init', 'my_remove_oembed_providers', 99 ); function my_remove_oembed_providers(){ // existing providers // print_r( _wp_oembed_get_object()->providers ); $remove_formats = [ // youtube '#https?://((m|www)\.)?youtube\.com/watch.*#i', '#https?://((m|www)\.)?youtube\.com/playlist.*#i', '#https?://youtu\.be/.*#i' ]; foreach( $remove_formats as $format ){ wp_oembed_remove_provider( $format ) } }
Ошибки, чего делать не нужно
В сети много где добавляется следующий хук для отключения провайдеров. Этого делать нельзя! Этот хук нужен для безопасности при встраивании! Он срабатывает непосредственно при встраивании, поэтому правильнее всего отключить встраивание, а не этот хук.
// Don't filter (HTML sanitize) oEmbed results. remove_filter( 'oembed_dataparse', 'wp_filter_oembed_result', 10 );
Читайте Подробнее о безопасности.