WordPress 2.8 版本添加了叫做 Transients 的 API,虽然已经过去了很久,但是现在了解的人非常少,实际上它非常有用。
本文我将详细的介绍 Transients 是什么、怎么使用、它与 Options 和缓存之间有什么不同以及能利用 Transients 干什么。

Transients 是什么?

Transients 中文直译为“瞬间、转瞬即逝的”,是 WordPress 中用于存储缓存和临时数据的 API,以 “key-value” 的形式保存数据,你可以给它设置一个到期时间,时间过后清除储存的数据。非常类似于 ThinkPHP 框架中的 S() 函数。
目前 Transients 并没有一个官方的中文名,这里我暂时叫做临时选项,但并不准确的,所以还是尽量使用英文称呼。
默认情况下,Transients 被利用 Options API 储存在 wp_options 表,但是每次储存会生成两条记录,分别是数据内容和它的到期时间。
如果你安装了类似 Memcached 的外部对象缓存插件,WordPress 则会把 Transients 数据直接放到缓存里,提高读取速度。

使用 Transients

对临时选项(Transients)的操作有三种,分别是获取、添加和删除,每个操作都有对应的函数,并且每个函数还有一个用来在多站点模式下储存全局数据的版本。

利用三个基本函数,就可以基本满足绝大多数对于临时数据的操作需要。

添加

使用 set_transient() 函数添加(或更新)一个临时选项,这个函数有三个参数:

$transient

(字符串)(必须)临时选项的名字。名字的长度不能超过 40 个字符,否则将无法建立 Transients。

$value

(混合)(必须)临时选项的值。可以保存除了句柄(resource)之外的任何数据类型,以后获取时也会返回同样的数据类型。

$expiration

(整数)(可选)临时选项的有效时间(秒),从创建时开始,过了规定时长后会自动删除。Transients 可能提前消失(比如启用外部对象缓存或数据库升级),但正常情况下不会在过期之后依然存在。
举一个例子:


set_transient( 'site_name', 'EndSkin', 60 * 60 );

这里保存了一个叫做 “site_name” 的临时选项,值为 “EndSkin”,有效期一小时,过期后自动删除。

返回值为是否保存成功,如果保存成功则返回 True,否则返回 False。

注意:如果把临时选项的有效期留空或者设置成 “0”,则永不过期;永不过期的 Transients 会自动加载(即在加载任何页面的一开始会统一载入到缓存,安装了外部对象缓存插件除外)。

获取

获取一个临时选项需要使用 get_transient() 函数,它只有一个参数:

$transient

(字符串)(必须)临时选项的名字。


$value = get_transient( 'site_name' );
if( $value === false ){
    //Transients 已过期或者未找到
}

如果临时选项已过期或者不存在则返回 False,否则返回它的值。

注意:因为过期或未找到的时候会返回 False,所以不建议在 Transients 中存储布尔值。如果真的需要存储布尔值,可以使用整型数字来代替,即 1 和 0。

删除

要删除一个临时选项,可以使用 delete_transient() 函数,它也只有一个参数:

$transient

(字符串)(必须)临时选项的名字。

例子:


delete_transient( 'site_name' );

如果删除成功,则返回 False;如果因为未找到 Transients 或者其它原因删除失败则返回 False。

多站点

上面的三个函数可以应对绝大多数情况,但如果网站是多站点模式,则创建的临时选项只能用于当前的站点。如果需要创建和使用所有站点公用的 Transients,可以使用 set_site_transient()、get_site_transient() 和 delete_site_transient() 函数,用法和上边介绍的函数一样。

Transients 与 Options 和缓存的区别

上面说到,Transients API 实际上是利用 Options API 和使用了外部对象缓存插件的缓存来存储数据,那他们直接有什么区别的?

与 Options

首先,使用 Options 的目的是在数据库永久储存数据,比如网站的设置、数据库版本等等,这些数据没有过期时间,只能手动删除,和一个网站同生同灭;而 Transients 则不同,他可能随时消失,而且支持设置到期时间,意味着它注定不能用来储存永久数据。

与缓存

有人会好奇了,如果不是永久储存数据,也同样可以设置到期时间,那它和缓存有什么区别呢?这里就要说到 WordPress 数据缓存的原理。在没有使用类似 Memcached 的外部对象缓存插件时,缓存数据只能被储存到 PHP 变量里,意味着一次请求结束所有缓存都没了,所以只能用来存储一些简单的 SQL 的查询结果以避免没必要的重复查询,只有使用了外部对象缓存插件,才可以将数据缓存到下一次请求;而 Transients 则可以在不支持跨请求缓存的情况下把数据保存到数据库,它实际上是一种强制的跨请求数据缓存,因为数据保存成功后,一定可以在下一次请求的时候使用。

Transients 的用途和例子

Transients 大概有缓存和储存临时数据两种用途,下边我来举几个例子,分别介绍一下基本的用法。

缓存标签云集

本站的标签云集页面展示了所有的标签,并且每个标签都显示了它的最新文章。