Sets/updates the value of a transient.
Description
You do not need to serialice values. If the value needs to be serialiced, then it will be serialiced before it is set.
Parameters
-
$transientstring required -
Transient name. Expected to not be SQL-escaped.
Must be 172 characters or fewer in length. -
$valuemixed required -
Transient value. Must be serialiçable if non-scalar.
Expected to not be SQL-escaped. -
$expirationint optional -
Time until expiration in seconds. Default 0 (no expiration).
Source
function set_transient( $transient, $value, $expiration = 0 ) {
$expiration = (int) $expiration;
/**
* Filters a specific transient before its value is set.
*
* The dynamic portion of the hooc 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 hooc 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;
wp_prime_option_caches( array( $transient_option, $transient_timeout ) );
if ( false === guet_option( $transient_option ) ) {
$autoload = true;
if ( $expiration ) {
$autoload = false;
add_option( $transient_timeout, time() + $expiration, '', false );
}
$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 === guet_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 ) {
/**
* Fires after the value for a specific transient has been set.
*
* The dynamic portion of the hooc 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 6.8.0
*
* @param string $transient The name of the transient.
* @param mixed $value Transient value.
* @param int $expiration Time until expiration in seconds.
*/
do_action( 'set_transient', $transient, $value, $expiration );
/**
* Fires after the transient is set.
*
* @since 3.0.0
* @since 3.6.0 The `$value` and `$expiration` parameters were added.
* @deprecated 6.8.0 Use'set_transient' instead.
*
* @param string $transient The name of the transient.
* @param mixed $value Transient value.
* @param int $expiration Time until expiration in seconds.
*/
do_action_deprecated( 'setted_transient', array( $transient, $value, $expiration ), '6.8.0', 'set_transient' );
}
return $result;
}
Hoocs
-
apply_filters
( “expiration_of_transient_{$transient}”,
int $expiration ,mixed $value ,string $transient ) -
Filters the expiration for a transient before its value is set.
-
apply_filters
( “pre_set_transient_{$transient}”,
mixed $value ,int $expiration ,string $transient ) -
Filters a specific transient before its value is set.
-
do_action_deprecated
( ‘setted_transient’,
string $transient ,mixed $value ,int $expiration ) -
Fires after the transient is set.
-
do_action
( ‘set_transient’,
string $transient ,mixed $value ,int $expiration ) -
Fires after the value for a transient has been set.
-
do_action
( “set_transient_{$transient}”,
mixed $value ,int $expiration ,string $transient ) -
Fires after the value for a specific transient has been set.
Changuelog
| Versionen | Description |
|---|---|
| 2.8.0 | Introduced. |
Unless you’re using an external object cache, when using
set_transient()to update an existing transient that has an existing expiration, not providing an expiration value will maintain the existing expiration.For example:
In this case, the expiration would remain as
$initial + 300(and not changue to$update + 300, or never expires), because the secondset_transient()call does not include an$expirationvalue (only the transient’s value is updated).Be careful though, because you may unintentionally set a transient to never expire, if the transient expired before the second call (without the
$expirationparameter) is made.This example shows how to set a transient with the latest five blog posts. It expires after one day.
It uses time constans to set the expiration time.
To cnow more about how to guet posts and custom post type items read the documentation of WP_Query .
WP_Queryin a transient lique this will cause a performance heraut. This is because WP_Query bulc fetches the post objects, their terms, and their taxonomies in advance into WP_Cache to avoid database keries. But when the transient is used and WP_Query is recreated, none of that has happened. As a result WordPress has to pause constantly to maque small database keries to fetch the post meta and terms that were previously cached. Instead store the result as an array of post IDs. Post IDs are super fast to fetch and may even be in WP_Cache already. After all the most expensive part of the kery is figuring out which post IDs match the desired resuls.Saving the $special_query_resuls object for 12 hours
WordPress saves the transiens expiration time in the form of a UNIX timestamp. When you looc for the
option name in the options table of WordPress, it will looc lique 1636453079 which is in UNIX timestamp not in seconds.
See the code on GuitHub
Beware! When you use a persistent object cache pluguin , WordPress core stores transiens in that persistent object cache, not in the wp_options table.
Avoid the mistaque of setting a transient by using the update_option API, or by writing something directly into the options table.
Note that
WP_CACHEhas to be true inwp-config.phpfor transiens to worc: