【编者按】网学网网络知识频道为大家收集整理了“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(WordPress博客如何建立Widget缓存_网学 网学推荐
免费论文
原创论文
文章排行榜
· 理解防火墙 屏蔽外界攻击 · 安装防火墙的十二个注意事项 · 企业中使用无线局域网如何进行安全 · 安装防火墙注意事项 · Cisco(思科)路由器上如何防止DDoS · 设定路由访存表防止黑客对防火墙发 · IP网络安全管理系统探讨 · 全面了解交换机漏洞 保护网络核心 · 层层设防保护VoIP安全 抵御隔墙之 · 简述常见黑客入侵方法以及工具防范 · 入侵检测(IDS)存在的问题及发展趋势 · 浅析防火墙与路由器的安全配置 · 实例讲解Oracle监听口令及监听器安 · 部署网络防火墙策略的十六条守则 · 部署网络防火墙策略 · 企业可轻松避免的十大安全地雷 · 计算机不能进安全模式的解决办法 · 无法格式化的U盘修复方法 POST[''delete_widget'']) &&版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号
WordPress博客如何建立Widget缓存_网学 网学推荐
免费论文
原创论文
文章排行榜
· 理解防火墙 屏蔽外界攻击 · 安装防火墙的十二个注意事项 · 企业中使用无线局域网如何进行安全 · 安装防火墙注意事项 · Cisco(思科)路由器上如何防止DDoS · 设定路由访存表防止黑客对防火墙发 · IP网络安全管理系统探讨 · 全面了解交换机漏洞 保护网络核心 · 层层设防保护VoIP安全 抵御隔墙之 · 简述常见黑客入侵方法以及工具防范 · 入侵检测(IDS)存在的问题及发展趋势 · 浅析防火墙与路由器的安全配置 · 实例讲解Oracle监听口令及监听器安 · 部署网络防火墙策略的十六条守则 · 部署网络防火墙策略 · 企业可轻松避免的十大安全地雷 · 计算机不能进安全模式的解决办法 · 无法格式化的U盘修复方法 POST[''delete_widget''] && isset(版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号
WordPress博客如何建立Widget缓存_网学 网学推荐
免费论文
原创论文
文章排行榜
· 理解防火墙 屏蔽外界攻击 · 安装防火墙的十二个注意事项 · 企业中使用无线局域网如何进行安全 · 安装防火墙注意事项 · Cisco(思科)路由器上如何防止DDoS · 设定路由访存表防止黑客对防火墙发 · IP网络安全管理系统探讨 · 全面了解交换机漏洞 保护网络核心 · 层层设防保护VoIP安全 抵御隔墙之 · 简述常见黑客入侵方法以及工具防范 · 入侵检测(IDS)存在的问题及发展趋势 · 浅析防火墙与路由器的安全配置 · 实例讲解Oracle监听口令及监听器安 · 部署网络防火墙策略的十六条守则 · 部署网络防火墙策略 · 企业可轻松避免的十大安全地雷 · 计算机不能进安全模式的解决办法 · 无法格式化的U盘修复方法 POST[''widget-id'']) &&版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号
WordPress博客如何建立Widget缓存_网学 网学推荐
免费论文
原创论文
文章排行榜
· 理解防火墙 屏蔽外界攻击 · 安装防火墙的十二个注意事项 · 企业中使用无线局域网如何进行安全 · 安装防火墙注意事项 · Cisco(思科)路由器上如何防止DDoS · 设定路由访存表防止黑客对防火墙发 · IP网络安全管理系统探讨 · 全面了解交换机漏洞 保护网络核心 · 层层设防保护VoIP安全 抵御隔墙之 · 简述常见黑客入侵方法以及工具防范 · 入侵检测(IDS)存在的问题及发展趋势 · 浅析防火墙与路由器的安全配置 · 实例讲解Oracle监听口令及监听器安 · 部署网络防火墙策略的十六条守则 · 部署网络防火墙策略 · 企业可轻松避免的十大安全地雷 · 计算机不能进安全模式的解决办法 · 无法格式化的U盘修复方法 POST[''widget-id'']) {版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号
delete_transient(WordPress博客如何建立Widget缓存_网学 网学推荐
免费论文
原创论文
文章排行榜
· 理解防火墙 屏蔽外界攻击 · 安装防火墙的十二个注意事项 · 企业中使用无线局域网如何进行安全 · 安装防火墙注意事项 · Cisco(思科)路由器上如何防止DDoS · 设定路由访存表防止黑客对防火墙发 · IP网络安全管理系统探讨 · 全面了解交换机漏洞 保护网络核心 · 层层设防保护VoIP安全 抵御隔墙之 · 简述常见黑客入侵方法以及工具防范 · 入侵检测(IDS)存在的问题及发展趋势 · 浅析防火墙与路由器的安全配置 · 实例讲解Oracle监听口令及监听器安 · 部署网络防火墙策略的十六条守则 · 部署网络防火墙策略 · 企业可轻松避免的十大安全地雷 · 计算机不能进安全模式的解决办法 · 无法格式化的U盘修复方法 POST[''widget-id'']);版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号
}
}
至此,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下载:
本文转自:http://www.codecto.com/2012/04/wordpress-widget-transient-cache/