Функция set_transient()
в WordPress используется для установки временных данных (транзиентов), которые сохраняются в базе данных и удаляются по истечении указанного времени. Этот метод подходит для кэширования данных, которые обновляются с некоторой регулярностью, например, результаты сложных SQL-запросов или данные из API.
set_transient( string $transient, mixed $value, int $expiration ): bool
Функция set_transient()
позволяет сохранить временную опцию с указанным именем, значением и временем жизни. При необходимости WordPress автоматически сериализует данные перед их записью.
Параметры
- $transient (строка) (обязательный) — Имя временной опции, не должно превышать 172 символов.
- $value (смешанный) (обязательный) — Значение временной опции, должно быть сериализуемым (если это массив или объект).
- $expiration (целое число) (необязательный) — Время до истечения в секундах. По умолчанию 0, что означает, что опция не будет иметь срока действия и сохранится на постоянной основе.
Возвращаемое значение
- Возвращает
true
, если опция успешно сохранена, иfalse
— в противном случае.
Дополнительная информация
Для имени транзиента в таблице базы данных будет создана запись с префиксом _transient_
. Длина имени ограничена 172 символами. Долгоживущие транзиенты без срока действия загружаются автоматически, а те, у которых указан срок действия, не автозагружаются, чтобы не замедлять работу сайта.
Пример 1: Сохранение данных с обновлением срока действия
Для установки срока действия транзиента, важно указать третий параметр $expiration
. Если обновить существующий транзиент без указания времени, он сохранит текущий срок действия.
$start_time = time();
set_transient( 'sample_data', 'some_value', 300 ); // Срок действия 5 минут
sleep(10);
$update_time = time();
set_transient( 'sample_data', 'updated_value' ); // Срок действия не изменится
В этом примере, даже при повторном вызове set_transient()
, срок действия останется равным $start_time + 300
, так как второй вызов не содержит параметра $expiration
.
Пример 2: Кэширование результатов сложного запроса
Этот пример показывает, как использовать set_transient()
для сохранения сложного запроса. Мы кэшируем результат на 12 часов.
// Формируем запрос
$custom_query_results = new WP_Query( array(
'post_type' => 'product',
'posts_per_page' => 10,
'orderby' => 'popularity',
'order' => 'DESC'
) );
// Сохраняем результат во временной опции с именем custom_query_cache
set_transient( 'custom_query_cache', $custom_query_results, 12 * HOUR_IN_SECONDS );
Используя данный подход, мы избегаем выполнения этого запроса каждый раз, что снижает нагрузку на сервер.
Пример 3: Сохранение последних 5 постов
В следующем примере мы получаем 5 последних постов и сохраняем результат на 1 день.
// Выполняем запрос
$latest_posts = new WP_Query( array(
'post_type' => 'post',
'posts_per_page' => 5,
'orderby' => 'date',
'order' => 'DESC'
) );
// Сохраняем результат с именем latest_five_posts
set_transient( 'latest_five_posts', $latest_posts, DAY_IN_SECONDS );
Этот пример полезен, если на сайте часто запрашивают последние посты, а обновлять кэш можно ежедневно.
Важные замечания
- Удаление и истечение: Когда транзиент достигает своего срока действия, WordPress удаляет его автоматически с помощью функции
delete_expired_transients()
. - Работа с кэшированием объектов: Если используется плагин объектного кэширования, транзиенты будут сохранены в объектный кэш, а не в таблицу
wp_options
. - Использование констант времени: WordPress предоставляет удобные константы времени, такие как
MINUTE_IN_SECONDS
,HOUR_IN_SECONDS
,DAY_IN_SECONDS
, которые упрощают установку срока действия.
Заключение
Функция set_transient()
— это мощный инструмент для оптимизации WordPress-сайтов, позволяя временно сохранять данные и снижать нагрузку на сервер.