WordPress博客如何成立Widget缓存

  WordPress 的 Widget 成果凭借其容易定制和排版机动的特点,我在做项目标时候出格喜欢用。最近在给雷锋网改版的时候除了首页的分类推荐利用 Widget 来排版以外,iOS 榜单也做成了 Widget,由于榜单是通过 iTunes 接口来获取数据的,因此数据必需缓存一段时间,才气制止每次会见都需要从接口获取数据的问题。嗯,本日就说说怎么给 Widget 配置缓存。

  先简朴讲授一下 WordPress 默认的两种缓存机制,一种是 Transient Cache,Transient Cache通过数据库的 options 表举办缓存,会发生两行记录,一行用于记录缓存内容,一行用于记录缓存时间,在挪用的时候,至少发生两次数据库查询(没有任何数据库缓存的环境下);另一种是 Object Cache,在没有安装任何缓存插件的环境下,WP_Object_Cache 会把数据缓存到 GLOBAL 变量的一个元素里,缓存内容只对当前页面有效,正是因为这一特点,在这个项目里应该选择 Transient Cache 来缓存 Widget 的数据。

  接下来先写一个最简朴的 Widget:

add_action('widgets_init', array('Test_Widget', 'register'));
class Test_Widget extends WP_Widget {
// 注册 Widget
function register() {
register_widget('Test_Widget');
}
// 结构函数
function __construct() {
$widget_ops = array('classname' => 'test_widget', 'description' => __( '测试挂件') );
parent::__construct('test_widget', __('Test Widget'), $widget_ops);
}
// Widget 主体输出
function widget( $args, $instance ) {
extract( $args );
//......
}
// 生存 Widget 参数
function update( $new_instance, $old_instance ) {
$instance = $old_instance;
//......
return $instance;
}
// Widget 配置面板
function form( $instance ) {
//......
}
}

  要给 Widget 成立缓存的话,我必需得同时实现这些要求:缓存按期自动更新,更新 Widget 参数的时候排除已有缓存,删除 Widget 的时候把相关的缓存也删除去。前两点我们可以通过修改 Test_Widget::update() 和 Test_Widget::widget() 实现,修改后的 class Test_Widget 为:

class Test_Widget extends WP_Widget {
// 注册 Widget
function register() {
register_widget('Test_Widget');
}
// 结构函数
function __construct() {
$widget_ops = array('classname' => 'test_widget', 'description' => __( '测试挂件') );
parent::__construct('test_widget', __('Test Widget'), $widget_ops);
}
// Widget 主体输出
function widget( $args, $instance ) {
extract( $args );
// 假如缓存已经逾期,则从头生成功效
if(false === get_transient($args['widget_id'])) {
/*
......
执行 Widget 主体,在输出的同时把功效生存到 $data 变量里
......
*/
// 运行功效缓存 1 小时
set_transient($args['widget_id'], $data, 3600);
} else {
echo get_transient($args['widget_id']);
}
//......
}
// 生存 Widget 参数
function update( $new_instance, $old_instance ) {
$instance = $old_instance;
// 更新参数时删除已有的缓存
delete_transient($this->id);
//......
return $instance;
}
// Widget 配置面板
function form( $instance ) {
//......
}
}

  最后要在删除 Widget 的时候把缓存删除,今朝我利用的是一个较量暴力的要领:

add_action('sidebar_admin_setup', 'delete_test_widget_cache'));
function delete_test_widget_cache() {
if(isset($_POST['delete_widget']) && $_POST['delete_widget'] && isset($_POST['widget-id']) && $_POST['widget-id']) {
delete_transient($_POST['widget-id']);
}
}

  至此,Widget 缓存机制几经完成,但在删除插件时删除已有缓存这一步里,利用了一个暴力的要领,该要领缺点是:你删除其他的 Widget 也会实验删除缓存。颠末阐明 WordPress 源代码,发明删除 Widget 里会挪用 Widget Class 里的 update_callback() 要领,操作这个要领去删除 Widget 的缓存,是一个较量文艺的做法。我从头改写后的 Class 如下:

class Test_Widget extends WP_Widget {
// 注册 Widget
function register() {
register_widget('Test_Widget');
}
// 结构函数
function __construct() {
$widget_ops = array('classname' => 'test_widget', 'description' => __( '测试挂件') );
parent::__construct('test_widget', __('Test Widget'), $widget_ops);
}
// Widget 主体输出
function widget( $args, $instance ) {
extract( $args );
// 假如缓存已经逾期,则从头生成功效
if(false === get_transient($args['widget_id'])) {
/*
......
执行 Widget 主体,在输出的同时把功效生存到 $data 变量里
......
*/
// 运行功效缓存 1 小时
set_transient($args['widget_id'], $data, 3600);
} else {
echo get_transient($args['widget_id']);
}
//......
}
// 生存 Widget 参数
function update( $new_instance, $old_instance ) {
$instance = $old_instance;
// 更新参数时删除已有的缓存
delete_transient($this->id);
//......
return $instance;
}
// Widget 配置面板
function form( $instance ) {
//......
}
// 下面这个函数是新增加的,用来删除缓存
function update_callback($widget_args = 1) {
// 删除缓存
delete_transient($this->id);
delete_transient($this->id);
// 挪用本来的 update_callback() 要领,防备堕落
parent::update_callback($widget_args);
}
}

PS一句:PHP Class 真的很好用,能淘汰大量代码,今后要多多进修。

Wordpress下载:

WordPress v3.5 RC2下载

WordPress博客如何创立Widget缓存

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/10049.html