Перейти к содержимому

Transients API: транзитное кэширование

Transients API — встроенный механизм WordPress для сохранения данных на определённый промежуток времени (TTL). Для посетителей сайта механизм полностью прозрачен — это инструмент разработчика.

Типичные сценарии:

  • фрагменты с данными внешних сервисов: последний твит, прогноз погоды, курсы валют;
  • результаты тяжёлых запросов к базе, общие для всех пользователей;
  • агрегированные данные для главной страницы.

Ядро само использует transients для RSS-лент и запросов на обновление тем, плагинов и ядра.

Три функции: set_transient(), get_transient(), delete_transient().

// Кэшируем результат внешнего API-запроса на 12 часов
function my_get_exchange_rates() {
$rates = get_transient( 'exchange_rates' );
if ( false === $rates ) {
$response = wp_remote_get( 'https://api.example.com/rates' );
$rates = json_decode( wp_remote_retrieve_body( $response ), true );
set_transient( 'exchange_rates', $rates, 12 * HOUR_IN_SECONDS );
}
return $rates;
}
// Принудительная инвалидация
delete_transient( 'exchange_rates' );

Константы времени ядра: MINUTE_IN_SECONDS, HOUR_IN_SECONDS, DAY_IN_SECONDS, WEEK_IN_SECONDS, MONTH_IN_SECONDS, YEAR_IN_SECONDS.

В отличие от объектного кэша, transients постоянны по умолчанию и хранятся в базе данных (таблица wp_options).

Но при установленном плагине внешнего объектного кэша (Redis, Memcached) transients автоматически начинают храниться в нём — быстрее и без нагрузки на базу. Это же касается site-transients в Multisite (группа site-transient — глобальная).

Матрица выбора по времени жизни данных:

ЗадачаИнструмент
Сохранить значение только на текущий запросОбъектный кэш (wp_cache_set)
Сохранить на определённый срок (минуты — дни)Transient (set_transient)
Сохранить на неопределённый срок, гарантированно в БДОпция (update_option)

Правило: если данные должны пережить запрос и устареть по расписанию — transient. Если это настройка, а не кэш — опция. Если данные нужны только внутри одного запроса — объектный кэш. При установленном persistent object cache все три механизма используют его.

Важно про опции: transient с истёкшим TTL удаляется, а опция остаётся навсегда. Не храните временные данные в опциях — таблица wp_options разрастается, а autoload-опции грузятся при каждом запросе (см. Кэширование объектов).

  • Не для персональных данных. Transients общие для всех посетителей. Для данных, привязанных к пользователю, используйте объектный кэш с ключом или группой по user ID.
  • TTL — не гарантия удаления. Истёкший transient удалится при следующем обращении к нему, а не ровно в момент истечения.
  • Внешние API могут падать. При ошибке wp_remote_get() не кэшируйте пустой результат надолго — проверяйте ответ перед set_transient().