## SET_TRANSIENT() │ WP 2.8.0
Функция set_transient()
используется для установки или обновления значения временного хранилища (транзиента) в WordPress.
### Что такое транзиенты?
Транзиенты — это временные данные, которые хранятся в базе данных на определённый срок. Они полезны для кэширования результатов тяжелых операций, таких как выполнение сложных SQL-запросов.
### Установка значения транзиента
Вы не обязаны сериализовать значения перед их установкой. Если значение требует сериализации, оно будет автоматически сериализовано перед тем, как будет установлено в базу данных.
### Хуки функции
Функция set_transient()
использует несколько хуков, которые позволяют вам взаимодействовать с её работой:
- pre_set_transient_(transient)
— выполняется перед установкой значения транзиента.
- expiration_of_transient_(transient)
— выполняется для обработки значения времени жизни транзиента.
- set_transient_(transient)
— выполняется после установки значения транзиента.
- setted_transient
— выполняется после установки, используется для общего уведомления.
### Возвращаемое значение
Функция возвращает true
при успешной установке значения и false
в противном случае.
### Синтаксис использования
```php
set_transient( $transient, $value, $expiration );
- $transient (string) (обязательный) — имя транзиента. Должно содержать не более 172 символов.
- $value (mixed) (обязательный) — значение, которое вы хотите сохранить. Должно быть сериализуемым, если не является простым значением.
- $expiration (int) — время жизни транзиента в секундах. По умолчанию — 0 (без срока действия).
Примеры использования
Пример 1: Сохранение результата запроса
Этот пример показывает, как сохранить результат сложного SQL-запроса в транзиент на 12 часов:
set_transient( 'special_query_results', $special_query_results, 12 * HOUR_IN_SECONDS );
Затем вы можете использовать функцию get_transient()
для получения результата.
Пример 2: Сохранение последних 5 постов
Этот пример показывает, как получить последние 5 постов и сохранить результат на один день в транзиенте:
// Выполняем запрос
$latest_post = new WP_Query( array(
'post_type' => 'post',
'posts_per_page' => 5,
'orderby' => 'date',
'order' => 'DESC'
) );
// Сохраняем результаты в транзиент с именем latest_5_posts
set_transient( 'latest_5_posts', $latest_post, DAY_IN_SECONDS );
Вы можете ознакомиться с WP_Query
для получения других параметров при извлечении постов.
Пример 3: Время жизни транзиента
Обратите внимание, что время жизни транзиента можно изменить, указав третий параметр только после истечения времени жизни.
Если вы используете функцию для обновления существующего транзиента, который ещё не истёк, то отсутствие третьего параметра (параметра времени жизни) сохранит текущее время истечения.
Пример:
$initial = time();
set_transient( 'foo', 'bar', 300 ); // Устанавливаем на 5 минут
sleep( 10 );
$update = time();
set_transient( 'foo', 'barbar' ); // Обновление без указания времени жизни
// Время истечения останется прежним
Будьте внимательны, так как вы можете случайно установить транзиент так, что он никогда не истечёт, если повтора вызова произойдёт без указания третьего параметра.
Изменения в версии
Функция set_transient()
была введена в версии 2.8.0.
Код функции
Ниже приведён исходный код функции set_transient()
:
function set_transient( $transient, $value, $expiration = 0 ) {
$expiration = (int) $expiration;
$value = apply_filters( "pre_settransient{$transient}", $value, $expiration, $transient );
$expiration = apply_filters( "expiration_oftransient{$transient}", $expiration, $value, $transient );
if ( wp_using_ext_object_cache() || wp_installing() ) {
$result = wp_cache_set( $transient, $value, 'transient', $expiration );
} else {
$transient_timeout = '_transient_timeout_' . $transient;
$transient_option = '_transient_' . $transient;
wp_prime_option_caches( array( $transient_option, $transient_timeout ) );
if ( false === get_option( $transient_option ) ) {
$autoload = true;
if ( $expiration ) {
$autoload = false;
add_option( $transient_timeout, time() + $expiration, '', false );
}
$result = add_option( $transient_option, $value, '', $autoload );
} else {
$update = true;
if ( $expiration ) {
if ( false === get_option( $transient_timeout ) ) {
delete_option( $transient_option );
add_option( $transient_timeout, time() + $expiration, '', false );
$result = add_option( $transient_option, $value, '', false );
$update = false;
} else {
update_option( $transient_timeout, time() + $expiration );
}
}
if ( $update ) {
$result = update_option( $transient_option, $value );
}
}
}
if ( $result ) {
do_action( "set_transient_{$transient}", $value, $expiration, $transient );
do_action( 'setted_transient', $transient, $value, $expiration );
}
return $result;
}
Связанные функции
delete_expired_transients()
delete_transient()
get_site_transient()
get_transient()
set_site_transient()