虽然您的两种选择(即使用瞬态或使用cron作业)都是可行的,但我非常喜欢使用瞬态,除非数据集非常大或需要自动化该过程。
如果看不到当前的大部分代码,很难给出一个有效的示例。尽管如此,如果你最终走的是瞬变路线,我建议你这样做:
// Now, check to see if the value is in the cache...
if( !( $our_data = get_transient($key) ) ) {
// If not, then we\'ll check the user meta...
if( !($our_data = get_user_meta($user_id, $key, true)) ) {
// If not there, we create it and store it.
$our_data = \'our data\';
update_user_meta($user_id, $key, $our_data);
} // end if
// And we unconditionally update the cache with an expiration of 1 day
set_transient($key, $our_data, (60 * 60 * 24) );
} // end if
一般来说,上述代码将执行以下操作:
检查缓存以查看该值是否存在。如果找到该值,则不会执行任何其他操作;但是,缓存将在24小时后过期,因此最终将返回null。
如果值不在缓存中,那么我们检查用户的元数据。如果它在那里,我们就使用它;否则,我们将手动创建它,然后更新用户元。如果从未创建过用户元,WordPress将在运行update_user_meta
作用
最后,我们无条件地使用元表中的数据或手动创建的数据更新缓存。
上述代码的唯一问题是,如果用户元永远不会更新,因为上述函数使用的是那里的内容,并且只有当它为null时才会更新。为了缓解这种情况,我希望:
代码库中其他地方的另一个函数正在更新用户值,您引入了另一个条件来触发更新函数例如:
// Contrived. This could be a query, the result of another function, etc.
$user_should_be_updated = true;
if( $user_should_be_updated || !( $our_data = get_user_meta($user_id, $key, true) ) ) {
/* Create the data, update the user */
} // end if
Manny\'s comment 还提供了一些很好的见解,因此也不要忽视关于该特定问题的答案。