WordPress как на ладони

Как полностью отключить REST API введенный в WP 4.4?

В WordPress 4.4. ввели новый API REST.

Толком не знаю зачем он нужен. Вроде для того, чтобы можно было получать содержимое сайта из вне в виде json.

В общем, вопрос такой.

Как его отключить? Желательно чтобы он вообще не работал. А конкретно, нужно удалить из <head> html сайта эту строку:

<link rel='https://api.w.org/' href='http://example.com/wp-json/' />
6
Danya
6.5 лет назад 50
  • 1
    Kama8764

    Нужно удалить все фильтры REST API и отключить сам API. Для этого поместите следующий код в файл functions.php:

    if( 'Disable REST API' ){
    
    	// Отключаем сам REST API
    	add_filter( 'rest_enabled', '__return_false' );
    
    	// Отключаем фильтры REST API
    	remove_action( 'xmlrpc_rsd_apis',            'rest_output_rsd' );
    	remove_action( 'wp_head',                    'rest_output_link_wp_head', 10 );
    	remove_action( 'template_redirect',          'rest_output_link_header', 11 );
    
    	remove_action( 'auth_cookie_malformed',      'rest_cookie_collect_status' );
    	remove_action( 'auth_cookie_expired',        'rest_cookie_collect_status' );
    	remove_action( 'auth_cookie_bad_username',   'rest_cookie_collect_status' );
    	remove_action( 'auth_cookie_bad_hash',       'rest_cookie_collect_status' );
    	remove_action( 'auth_cookie_valid',          'rest_cookie_collect_status' );
    	remove_filter( 'rest_authentication_errors', 'rest_cookie_check_errors', 100 );
    
    	// Отключаем события REST API
    	remove_action( 'init',          'rest_api_init' );
    	remove_action( 'rest_api_init', 'rest_api_default_filters', 10 );
    	remove_action( 'parse_request', 'rest_api_loaded' );
    
    	// Отключаем Embeds связанные с REST API
    	//remove_action( 'rest_api_init',          'wp_oembed_register_route'           );
    	//remove_filter( 'rest_pre_serve_request', '_oembed_rest_pre_serve_request', 10 );
    
    	// oembed scripts
    	//remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
    	//remove_action( 'wp_head', 'wp_oembed_add_host_js'         );
    }
    

    Фильтры хранятся в этом файле: http://wp-kama.ru/filecode/wp-includes/default-filters.php#L211

    П.С. Еще есть плагин для отключения REST API: https://wordpress.org/plugins/disable-json-api/

    А также, есть плагин по этой же теме, который отключает возможность встраивать ваши записи на другом блоге - oembed. Называется Disable Embeds. Некоторые строки из отключения oembed используются в коде выше, потому что они косвенно связаны с REST API.

    Отключать REST API не рекомендуется!

    REST API используется в админке WordPress, поэтому отключать его опасно!

    Но можно закрыть все REST запросы (даже публичные) для неавторизованных пользователей:

    add_filter( 'rest_authentication_errors', function( $result ) {
    
    	// maybe authentication error already set
    	if ( empty( $result ) ){
    		if ( ! is_user_logged_in() ) 
    			return new WP_Error( 'rest_not_logged_in', 'You are not currently logged in.', array( 'status' => 401 ) );
    	}
    
    	return $result;
    });

    Подробнее про отключение REST от публичного доступа.

    zmoe 6.4 года назад

    Вот спасибо, помогли. Только я не понял, почему это появилось у меня только на одном сайте, на остальных такого нет, версия вордпресс одна?

    zmoe 6.4 года назад

    Написал тоже об этом статью, но кроме этого кода нужно вставить еще несколько строк, чтобы удалились ссылки на эти разделы http://zmoe.ru/wp-json/.

    Kama 6.4 года назад

    Про какие несколько строк идет речь?

    Про эту строку?

    remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );

    Похоже её тоже нужно включить в этот список. У себя на сайте я её отключил сразу, но почему-то я думал что она не связана с rest api, сейчас посмотрел - связана...

    И есть еще такой скрипт, но это чтобы сайт мог отображать выводимые через rest блоки с других сайтов. В принципе и его можно отключить...

    remove_action( 'wp_head',                'wp_oembed_add_host_js'                 );

    Спасибо за коммент, дополнил код, еще одной строкой. Ну WP конечно дал... Галку в настройках поставили бы хоть что ли для отключения REST API.

    WPShop 6.4 года назад

    Для редиректа с http://example.com/wp-json/ на главную, добавьте:

    add_action( 'template_redirect', function() {
    	if ( preg_match( '#^/wp-json/?$#i', $_SERVER['REQUEST_URI'] ) ) {
    		wp_redirect( get_option( 'siteurl' ), 301 );
    		die();
    	}
    } );
    Роман 6.4 года назад

    Спасибо автору сайта, спасибо также zmoe со странным сайтом, где не видно комментариев, а вместо них предлагают поиграть в игру в браузере.

    Денис 6.4 года назад

    Спасибо блогеру "Kama". Можно ещё поинтересоваться за следующее... на главной так и остался непонятный скрипт, где встречается этот самый json

    Иван 6.3 года назад

    также интересует этот вопрос

    Kama 6.3 года назад

    Это никак не связано с REST API! Тут у вас показано что тип данных в json формате... Как если писать

    <script type="text/javascript">alert('foo');</script>
    Vladimir 6.3 года назад

    Коллеги, так у кого получилось убрать этого зверя (ld+json) из скрипта плагина Yoast SEO? Поделитесь опытом, а то в вебмастере дубли продолжают плодиться.

    Даниил 6.2 года назад

    Более полная версия редиректа, перенаправляет еще и все вложенные директории, мне кажется имеет смысл добавить в основную тему.

    add_action( 'template_redirect', function() {
    	if ( preg_match( '#^/wp-json/(.*)#', $_SERVER['REQUEST_URI'] ) ) {
    		wp_redirect( get_option( 'siteurl' ), 301 );
    		die();
    	}
    } );
    ST 3.3 года назад

    Проверил на новом WP 5.1 вышеприведённый код редиректа wp-json на главную. Не работает.

    Комментировать
  • 0
    Evgeny Letov promoexpert.pro

    Плагин disable-json-api не работает — не удаляет строки. Ваши инструкции сработали

    Комментировать
  • 0

    Подскажите пожалуйста. Вставил указанный код но редиректа с этих страниц не идет, а попадает на 404 ошибку (страница не найдена). В чем может быть дело?

    Kama 6.3 года назад

    Зачем вам нужен редирект? Кто на эти страницы заходит?..

    Max 6.3 года назад

    Я подумал сто одним из критериев правильной работы решения указанного выше является редирек. Если нет, то редирект не нужен.

    Тогда еще один вопрос. В вебмастере>"структура сайта" теперь имеется раздел wp-json/. Я так понимаю он должен пропасть после очередного посещения роботом?

    Kama 6.3 года назад

    Да, конечно пропадет, 404 же отдается...

    Алекс 6.3 года назад

    Вставил код, но 404 не отдает. На месте того контента что выдавали эти страницы стал выводиться контент с главной, но ответ сервера 200, т.е. не 404 и не 301. Подскажите, как можно сделать чтобы на месте этих страниц выдавалась 404 ошибка?

    Mnm 5.7 лет назад

    Та же история.
    Kama, подскажите куда копать?
    Страницы с бредокодом исчезла, но открывается
    http://site.com/?url=http%3A%2F%2Fsite.com%2Fcategory%2nazvanie-staty%2F&format=xml , а на ней дублируется главная страница. Ответ сервера 200ok.

    Комментировать
  • 0

    Подскажите как должно быть?
    1.Без добавления кода вебмастер говорит, что загружено 18 страниц wp-json/ но их нет в индексе, страницы находятся в разделе исключенные. При переходе на эти страницы выдает код.

    2.При добавлении указаного в статье кода. Страница направляет на главную, но в адресной строке остается путь к домен/wp-json/

    abalak 6.2 года назад

    У меня такая же проблема. Вы как-то её решили?

    Ава 6 лет назад

    Ребята помогите мне устранить это проблема у меня никак не получается. За ране спасибо

    Алексей 5.9 лет назад

    Виктор, этим способом вы боритесь с последствиями, а не с причиной.

    Алексей 5.8 лет назад

    А куда лайк то поставить, за ценные советы?

    Юрий 5.7 лет назад

    То же самое. Не редиректит на главнуа, а отображает контент главной. Получается, что создаются дубли главной страницы.

    aleksei1976 5.7 лет назад

    При добавлении указаного в статье кода. Страница направляет на главную, но в адресной строке остается путь к домен/wp-json/

    То же самое, кто нибудь нашел выход?

    Дмитрий 4.6 лет назад

    Я создал папку /wp-json Закинул туда .htaccess файл с содержимым
    Deny from all
    и вроде норм

    Cиречь 2.3 года назад

    умничка. просто элегантно обойти виртуальный урл подсунув реальный файл

    Комментировать
  • 0

    Kama, здравствуйте! У меня стоит последняя версия WP 5.7.2. И использую в functions.php команды из вышеприведенной инструкции:

    • Закрытие всех REST запросов для неавторизованных пользователей
    • Отключение REST API фильтры/события/Embeds/oembed scripts

    Но в таком случае не работает плагин "All in One SEO" (свежая версия), которому нужен REST API. Он будет работать, если убрать строчки кода, отвечающие за:

    • Отключение REST API фильтров/событий/Embeds/oembed scripts

    Вопрос: Насколько сейчас актуальны вот эти команды - отключение REST API фильтров/событий/Embeds/oembed scripts ? Или достаточно оставить команду - Закрытие всех REST запросов для неавторизованных пользователей?

    Kama год назад

    Embeds и скрипты вообще не обязательно отключать!

    Комментировать
  • 0

    Здравствуйте. Можете помочь советом?
    У меня на сайте WP включен JSON REST API. И вот последнее время появилась такая проблема. При работе в редакторе WP процессор хостинга загружается на 100%. В отчете нагрузки куча запросов GET типа /сайт/wp-json/wp/v2/media/15317?context=edit&_locale=user, где цифра как я понял - это номер картинки, которая в статье. если в статье много картинок, то вот и запросов много, и каждый запрос висит по 30-40 секунд.
    Не смог поиском найти от чего это может быть и почему формируется такой запрос. И главное - как это исправить? Буду очень благодарен за совет!

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация