Краткий ответ: если не работает REST API WordPress, сначала откройте адрес /wp-json/ и посмотрите, что возвращает сайт: JSON, 404, 403, 500, HTML-страницу, редирект или пустой ответ. Чаще всего проблема связана с постоянными ссылками, .htaccess, Nginx rules, security-плагином, WAF/ModSecurity, кешем, Cloudflare, конфликтом плагинов, HTTPS, CORS, nonce, Authorization header или ошибкой PHP.
REST API нужен не только разработчикам. Через него работают Gutenberg, Site Health, WooCommerce, некоторые формы, личные кабинеты, интеграции, мобильные приложения, CRM, Telegram-уведомления и внешние сервисы. Поэтому поломка REST API может выглядеть по-разному: редактор не сохраняет запись, форма не отправляется, интеграция не получает данные, WooCommerce даёт ошибку, а в Site Health появляется сообщение “The REST API encountered an error”.
Правильная диагностика — идти по слоям: сначала проверить сам endpoint, потом постоянные ссылки, серверные правила, блокировки безопасности, кеш, плагины, тему, авторизацию и логи. Если проблема связана с кастомной логикой, интеграциями или плагинами, может понадобиться точечная доработка WordPress, а не случайное отключение всего сайта.
REST API WordPress обычно доступен по адресу:
https://example.com/wp-json/
Если этот адрес не возвращает нормальный JSON-ответ, значит запрос ломается до WordPress, внутри WordPress или на уровне авторизации. Иногда сам /wp-json/ открывается нормально, но конкретный endpoint, например /wp-json/wp/v2/posts, /wp-json/wp/v2/users или endpoint плагина, возвращает ошибку.
| Симптом | Возможная причина | Что проверить |
|---|---|---|
| /wp-json/ отдаёт 404 | постоянные ссылки, .htaccess, rewrite rules, Nginx | Permalinks, .htaccess, try_files |
| /wp-json/ отдаёт 403 | security-плагин, WAF, IP-блокировка, REST API отключён | логи безопасности, Cloudflare, WAF |
| /wp-json/ отдаёт 500 | PHP Fatal error, конфликт плагина, тема, memory limit | debug.log, error_log, плагины |
| Возвращается HTML вместо JSON | редирект, кеш, warning/notice, страница ошибки | Network, headers, debug.log |
| Ошибка 401/403 на защищённом endpoint | нет авторизации, nonce, cookies, Application Passwords | Authorization header, nonce, права пользователя |
| Site Health пишет REST API error | loopback, cURL, SSL, firewall, HTTP-запрос к самому сайту | Site Health, server logs, SSL, DNS |
| Gutenberg не сохраняет запись | REST API заблокирован, nonce, WAF, JS-ошибка | Console, Network, wp-json |
| Интеграция с CRM не работает | auth, CORS, endpoint, webhook, firewall | логи интеграции, headers, API response |
Если REST API возвращает 403, проверьте статью WordPress показывает ошибку 403. Если после обновления плагина REST API начал падать, полезно проверить материал после обновления плагина сломался сайт WordPress.
Начинайте с простого теста: откройте /wp-json/ в браузере. Нормальный ответ должен быть похож на JSON-структуру с routes, namespaces и другой служебной информацией WordPress. Если вместо этого вы видите 404, 403, 500, HTML или редирект, нужно искать слой, который ломает запрос.
Откройте:
https://example.com/wp-json/
Замените example.com на свой домен. Дальше смотрите результат:
В админке WordPress откройте:
Инструменты → Здоровье сайта
Если там есть сообщение про REST API или loopback request, скопируйте точный текст ошибки. Особенно важны HTTP-код, endpoint и сообщение cURL.
REST API часто ломается вместе с красивыми URL. Если сайт на Apache, проблема может быть в .htaccess. Если сайт на Nginx, проблема может быть в try_files.
В админке откройте:
Настройки → Постоянные ссылки → Сохранить изменения
После сохранения снова откройте /wp-json/. Если проблема ушла, причина была в rewrite rules.
Если REST API ломается не в браузере напрямую, а в редакторе, форме, WooCommerce или личном кабинете, откройте DevTools:
Security-плагины часто блокируют REST API полностью или частично. Иногда они разрешают публичный /wp-json/, но блокируют endpoint для пользователей, заказов, форм, WooCommerce или кастомных плагинов.
Проверьте:
REST API не должен отдавать старый кешированный HTML вместо JSON. Но агрессивный page cache, CDN, минификация, firewall rules или неправильные исключения могут ломать запросы.
Если не хотите рисковать сайтом и тратить время на эксперименты, можно оставить заявку. Я посмотрю задачу и предложу аккуратное решение.
Исправление зависит от того, какой ответ возвращает REST API. Нельзя лечить 404, 403 и 500 одинаково. Сначала определите HTTP-код и источник проблемы, потом применяйте точечное решение.
Сначала пересохраните постоянные ссылки. Затем проверьте .htaccess или Nginx config.
Если 404 возникает не только у REST API, а вообще на всех внутренних страницах, проверьте статью WordPress показывает ошибку 404 на всех страницах.
403 означает, что доступ запрещён. Чаще всего виноват security-плагин, WAF, ModSecurity, Cloudflare, блокировка IP или кастомное правило, которое отключает REST API.
Ошибка 500 почти всегда требует проверки логов. В браузере вы можете видеть только общий ответ, но в debug.log часто будет конкретный файл, строка и плагин.
Если публичный /wp-json/ работает, но endpoint для публикации, пользователей, заказов или настроек возвращает 401/403, проблема часто в авторизации.
Проверьте:
Если редактор блоков не сохраняет запись, не загружает категории, не показывает preview или пишет “Updating failed”, проверьте запросы в Network.
Для CRM, мобильного приложения, Telegram, headless frontend или внешней публикации важно не только открыть /wp-json/, но и правильно настроить endpoint, метод, авторизацию, права и формат ответа.
Если стандартного функционала недостаточно, лучше делать отдельный endpoint через кастомный плагин. Для таких задач полезно понимать, когда нужен кастомный WordPress-плагин.
Важно: код и команды ниже могут повлиять на REST API, редактор Gutenberg, формы, WooCommerce, личный кабинет, интеграции, авторизацию и безопасность. Перед изменениями сделайте backup. Не отключайте REST API глобально на рабочем сайте без понимания последствий.
Куда выполнять: терминал или SSH.
curl -I https://example.com/wp-json/
Проверить тело ответа:
curl https://example.com/wp-json/
curl https://example.com/wp-json/wp/v2/posts
Куда выполнять: SSH в корне сайта.
wp rewrite flush
wp option get permalink_structure
Куда вставлять: файл .htaccess в корне сайта. Перед заменой сохраните старый файл.
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Куда вставлять: server block Nginx внутри location /. После изменения нужно проверить конфигурацию.
location / {
try_files $uri $uri/ /index.php?$args;
}
Проверка конфигурации:
nginx -t
Перезагрузка Nginx:
systemctl reload nginx
Если REST API авторизация через Application Passwords или Basic Auth не работает, иногда сервер не передаёт Authorization header в PHP.
Куда вставлять: .htaccess, выше стандартного блока WordPress или внутри подходящей секции, если хостинг это поддерживает.
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
На некоторых конфигурациях также используют:
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
Куда искать: functions.php дочерней темы, mu-plugins, кастомные плагины.
add_filter('rest_authentication_errors', function ($result) {
return new WP_Error('rest_disabled', 'REST API disabled.', array('status' => 403));
});
Если такой код есть, он может блокировать REST API. Удалять его нужно только после понимания, зачем он был добавлен.
Куда вставлять: отдельный мини-плагин или кастомный плагин, не в файлы ядра WordPress.
add_action('rest_api_init', function () {
register_rest_route('sc/v1', '/ping', array(
'methods' => 'GET',
'callback' => function () {
return rest_ensure_response(array(
'success' => true,
'message' => 'REST API works',
));
},
'permission_callback' => '__return_true',
));
});
После добавления endpoint можно проверить:
https://example.com/wp-json/sc/v1/ping
После правильного исправления REST API должен возвращать JSON, а не 403, 404, 500, HTML, редирект или пустой ответ.
Хороший результат:
Если REST API вызывается с другого домена, браузер может блокировать запрос из-за CORS. Это не всегда означает, что REST API сломан. Сервер может отдавать нормальный ответ, но браузер не разрешает использовать его во внешнем приложении.
Если сайт работает на HTTPS, а API вызывается по HTTP, браузер может блокировать запрос. Проверьте, чтобы сайт, WordPress Address, Site Address и API-запросы использовали одну HTTPS-схему.
REST API может ломаться из-за цепочек 301/302: http → https, без www → www, языковой префикс, trailing slash, редиректы плагинов. Внешние сервисы не всегда корректно проходят такие цепочки.
Даже один PHP warning, notice или лишний пробел перед JSON может испортить ответ. В браузере это может выглядеть как “invalid JSON response” или ошибка парсинга.
Site Health может одновременно показывать ошибку REST API и loopback request. Это бывает, когда WordPress не может сделать HTTP-запрос к самому себе из-за DNS, SSL, firewall, basic auth, WAF или хостинга.
Если не работает только endpoint вашего плагина, проверьте namespace, route, methods, callback, permission_callback, args и return. Callback должен возвращать корректный ответ, а не echo/print.
Это может сломать Gutenberg, Site Health, WooCommerce, формы, интеграции, личные кабинеты и внешние приложения. Если нужно ограничить доступ, лучше делать точечные правила.
Базовый endpoint может работать, но конкретный endpoint плагина или защищённый route может возвращать 401, 403 или 500.
Для авторизации важны Authorization header, cookies, nonce, content-type и HTTPS. Без проверки headers можно искать проблему не там.
REST API должен отдавать актуальный JSON. Если кеш отдаёт HTML или старый ответ, редактор и интеграции могут работать неправильно.
Если запрос из браузера заблокирован CORS, API может быть рабочим. Нужно отдельно проверить ответ через curl или Postman.
Многие блокировки REST API идут не от WordPress, а от firewall, WAF, Cloudflare или security-плагина.
В кастомных endpoint лучше возвращать данные через rest_ensure_response(), WP_REST_Response или WP_Error, а не печатать JSON вручную.
Возможная причина: постоянные ссылки, .htaccess, Apache rewrite, Nginx try_files.
Что делать: пересохранить permalinks, восстановить .htaccess, проверить mod_rewrite или Nginx config.
Возможная причина: REST API заблокирован security-плагином, WAF, Cloudflare, .htaccess или кастомным кодом.
Что делать: проверить firewall logs, .htaccess, security-плагины, rest_authentication_errors и IP-блокировки.
Возможная причина: PHP Fatal error, конфликт плагинов, тема, memory limit, несовместимость PHP.
Что делать: включить debug.log, проверить error_log, отключить проблемный плагин, переключить тему для теста.
Возможная причина: REST API заблокирован, nonce неверный, WAF блокирует запрос, кеш отдаёт неправильный ответ или есть JS-ошибка.
Что делать: открыть DevTools → Network, найти запрос к /wp-json/, проверить статус, response и headers.
Возможная причина: неверный пароль приложения, нет HTTPS, сервер не передаёт Authorization header, пользователь не имеет прав.
Что делать: проверить Basic Auth, HTTPS, Authorization header, права пользователя и настройки сервера.
Возможная причина: кеш, редирект, страница защиты, Cloudflare challenge, warning/notice или неправильный URL endpoint.
Что делать: проверить curl, headers, кеш, Cloudflare, debug.log и точный endpoint.
Возможная причина: cookies, nonce, роль пользователя, security-плагин или ошибка в context=edit.
Что делать: проверить авторизацию, nonce, права пользователя, endpoint с context=view и context=edit.
Возможная причина: ошибка register_rest_route, namespace, permission_callback, callback, метод запроса или return.
Что делать: проверить rest_api_init, route, methods, callback, permission_callback и debug.log.
Чаще всего из-за постоянных ссылок, .htaccess, Nginx rules, security-плагина, WAF, кеша, Cloudflare, ошибки PHP, неправильной авторизации, nonce, HTTPS, CORS или Authorization header.
Откройте https://example.com/wp-json/. Если возвращается JSON, базовый REST API работает. Если 404, 403 или 500 — нужно проверять rewrite rules, блокировки, сервер и debug.log.
Пересохраните постоянные ссылки, проверьте .htaccess на Apache или try_files на Nginx, очистите кеш и проверьте, не конфликтуют ли плагины.
Проверьте security-плагины, WAF, ModSecurity, Cloudflare, .htaccess, IP-блокировки и кастомный код, который может отключать REST API.
Это API WordPress, через который сайт отдаёт и принимает данные в формате JSON. Его используют редактор блоков, плагины, темы, внешние приложения, CRM, мобильные приложения и интеграции.
WordPress делает тестовый запрос к своему REST endpoint. Если запрос возвращает ошибку, timeout, 403, 404, 500, редирект или неожиданный ответ, Site Health показывает предупреждение.
Технически можно, но обычно это плохая идея. Полное отключение может сломать редактор Gutenberg, Site Health, WooCommerce, формы, личные кабинеты и интеграции.
Обычно нет авторизации или у пользователя нет прав. Проверьте cookies, nonce, Application Passwords, Authorization header, HTTPS и capability пользователя.
Доступ запрещён security-плагином, WAF, Cloudflare, .htaccess, IP-блокировкой, ролью пользователя или кастомным кодом в rest_authentication_errors.
Чаще всего сломаны постоянные ссылки, .htaccess, rewrite rules или Nginx try_files. Также возможен неправильный namespace или route у кастомного endpoint.
Возможен редирект, кеш, страница защиты, PHP warning перед JSON, Cloudflare challenge, страница ошибки или неправильный URL endpoint.
Проверьте debug.log, временно отключите подозрительный плагин на staging-копии, откройте /wp-json/ снова и посмотрите Network. Часто виноваты security, cache, optimization или custom endpoint плагины.
Gutenberg использует REST API для сохранения и загрузки данных. Если API заблокирован, отдаёт неправильный JSON или не проходит nonce, редактор может писать “Updating failed”.
Если REST API нужен для заявок, CRM, WooCommerce, личного кабинета, внешнего сервиса или кастомного плагина, лучше не отключать защиту наугад. Нужна диагностика endpoint, headers, логов, авторизации и серверных правил.
Если не работает REST API WordPress, сначала нужно понять, какой ответ возвращает /wp-json/: JSON, 404, 403, 500, HTML, редирект или timeout. От этого зависит правильное решение.
Чаще всего проблема находится в постоянных ссылках, .htaccess, Nginx rules, security-плагине, WAF, кешировании, Cloudflare, PHP-ошибке, авторизации, nonce, HTTPS, CORS или Authorization header.
Самый безопасный порядок: backup, проверка /wp-json/, Site Health, Network, debug.log, permalinks, .htaccess/Nginx, security-плагинов, кеша и авторизации. Так можно восстановить REST API без лишнего риска для редактора, форм, WooCommerce и интеграций.
Об авторе