Встроен ли и активирован ли REST API WordPress в стандартной установке WordPress 4.7?

10 дек. 2016 г., 19:07:58
Просмотры: 50.7K
Голосов: 46

Я только что установил 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, или нужно устанавливать сторонний плагин для этого?

6
Комментарии

Есть ли тег discovery в исходном коде страницы? <link rel='https://api.w.org/' href='https://example.com/wp-json/' /> Похоже, это просто работает на моих сайтах.

Rarst Rarst
10 дек. 2016 г. 19:32:46

@Rarst, если я выполню grep -r "<link rel='https://api.w.org/'" . в директории html, то получу одно совпадение в файле ./wp-includes/rest-api.php с таким текстом: echo "<link rel='https://api.w.org/' href='" . esc_url( $api_root ) . "' />\n";

Pep Pep
10 дек. 2016 г. 20:13:08

Не в вашем исходном коде, а в HTML-исходнике страницы вашего сайта в браузере.

Rarst Rarst
10 дек. 2016 г. 20:16:23

@Rarst, да, я вижу <link href="http://example.com/wp-json/" rel="https://api.w.org/">

Pep Pep
10 дек. 2016 г. 20:24:04

Что вы получаете при открытии ссылки в браузере? С включённым WP_DEBUG?

Rarst Rarst
10 дек. 2016 г. 20:32:40

Я получаю 404 для http://example.com/wp-json/ как при WP_DEBUG установленном в true, так и в false.

Pep Pep
10 дек. 2016 г. 20:42:31
Показать остальные 1 комментариев
Все ответы на вопрос 4
10
32

В 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 в комментариях ниже).

10 дек. 2016 г. 19:37:11
Комментарии

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

Pep Pep
10 дек. 2016 г. 19:54:38

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

Mark Kaplun Mark Kaplun
10 дек. 2016 г. 19:58:35

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

Pep Pep
10 дек. 2016 г. 20:04:51

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

Mark Kaplun Mark Kaplun
10 дек. 2016 г. 20:12:36

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

Pep Pep
10 дек. 2016 г. 20:29:57

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

Mark Kaplun Mark Kaplun
10 дек. 2016 г. 20:40:56

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

Pep Pep
10 дек. 2016 г. 20:59:55

У вас установлен и активирован mod_rewrite?

Mark Kaplun Mark Kaplun
10 дек. 2016 г. 21:41:03

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

Pep Pep
10 дек. 2016 г. 21:53:15

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

devasia2112 devasia2112
3 янв. 2019 г. 18:47:52
Показать остальные 5 комментариев
5
14

У меня была версия 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

Я не смог найти в документации информацию о необходимости этого параметра запроса. Я что, один такой?

27 июн. 2017 г. 06:52:28
Комментарии

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

Anirudha Anirudha
31 авг. 2017 г. 14:35:14

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

Eugene K Eugene K
7 февр. 2018 г. 05:50:22

Думаю, это происходит, когда не включены "человекопонятные" постоянные ссылки. Согласно документации...

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

Giles Butler Giles Butler
20 июл. 2018 г. 00:36:44

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

devasia2112 devasia2112
3 янв. 2019 г. 18:48:28

Очень полезно, если вы тестируете на встроенном PHP сервере php -S localhost:1234.

Juan Javier Triff Cabanas Juan Javier Triff Cabanas
2 сент. 2020 г. 05:22:30
0

Если REST API не работает "из коробки" или после свежей установки, и при переходе по адресу:

mydomain/wp-json/wp-v2/posts

вам потребуется просто активировать "постоянные ссылки" (permalinks) в формате post_name, которые находятся:

Консоль WordPress → Настройки → Постоянные ссылки

Или если вы не хотите активировать постоянные ссылки, можно просто ввести:

mydomain?rest_route=/wp/v2/posts

Честно говоря, хотелось бы, чтобы WordPress обновил свое руководство по REST API, сделав его более дружелюбным для пользователей. Мне больше нравилась старая версия документации :)

29 мая 2019 г. 20:20:47
0

Я вижу, что вы исправили проблему, но оставлю здесь своё решение, так как оно тоже сработало у меня. У меня была такая же проблема при обновлении с 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, поэтому вам следует обновить вызовы функций.

17 дек. 2016 г. 04:30:18