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://site.ru/wp-json/' />
6
Danya
3.1 года назад 50
  • 1
    Kama7296

    Нужно удалить все фильтры 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 ) {
    	if ( ! empty( $result ) ) 
    		return $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 3 года назад

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

    zmoe 3 года назад

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

    Kama 3 года назад

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

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

    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 3 года назад

    Для редиректа с 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 года назад

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

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

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

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

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

    Kama 3 года назад

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

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

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

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

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

    add_action( 'template_redirect', function() {
    	if ( preg_match( '#^/wp-json/(.*)#', $_SERVER['REQUEST_URI'] ) ) {
    		wp_redirect( get_option( 'siteurl' ), 301 );
    		die();
    	}
    } );
    Комментировать
  • 0
    Evgeny Letov cайт: promoexpert.pro

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

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

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

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

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

    Kama 3 года назад

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

    Max 3 года назад

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

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

    Kama 3 года назад

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

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

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

    Mnm 2.4 года назад

    Та же история.
    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 2.8 года назад

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

    Ава 2.7 года назад

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

    Алексей 2.5 года назад

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

    Алексей 2.4 года назад

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

    Юрий 2.4 года назад

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

    aleksei1976 2.4 года назад

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

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

    Дмитрий 1.3 года назад

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

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