WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

set_transient() WP 2.8

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

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

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

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

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

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

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

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

Возвращает

Логическое значение: true, если временная опция была сохранена и false в противном случае.

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

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

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

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

Примеры

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

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

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

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

Заметки

  1. В 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

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

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

Код set transient: wp-includes/option.php WP 5.2.4

<?php
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() ) {
		$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;
}

Cвязанные функции

Из раздела: Временные опции (transients)

4 коммента
  • Otshelnik-fm213 otshelnik-fm.ru

    Удобная штука - например когда мы получаем случайный список новостей - Это тяжелый запрос, а закешировав его на 12 часов - облегчим задачу.

    Где-то читал что для получения твитов, чтобы каждый раз не обращаться на сайт твиттера - можно закешировать запрос на время, а потом из своей бд его дергать.

    Есть еще идеи?

    1
    Ответить5.5 лет назад #
    • Kama7631

      Для твитов хорошая идея. Фиды тоже туда кэшируются вроде.

      1
      Ответить5.5 лет назад #
  • Dimon

    По истечении срока давности _transient_ сами удаляться из wp_options или нужно отдельную функцию для этого писать?

    Ответить11 мес назад #
    • Kama7631

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

      1
      Ответить11 мес назад #
Здравствуйте, !     Войти . Зарегистрироваться