Удаление ссылок JSON API в header html
Кто-нибудь знает, как удалить ссылки WordPress JSON API в теге header?
<head>
...
<link rel='https://api.w.org/' href='http://example.com/wp-json/' />
<link rel="alternate" type="application/json+oembed" href="http://example.com/wp-json/oembed/1.0/embed?url=..." />
<link rel="alternate" type="text/xml+oembed" href="http://example.com/wp-json/oembed/1.0/embed?url=..." />
</head>
Я хотел бы избежать использования плагина. Если возможно, есть ли способ удалить их с помощью функции remove_action?
remove_action( 'wp_head', 'rsd_link' );

Я вижу в filters.php строку "add_action( 'wp_head', 'rest_output_link_wp_head', 10, 0 )", что наводит меня на мысль, что это должно помочь удалить rel='https://api.w.org/'
.
remove_action( 'wp_head', 'rest_output_link_wp_head' );
Остальное... * кашель * похоже находится в default-filters.php
remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
Чтобы удалить rest_output_link_header
remove_action( 'template_redirect', 'rest_output_link_header', 11 );
Ссылки

Попробовал все варианты, но заголовок api.w.org никуда не девается! Похоже, это больше не работает в последних версиях WordPress.

Эта кастомная функция поможет удалить все ссылки в шапке и подвале сайта - вы можете поместить её в файл functions.php
вашей активной темы:
function remove_json_api () {
// Удаляем строки REST API из HTML-шапки
remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );
remove_action( 'wp_head', 'wp_oembed_add_discovery_links', 10 );
// Удаляем конечную точку REST API
remove_action( 'rest_api_init', 'wp_oembed_register_route' );
// Отключаем авто-обнаружение oEmbed
add_filter( 'embed_oembed_discover', '__return_false' );
// Не фильтруем результаты oEmbed
remove_filter( 'oembed_dataparse', 'wp_filter_oembed_result', 10 );
// Удаляем ссылки обнаружения oEmbed
remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
// Удаляем JavaScript для oEmbed из фронтенда и бэкенда
remove_action( 'wp_head', 'wp_oembed_add_host_js' );
// Удаляем все правила перезаписи для эмбедов
add_filter( 'rewrite_rules_array', 'disable_embeds_rewrites' );
}
add_action( 'after_setup_theme', 'remove_json_api' );
Этот сниппет полностью отключает REST API и показывает следующий контент при посещении http://example.com/wp-json/
, где example.com
- доменное имя вашего сайта:
{"code":"rest_disabled","message":"The REST API is disabled on this site."}
Для отключения WordPress REST API используйте следующий сниппет:
function disable_json_api () {
// Фильтры для WP-API версии 1.x
add_filter( 'json_enabled', '__return_false' );
add_filter( 'json_jsonp_enabled', '__return_false' );
// Фильтры для WP-API версии 2.x
add_filter( 'rest_enabled', '__return_false' );
add_filter( 'rest_jsonp_enabled', '__return_false' );
}
add_action( 'after_setup_theme', 'disable_json_api' );

Нужно ли удалять wp_oembed_add_discovery_links
из заголовка дважды с разными приоритетами, или это опечатка?

Также в функции disable_json_api()
, если используется последняя версия WordPress, можно ли оставить только фильтры для версии 2.x или нужны оба?

В пользовательской функции отсутствует функция disable_embeds_rewrites
. Полный исходный код можно найти по ссылке https://github.com/swissspidy/disable-embeds/blob/master/disable-embeds.php.

@Drakes Да, ты прав. Это отсутствует, потому что код не обновлялся с момента публикации в прошлом году. Почему бы не изменить/обновить приведённый выше фрагмент, чтобы помочь другим? Это было бы полезно и удобно ;)

Я бы рекомендовал использовать плагин Disable Embeds вместо того, чтобы копировать только его часть в свой плагин или тему. Это более надёжно в долгосрочной перспективе.

Лучшее и простое решение для отключения oEmbed discovery links и wp-embed.min.js — добавить этот код в файл темы (function.php
).
remove_action( 'wp_head', 'wp_oembed_add_discovery_links', 10 );
remove_action( 'wp_head', 'wp_oembed_add_host_js' );
remove_action('rest_api_init', 'wp_oembed_register_route');
remove_filter('oembed_dataparse', 'wp_filter_oembed_result', 10);
Надеюсь, это поможет вам, так как предыдущие решения не сработали для меня в последней версии WordPress.
