WordPress как на ладони
wordpress jino

set_transient() WP 2.8

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

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

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

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

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

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

Хуки из функции:
Возвращает

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

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

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

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

Если указать 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

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

<?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)

set_transient 2 комментария
  • Otshelnik-fm182 cайт: across-ocean.otshelnik-fm.ru

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

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

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

    Ответить3.5 года назад #
    • Kama4464

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

      Ответить3.5 года назад #

Здравствуйте, !

Ваш комментарий