缓存

概述

此页面包含WordPress Transients API的技术文档 ,它提供了一种简单且标准化的方法来临时将缓存数据存储在数据库中,方法是给它一个自定义名称和一个时间范围,在该时间范围之后它会过期并被删除。

Transients API 与 Options API非常相似 ,但增加了过期时间功能,这简化了使用 wp_options 数据库表临时存储缓存信息的过程。

什么是 WordPress Transients?

Transients 是一个 WordPress 缓存 API,用于缓存任何使用频率很高但加载很慢/耗时的数据。这些数据可能来自外部 API,数据库或其他操作。

与其他缓存方式相比,Transients 具有以下优点:

  • 能存储在数据库或文件系统中,因此不需要额外的服务器或内存存储。
  • 可以设置到期时间,以便在数据过期后自动重新加载。
  • 具有内置的非常规过期机制,以便在数据未过期但需要更新的情况下,可以规定模板无需处理完整的数据。
  • 具有易于使用的 API,可以在需要时随时设置和访问Transients。
  • 不需要使用额外的缓存插件。

如何使用 WordPress Transients?

下面我们将通过代码演示介绍 WordPress Transients 的使用。

1. 设置 Transients

下面是使用 set_transient() 函数将数据存储为 Transients:

$value = 'Hello, world!';
$expiration = 60 * 60; // 60 minutes
set_transient( 'hello_world', $value, $expiration );

在上面的例子中,我们将一个字符串 'Hello, world!' 存储在了 Transients 中,并规定其过期时间为一小时。在这段时间内,每次调用 get_transient() 时,该值都会从 Transients 中获取,而不是从源载入。

2. 获取 Transients

下面是使用 get_transient() 函数从 Transients 获取数据的演示代码:

$value = get_transient( 'hello_world' );
if ( false === $value ) {
    $value = 'Something else…';
}
echo $value;

在上面的例子中,我们尝试从 Transients 中获取缓存的 'Hello, world!' 值。如果值不存在或已过期,则获取一个默认值 'Something else…'。

3. 删除 Transients

你可以使用 delete_transient() 函数删除 Transients:

delete_transient( 'hello_world' );

在上面的例子中,我们删除了之前设置的 'Hello, world!' Transients。

总结

WordPress Transients API 可以存储那些在使用频率高但在博客的数据库或源中较慢的数据,它可以显著提高网站性能。我们希望以上代码演示可以帮助您理解 WordPress Transients API。

功能参考

设置/获取缓存:

删除缓存:

使用缓存

保存缓存

要保存您使用的缓存 set_transient()

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

因此,例如要将$special_query_results对象保存 12 小时,您可以这样做:

set_transient( 'special_query_results', $special_query_results, 60*60*12 );

使用时间常数

在 WordPress 3.5中,引入了几个常量来方便地表示时间:

MINUTE_IN_SECONDS  = 60 (seconds)
HOUR_IN_SECONDS    = 60 * MINUTE_IN_SECONDS
DAY_IN_SECONDS     = 24 * HOUR_IN_SECONDS
WEEK_IN_SECONDS    = 7 * DAY_IN_SECONDS
MONTH_IN_SECONDS   = 30 * DAY_IN_SECONDS
YEAR_IN_SECONDS    = 365 * DAY_IN_SECONDS

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

set_transient( 'special_query_results', $special_query_results, 12 * HOUR_IN_SECONDS );

获取缓存

要获得保存的缓存,您可以使用 get_transient() :

get_transient( $transient );

$transient:保存缓存时使用的独特 slug  set_transient()

在我们的例子中,我们可以通过以下方式获取我们的特殊查询结果:

get_transient( 'special_query_results' );

如果 transient 不存在或已过期,则将 get_transient() 返回 false. 这应该使用身份运算符===而不是普通的相等运算符来检查==,因为零整数值(或其他“空”/“假”数据)可能是您要存储的数据。由于这个“假”值,缓存不应该被用来保存普通的布尔值(真/假)。将它们放入数组或将它们转换为整数。

用法示例:

if ( false === ( $value = get_transient( 'value' ) ) ) {
	// this code runs when there is no valid transient set
}

上面的代码将获取缓存并将其放入 $value. if 块中的代码仅在没有有效缓存可获取时运行。这通常是一种通过其他方式重新生成缓存值的方法。请记住,缓存有可能在正常到期时间之前不可用。

删除保存的缓存

一旦我们上次运行 $expiration 秒后,我们的缓存将自然地老死 set_transient(),但我们可以通过手动删除它来强制缓存提前结束。这在给定活动(保存帖子、添加类别等)会使缓存数据本质上过时并需要更新时很有用。

delete_transient( $transient );

$transient: 保存时使用的唯一名称 set_transient()

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

delete_transient( 'special_query_results' );

WordPress 很少清除过期的缓存。为防止过期的缓存在数据库中累积,一个好习惯是在你用完它并且不再需要它后始终删除它。

完整示例

将它们放在一起是一个如何在代码中使用缓存的示例。

<?php
// Get any existing copy of our transient data
if ( false === ( $special_query_results = get_transient( 'special_query_results' ) ) ) {
	// It wasn't there, so regenerate the data and save the transient
	$special_query_results = new WP_Query( 'cat=5&order=random&tag=tech&post_meta_key=thumbnail' );
	set_transient( 'special_query_results', $special_query_results, 12 * HOUR_IN_SECONDS );
}
// Use the data like you would have normally...
?>

和一个使用的例子 delete_transient()。在这种情况下,我们将向操作添加一个函数 edit_term ,该函数将在每次编辑类别或标签时运行(即我们假设编辑术语会使我们的数据无效,并且我们希望删除缓存的版本)。

<?php
// Create a simple function to delete our transient
function edit_term_delete_transient() {
	delete_transient( 'special_query_results' );
}
// Add the function to the edit_term hook so it runs when categories/tags are edited
add_action( 'edit_term', 'edit_term_delete_transient' );
?>

将缓存与 WP_Query一起使用 以检索“精选帖子”:

<?php 
// Check for transient. If none, then execute WP_Query
if ( false === ( $featured = get_transient( 'foo_featured_posts' ) ) ) {
	$featured = new WP_Query(
		array(
			'category' => 'featured',
			'posts_per_page' => 5
		)
	);

	// Put the results in a transient. Expire after 12 hours.
	set_transient( 'foo_featured_posts', $featured, 12 * HOUR_IN_SECONDS );
}
?>
 
// Run the loop as normal
<?php if ( $featured->have_posts() ) : ?>
	<?php while ( $featured->have_posts() ) : $featured->the_post(); ?>
		// featured posts found, do stuff
	<?php endwhile; ?>
<?php else: ?>
	// no featured posts found
<?php endif; ?>
<?php wp_reset_postdata(); ?>

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