Как отключить 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 (конкретных провайдеров)

  1. Отключаем встраивания для внутренних ссылок сайта

    Нам нужно чтобы встраивание не работало, когда мы указываем в посте ссылку на текущий сайт на отдельной строке:

    // Remove filter of the oEmbed result before any HTTP requests are made.
    remove_filter( 'pre_oembed_result', 'wp_filter_pre_oembed_result', 10 );
  2. Отключаем все неизвестные провайдеры

    Это провайдеры, которые не зарегистрированы в 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' );
  3. Отключаем известных провайдеров. Для этого используем функцию 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 );

Читайте Подробнее о безопасности.