<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CodeCTO</title>
	<atom:link href="http://www.codecto.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.codecto.com</link>
	<description>一个专注于 WordPress 主题插件开发的技术博客</description>
	<lastBuildDate>Wed, 16 May 2012 16:04:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>在 Ubuntu 12.04 上安装 Dropbox 客户端</title>
		<link>http://www.codecto.com/2012/05/install-dropbox-on-ubuntu-1204/</link>
		<comments>http://www.codecto.com/2012/05/install-dropbox-on-ubuntu-1204/#comments</comments>
		<pubDate>Wed, 16 May 2012 16:04:07 +0000</pubDate>
		<dc:creator>CantonBolo</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Dropbox]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.codecto.com/?p=564</guid>
		<description><![CDATA[Ubuntu 是目前最流行的桌面级 Linux 发行版，由于我的 Dropbox 网盘容量不足，所以我用虚拟机装了个 Ubuntu 12.04 32bit 用来刷容量。不料通过 Dropbox 官方提供的 deb 包安装却总是在最后一步提示失败，通过源代码编译安装也不行。只好通过 apt-get 来安装了。]]></description>
			<content:encoded><![CDATA[<p><img src="http://content.codecto.com/wp-content/uploads/2012/05/dropbox.jpeg" alt="在 Ubuntu 12.04 上安装 Dropbox 客户端" title="dropbox" class="alignright size-full wp-image-565" />Ubuntu 是目前最流行的桌面级 Linux 发行版，由于我的 <a href="http://db.tt/tNX4Kl5" title="Dropbox" target="_blank" rel="nofollow">Dropbox</a> 网盘容量不足，所以我用虚拟机装了个 Ubuntu 12.04 32bit 用来刷容量。不料通过 Dropbox 官方提供的 deb 包安装却总是在最后一步提示失败，通过源代码编译安装也不行。只好通过 apt-get 来安装了，幸好也不是太麻烦，不过在国内的话要先连 VPN。</p>
<pre class="brush:shell">
sudo apt-key adv --keyserver pgp.mit.edu --recv-keys 5044912E
sudo add-apt-repository "deb http://linux.dropbox.com/ubuntu $(lsb_release -sc) main"
sudo apt-get update &#038;&#038; sudo apt-get install nautilus-dropbox
</pre>
<p>输完这几个命令以后会弹出一个安装框，按一下 Next 以后就可以使用 Dropbox 了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codecto.com/2012/05/install-dropbox-on-ubuntu-1204/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>改变 WordPress 默认显示的文章类型</title>
		<link>http://www.codecto.com/2012/05/change-wordpress-default-post-type/</link>
		<comments>http://www.codecto.com/2012/05/change-wordpress-default-post-type/#comments</comments>
		<pubDate>Tue, 15 May 2012 02:50:48 +0000</pubDate>
		<dc:creator>CantonBolo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[自定义文章类型]]></category>

		<guid isPermaLink="false">http://www.codecto.com/?p=560</guid>
		<description><![CDATA[WordPress 从 2.9 开始加入的自定义文章类型功能(Custom post type)，给二次开发带来了很大方便，我们完全可以用 WordPress 构建更加复杂的站点。但是 WordPress 却不能在后台设置主页和 Rss 里默认的文章类型，这是一个硬伤。不过我们可以通过 WP 的内部开发接口来修改默认文章类型。]]></description>
			<content:encoded><![CDATA[<p>WordPress 从 2.9 开始加入的自定义文章类型功能(Custom post type)，给二次开发带来了很大方便，我们完全可以用 WordPress 构建更加复杂的站点。但是 WordPress 却不能在后台设置主页和 Rss 里默认的文章类型，这是一个硬伤。不过我们可以通过 WP 的内部开发接口来修改默认文章类型。代码很简单，如下：</p>
<pre class="brush:php">
// 只需要改变首页显示的文章类型
add_filter( 'pre_get_posts', 'my_get_posts' );
function my_get_posts( $query ) {
	if ( is_home() &#038;&#038; !is_singular() &#038;&#038; $query->is_main_query() )
		$query->set( 'post_type', array( 'sentence' ) );
	return $query;
}
</pre>
<p>如果除了首页以外，你还需要改变 Rss 里的文章类型的话，请把 <code>if ( is_home() &#038;&#038; $query->is_main_query() )</code> 改成 <code>if ( (is_home() &#038;&#038; $query->is_main_query()) || (is_feed() &#038;&#038; !isset($_REQUEST['post_type'])) )</code>。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codecto.com/2012/05/change-wordpress-default-post-type/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>修复 XAMPP for Mac WordPress 不能升级的问题</title>
		<link>http://www.codecto.com/2012/05/fix-ftp-login-problem-in-wordpress-in-xampp-for-mac/</link>
		<comments>http://www.codecto.com/2012/05/fix-ftp-login-problem-in-wordpress-in-xampp-for-mac/#comments</comments>
		<pubDate>Thu, 10 May 2012 05:26:24 +0000</pubDate>
		<dc:creator>CantonBolo</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[XAMPP]]></category>

		<guid isPermaLink="false">http://www.codecto.com/?p=546</guid>
		<description><![CDATA[XAMPP 是我在本地使用的 Web 服务器搭建工具。但在 Mac 系统里，XAMPP 的默认配置有点问题，导致 WordPress 无法在后台自动升级。原因是 Apache 所在的用户组没有足够的权限，我们可以通过修改 XAMPP 的 httpd.conf 文件来修复这个问题]]></description>
			<content:encoded><![CDATA[<p><img src="http://content.codecto.com/wp-content/uploads/2012/05/xampp-for-mac.png" alt="xampp for mac" title="xampp for mac" class="alignright size-full wp-image-551" /></p>
<p><a href="http://www.apachefriends.org/en/index.html" title="XAMPP官方网站" target="_blank" rel="nofollow">XAMPP</a> 是我在本地使用的 Web 服务器搭建工具。但在 Mac 系统里，XAMPP 的默认配置有点问题，导致 WordPress 无法在后台自动升级。原因是 Apache 所在的用户组没有足够的权限，我们可以通过修改 XAMPP 的 httpd.conf 文件来修复这个问题。</p>
<p>如果你需要经常使用终端进行本地操作的话，推荐安装一个 Mac App：<a href="http://itunes.apple.com/us/app/go2shell/id445770608?mt=12" title="Go2Shell" target="_blank" rel="nofollow">Go2Shell</a>，只要把 Go2Shell 的图标拉到  Finder 窗口的工具栏上， Go2Shell 就会自动打开终端，并且把位置定位到 Finder 当前打开的目录。</p>
<p>嗯，总之是打开终端，定位到 xampp/etc 目录，然后输入：</p>
<pre class="brush:shell">
sudo vi httpd.conf
</pre>
<p>运行上面的命令以后会要求输入 root 账户密码，密码正确的话会打开 vi。找到下面两行：</p>
<pre class="brush:text">
User nobody
Group nobody
</pre>
<p>先按一下 i 键切换到 Insert 模式，再把这两行改成：</p>
<pre class="brush:text">
User 你的 Mac 用户名
Group staff
</pre>
<p>按 esc 键，在输入双引号内的字符”:qw”和回车保存推出，重启 Apache 服务。以后升级 WordPress 的时候，主机填 127.0.0.1，用户名填你的 Mac 用户名，密码填写 Mac 的用户密码即可顺利升级。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codecto.com/2012/05/fix-ftp-login-problem-in-wordpress-in-xampp-for-mac/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>百度 JS 前端框架 Tangram</title>
		<link>http://www.codecto.com/2012/05/tangram/</link>
		<comments>http://www.codecto.com/2012/05/tangram/#comments</comments>
		<pubDate>Wed, 09 May 2012 03:19:23 +0000</pubDate>
		<dc:creator>CantonBolo</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tangram]]></category>
		<category><![CDATA[前端框架]]></category>

		<guid isPermaLink="false">http://www.codecto.com/?p=543</guid>
		<description><![CDATA[Tangram是一套简单可依赖的Javascript库，主要分为Base和Component两部分。Base提供了开发时常用功能的封装，是核心的工具库。Component是Tangram组件库，基于Tangram Base之上开发，提供各种UI组件和动画效果。]]></description>
			<content:encoded><![CDATA[<h3>Tangram 概述</h3>
<p><a href="http://tangram.baidu.com/" title="Tangram" target="_blank" rel="nofollow">Tangram</a> 是百度UUX团队开发的 JS 框架。</p>
<p>Tangram 是一套简单可依赖的 JavaScript 库，主要分为 Base 和 Component 两部分。Base 提供了开发时常用功能的封装，是核心的工具库。Component 是Tangram 组件库，基于 Tangram Base 之上开发，提供各种 UI 组件和动画效果（有点像 jQuery 和 jQuery UI）。</p>
<h3>为什么使用 Tangram</h3>
<ul>
<li>体积小巧，性能优良，使用简单。</li>
<li>模块化架构，方便定制与扩展。</li>
<li>适合团队开发，丰富的中文文档和本地技术优化，适合中国用户。</li>
<li>多浏览器支持:IE6、7、8+，firfox3.x+，遨游2.x+，opera 10.x，chrome 4.x+，safari 4.x+。</li>
<li>经过专业QA团队的测试以及百度各大产品线的应用，质量有保障。</li>
</ul>
<h3>浏览器、平台支持</h3>
<p>完全支持：</p>
<ul>
<li>Windows XP</li>
<li>Firfox3.x</li>
<li>IE6、7、8</li>
<li>遨游2.x</li>
<li>Opera 10.x</li>
<li>Chrome 4.x</li>
<li>Safari 4.x</li>
</ul>
<p>上述浏览器都是现代且常用的，在百度，这些浏览器占有的比例达到98.88（截至2010.4）。这些浏览器都经过QA测试，并且所有这些浏览器上的bug的解决优先级是最高的。</p>
<p>核心支持：</p>
<ul>
<li>IE ＞ 6 (包括Mac版)</li>
<li>Safari ＞ 3</li>
<li>Firefox ＞ 2</li>
<li>Opera ＞ 9.5</li>
<li>Netscape ＞ 8</li>
</ul>
<p>最近打算多介绍一些优秀的 JS/PHP 开源类库，不知道大家有没有兴趣？</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codecto.com/2012/05/tangram/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>JavaScript 跨浏览器事件监听</title>
		<link>http://www.codecto.com/2012/05/javascript-cross-broswers-event-listener/</link>
		<comments>http://www.codecto.com/2012/05/javascript-cross-broswers-event-listener/#comments</comments>
		<pubDate>Mon, 07 May 2012 09:56:53 +0000</pubDate>
		<dc:creator>CantonBolo</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[事件监听]]></category>

		<guid isPermaLink="false">http://www.codecto.com/?p=539</guid>
		<description><![CDATA[JS 事件监听已经是很 out 的话题了，很久以前我也写过一篇《JavaScript 事件监听绑定》，但那个方法还不够好，因为在 attachEvent 和 addEventListener 方法都无法使用时没有为对象添加事件属性。]]></description>
			<content:encoded><![CDATA[<p>JS 事件监听已经是很 out 的话题了，很久以前我也写过一篇《<a href="http://www.codecto.com/2011/02/javascript-add-event-listener/" title="JavaScript 事件监听绑定">JavaScript 事件监听绑定</a>》，但那个方法还不够好，因为在 attachEvent 和 addEventListener 方法都无法使用时没有为对象添加事件属性，所以改成下面这样会更加好。</p>
<pre class="brush:javascript">
function addEvent(evnt, elem, func) {
	if (elem.addEventListener) { // W3C DOM
		elem.addEventListener(evnt,func,false);
	} else if (elem.attachEvent) { // IE DOM
		elem.attachEvent("on" + evnt, func);
	} else { // No much to do
		elem[evnt] = func;
	}
}
</pre>
<p>PS：IE9 已经支持 addEventListener 方法来监听事件了，本文纯属炒冷饭。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codecto.com/2012/05/javascript-cross-broswers-event-listener/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CentOS 更换软件源</title>
		<link>http://www.codecto.com/2012/04/centos-change-software-source/</link>
		<comments>http://www.codecto.com/2012/04/centos-change-software-source/#comments</comments>
		<pubDate>Sat, 28 Apr 2012 06:24:47 +0000</pubDate>
		<dc:creator>CantonBolo</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[软件源]]></category>

		<guid isPermaLink="false">http://www.codecto.com/?p=535</guid>
		<description><![CDATA[CentOS 是全世界最流行的 Linux 发行版之一，我在我的 VPS 上一直使用。最近因为想搞搞 Python，所以在本地用虚拟机装了一个带 GNOME GUI 的 CentOS 玩玩]]></description>
			<content:encoded><![CDATA[<p>CentOS 是全世界最流行的 Linux 发行版之一，我在我的 VPS 上一直使用。最近因为想搞搞 Python，所以在本地用虚拟机装了一个带 GNOME GUI 的 CentOS 玩玩。</p>
<p>在国内，最让 Linux 玩家受不了的是国外软件源速度太慢，幸好国内有很多代替品，<a href="http://mirrors.163.com/" title="网易的 Linux 软件源" target="_blank" rel="nofollow">网易的 Linux 软件源</a>就是其中我觉得最好的一个。</p>
<p>要更换软件源，首先要使用 Root 账户登录，如果你已经使用了别的账户登录，可以在终端窗口中进行下面的操作，切换到 Root 账户。</p>
<pre class="brush:shell">
sudo root密码 root
#系统提示输入当前账户的密码
su
#系统提示输入 Root 账户密码
</pre>
<p>网易已经提供了 repo 文件，这是跟国内其他 Linux 软件源相比，最赞的一点。</p>
<pre class="brush:shell">
#进入 /etc/yum.repos.d 目录
cd /etc/yum.repos.d
#备份原来的 CentOS-Base.repo 文件
mv ./CentOS-Base.repo ./CentOS-Base.repo.backup
#下载网易的 repo 文件，如果是 CentOS 5 的话：
wget http://mirrors.163.com/.help/CentOS5-Base-163.repo
#如果是 CentOS 6 的话：
wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
#接下来均以 CentOS 6 为例
#把下载回来的 repo 文件重命名为 CentOS-Base.repo
mv ./CentOS6-Base-163.repo ./CentOS-Base.repo
#修改 CentOS-Base.repo
vi ./CentOS-Base.repo
#修改 [base] 段，变成
name=CentOS-$releasever - Base - 163.com
baseurl=http://mirrors.163.com/centos/$releasever/os/$basearch/
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&#038;arch=$basearch&#038;repo=os
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
#修改 CentOS-Media.repo，把 baseurl 改成
baseurl=http://mirrors.163.com/centos/$releasever/os/$basearch/
#重建软件源缓存
yum makecache
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.codecto.com/2012/04/centos-change-software-source/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress 建立 Widget 缓存 2</title>
		<link>http://www.codecto.com/2012/04/wordpress-widget-transient-cache-2/</link>
		<comments>http://www.codecto.com/2012/04/wordpress-widget-transient-cache-2/#comments</comments>
		<pubDate>Fri, 13 Apr 2012 02:42:11 +0000</pubDate>
		<dc:creator>CantonBolo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[缓存]]></category>

		<guid isPermaLink="false">http://www.codecto.com/?p=532</guid>
		<description><![CDATA[上次说了建立 Widget 缓存的方法，但在删除插件时删除已有缓存这一步里，我当时使用了一个暴力的方法，该方法缺点是：你删除其他的 Widget 也会尝试删除缓存]]></description>
			<content:encoded><![CDATA[<p>上次说了<a href="http://www.codecto.com/2012/04/wordpress-widget-transient-cache/" title="WordPress 建立 Widget 缓存">建立 Widget 缓存</a>的方法，但在删除插件时删除已有缓存这一步里，我当时使用了一个暴力的方法，该方法缺点是：你删除其他的 Widget 也会尝试删除缓存。经过这两天分析 WordPress 源代码，发现删除 Widget 里会调用 Widget Class 里的 update_callback() 方法，利用这个方法去删除 Widget 的缓存，是一个比较文艺的做法。我重新改写后的 Class 如下：</p>
<pre class="brush:php">
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);
	}
}
</pre>
<p>PS一句：PHP Class 真的很好用，能减少大量代码，以后要多多学习。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codecto.com/2012/04/wordpress-widget-transient-cache-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress 建立 Widget 缓存</title>
		<link>http://www.codecto.com/2012/04/wordpress-widget-transient-cache/</link>
		<comments>http://www.codecto.com/2012/04/wordpress-widget-transient-cache/#comments</comments>
		<pubDate>Tue, 10 Apr 2012 09:30:18 +0000</pubDate>
		<dc:creator>CantonBolo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[缓存]]></category>

		<guid isPermaLink="false">http://www.codecto.com/?p=525</guid>
		<description><![CDATA[WordPress 的 Widget 功能凭借其容易定制和排版灵活的特点，我在做项目的时候特别喜欢用。最近在给雷锋网改版的时候除了首页的分类推荐使用 Widget 来排版以外，iOS 榜单也做成了 Widget，由于榜单是通过 iTunes 接口来获取数据的，因此数据必须缓存一段时间，才能避免每次访问都需要从接口获取数据的问题]]></description>
			<content:encoded><![CDATA[<p>WordPress 的 Widget 功能凭借其容易定制和排版灵活的特点，我在做项目的时候特别喜欢用。最近在给<a href="http://www.leiphone.com/" title="雷锋网" target="_blank" rel="nofollow">雷锋网</a>改版的时候除了首页的分类推荐使用 Widget 来排版以外，iOS 榜单也做成了 Widget，由于榜单是通过 iTunes 接口来获取数据的，因此数据必须缓存一段时间，才能避免每次访问都需要从接口获取数据的问题。嗯，今天就说说怎么给 Widget 设置缓存。</p>
<p>先简单讲解一下 WordPress 默认的两种缓存机制，一种是 <a href="http://codex.wordpress.org/Transients_API" title="WordPress Transients API" target="_blank" rel="nofollow">Transient Cache</a>，Transient Cache通过数据库的 options 表进行缓存，会产生两行记录，一行用于记录缓存内容，一行用于记录缓存时间，在调用的时候，至少产生两次数据库查询（没有任何数据库缓存的情况下）；另一种是 <a href="http://codex.wordpress.org/Class_Reference/WP_Object_Cache" title="WP Object Cache" target="_blank" rel="nofollow">Object Cache</a>，在没有安装任何缓存插件的情况下，WP_Object_Cache 会把数据缓存到 GLOBAL 变量的一个元素里，缓存内容只对当前页面有效，正是因为这一特点，在这个项目里应该选择 Transient Cache 来缓存 Widget 的数据。</p>
<p>接下来先写一个最简单的 Widget：</p>
<pre class="brush:php">
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 ) {
		//......
	}
}
</pre>
<p>要给 Widget 建立缓存的话，我必须得同时实现这些要求：缓存定期自动更新，更新 Widget 参数的时候清除已有缓存，删除 Widget 的时候把相关的缓存也删除掉。前两点我们可以通过修改 Test_Widget::update() 和 Test_Widget::widget() 实现，修改后的 class Test_Widget 为：</p>
<pre class="brush:php">
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 ) {
		//......
	}
}
</pre>
<p>最后要在删除 Widget 的时候把缓存删除，目前我使用的是一个比较暴力的方法：</p>
<pre class="brush:php">
add_action('sidebar_admin_setup', 'delete_test_widget_cache'));
function delete_test_widget_cache() {
	if(isset($_POST['delete_widget']) &#038;&#038; $_POST['delete_widget'] &#038;&#038; isset($_POST['widget-id']) &#038;&#038; $_POST['widget-id']) {
		delete_transient($_POST['widget-id']);
	}
}
</pre>
<p>至此，Widget 缓存机制几经完成，但最好那个暴力删除缓存的方法其实还可以改进，这个先留给大家思考。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codecto.com/2012/04/wordpress-widget-transient-cache/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>修改 WordPress 文件上传目录</title>
		<link>http://www.codecto.com/2012/04/wordpress-handle-upload-path/</link>
		<comments>http://www.codecto.com/2012/04/wordpress-handle-upload-path/#comments</comments>
		<pubDate>Sun, 01 Apr 2012 09:31:48 +0000</pubDate>
		<dc:creator>CantonBolo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[插件开发]]></category>
		<category><![CDATA[文件上传]]></category>

		<guid isPermaLink="false">http://www.codecto.com/?p=519</guid>
		<description><![CDATA[WordPress 默认的上传目录位于 wp-content/uploads ，并且根据设置还可以按照年月归档。可是，如果我要上传一个头像，或者幻灯片的话，也跟附件混在一起总是不太好吧？幸好 WordPress 知道会有用户有这种需求，我们可以通过 filter 来临时改变文件上传目录]]></description>
			<content:encoded><![CDATA[<p>WordPress 默认的上传目录位于 wp-content/uploads ，并且根据设置还可以按照年月归档。可是，如果我要上传一个头像，或者幻灯片的话，也跟附件混在一起总是不太好吧？幸好 WordPress 知道会有用户有这种需求，我们可以通过 filter 来临时改变文件上传目录。filter 函数如下：</p>
<pre class="brush:php">
function slider_upload_dir($uploads) {
	$siteurl = get_option( 'siteurl' );
	$uploads['path'] = WP_CONTENT_DIR . '/slider';
	$uploads['url'] = $siteurl . '/wp-content/slider';
	$uploads['subdir'] = '';
	$uploads['basedir'] = $uploads['path'];
	$uploads['baseurl'] = $uploads['url'];
	$uploads['error'] = false;
	return $uploads;
}
</pre>
<p>在 WordPress 处理上传文件之前，加载这个 filter 函数：</p>
<pre class="brush:php">
add_filter('upload_dir', 'slider_upload_dir');
</pre>
<p>这样上传的文件将会上传到 wp-content/slider 目录！这个方法特别适合于有上传头像或者幻灯片需求的项目，可以避免这些文件和文章附件混淆。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codecto.com/2012/04/wordpress-handle-upload-path/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>修改 WordPress 评论者 Cookie 过期时间</title>
		<link>http://www.codecto.com/2012/03/wordpress-comment-author-cookie-expried/</link>
		<comments>http://www.codecto.com/2012/03/wordpress-comment-author-cookie-expried/#comments</comments>
		<pubDate>Wed, 28 Mar 2012 13:04:57 +0000</pubDate>
		<dc:creator>CantonBolo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Cookie]]></category>

		<guid isPermaLink="false">http://www.codecto.com/?p=516</guid>
		<description><![CDATA[上次说了怎么修改 WordPress 用户登录 Cookie 过期时间，但对于大部分的 WordPress 站点来说，除了管理员以外，并没几个用户需要登录。甚至评论都是开放的，不需要登录。恰好有人问我怎么修改评论者的 Cookie 过期时间，写篇文章公开说明一下]]></description>
			<content:encoded><![CDATA[<p>上次说了怎么<a href="http://www.codecto.com/2012/03/modify-wordpress-auth-cookie-expired/" title="修改 WordPress 用户登录 Cookie 过期时间">修改 WordPress 用户登录 Cookie 过期时间</a>，但对于大部分的 WordPress 站点来说，除了管理员以外，并没几个用户需要登录。甚至评论都是开放的，不需要登录。恰好有人问我怎么修改评论者的 Cookie 过期时间，写篇文章公开说明一下。</p>
<p>WordPress 默认对于未登录的评论者会设置三个分别用于记录名字、邮箱、网址的 Cookie，这三个 Cookie 的有效期为 500000 分钟（差不多一年），要修改这三个 Cookie 的有效期可以通过下面的代码来实现。</p>
<pre class="brush:php">
add_filter('comment_cookie_lifetime', 'custom_comment_cookie_lifetime');
function custom_comment_cookie_lifetime($lifetime) {
	return 7200;
}
</pre>
<p>上面的代码可以把评论者信息的保存时间设为 2 小时。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codecto.com/2012/03/wordpress-comment-author-cookie-expried/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

