Функция 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-сайтов, позволяя временно сохранять данные и снижать нагрузку на сервер.