WP Rest API не работает

24 окт. 2019 г., 15:14:46
Просмотры: 17.8K
Голосов: 5

WP 5.2.4

/wp-json/wp/v2/

Выдает ошибку 404.

Я обновил постоянные ссылки, имею рабочий .htaccess на Apache и не использую "простые постоянные ссылки", но это все равно не работает. Мой Apache и его конфигурация выглядят нормально, все работает кроме /wp-json.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Как исправить эту раздражающую ошибку WP? Почему WordPress не улучшает это, когда люди сталкиваются с этим каждый день?

Мои маршруты WP выглядят так (сокращено):

array (
  '^wc-auth/v([1]{1})/(.*)?' => 'index.php?wc-auth-version=$matches[1]&wc-auth-route=$matches[2]',
  '^wc-api/v([1-3]{1})/?$' => 'index.php?wc-api-version=$matches[1]&wc-api-route=/',
  '^wc-api/v([1-3]{1})(.*)?' => 'index.php?wc-api-version=$matches[1]&wc-api-route=$matches[2]',
  'sitemap_index\\.xml$' => 'index.php?sitemap=1',
  '([^/]+?)-sitemap([0-9]+)?\\.xml$' => 'index.php?sitemap=$matches[1]&sitemap_n=$matches[2]',
  '([a-z]+)?-?sitemap\\.xsl$' => 'index.php?yoast-sitemap-xsl=$matches[1]',
  'shop-4/?$' => 'index.php?post_type=product',
  'shop-4/feed/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?post_type=product&feed=$matches[1]',
  'shop-4/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?post_type=product&feed=$matches[1]',
  'shop-4/page/([0-9]{1,})/?$' => 'index.php?post_type=product&paged=$matches[1]',
  '^wp-json/?$' => 'index.php?rest_route=/',
  '^wp-json/(.*)?' => 'index.php?rest_route=/$matches[1]',

....

Как видно, правила wp-json должны работать, так как соответствуют URL типа:

/wp-json/wp/v2/posts/6307

Я проверил, какие REST маршруты доступны (используя плагин "Rest Manager", хороший и понятный):

/wp/v2/posts/
/wp/v2/posts/(?P<id>[\d]+)

Когда я открываю URL:

/index.php?rest_route=wp/v2/posts/6307
/index.php?rest_route=/wp/v2/posts/6307
/index.php?rest_route=wp/v2/posts/
/index.php?rest_route=/wp/v2/posts/

Я получаю для всех:

(404)
{"code":"rest_no_route","message":"Не найден маршрут, соответствующий URL и методу запроса","data":{"status":404}}

Говорят, что список конечных точек доступен через GET /wp-json/, но эта страница также возвращает 404.

Поведение точно такое же для маршрутов, где я знаю, что используются GET методы:

404 /wp-json/wp/v2/block-renderer/woocommerce/
4
Комментарии

Некоторые плагины имеют опцию отключения REST API. Убедитесь, что все плагины отключены, и попробуйте снова.

idpokute idpokute
24 окт. 2019 г. 17:27:41

У меня не так много плагинов, в основном WooCommerce и WPML. REST API "активен", просто маршрутизация работает с ошибками.

Daniel W. Daniel W.
24 окт. 2019 г. 17:29:08

Причина, по которой я предлагаю отключить все плагины, - выяснить, является ли это проблемой программного обеспечения (например, плагинов) или сервера (например, проблемы с .htaccess).

idpokute idpokute
24 окт. 2019 г. 17:31:52

@idpokute Я выяснил, что плагин "WPML" вызывает эту проблему. Есть идеи, как можно продолжить отладку?

Daniel W. Daniel W.
27 окт. 2019 г. 17:14:42
Все ответы на вопрос 1
1

Сначала необходимо проверить, включен ли REST API в WordPress.

Лучший способ проверить — посетить этот URL: https://вашсайт.com/wp-json. Если вы видите JSON-ответ, значит, REST API включен. Если отображается страница с ошибкой или происходит перенаправление на главную страницу, значит, REST API отключен. В этом случае его нужно сначала включить.

В таком случае необходимо включить Постоянные ссылки.

  1. Перейдите в админ-панель вашего сайта (Посетите https://вашсайт.com/wp-json)
  2. Настройки > Постоянные ссылки (перейдите по https://вашсайт.com/wp-admin/options-permalink.php)
  3. Убедитесь, что не выбрана опция "Обычные"
  4. Выберите "Название записи" (это лучший вариант)
  5. Нажмите "Сохранить изменения". Это перезапишет/восстановит ваш файл .htaccess

Подробнее

14 мая 2021 г. 10:07:35
Комментарии

Хорошее начало, но вы не упомянули, что делать, если виден JSON-ответ (то есть API работает). Вы начали с "включен или нет", но описали только сценарий "нет". С радостью изменю свой голос против на голос за, если вы сможете завершить ответ :)

Cush Cush
5 июл. 2021 г. 19:07:53