WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

Как полностью отключить 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
9 декабря 2015 50
  • 1
    Kama7729

    Нужно удалить все фильтры 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 );
    
    	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;
    });
    zmoe 14 Янв. 2016

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

    zmoe 14 Янв. 2016

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

    Kama 14 Янв. 2016

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

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

    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 2 Фев. 2016

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

    add_action( 'template_redirect', function() {
    	if ( preg_match( '#^/wp-json/?$#i', $_SERVER['REQUEST_URI'] ) ) {
    		wp_redirect( get_option( 'siteurl' ), 301 );
    		die();
    	}
    } );
    Роман 3 Фев. 2016

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

    Денис 3 Фев. 2016

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

    Иван 5 Фев. 2016

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

    Kama 5 Фев. 2016

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

    <script type="text/javascript">alert('foo');</script>
    Vladimir 21 Фев. 2016

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

    Даниил 26 Мар. 2016

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

    add_action( 'template_redirect', function() {
    	if ( preg_match( '#^/wp-json/(.*)#', $_SERVER['REQUEST_URI'] ) ) {
    		wp_redirect( get_option( 'siteurl' ), 301 );
    		die();
    	}
    } );
    ST 5 Мар. 2019

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

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

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

    Комментировать
  • 0
    campusboy3532 www.youtube.com/c/wpplus

    Ребят, а зачем вообще WP по умолчанию стал выводить эту ерунду? Я думал эта фишка для разработчиков, зачем её сувать везде sad дубли плодит теперь на сайтах.

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

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

    Kama 8 Фев. 2016

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

    Max 9 Фев. 2016

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

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

    Kama 9 Фев. 2016

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

    Алекс 10 Фев. 2016

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

    Mnm 14 Сен. 2016

    Та же история.
    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 22 Мар. 2016

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

    Ава 15 Май. 2016

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

    Алексей 8 Июл. 2016

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

    Алексей 26 Авг. 2016

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

    Юрий 12 Сен. 2016

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

    aleksei1976 15 Сен. 2016

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

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

    Дмитрий 4 Окт. 2017

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

    Cиречь 5 Фев. 2020

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

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

    У меня с этими кодами ничего не получается.

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