当前浏览:首页 / WordPress函数 / set_transient()

set_transient( string $transient, mixed $value, int $expiration )

设置/更新瞬态的值

setmore...


描述

您不需要序列化值。如果需要序列化该值,则将在设置该值之前对其进行序列化。


参数

$transient

(string)(必填) 瞬态名称。预期不会进行SQL转义。长度必须小于等于172个字符。

$value

(mixed)(必填) 瞬态值。如果不是标量,则必须是可序列化的。预期不会进行SQL转义。

$expiration

(int)(可选) 过期时间(秒)。默认值为0(无过期)。


返回

(bool) 如果设置了该值,则为true,否则为false。


更多信息

对于参数$transient,如果未启用memcached,则名称的长度应为172个字符或更少,因为WordPress将在选项表中用“_transient_”或“_transient_timeout_”作为名称的前缀(取决于它是否过期)。较长的键名将自动失败。见Trac#15058

如果存在瞬态,此函数将更新瞬态的过期时间。

注意:从不过期的瞬变是自动加载的,而具有过期时间的瞬变不是自动加载的。在添加可能不需要在每个页面上添加的瞬态时,请考虑这一点,因此不需要自动加载,从而影响页面性能。

WordPress提供了一些以秒为单位指定时间的常量。请参见Transients_API#Using_Time_Constants,而不是将整数相乘。

由于wp_options表中的数据库模式(option_name: varchar(191))的原因,键名限制为191个字符。

在4.4之前的WordPress版本中,长度限制在set_transient(现在为172)中为45,在数据库中为64(现在为191)。



源码

查看源码 官方文档


更新日志

版本描述
2.8.0开始引入

使用示例

  • 示例1

    除非使用外部对象缓存,否则当使用set_transient()更新具有现有过期的现有瞬态时,不提供过期值将保持现有过期。

    例如:

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

    在这种情况下,过期将保持为$initial + 300(并且不会更改为$update + 300,或者永不过期),因为第二次set_transient()调用不包括$expiration值(仅更新瞬态的值)。

    但是要小心,因为如果瞬态在第二次调用(没有$expiration参数)之前过期,您可能会无意中将其设置为永不过期。

  • 示例2

    这个例子展示了如何使用最新的五篇博客文章设置一个瞬态,一天后到期。
    它使用时间常数来设置过期时间。

    // Set the arguments for the custom query
    $args = array(
        'post_type'      => 'post',
        'posts_per_page' => 5,
        'orderby'        => 'date',
        'order'          => 'DESC'
    );
    $latest_post = new WP_Query( $args );
    
    // Save the results in a transient named latest_5_posts
    set_transient( 'latest_5_posts', $latest_post, DAY_IN_SECONDS );
    

    要了解有关如何获取文章和自定义文章类型项的更多信息,请阅读WP_Query的文档。

  • 示例3

    保存$special_query_results对象12小时

    set_transient( 'special_query_results', $special_query_results, 12 * HOUR_IN_SECONDS );
    
  • 示例4

    WordPress以UNIX时间戳的形式保存瞬态过期时间。当你寻找

    _transient_timeout_{$transient}

    选项名称在WordPress的选项表中,看起来像1636453079,它是UNIX时间戳,而不是秒。
    查看GitHub上的代码