瞬态

概述

本页包含以下技术文档WordPress瞬态API,它提供了一种简单、标准化的方法,通过为缓存数据指定一个自定义名称和一个时间段,在该时间段之后,缓存数据将过期并被删除,从而在数据库中临时存储缓存数据。

Transients API与选项API但添加了过期时间的功能,简化了使用wp_选项临时存储缓存信息的数据库表。

请注意,“site_”功能基本上与对应功能相同,但在使用WordPress时可以在网络范围内工作多点会议.

另外值得注意的是,Transients天生就是通过缓存插件来加速的,而普通的Options则不然。A类memcached(内存缓存)例如,插件可以使WordPress将瞬态值存储在快速内存中,而不是存储在数据库中。因此,应使用瞬态来存储任何预期到期或随时可能到期的数据。也不应假设瞬态数据存在于数据库中,因为它们可能根本不存储在数据库中。

此外,瞬态可能在到期时间之前不可用。就像缓存一样,如果瞬态不可用,代码应该有一个回退方法来重新生成数据。

Ryan McCue在:

每个人似乎都误解了暂时过期是如何工作的,所以它的长短是:暂时过期时间是最长的时间。没有最低年龄。瞬态可能会在设置后的一秒钟或24小时内消失,但在过期后它们将永远不会出现。

本文的目标读者包括WordPress主题作者、插件作者以及需要缓存特定数据但希望在给定时间内刷新数据的任何人。本文档假设您对PHP脚本有基本的了解。

函数参考

设置/获取瞬态:

删除瞬态:

使用瞬态

保存瞬态

要保存您使用的瞬态set_transient():

set_transient($transient,$value,$expiration);
  • $瞬态(字符串):瞬态名称。
    预期不是SQL转义的。长度必须不超过172个字符。
  • 价值$(数组|对象):要保存的数据,可以是常规变量,也可以是数组/对象。
    该API将为您处理复杂数据的序列化。
  • $过期(integer):刷新前保留数据的最长秒数。
    瞬态可能在$过期(由于外部对象缓存或数据库升级),但在$expiration之后将永远不会返回其值。

例如,要保存$special_query_results对象12小时后,您将执行以下操作:

set_transient('特殊查询结果',$special_query_results,60*60*12);

使用时间常数

WordPress 3.5版,引入了几个常数以方便表示时间:

MINUTE_IN_SECONDS=60(秒)小时_秒=60*分钟_秒天_秒=24*小时_秒周_秒=7*天_秒MONTH_IN_SECONDS=30*天_IN_SEANDS年_秒=365*天_秒

例如,上面的代码示例可以简化为:

set_transient('特殊查询结果',$special_query_results,12*HOUR_IN_SECONDS);

获取瞬态

要获得保存的瞬态,请使用获取瞬态():

get_transient($transient);

$瞬态:保存瞬态时使用的唯一slugset_transient().

在我们的示例中,可以使用以下命令获取特殊查询结果:

get_transient('特殊查询结果');

如果瞬态不存在或已过期,则获取瞬态()将返回。应使用标识运算符进行检查===而不是普通的等式运算符==,因为0的整数值(或其他“空”/“假”数据)可能是您要存储的数据。由于这个“false”值,不应该使用transients来保存纯布尔值(true/false)。将它们放入数组中,或者将它们转换为整数。

示例用法:

if(false===($value=gettransient(“value”)){//此代码在没有有效的瞬态集时运行}

上述代码将获取瞬态并将其放入价值$。if块中的代码仅在没有有效的瞬态时运行。这通常是一种通过其他方式重新生成瞬态值的方法。请记住,在正常到期时间之前,可能会出现暂时不可用的情况。

删除保存的瞬态

自上次运行以来,一旦$expiration秒过去,我们的瞬变将自然死亡set_transient(),但我们可以通过手动删除它来迫使瞬态提前结束。当给定的活动(保存帖子、添加类别等)将使缓存的数据固有过时并需要更新时,这很有用。

delete_transian($transian);

$瞬态:与一起保存时使用的唯一名称set_transient().

显然,在我们的案例中,这将是:

delete_transient('特殊查询结果');

WordPress不经常清除过期的瞬态。为了防止过期的瞬变在数据库中累积,在完成且不再需要瞬变后,总是删除它是一种好做法。

完整示例

把这些放在一起就是一个如何在代码中使用瞬态的例子。

<?php(电话)//获取瞬态数据的任何现有副本if(false===($special_query_results=get_transient('specialquery_results')){//它不在那里,所以重新生成数据并保存瞬态$special_query_results=新WP_query('cat=5&order=random&tag=tech&post_meta_key=thumbnail');set_transient('特殊查询结果',$special_query_results,12*HOUR_IN_SECONDS);}//像往常一样使用数据。。。?>

以及使用的示例删除瞬态()。在这种情况下,我们将向编辑_术语action,它将在每次编辑类别或标记时运行(即,我们假设编辑术语会使数据无效,我们希望删除缓存的版本)。

<?php(电话)//创建一个简单的函数来删除瞬态函数edit_term_delete_transient(){delete_transient('特殊查询结果');}//将函数添加到edit_term挂钩,以便在编辑类别/标记时运行add_action('编辑项','编辑项删除瞬态');?>

使用瞬态WP_查询要检索“特色帖子”:

<?php(电话)//检查瞬态。如果没有,则执行WP_Queryif(false===($feature=gettransient('foo_featuredposts')){$featured=新WP_Query(阵列(“category”=>“featured”,“posts_per_page”=>5));//将结果放入瞬态。12小时后过期。set_transient(“foo_featured_posts”,$featured,12*HOUR_IN_SECONDS);}?>//正常运行循环<?php if($featured->have_posts()):?><?php while($featured->have_posts()):$feature->the_post();?>//找到特色帖子,做些事情<?php endwhile;?><?php其他:?>//找不到特色帖子<?php-endif;?><?php wp_reset_postdata();?>

在插件和主题中使用瞬态很简单,只增加了几行额外的代码,但如果在正确的情况下使用(长时间/昂贵的数据库查询或复杂的处理数据),它可以节省站点的加载时间。