每天更新一次密集的wp_Query结果

时间:2017-07-11 作者:Alvin

我正在大量帖子上使用wp\\u query对自定义字段数据进行一些计算,加载结果需要很长时间。这里的一位用户建议我利用wp cron每天运行一次这些计算。

我一直无法理解的是,如果我创建一个包含所有这些代码的操作,将其设置为每天运行一次,并在模板文件中调用此操作,那么这些查询不会在每次加载模板时重新计算吗?

我的预期结果是查询结果显示在模板上,但实际上只有在cron启动时才重新计算。

我觉得这里缺少了一些简单的东西,但我能找到的所有wp cron示例似乎都没有涵盖我的用例。

2 个回复
SO网友:Marek

我正在使用transients 对于这种情况。结果保存到数据库(wp_options 表)设置了过期时间。如果慢加载时间低于某个合理的阈值,它是可用的。。。一个(第一个)访问者需要等待很长时间才能提交请求,其他访问者将看到保存的结果。

$results = get_transient(\'my_results\');

if( ! $results ) {

    $results = my_intensive_calculations(); // etc...

    set_transient( \'my_results\' , $results, DAY_IN_SECONDS );

}

echo $results;
crons有一个缺点-第一个访问者必须等待my_intensive_calculations() 响应(cron请求在后台运行,不阻止页面呈现)。但它的结果将被缓存,其他所有访问者都将尽快看到页面/模板。

SO网友:kero

假设您的代码存在于函数中calculateCityAverages() 返回(不是echo!)您的数据,可能以数组的形式。

要缓存数据,你可以做很多事情,自定义选项,甚至一篇帖子。。我会使用Transients API

Transients API,它提供了一种简单而标准化的方法,通过为缓存数据提供一个自定义名称和一个时间段,在该时间段之后缓存数据将过期并被删除,从而将缓存数据临时存储在数据库中。

将计算函数包装成这样

function getCityAverages($force = FALSE){
    $result = get_transient(\'my_city_averages\');
    // if there is no cached data or we want to refresh cache
    if ($result === FALSE || $force === TRUE) {
        // calculate it
        $result = calculateCityAverages();
        // store it for 12h
        set_transient(\'my_city_averages\', $result, 12 * HOUR_IN_SECONDS);
    }
    return $result;
}
但仍然存在一个问题:对于第一个访问者,或者缓存为空的任何时候,都会有40秒的页面加载。只有在那之后的游客才会从这一过渡中获益。

要避免这种情况,可以加热缓存(cold and warm cache?), 因为这应该在特定的时间间隔和后台进行,所以使用WP-Cron 通过wp_schedule_event().

建议在激活插件时安排事件,因为这通常只应执行一次(当然,计划将运行多次)。

此代码直接来自codex。你只需要打电话getCityAverages(TRUE) (以确保您重新计算它,而不仅仅是从缓存中获取它)。

register_activation_hook(__FILE__, \'my_activation\');

function my_activation() {
    if (! wp_next_scheduled ( \'my_hourly_event\' )) {
    wp_schedule_event(time(), \'hourly\', \'my_hourly_event\');
    }
}

add_action(\'my_hourly_event\', \'do_this_hourly\');

function do_this_hourly() {
    // we don\'t care about the result, just warm cache
    getCityAverages(TRUE);
}
由于您现在在WP Cron中有需要很长时间的任务,我建议使用适当的crontab/cronjob instead of how WordPress does it by default.

剩下的就是电话getCityAverages() 任何需要数据的地方。

结束

相关推荐

如何使php脚本只使用wp-cron运行

我有一个php脚本,它执行一个函数并创建一个包含结果的xml文件。我希望这个脚本每天只运行一次,我正在使用wordpress cron来实现这一点。问题是这个脚本总是在所有页面加载时运行,这很糟糕,因为它需要超过30秒才能完成。如何停止它始终运行并使其仅与wp cron一起工作?我读过关于cronjob的文章,但我的主机没有这个功能。这是我在php文件顶部使用的代码: add_action( \'my_cron_hook\', \'myfunction\' ); if( !wp_next