Встроен ли и активирован ли REST API WordPress в стандартной установке WordPress 4.7?
Я только что установил WordPress 4.7. Одним из упоминаний в анонсе является то, что в нем представлен REST API.
Мое понимание следующее:
- Плагин WordPress REST API больше не нужен, так как предположительно он уже был объединен с ядром в WordPress 4.7.
- WordPress REST API включен по умолчанию
Однако я заметил, что в стандартной установке WordPress 4.7 ни одна из конечных точек не работает (например http://examples.com/wp-json/wp/v2/posts
).
Как я могу проверить, действительно ли активирован новый REST API? Можно ли включить или отключить REST API через стандартный интерфейс WordPress, или нужно устанавливать сторонний плагин для этого?

В WordPress 4.7 REST API включен по умолчанию. Самый простой способ проверить его работу — посетить URL example.com/wp-json, где вы должны увидеть список зарегистрированных конечных точек.
Официальной опции для отключения REST API нет (хотя были разговоры о её добавлении, но не факт, что это вошло в релиз), так как некоторые базовые функции движка зависят от него.
Если REST API не работает, в первую очередь стоит проверить:
- Правила в файле .htaccess
- Наличие директории wp-json
Также, если URL вида /wp-json/wp/v2/posts
не работают, но работает вариант /?rest_route=/wp-json/wp/v2/posts
, значит вам нужно включить "человеко-понятные" постоянные ссылки в настройках WordPress (как предложил Giles Butler в комментариях ниже).

У меня нет директории wp-json в /var/www/html
или её поддиректориях. Также у меня нет файла .htaccess
(кроме /var/www/html/wp-content/plugins/akismet/.htaccess
). Должен ли он быть?

@Pep, какой веб-сервер вы используете? У вас включены "человекопонятные" постоянные ссылки?

Apache. Я точно следовал шагам из этих руководств по установке WordPress 4.7 на AWS: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/install-LAMP.html и http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/hosting-wordpress.html

не знаком с AWS, но если вы установили чистый WordPress, у вас должен быть файл .htaccess в корне установки. Если его нет, попробуйте перейти в настройки > постоянные ссылки, убедитесь, что у вас не выбрана настройка "Plain", сохраните и проверьте, создался ли файл htaccess

У меня были постоянные ссылки с настройкой "Plain". Я изменил её на "Post name". WordPress не смог сохранить файл .htaccess, видимо из-за проблем с правами, поэтому выдал мне код. Я создал файл .htaccess
через ssh
с этим содержимым. Однако REST API продолжает возвращать 404, даже для http:example.com/wp-json/

не должно быть 404. Проверьте, работают ли другие "красивые" URL, например, стандартная запись. Если нет, значит проблема с .htaccess осталась

Похоже, что Permalink вообще не работает, и проблема не только в API-эндпоинтах. Я только что заметил, что могу получить доступ к записям блога только при настройке "Plain". Если я изменяю Permalink на любое другое значение, я получаю предупреждение о необходимости вручную изменить файл .htaccess
, что я и делаю, но затем получаю ошибку 404 даже для записей блога. Получается, что моя проблема связана с Permalink в целом, а не только с REST API. Возможно, сообщение "файл .htaccess недоступен для записи" является симптомом какой-то другой проблемы.

Я наконец-то нашел проблему. Поскольку я не знал, что для работы REST API требуется Permalink, я пропустил во время первоначальной настройки шаг установки AllowOverride All
в секции <Directory "/var/www/html">
файла /etc/httpd/conf/httpd.conf
. Именно поэтому мои изменения в .htaccess
игнорировались. Теперь, с любым Permalink, кроме "Plain", API-эндпоинты работают.

Если вы используете некрасивые постоянные ссылки, вам следует передать маршрут REST API в виде параметра строки запроса. Маршрут http://oursite.com/wp-json/ в примере выше тогда будет выглядеть как http://oursite.com/?rest_route=/ "https://developer.wordpress.org/rest-api/#routes-endpoints"

У меня была версия 4.7, и я тоже думал, что REST API отключен, но меня обманул URL. Чтобы увидеть правильный URL, найдите строку, которая выглядит примерно так:
link rel='https://api.w.org/
' href='http://mysite?rest_route=/
' />.
Использование http://mysite?rest_route=/ в качестве префикса решило мою проблему. Например, для получения записей достаточно ввести: http://mysite?rest_route=/wp/json
Я не смог найти в документации информацию о необходимости этого параметра запроса. Я что, один такой?

Сработало для меня на WordPress 4.8.x. Не понимаю, почему это нигде не задокументировано.

Не один я такой. Нашел этот ответ только в вашем комментарии после 10 минут поисков. Мне нужно было сделать: www.example.com?rest_route=/wp/v2/posts

Думаю, это происходит, когда не включены "человекопонятные" постоянные ссылки. Согласно документации...
"На сайтах без "человекопонятных" ссылок, маршрут добавляется к URL как параметр rest_route. Для приведенного выше примера полный URL будет выглядеть так: http://example.com/?rest_route=/wp/v2/posts/123"

вот она -> https://developer.wordpress.org/rest-api/#routes-endpoints

Если REST API не работает "из коробки" или после свежей установки, и при переходе по адресу:
mydomain/wp-json/wp-v2/posts
вам потребуется просто активировать "постоянные ссылки" (permalinks) в формате post_name, которые находятся:
Консоль WordPress → Настройки → Постоянные ссылки
Или если вы не хотите активировать постоянные ссылки, можно просто ввести:
mydomain?rest_route=/wp/v2/posts
Честно говоря, хотелось бы, чтобы WordPress обновил свое руководство по REST API, сделав его более дружелюбным для пользователей. Мне больше нравилась старая версия документации :)

Я вижу, что вы исправили проблему, но оставлю здесь своё решение, так как оно тоже сработало у меня. У меня была такая же проблема при обновлении с beta15 до core API в WordPress 4.7. Оказалось, что проблема была в некоторых плагинах, которые использовали устаревшую функцию register_api_field. Я изменил её на register_rest_field согласно примечанию в changelog:
ВАЖНОЕ ИЗМЕНЕНИЕ: Переименована функция register_api_field() в register_rest_field().
Добавлена функция register_api_field() для обратной совместимости, которая вызывает _doing_it_wrong(). Однако register_api_field() никогда не будет включена в ядро WordPress, поэтому вам следует обновить вызовы функций.
