wpcoding.ru wordpress WP Coding

Как удалить кэширование REST API ответов в WordPress для быстрой отладки

Проблема: Почему 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 ответ обновляется без задержек:

  1. Откройте консоль браузера на вкладке Network.
  2. Отправьте запрос к REST API, например, https://site.com/wp-json/wp/v2/posts.
  3. Посмотрите в заголовках ответа Cache-Control — он должен содержать no-store, no-cache.
  4. Внесите изменения в данные, возвращаемые 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
×
Сделай свой сайт крутым!

Скидка -20% на премиум плагины WordPress

Выбрать плагин сейчас ⋙