﻿---
title: "Transients API: транзитное кэширование"
description: "Transients API в WordPress: set/get/delete_transient, время жизни, хранение в БД vs внешний object cache, когда выбрать transient, object cache или option."
---

## Что такое транзитное кэширование

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

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

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

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

## Базовое использование

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

```php
// Кэшируем результат внешнего 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;
}
```

```php
// Принудительная инвалидация
delete_transient( 'exchange_rates' );
```

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

## Где хранятся transients

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

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

## Object cache, transient или option?

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

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

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

**Важно про опции:** transient с истёкшим TTL удаляется, а опция остаётся навсегда. Не храните временные данные в опциях — таблица `wp_options` разрастается, а autoload-опции грузятся при каждом запросе (см. [Кэширование объектов](https://wpcraft.ru/kb/stacks/wordpress/cache/object-cache.md)).

## Ограничения

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

## Материалы и источники

- [Основы кэширования в WordPress](https://wpmag.ru/2013/keshirovaniye-wordpress/) — Константин Ковшенин, WP Magazine
- [Кеширование WordPress: WP Super Cache, WP Rocket, Surge](https://wpcraft.ru/blog/cache-wordpress) — WPCraft
- [Transients API](https://developer.wordpress.org/apis/handbook/transients/) — официальная документация WordPress
- [Кэширование объектов](https://wpcraft.ru/kb/stacks/wordpress/cache/object-cache.md) — объектный кэш и persistent backends