这是一个很好的用例Transients 或者Object Cache. 使用哪种方法取决于您是需要对每个请求执行此查询/检查,还是只需要每小时/天/周执行一次,等等。
对于这两个选项,将首先创建一个单独的函数来执行检查并返回结果数。然后在每个钩子回调中使用此函数来确定执行的输出/操作(如您所说)。
function wpse_344520_count_user_posts() {
$user_id = get_current_user_id();
$query = new WP_Query(
[
// etc.
]
);
$count = $query->found_posts;
return $count;
}
add_action(
\'manage_users_columns\',
function() {
$count = wpse_344520_count_user_posts();
if ( $count > 0 ) {
// Do something.
}
}
);
add_action(
\'admin_head\',
function() {
$count = wpse_344520_count_user_posts();
if ( $count > 0 ) {
// Do something.
}
}
);
// etc.
诀窍在于,在这个函数中,您应该检查查询是否已经执行,如果存在,则返回现有结果。您可以使用瞬态或对象缓存作为存储机制,具体取决于您的需求。
对象缓存verson如下所示:
function wpse_344520_count_user_posts() {
// Check if we\'ve cached a result.
$count = wp_cache_get( \'wpse_344520_count\', $user_id );
// If we have...
if ( false !== $count ) { // Must be strict comparison so we can store 0 if necessary.
// ...return it.
return $count;
}
// Otherwise perform the query...
$user_id = get_current_user_id();
$query = new WP_Query(
[
// etc.
]
);
$count = $query->found_posts;
// ..cache the result...
wp_cache_set( \'wpse_344520_count\', $count, $user_id );
// ...and return it.
return $count;
}
现在查询只运行一次,后续调用
wpse_344520_count_user_posts()
将使用缓存的结果。
transient方法类似,但将其结果保存在数据库中,这样可以在多个单独的请求上缓存结果。如果不需要精确到第二秒的结果,请使用此方法:
function wpse_344520_count_user_posts() {
$user_id = get_current_user_id();
// Check if we\'ve cached a result.
$count = get_transient( \'wpse_344520_count_\' . $user_id );
// If we have...
if ( $count !== false ) { // Must be strict comparison so we can store 0 if necessary.
// ...return it.
return $count;
}
// Otherwise perform the query...
$query = new WP_Query(
[
// etc.
]
);
$count = $query->found_posts;
// ..and cache the result...
set_transient( \'wpse_344520_count_\' . $user_id, $count, HOUR_IN_SECONDS );
// ...then return it.
return $count;
}
正如你所看到的,这非常相似。唯一的区别是:
我们使用get_transient()
和set_transient()
而不是wp_cache_get()
和wp_cache_set()
.我们使用用户ID作为临时名称的一部分,以确保为每个用户分别存储该值。这是必要的,因为瞬态不像对象缓存那样支持“组”我们要经过一定的秒数才能缓存该值set_transient()
. 在我的示例中,我使用了built in constants 将时间设置为一小时