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

Как полностью отключить 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/' />
5
Danya50 1.7 года назад
  • 1
    Kama4486

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

    // Отключаем сам 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, 0 );
    remove_action( 'template_redirect',          'rest_output_link_header', 11, 0 );
    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, 1 );
    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, 4 );
    
    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...

    zmoe 1.6 года назад

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

    zmoe 1.6 года назад

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

    Kama 1.6 года назад

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

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

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

    Для редиректа с 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();
    	}
    } );
    Роман 1.5 года назад

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

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

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

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

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

    Kama 1.5 года назад

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

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

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

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

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

    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
    campusboy1832 cайт: wp-plus.ru

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

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

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

    Kama 1.5 года назад

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

    Max 1.5 года назад

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

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

    Kama 1.5 года назад

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

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

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

    Mnm год назад

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

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

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

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

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

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

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

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

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

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

    aleksei1976 год назад

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

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

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