Проблема: Почему REST API WordPress возвращает устаревшие данные?
При разработке и отладке REST API маршрутов в WordPress часто сталкиваешься с тем, что изменения в коде не отражаются сразу. Это связано с кэшированием ответов, которое может быть реализовано на нескольких уровнях: внутренний кэш WordPress, серверный кэш, плагины кэширования, CDN и браузер. Важно точно диагностировать, откуда берется кэш и как его отключить, чтобы получать актуальные данные во время разработки.
Диагностика проблемы с кэшированием REST API
Для начала нужно проверить, не кэширует ли WordPress сам REST API ответы. По умолчанию WordPress не кэширует REST API, но некоторые плагины и серверные настройки могут это делать.
- Проверьте заголовки ответа REST API в браузере или с помощью
curl -I https://site.com/wp-json/endpoint. Обратите внимание на заголовкиCache-Control,Expires,ETag. - Отключите временно плагины кэширования (например, WP Super Cache, W3 Total Cache, LiteSpeed Cache) и проверьте, исчезла ли проблема.
- Проверьте настройки сервера: если включен Redis, Memcached или Varnish, возможно, они кэшируют REST API ответы. Временно отключите или настройте исключения.
- Проверьте, нет ли кастомного кэширования в вашем коде — хуков, фильтров, оберток вокруг REST API запросов.
Пошаговое удаление кэширования REST API ответов в WordPress
Чтобы гарантированно отключить кэширование REST API на уровне WordPress, добавьте следующий код в functions.php вашей темы или в отдельный плагин:
add_filter('rest_post_dispatch', function ($response, $server, $request) {
$response->header('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0');
$response->header('Pragma', 'no-cache');
$response->header('Expires', '0');
return $response;
}, 10, 3);Этот фильтр принудительно добавит заголовки, запрещающие кеширование ответа REST API на стороне клиента и промежуточных прокси.
Если у вас есть серверное кэширование через Redis или Memcached, убедитесь, что REST API запросы исключены из кэширования. Например, для LiteSpeed Cache в настройках исключений можно добавить путь /wp-json/.
Отключение кэширования в популярных плагинах
- WP Super Cache: В настройках «Advanced» добавьте
/wp-json/в исключения. - W3 Total Cache: В разделе Page Cache -> Advanced не кешируйте URI с REST API, добавьте
^/wp-json/в исключения. - LiteSpeed Cache: В настройках исключений для кэша включите путь
/wp-json/.
Проверка результата после отключения кэширования
После внесения изменений проверьте, что REST API ответ обновляется без задержек:
- Откройте консоль браузера на вкладке Network.
- Отправьте запрос к REST API, например,
https://site.com/wp-json/wp/v2/posts. - Посмотрите в заголовках ответа
Cache-Control— он должен содержатьno-store, no-cache. - Внесите изменения в данные, возвращаемые API, и повторите запрос. Данные должны обновиться сразу.
Частые ошибки и как их исправить
- Кэш не отключился, данные всё ещё старые: Возможно, кэш на уровне CDN (Cloudflare, Sucuri) или прокси. Нужно добавить исключения в их настройках для
/wp-json/. - Заголовки кэширования не изменяются: Проверьте приоритет фильтров — возможно, другой плагин перезаписывает заголовки. Используйте более высокий приоритет, например, 100.
- Кэширование внутри кода REST API: Если в вашем кастомном обработчике используется Transient API или объектный кэш, временно отключите их для отладки.
Практические советы по безопасности и производительности
- Отключайте кэширование REST API только в режиме разработки, на продакшене лучше настроить корректное кеширование с контролем версий данных.
- Используйте
ETagиIf-None-Matchзаголовки для условного кеширования. WordPress генерирует их автоматически, если не отключены. - Для критичных запросов используйте nonce или авторизацию, чтобы не отдавать устаревший контент неавторизованным пользователям.
Сравнение способов отключения кэширования REST API
| Способ | Плюсы | Минусы |
|---|---|---|
Добавление заголовков через rest_post_dispatch | Просто, работает на уровне WP | Не влияет на серверный или CDN кэш |
| Исключение URI в настройках плагинов кэширования | Устраняет серверный кэш | Зависит от правильных настроек плагинов |
| Исключение в CDN | Полностью исключает кэширование на уровне сети | Требует доступа и настройки CDN |