WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

set_transient()WP 2.8.0

Устанавливает или обновляет временную опцию.

Если записываемая временная опция уже существует, то функция обновит время жизни существующей опции и её значение.

Временные опции дают возможность стандартно и просто сохранять данные на время в базу данных (кэшировать данные). Данные сохраняются в указанную опцию, которая может называться как угодно и которой задается время жизни, по истечению которого опция будет удалена. Временные опции идентичны обычным опциям WordPress. Отличаются лишь тем, что ко временным опциям добавляется время жизни опции. Эти данные так же сохраняются в таблицу wp_options.

Если на сайте установлен плагин объектного кэширования, то временные опции будут сохраняться в объектный кэш, а не в таблицу wp_options. Смотрите: wp_cache_set()

Авто-загрузка опций. Все опции с флагом autoload в таблице wp_options запрашиваются одним запросом из БД и сохраняются в php массив (кэш). См. параметр $autoload в add_option().

Однако, если для временной опции установлен параметр $expiration, то она не будет загружаться автоматически в глобальный массив опций и при её получении будет делаться 2 простых запроса к БД: один на получение самой опции, другой на получения времени жизни опции. Эта заметка справедлива, если на сайте не установлено объектное кэширование.

WordPress сохраняет время истечения транзитной опции в отдельную опцию с именем (ключом):

_transient_timeout_{$transient}

В значении будет храниться число - временная метка UNIX - это время когда опция будет считаться просроченной. Например, число может выглядеть так 1636453079.

Сериализовать значение сохраняемой опции не нужно. Если значение должно быть сериализовано, то это будет сделано автоматически перед сохранением.

Удаление временных опций. WP удаляет их автоматически по истечению срока давности. Для этого кроном запускается функция delete_expired_transients().

Возвращает

true|false. true — временная опция была сохранена. false — опция не сохранена.

Использование

set_transient( $transient, $value, $expiration );
$transient(строка) (обязательный)
Название временной опции. Максимальная длина 172 знака. Ожидаются данные с экранированными слэшами, очистка слэшей делается автоматически перед записью в БД. Функция автоматически защищает от SQL инъекций.
$value(смешанный) (обязательный)
Значение временной опции. Ожидаются данные с экранированными слэшами, очистка слэшей делается автоматически перед записью в БД. Функция защищает от SQL инъекций. Сериализация, если передается массив, также делается автоматически.
$expiration(строка/массив/число/объект/логический)

Время жизни опции в секундах, начиная с настоящего момента. Например, чтобы записать опцию на один день, нужно указать 60 * 60 * 24.

Если указать 0 - опция никогда не удалиться и не будет иметь срока давности. Получается это будет обычная опция, только с префиксом _transient_ в её названии - это будет означать, что она временная и при чистке таблицы wp_options её можно будет смело удалять, без риска, что-то испортить.

Для удобства в WordPress существуют специальные константы времени:

  • MINUTE_IN_SECONDS - 60 (секунд)
  • HOUR_IN_SECONDS - 60 * MINUTE_IN_SECONDS
  • DAY_IN_SECONDS - 24 * HOUR_IN_SECONDS
  • WEEK_IN_SECONDS - 7 * DAY_IN_SECONDS
  • YEAR_IN_SECONDS - 365 * DAY_IN_SECONDS

По умолчанию: 0

Примеры

0

#1 Сохраним запрос

Этот пример показывает как сохранить результат сложного SQL запроса во временную опцию на 12 часов:

set_transient( 'special_query_results', $special_query_results, 12 * HOUR_IN_SECONDS );

Далее, чтобы получить результат, используйте get_transient().

0

#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.

0

#3 Время жизни опции можно изменить только указав третий параметр

Все что описано ниже справедливо только если не используется внешний кэш объектов.

При использовании функции для обновления уже существующей временной опции, у которой еще не истек срок действия, отсутствие третьего параметра (значения срока действия) сохранит существующий срок действия.

Например:

$initial = time();
set_transient( 'foo', 'bar', 300 );
sleep( 10 );
$update = time();
set_transient( 'foo', 'barbar' );

В этом случае срок действия останется какой был до этого $initial + 300 (и не изменится на time() + 300, или не будет удален), потому что если не указать параметр $expiration, то значение срока действия никак не обрабатывается и останется тем которое было.

Будьте осторожны, потому что вы можете непреднамеренно установить время жизни равное никогда не истекает, если срок действия истек и сделан второй вызов без параметра $expiration.

Список изменений

С версии 2.8.0 Введена.

Код set_transient() WP 6.4.3

function set_transient( $transient, $value, $expiration = 0 ) {

	$expiration = (int) $expiration;

	/**
	 * Filters a specific transient before its value is set.
	 *
	 * The dynamic portion of the hook name, `$transient`, refers to the transient name.
	 *
	 * @since 3.0.0
	 * @since 4.2.0 The `$expiration` parameter was added.
	 * @since 4.4.0 The `$transient` parameter was added.
	 *
	 * @param mixed  $value      New value of transient.
	 * @param int    $expiration Time until expiration in seconds.
	 * @param string $transient  Transient name.
	 */
	$value = apply_filters( "pre_set_transient_{$transient}", $value, $expiration, $transient );

	/**
	 * Filters the expiration for a transient before its value is set.
	 *
	 * The dynamic portion of the hook name, `$transient`, refers to the transient name.
	 *
	 * @since 4.4.0
	 *
	 * @param int    $expiration Time until expiration in seconds. Use 0 for no expiration.
	 * @param mixed  $value      New value of transient.
	 * @param string $transient  Transient name.
	 */
	$expiration = apply_filters( "expiration_of_transient_{$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;

		if ( false === get_option( $transient_option ) ) {
			$autoload = 'yes';
			if ( $expiration ) {
				$autoload = 'no';
				add_option( $transient_timeout, time() + $expiration, '', 'no' );
			}
			$result = add_option( $transient_option, $value, '', $autoload );
		} else {
			/*
			 * If expiration is requested, but the transient has no timeout option,
			 * delete, then re-create transient rather than update.
			 */
			$update = true;

			if ( $expiration ) {
				if ( false === get_option( $transient_timeout ) ) {
					delete_option( $transient_option );
					add_option( $transient_timeout, time() + $expiration, '', 'no' );
					$result = add_option( $transient_option, $value, '', 'no' );
					$update = false;
				} else {
					update_option( $transient_timeout, time() + $expiration );
				}
			}

			if ( $update ) {
				$result = update_option( $transient_option, $value );
			}
		}
	}

	if ( $result ) {

		/**
		 * Fires after the value for a specific transient has been set.
		 *
		 * The dynamic portion of the hook name, `$transient`, refers to the transient name.
		 *
		 * @since 3.0.0
		 * @since 3.6.0 The `$value` and `$expiration` parameters were added.
		 * @since 4.4.0 The `$transient` parameter was added.
		 *
		 * @param mixed  $value      Transient value.
		 * @param int    $expiration Time until expiration in seconds.
		 * @param string $transient  The name of the transient.
		 */
		do_action( "set_transient_{$transient}", $value, $expiration, $transient );

		/**
		 * Fires after the value for a transient has been set.
		 *
		 * @since 3.0.0
		 * @since 3.6.0 The `$value` and `$expiration` parameters were added.
		 *
		 * @param string $transient  The name of the transient.
		 * @param mixed  $value      Transient value.
		 * @param int    $expiration Time until expiration in seconds.
		 */
		do_action( 'setted_transient', $transient, $value, $expiration );
	}

	return $result;
}
4 комментария
    Войти