Як вимкнути oEmbed у WordPress

Для відключення oEmbed у WP можна використовувати спеціальний плагін Disable Embeds . Але також це можна зробити кодом. Нижче розглянемо варіант із використанням коду.


Відключимо oEmbed маршрут (можливість, щоб наш сайт був постачальником oEmbed):

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;
	} );
}


Повністю відключаємо всі вбудовування у контенті

Скасування цих хуків повністю відключить можливість вбудовувати посилання на окремому рядку в контенті, а також роботу шорткоду .

// Remove  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 з 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 )
    	}
    
    }


Помилки, що робити не потрібно

У мережі багато де додається наступний хук для відключення провайдерів. Цього робити не можна! Цей хук потрібний для безпеки під час вбудовування! Він спрацьовує безпосередньо при вбудовуванні, тому правильніше відключити вбудовування, а не цей хук.

// Не фільтрує (HTML sanitize) oEmbed results.
remove_filter( 'oembed_dataparse', 'wp_filter_oembed_result', 10);

Читайте Детальніше про безпеку .

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *