<?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>我爱水煮鱼&#187; 沙发</title>
	<atom:link href="http://fairyfish.net/tag/sofa/feed/" rel="self" type="application/rss+xml" />
	<link>http://fairyfish.net</link>
	<description>关注 WordPress，关注互联网</description>
	<lastBuildDate>Fri, 10 Feb 2012 15:15:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>自己动手写 WordPress 插件：后台选项</title>
		<link>http://fairyfish.net/2007/12/22/write-plugin-by-yourself-option/</link>
		<comments>http://fairyfish.net/2007/12/22/write-plugin-by-yourself-option/#comments</comments>
		<pubDate>Tue, 29 Jul 2008 17:13:00 +0000</pubDate>
		<dc:creator>Denis</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WordPress 插件]]></category>
		<category><![CDATA[WordPress 教程]]></category>
		<category><![CDATA[沙发]]></category>

		<guid isPermaLink="false">http://fairyfish.net/2007/12/22/%e8%87%aa%e5%b7%b1%e5%8a%a8%e6%89%8b%e5%86%99-wordpress-%e6%8f%92%e4%bb%b6%ef%bc%9a%e5%90%8e%e5%8f%b0%e9%80%89%e9%a1%b9/</guid>
		<description><![CDATA[自从上一次谈到使用 WP-Cron 来进一步提高插件的效率之后，差不多有一个月没有跟新我这个插件教程了。好了今天介绍最后一篇：增加后台选项，以及其他的一些参考资料。 如果插件是给自己用，OK，可以把所有的地方都写死，不用很多参数，但是全世界人民对插件的需求是完全不同的，很多人是不懂代码，更多人是希望在后台简单点两下就能够配置出来自己要的效果出来。好吧，今天就给大家讲讲这方面的东东： 在 WordPress 中，创建后台选项的 API 是： add_options_page(page_title, menu_title, access_level/capability, file, [function]); 其中 page_title 为页面标题，menu_title 为菜单标题，access_level/capability 为访问这个选项的最低权限用户，file 这里为选项的唯一标示符，function 为用于显示页面内容的函数。 然后怎么样把后台的数据保存起来和在插件中调用呢？其实我们前面的教程中已经使用到了 WordPress 是通过 API update_option($option_name, $newvalue) 把数据保存和到数据库中，并通过 API get_option($option) 取出。 好了，现在已经了解清楚了原理，下面我们谈谈给我们的沙发插件添加什么选项，嗯，就大家问我的几个问题添加下选项吧。第一个是，有些博客是开放注册的博客，而前面的版本是不统计注册用户的沙发的，第二个是有些帅哥喜欢显示更多的沙发，恩就给他个机会显示更多的沙发。 首先我们在插件最后添加以下代码用于制作后台选项界面： function wp_sofa_options(){ $message='更新成功'; if($_POST['update_sofa_option']){ $wp_sofa_exclude_saved = get_option(&#34;wp_sofa_exclude&#34;); $wp_sofa_exclude = $_POST['wp_sofa_exclude_option']; if ($wp_sofa_exclude_saved != $wp_sofa_exclude) if(!update_option(&#34;wp_sofa_exclude&#34;,$wp_sofa_exclude)) $message='更新失败'; $wp_sofa_number_saved = get_option(&#34;wp_sofa_number&#34;); $wp_sofa_number = $_POST['wp_sofa_number_option']; [...]]]></description>
			<content:encoded><![CDATA[<p>自从上一次谈到使用 <a href="http://fairyfish.net/2007/11/26/write-plugin-by-yourself-cron/">WP-Cron</a> 来进一步提高插件的效率之后，差不多有一个月没有跟新我这个插件教程了。好了今天介绍最后一篇：增加后台选项，以及其他的一些参考资料。</p>
<p>如果插件是给自己用，OK，可以把所有的地方都写死，不用很多参数，但是全世界人民对插件的需求是完全不同的，很多人是不懂代码，更多人是希望在后台简单点两下就能够配置出来自己要的效果出来。好吧，今天就给大家讲讲这方面的东东：<br />
<span id="more-1180"></span><br />
在 WordPress 中，创建后台选项的 API 是：<br />
add_options_page(page_title, menu_title, access_level/capability, file, [function]);</p>
<p>其中 page_title 为页面标题，menu_title 为菜单标题，access_level/capability 为访问这个选项的最低权限用户，file 这里为选项的唯一标示符，function 为用于显示页面内容的函数。</p>
<p>然后怎么样把后台的数据保存起来和在插件中调用呢？其实我们前面的教程中已经使用到了</p>
<p>WordPress 是通过 API update_option($option_name, $newvalue) 把数据保存和到数据库中，并通过 API get_option($option) 取出。</p>
<p>好了，现在已经了解清楚了原理，下面我们谈谈给我们的沙发插件添加什么选项，嗯，就大家问我的几个问题添加下选项吧。第一个是，有些博客是开放注册的博客，而前面的版本是不统计注册用户的沙发的，第二个是有些帅哥喜欢显示更多的沙发，恩就给他个机会显示更多的沙发。</p>
<p>首先我们在插件最后添加以下代码用于制作后台选项界面：</p>
<pre><a style="color: #0000ff" href="http://www.php.net/function">function</a> wp_sofa_options(){
	$message='<span style="color: #8b0000">更新成功</span>';
	<a style="color: #0000ff" href="http://www.php.net/if">if</a>($_POST['<span style="color: #8b0000">update_sofa_option</span>']){
		$wp_sofa_exclude_saved = get_option(&quot;<span style="color: #8b0000">wp_sofa_exclude</span>&quot;);
		$wp_sofa_exclude = $_POST['<span style="color: #8b0000">wp_sofa_exclude_option</span>'];
		<a style="color: #0000ff" href="http://www.php.net/if">if</a> ($wp_sofa_exclude_saved != $wp_sofa_exclude)
			<a style="color: #0000ff" href="http://www.php.net/if">if</a>(!update_option(&quot;<span style="color: #8b0000">wp_sofa_exclude</span>&quot;,$wp_sofa_exclude))
				$message='<span style="color: #8b0000">更新失败</span>';
		$wp_sofa_number_saved = get_option(&quot;<span style="color: #8b0000">wp_sofa_number</span>&quot;);
		$wp_sofa_number = $_POST['<span style="color: #8b0000">wp_sofa_number_option</span>'];
		<a style="color: #0000ff" href="http://www.php.net/if">if</a>($wp_sofa_number_saved != $wp_sofa_number)
			<a style="color: #0000ff" href="http://www.php.net/if">if</a>(!update_option(&quot;<span style="color: #8b0000">wp_sofa_number</span>&quot;,$wp_sofa_number))
				$message='<span style="color: #8b0000">更新失败</span>';
		$wp_sofa_titles_saved = get_option(&quot;<span style="color: #8b0000">wp_sofa_titles</span>&quot;);
		$wp_sofa_titles = $_POST['<span style="color: #8b0000">wp_sofa_titles_option</span>'];
		<a style="color: #0000ff" href="http://www.php.net/if">if</a>($wp_sofa_titles_saved != $wp_sofa_titles)
			<a style="color: #0000ff" href="http://www.php.net/if">if</a>(!update_option(&quot;<span style="color: #8b0000">wp_sofa_titles</span>&quot;,$wp_sofa_titles))
				$message='<span style="color: #8b0000">更新失败</span>';
		update_sofa();
		<a style="color: #0000ff" href="http://www.php.net/echo">echo</a> '<span style="color: #8b0000">&lt;div class=&quot;updated&quot;&gt;&lt;strong&gt;&lt;p&gt;</span>'. $message . '<span style="color: #8b0000">&lt;/p&gt;&lt;/strong&gt;&lt;/div&gt;</span>';
	}
<span style="color: #0000ff">?&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">div</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">wrap</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">form</span> <span style="color: #ff0000">method</span>=<span style="color: #0000ff">&quot;post&quot;</span> <span style="color: #ff0000">action</span>=<span style="color: #0000ff">&quot;&quot;</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span>沙发<span style="color: #0000ff">&lt;/</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">fieldset</span> <span style="color: #ff0000">name</span>=<span style="color: #0000ff">&quot;wp_basic_options&quot;</span>  <span style="color: #ff0000">class</span>=<span style="color: #0000ff">&quot;options&quot;</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">table</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">tr</span><span style="color: #0000ff">&gt;</span>
        <span style="color: #0000ff">&lt;</span><span style="color: #800000">td</span> <span style="color: #ff0000">valign</span>=<span style="color: #0000ff">&quot;top&quot;</span> <span style="color: #ff0000">align</span>=<span style="color: #0000ff">&quot;right&quot;</span><span style="color: #0000ff">&gt;</span>排除用户：<span style="color: #0000ff">&lt;/</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span>
	<span style="color: #0000ff">&lt;</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input</span> <span style="color: #ff0000">type</span>=<span style="color: #0000ff">&quot;text&quot;</span> <span style="color: #ff0000">name</span>=<span style="color: #0000ff">&quot;wp_sofa_exclude_option&quot;</span> <span style="color: #ff0000">value</span>=<span style="color: #0000ff">&quot;&lt;?php echo get_option(&quot;</span><span style="color: #ff0000">wp_sofa_exclude</span>&quot;);  ?<span style="color: #0000ff">&gt;</span>&quot; /&gt; 输入需要排除用户的 ID，多个请用英文的 , 分开。<span style="color: #0000ff">&lt;/</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">tr</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">tr</span><span style="color: #0000ff">&gt;</span>
        <span style="color: #0000ff">&lt;</span><span style="color: #800000">td</span> <span style="color: #ff0000">valign</span>=<span style="color: #0000ff">&quot;top&quot;</span> <span style="color: #ff0000">align</span>=<span style="color: #0000ff">&quot;right&quot;</span><span style="color: #0000ff">&gt;</span>个数：<span style="color: #0000ff">&lt;/</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span>
        <span style="color: #0000ff">&lt;</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input</span> <span style="color: #ff0000">type</span>=<span style="color: #0000ff">&quot;text&quot;</span> <span style="color: #ff0000">name</span>=<span style="color: #0000ff">&quot;wp_sofa_number_option&quot;</span> <span style="color: #ff0000">value</span>=<span style="color: #0000ff">&quot;&lt;?php echo get_option(&quot;</span><span style="color: #ff0000">wp_sofa_number</span>&quot;); ?<span style="color: #0000ff">&gt;</span>&quot; /&gt; 显示沙发的个数，尽量不要超过10个。<span style="color: #0000ff">&lt;/</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">tr</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">tr</span><span style="color: #0000ff">&gt;</span>
        <span style="color: #0000ff">&lt;</span><span style="color: #800000">td</span> <span style="color: #ff0000">valign</span>=<span style="color: #0000ff">&quot;top&quot;</span> <span style="color: #ff0000">align</span>=<span style="color: #0000ff">&quot;right&quot;</span><span style="color: #0000ff">&gt;</span>沙发列表元素标题<span style="color: #0000ff">&lt;/</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span>
	<span style="color: #0000ff">&lt;</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input</span> <span style="color: #ff0000">type</span>=<span style="color: #0000ff">&quot;text&quot;</span> <span style="color: #ff0000">name</span>=<span style="color: #0000ff">&quot;wp_sofa_titles_option&quot;</span> <span style="color: #ff0000">value</span>=<span style="color: #0000ff">&quot;&lt;?php echo get_option(&quot;</span><span style="color: #ff0000">wp_sofa_titles</span>&quot;) ?<span style="color: #0000ff">&gt;</span>&quot; /&gt; 显示沙发的个数，尽量不要超过10个。<span style="color: #0000ff">&lt;/</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">tr</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">table</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">fieldset</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">&quot;submit&quot;</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input</span> <span style="color: #ff0000">type</span>=<span style="color: #0000ff">&quot;submit&quot;</span> <span style="color: #ff0000">name</span>=<span style="color: #0000ff">&quot;update_sofa_option&quot;</span> <span style="color: #ff0000">value</span>=<span style="color: #0000ff">&quot;Update Options &amp;raquo;&quot;</span> <span style="color: #0000ff">/&gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">form</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;?</span>php
}

<a style="color: #0000ff" href="http://www.php.net/function">function</a> wp_sofa_options_admin(){
	add_options_page('<span style="color: #8b0000">wp_safa</span>', '<span style="color: #8b0000">沙发</span>', 5,  __FILE__, '<span style="color: #8b0000">wp_sofa_options</span>');
}

add_action('<span style="color: #8b0000">admin_menu</span>', '<span style="color: #8b0000">wp_sofa_options_admin</span>');</pre>
<p>然后在对前面的 update_sofa 程序进行相应的修改，这里就不再详细的叙述了。</p>
<p>本次插件下载：<a href="http://wpcn.googlecode.com/files/wp-sofa-6.0.zip">wp-sofa-6.0.zip</a>。</p>
<p>至此，这个制作插件的教程结束，本来应该还有一篇关于插件如何创建独立的数据表，但是没有相关的经验，就不写了。这个教程写得很乱，但是基本上看下来对你制作插件还是有一定的帮助的。如果你有什么意见，欢迎提出来。</p>
<p>另外我还有写一篇总结的文章，并给你推荐一个更多制作插件的文章列表。</p>
<p>&gt;&gt;&gt;<a href="http://fairyfish.net/2007/12/22/write-plugin-by-yourself-option/" title="自己动手写 WordPress 插件：后台选项">继续阅读全文</a> ...</p><hr /><p><a href="http://s.click.taobao.com/t_8?e=7HZ5x%2BOzcBqQvUL9HREWEoUWa1c%3D&p=mm_25083601_0_0" rel="nofollow"><img src="http://fairyfish.net/wp-content/banner/notyet.gif"></a></p>
<p>
&copy; <a href="http://fairyfish.net/" title="我爱水煮鱼">我爱水煮鱼</a>
 / <a href="http://fairyfish.net/bookmark/?url=http://fairyfish.net/2007/12/22/write-plugin-by-yourself-option/&title=%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E5%86%99+WordPress+%E6%8F%92%E4%BB%B6%EF%BC%9A%E5%90%8E%E5%8F%B0%E9%80%89%E9%A1%B9&tags=WordPress 插件, WordPress 教程, 沙发, "  title="自己动手写 WordPress 插件：后台选项">收藏本文</a>
 / <a href="http://fairyfish.net/2007/12/22/write-plugin-by-yourself-option/#comments" title="自己动手写 WordPress 插件：后台选项">7条评论</a>
 / <a href="http://feed.fairyfish.net" title="订阅我爱水煮鱼">RSS 订阅</a>
 / <a href="http://fairyfish.net/go/wpjam" title="WordPress JAM">长期承接 WordPress 项目</a>
 / <a href="http://fairyfish.net/coupon/" title="主机域名优惠码">主机域名优惠码</a>
 / <a href="http://weibo.com/denishua/" title="新浪微博">新浪微博</a>
</p><h3>相关日志</h3><ul class="related_post"><li><a href="http://fairyfish.net/2007/11/26/write-plugin-by-yourself-cron/" title="自己动手写 WordPress 插件：使用 WP-Cron">自己动手写 WordPress 插件：使用 WP-Cron</a></li>
<li><a href="http://fairyfish.net/2007/11/19/write-plugin-by-yourself-api/" title="自己动手写 WordPress 插件：使用 API">自己动手写 WordPress 插件：使用 API</a></li>
<li><a href="http://fairyfish.net/2007/11/12/write-plugin-by-yourself-widget-2/" title="自己动手写 WordPress 插件：窗体化插件 2">自己动手写 WordPress 插件：窗体化插件 2</a></li>
<li><a href="http://fairyfish.net/2007/11/10/write-plugin-by-yourself-widget-1/" title="自己动手写 WordPress 插件：窗体化插件 1">自己动手写 WordPress 插件：窗体化插件 1</a></li>
<li><a href="http://fairyfish.net/2007/11/09/write-plugin-by-yourself-begin/" title="自己动手写 WordPress 插件：开始">自己动手写 WordPress 插件：开始</a></li>
<li><a href="http://fairyfish.net/2008/08/14/creating-tables-with-plugins/" title="为插件添加数据表">为插件添加数据表</a></li>
</ul><img src="http://fairyfish.net/wp-content/plugins/all-in-one/ga.php?utmac=MO-328125-5&amp;utmn=594031510&amp;utmr=-&amp;utmp=%2Frss%2F2007%2F12%2F22%2Fwrite-plugin-by-yourself-option%2F&amp;utmdt=%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E5%86%99+WordPress+%E6%8F%92%E4%BB%B6%EF%BC%9A%E5%90%8E%E5%8F%B0%E9%80%89%E9%A1%B9&amp;guid=ON" />]]></content:encoded>
			<wfw:commentRss>http://fairyfish.net/2007/12/22/write-plugin-by-yourself-option/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>自己动手写 WordPress 插件：使用 WP-Cron</title>
		<link>http://fairyfish.net/2007/11/26/write-plugin-by-yourself-cron/</link>
		<comments>http://fairyfish.net/2007/11/26/write-plugin-by-yourself-cron/#comments</comments>
		<pubDate>Sat, 03 May 2008 14:52:15 +0000</pubDate>
		<dc:creator>Denis</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WordPress 插件]]></category>
		<category><![CDATA[WordPress 教程]]></category>
		<category><![CDATA[开放 API]]></category>
		<category><![CDATA[沙发]]></category>

		<guid isPermaLink="false">http://fairyfish.net/2007/11/26/write-plugin-by-yourself-widget-corn/</guid>
		<description><![CDATA[上一节我们讲了如何利用 WordPress API 开发 WordPress 插件。这一节我们继续讲解 WordPress API，涉及的主题是 WP-Cron，就是在 WordPress 中安排任务。 如何在 WordPress 中安排任务，这是在 WordPress 2.1 中就引入的功能。本人针对这个功能翻译过一篇文章：如何在 WordPress 安排任务，建议大家在继续之前，好好阅读下那篇文章。 前面我们通过把沙发排名信息保存到数据库中，再有留言之后再进行更新，这样的操作来提高沙发插件的执行效率，今天来谈谈另外一种提高插件执行效率的方法，定时去更新沙发沙发的排名信息到数据库中来提高效率。 下面我们来讲解如何实现： 首先注释掉 sofa_comment_post 和 add_action('comment_post', 'sofa_comment_post');。 然后添加如下代码： //创建自定义的更新沙发排名信息的事件，调用更新沙发排名信息的函数add_action('update_sofa_event', 'update_sofa'); //定义任务，调用更新沙发排名信息的事件 if (!wp_next_scheduled('update_sofa_event')) { wp_schedule_event( time(), 'hourly', 'update_sofa_event' ); } //当插件被停止时候，移除更新沙发排名信息的事件 function update_sofa_deactivation(){ wp_clear_scheduled_hook('update_sofa_event'); } register_deactivation_hook(basename(__FILE__),' update_sofa_deactivation'); 上面的函数注视已经非常清楚了，这里不多讲了，这里是每个小时，更新一次，如果你觉得太频繁了，可以改成每天，把 wp_schedule_event 函数中 hourly 改成 daily 即可。 至于为什么要添加插件停止事件，是因为我们使用 wp_schedule_event [...]]]></description>
			<content:encoded><![CDATA[<p>上一节我们讲了如何<a href="http://fairyfish.net/2007/11/19/write-plugin-by-yourself-widget-api/">利用 WordPress API 开发 WordPress 插件</a>。这一节我们继续讲解 WordPress API，涉及的主题是 <a href="http://codex.wordpress.org/Category:WP-Cron_Functions">WP-Cron</a>，就是在 WordPress 中安排任务。</p>
<p>如何在 WordPress 中安排任务，这是在 WordPress 2.1 中就引入的功能。本人针对这个功能翻译过一篇文章：<a href="http://fairyfish.net/2007/05/01/timing-is-everything-scheduling-in-wordpress/">如何在 WordPress 安排任务</a>，建议大家在继续之前，好好阅读下那篇文章。<br />
<span id="more-1137"></span><br />
前面我们通过把沙发排名信息保存到数据库中，再有留言之后再进行更新，这样的操作来提高沙发插件的执行效率，今天来谈谈另外一种提高插件执行效率的方法，定时去更新沙发沙发的排名信息到数据库中来提高效率。</p>
<p>下面我们来讲解如何实现：<br />
首先注释掉 <code>sofa_comment_post</code> 和 <code>add_action('comment_post', 'sofa_comment_post');</code>。</p>
<p>然后添加如下代码：</p>
<pre><span style="color: #008000">//创建自定义的更新沙发排名信息的事件，调用更新沙发排名信息的函数</span>add_action('<span style="color: #8b0000">update_sofa_event</span>', '<span style="color: #8b0000">update_sofa</span>');

<span style="color: #008000">//定义任务，调用更新沙发排名信息的事件</span>
<a style="color: #0000ff" href="http://www.php.net/if">if</a> (!wp_next_scheduled('<span style="color: #8b0000">update_sofa_event</span>')) {
	wp_schedule_event( <a style="color: #ffa500" href="http://www.php.net/time">time</a>(), '<span style="color: #8b0000">hourly</span>', '<span style="color: #8b0000">update_sofa_event</span>' );
}

<span style="color: #008000">//当插件被停止时候，移除更新沙发排名信息的事件</span>
<a style="color: #0000ff" href="http://www.php.net/function">function</a> update_sofa_deactivation(){
	wp_clear_scheduled_hook('<span style="color: #8b0000">update_sofa_event</span>');
}

register_deactivation_hook(<a style="color: #ffa500" href="http://www.php.net/basename">basename</a>(__FILE__),' <span style="color: #8b0000">update_sofa_deactivation</span>');</pre>
<p>上面的函数注视已经非常清楚了，这里不多讲了，这里是每个小时，更新一次，如果你觉得太频繁了，可以改成每天，把 <code>wp_schedule_event</code> 函数中 hourly 改成 daily 即可。</p>
<p>至于为什么要添加插件停止事件，是因为我们使用 <code>wp_schedule_event</code> 添加的定时事件没有用函数 <code>wp_clear_scheduled_hook</code> 清除掉，在插件停用之后还会继续运行的。</p>
<p>这篇到此为止，如果你有什么问题请给我留言，下一片我们将<a href="http://fairyfish.net/2007/12/22/write-plugin-by-yourself-option/">讲解 Option</a>。请继续关注，并提出你的宝贵意见。</p>
<p>&gt;&gt;&gt;<a href="http://fairyfish.net/2007/11/26/write-plugin-by-yourself-cron/" title="自己动手写 WordPress 插件：使用 WP-Cron">继续阅读全文</a> ...</p><hr /><p><a href="http://s.click.taobao.com/t_8?e=7HZ5x%2BOzcBqQvUL9HREWEoUWa1c%3D&p=mm_25083601_0_0" rel="nofollow"><img src="http://fairyfish.net/wp-content/banner/notyet.gif"></a></p>
<p>
&copy; <a href="http://fairyfish.net/" title="我爱水煮鱼">我爱水煮鱼</a>
 / <a href="http://fairyfish.net/bookmark/?url=http://fairyfish.net/2007/11/26/write-plugin-by-yourself-cron/&title=%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E5%86%99+WordPress+%E6%8F%92%E4%BB%B6%EF%BC%9A%E4%BD%BF%E7%94%A8+WP-Cron&tags=WordPress 插件, WordPress 教程, 开放 API, 沙发, "  title="自己动手写 WordPress 插件：使用 WP-Cron">收藏本文</a>
 / <a href="http://fairyfish.net/2007/11/26/write-plugin-by-yourself-cron/#comments" title="自己动手写 WordPress 插件：使用 WP-Cron">6条评论</a>
 / <a href="http://feed.fairyfish.net" title="订阅我爱水煮鱼">RSS 订阅</a>
 / <a href="http://fairyfish.net/go/wpjam" title="WordPress JAM">长期承接 WordPress 项目</a>
 / <a href="http://fairyfish.net/coupon/" title="主机域名优惠码">主机域名优惠码</a>
 / <a href="http://weibo.com/denishua/" title="新浪微博">新浪微博</a>
</p><h3>相关日志</h3><ul class="related_post"><li><a href="http://fairyfish.net/2007/11/19/write-plugin-by-yourself-api/" title="自己动手写 WordPress 插件：使用 API">自己动手写 WordPress 插件：使用 API</a></li>
<li><a href="http://fairyfish.net/2007/12/22/write-plugin-by-yourself-option/" title="自己动手写 WordPress 插件：后台选项">自己动手写 WordPress 插件：后台选项</a></li>
<li><a href="http://fairyfish.net/2007/11/12/write-plugin-by-yourself-widget-2/" title="自己动手写 WordPress 插件：窗体化插件 2">自己动手写 WordPress 插件：窗体化插件 2</a></li>
<li><a href="http://fairyfish.net/2007/11/10/write-plugin-by-yourself-widget-1/" title="自己动手写 WordPress 插件：窗体化插件 1">自己动手写 WordPress 插件：窗体化插件 1</a></li>
<li><a href="http://fairyfish.net/2007/11/09/write-plugin-by-yourself-begin/" title="自己动手写 WordPress 插件：开始">自己动手写 WordPress 插件：开始</a></li>
<li><a href="http://fairyfish.net/2008/08/14/creating-tables-with-plugins/" title="为插件添加数据表">为插件添加数据表</a></li>
</ul><img src="http://fairyfish.net/wp-content/plugins/all-in-one/ga.php?utmac=MO-328125-5&amp;utmn=505608980&amp;utmr=-&amp;utmp=%2Frss%2F2007%2F11%2F26%2Fwrite-plugin-by-yourself-cron%2F&amp;utmdt=%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E5%86%99+WordPress+%E6%8F%92%E4%BB%B6%EF%BC%9A%E4%BD%BF%E7%94%A8+WP-Cron&amp;guid=ON" />]]></content:encoded>
			<wfw:commentRss>http://fairyfish.net/2007/11/26/write-plugin-by-yourself-cron/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>自己动手写 WordPress 插件：使用 API</title>
		<link>http://fairyfish.net/2007/11/19/write-plugin-by-yourself-api/</link>
		<comments>http://fairyfish.net/2007/11/19/write-plugin-by-yourself-api/#comments</comments>
		<pubDate>Sat, 03 May 2008 14:04:45 +0000</pubDate>
		<dc:creator>Denis</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WordPress 插件]]></category>
		<category><![CDATA[WordPress 教程]]></category>
		<category><![CDATA[开放 API]]></category>
		<category><![CDATA[沙发]]></category>

		<guid isPermaLink="false">http://fairyfish.net/2007/11/19/write-plugin-by-yourself-widget-api/</guid>
		<description><![CDATA[上两篇讲解了如河窗体化 WordPress 插件，今天我们来点高级点， 如何使用 WordPress API 进行编写插件。其实我们在前面窗体化 WordPress 插件中已经部分涉及到这方面的知识。只是没有做详细的说明，所以认真看今天的内容也会对你以前的内容也会有所帮助。当然有什么问题，欢迎给我留言。 首先，什么是 WordPress 的 API？ 在很早之前，我们需要添加一些新的功能，需要修改 WordPress 源代码，这是非常的郁闷，而现在有了 API （应用程序接口）之后，我们就能非常容易的添加和修改一些内置的功能。 WordPress 提供两种类型的 API： Action（行为）：行为是一些能够由 WordPress 核心事件触发的函数。行为 hook 能够让你添加或移除由 WordPress 行为触发执行的函数。这些 hook 能够使插件在它们指定的行为被触发执行。 Filter（过滤器）：过滤器是修改 WordPress 存储在你数据库中的内容的函数。过滤器 hook 允许你为 WordPress 的不同类型的内容（通常为文本）添加或者移除过滤器。这些 hook 能够使你能够非常容易的修改内容或者文本。 关于 WordPress API 更多介绍请参考官方文档：Plugin API。下面我们来讲解一个实际的例子：根据 Action API 调整性能之后沙发四代。 首先，我们再重复一下 sofa 这个插件的基本逻辑： 查出含有留言的 Post 的 ID。 然后找出它们的第一条留言的留言者和其博客，帮把这些信息写到一个数组中。 [...]]]></description>
			<content:encoded><![CDATA[<p>上两篇讲解了如河<a href="http://fairyfish.net/2007/11/10/write-plugin-by-yourself-widget-1/">窗体化 WordPress 插件</a>，今天我们来点高级点， <img src='http://fairyfish.b0.upaiyun.com/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  如何使用 WordPress API 进行编写插件。其实我们在前面窗体化 WordPress 插件中已经部分涉及到这方面的知识。只是没有做详细的说明，所以认真看今天的内容也会对你以前的内容也会有所帮助。当然有什么问题，欢迎给我留言。</p>
<p>首先，<strong>什么是 WordPress 的 API</strong>？<br />
<span id="more-1130"></span><br />
在很早之前，我们需要添加一些新的功能，需要修改 WordPress 源代码，这是非常的郁闷，而现在有了 API （应用程序接口）之后，我们就能非常容易的添加和修改一些内置的功能。</p>
<p>WordPress 提供两种类型的 API：</p>
<ol>
<li>Action（行为）：行为是一些能够由 WordPress 核心事件触发的函数。行为 hook 能够让你添加或移除由 WordPress 行为触发执行的函数。这些 hook 能够使插件在它们指定的行为被触发执行。</li>
<li>Filter（过滤器）：过滤器是修改 WordPress 存储在你数据库中的内容的函数。过滤器 hook 允许你为 WordPress 的不同类型的内容（通常为文本）添加或者移除过滤器。这些 hook 能够使你能够非常容易的修改内容或者文本。</li>
</ol>
<p>关于 WordPress  API 更多介绍请参考官方文档：<a href="http://codex.wordpress.org/Plugin_API">Plugin API</a>。下面我们来讲解一个实际的例子：根据 Action API 调整性能之后沙发四代。</p>
<p>首先，我们再重复一下 sofa 这个插件的基本逻辑：</p>
<ol>
<li>查出含有留言的 Post 的 ID。</li>
<li>然后找出它们的第一条留言的留言者和其博客，帮把这些信息写到一个数组中。</li>
<li>对数组进行处理找出抢到沙发的三个留言者并获取他们的博客地址。</li>
<li>输出他们。</li>
</ol>
<p>假设一个含有500篇日志的博客，一共有80%的日志含有留言，这样</p>
<p>第一步，将进行 1 次 SQL 查询。<br />
第二步，将进行 500X80%=400 次 SQL 查询。<br />
第三步，经进行 3 次 SQL 查询。</p>
<p>这样一个插件是非常耗费资源的。而对一个博客来说，留言数和浏览数数相比，是非常小的一个数据。所以我们是否可以把留言最多的人存到一个数据库中，当有人留言的时候，我们再对其进行更新呢？</p>
<p>答案是肯定，仔细在官方文档的 <a href="http://codex.wordpress.org/Plugin_API/Action_Reference">Action Reference</a> 中找到 <code>comment_post</code> 这个 Action Hook。它是在留言保存到数据库之后进行的行为，这个正是我们所要的。于是我们对 Sofa 插件修改如下：</p>
<p>首先把原有的 <code>get_sofa</code> 函数修改为 <code>update_sofa</code>，并且把原来得输出沙发党前三名的循环改成获取前三名的数据存入数据中：</p>
<pre>	$sofa = <a style="color: #ffa500" href="http://www.php.net/array">array</a>(); <span style="color: #008000">//初始化写入数据库的沙发数组</span>
	<a style="color: #0000ff" href="http://www.php.net/for">for</a>($i=0; $i&lt;3; $i++){
		$title="<span style="color: #8b0000"></span>";
		<a style="color: #0000ff" href="http://www.php.net/if">if</a>($i==0)	$title = "<span style="color: #8b0000">状元：</span>";
		<a style="color: #0000ff" href="http://www.php.net/if">if</a>($i==1)	$title = "<span style="color: #8b0000">榜眼：</span>";
		<a style="color: #0000ff" href="http://www.php.net/if">if</a>($i==2)	$title = "探花：";
		$q = "<span style="color: #8b0000">SELECT comment_author_url FROM $wpdb-&gt;comments WHERE comment_type ='' AND user_id = 0 AND comment_approved = '1' AND comment_author_url !='' AND comment_author = '$first_commentors_author[$i]' limit 1</span>";
		$first_comment_url = $wpdb-&gt;get_results($q); <span style="color: #008000">//获取沙发党的博客</span>
		<a style="color: #0000ff" href="http://www.php.net/if">if</a>($first_comment_url){
			$sofa[$i] = $title . '<span style="color: #8b0000">&lt;a href="</span>' . $first_comment_url[0] -&gt; comment_author_url . '<span style="color: #8b0000">" title="</span>' . $first_commentors_author[$i].'<span style="color: #8b0000">"&gt;</span>' . $first_commentors_author[$i] . '<span style="color: #8b0000">&lt;/a&gt;(</span>' . $first_commentors["<span style="color: #8b0000">$first_commentors_author[$i]</span>"].'<span style="color: #8b0000">)</span>';
		} <a style="color: #0000ff" href="http://www.php.net/else">else</a> {
			$sofa[$i] = $title . $first_commentors_author[$i] . '<span style="color: #8b0000">(</span>'.$first_commentors["<span style="color: #8b0000">$first_commentors_author[$i]</span>"] . '<span style="color: #8b0000">)</span>';
		}
	}
	update_option('<span style="color: #8b0000">sofa</span>',$sofa);	<span style="color: #008000">//把沙发排名数据更新到数据库中</span></pre>
<p>然后重新创建一个 <code>get_sofa</code> 函数，这个函数这个时候是从数据库中获取沙发排名数据，然后输出。函数如下：</p>
<pre><a style="color: #0000ff" href="http://www.php.net/function">function</a> get_sofa(){
	$output = "<span style="color: #8b0000"></span>"; <span style="color: #008000">//初始化输出字符串	</span>
	$output .= '<span style="color: #8b0000">&lt;ul class="wp_sofa"&gt;</span>';

	$sofa = get_option('<span style="color: #8b0000">sofa</span>');	<span style="color: #008000">//从数据库中获取沙发排名数据</span>

	<a style="color: #0000ff" href="http://www.php.net/if">if</a>(!$sofa[0]){	<span style="color: #008000">//如果是第一次使用，把沙发排名数据写入数据库</span>
		update_sofa();
		$sofa = get_option('<span style="color: #8b0000">sofa</span>');	<span style="color: #008000">//重新获取</span>
	}

	<a style="color: #0000ff" href="http://www.php.net/for">for</a>($i=0; $i&lt;<a style="color: #ffa500" href="http://www.php.net/count">count</a>($sofa); $i++){
		$output .= '<span style="color: #8b0000">&lt;li&gt;</span>'. $sofa[$i] .'<span style="color: #8b0000">&lt;/li&gt;</span>';
	}

	$output .= '<span style="color: #8b0000">&lt;/ul&gt;</span>';
	<a style="color: #0000ff" href="http://www.php.net/return">return</a> $output;<span style="color: #008000">//输出沙发党前三甲</span>
}</pre>
<p>最后是这个篇教程的关键，当有人留言之后，更新沙发排名信息。函数很简单：</p>
<pre><a style="color: #0000ff" href="http://www.php.net/function">function</a> sofa_comment_post ($comment_ID) {
	<a style="color: #0000ff" href="http://www.php.net/global">global</a> $user_ID;
	<a style="color: #0000ff" href="http://www.php.net/if">if</a> ( !$user_ID ){
		update_sofa();
	}
}

add_action('<span style="color: #8b0000">comment_post</span>', '<span style="color: #8b0000">sofa_comment_post</span>');</pre>
<p>关键在于 add_action(&#8216;<span style="color: #8b0000">comment_post</span>&#8216;, &#8216;<span style="color: #8b0000">sofa_comment_post</span>&#8216;); 它是在用户留言成功之后执行 <code>sofa_comment_post</code> 这个函数，从而更新沙发排名数据到数据库中。</p>
<p>这篇到此为止，这篇完成的插件：<a href="http://wpcn.googlecode.com/files/wp-sofa-4.0.zip">wp-sofa-4.0</a>，相信性能方面会有非常大的提升，本人会对自己以前开发的插件，会按照同样的方法或者下一章的方法进行更新，如果你是用我开发的插件，请注意关注本博客，注意更新。下一篇将会介绍另外一种更新沙发排名信息的方法，通过 <a href="http://fairyfish.net/2007/11/26/write-plugin-by-yourself-cron/">WP-Cron</a> 特性来实现定时更新。如果你有什么问题请给我留言。</p>
<p>&gt;&gt;&gt;<a href="http://fairyfish.net/2007/11/19/write-plugin-by-yourself-api/" title="自己动手写 WordPress 插件：使用 API">继续阅读全文</a> ...</p><hr /><p><a href="http://s.click.taobao.com/t_8?e=7HZ5x%2BOzcBqQvUL9HREWEoUWa1c%3D&p=mm_25083601_0_0" rel="nofollow"><img src="http://fairyfish.net/wp-content/banner/notyet.gif"></a></p>
<p>
&copy; <a href="http://fairyfish.net/" title="我爱水煮鱼">我爱水煮鱼</a>
 / <a href="http://fairyfish.net/bookmark/?url=http://fairyfish.net/2007/11/19/write-plugin-by-yourself-api/&title=%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E5%86%99+WordPress+%E6%8F%92%E4%BB%B6%EF%BC%9A%E4%BD%BF%E7%94%A8+API&tags=WordPress 插件, WordPress 教程, 开放 API, 沙发, "  title="自己动手写 WordPress 插件：使用 API">收藏本文</a>
 / <a href="http://fairyfish.net/2007/11/19/write-plugin-by-yourself-api/#comments" title="自己动手写 WordPress 插件：使用 API">7条评论</a>
 / <a href="http://feed.fairyfish.net" title="订阅我爱水煮鱼">RSS 订阅</a>
 / <a href="http://fairyfish.net/go/wpjam" title="WordPress JAM">长期承接 WordPress 项目</a>
 / <a href="http://fairyfish.net/coupon/" title="主机域名优惠码">主机域名优惠码</a>
 / <a href="http://weibo.com/denishua/" title="新浪微博">新浪微博</a>
</p><h3>相关日志</h3><ul class="related_post"><li><a href="http://fairyfish.net/2007/11/26/write-plugin-by-yourself-cron/" title="自己动手写 WordPress 插件：使用 WP-Cron">自己动手写 WordPress 插件：使用 WP-Cron</a></li>
<li><a href="http://fairyfish.net/2007/12/22/write-plugin-by-yourself-option/" title="自己动手写 WordPress 插件：后台选项">自己动手写 WordPress 插件：后台选项</a></li>
<li><a href="http://fairyfish.net/2007/11/12/write-plugin-by-yourself-widget-2/" title="自己动手写 WordPress 插件：窗体化插件 2">自己动手写 WordPress 插件：窗体化插件 2</a></li>
<li><a href="http://fairyfish.net/2007/11/10/write-plugin-by-yourself-widget-1/" title="自己动手写 WordPress 插件：窗体化插件 1">自己动手写 WordPress 插件：窗体化插件 1</a></li>
<li><a href="http://fairyfish.net/2007/11/09/write-plugin-by-yourself-begin/" title="自己动手写 WordPress 插件：开始">自己动手写 WordPress 插件：开始</a></li>
<li><a href="http://fairyfish.net/2008/08/14/creating-tables-with-plugins/" title="为插件添加数据表">为插件添加数据表</a></li>
</ul><img src="http://fairyfish.net/wp-content/plugins/all-in-one/ga.php?utmac=MO-328125-5&amp;utmn=660181155&amp;utmr=-&amp;utmp=%2Frss%2F2007%2F11%2F19%2Fwrite-plugin-by-yourself-api%2F&amp;utmdt=%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E5%86%99+WordPress+%E6%8F%92%E4%BB%B6%EF%BC%9A%E4%BD%BF%E7%94%A8+API&amp;guid=ON" />]]></content:encoded>
			<wfw:commentRss>http://fairyfish.net/2007/11/19/write-plugin-by-yourself-api/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Top First Commentors</title>
		<link>http://fairyfish.net/2008/03/06/top-first-commentors/</link>
		<comments>http://fairyfish.net/2008/03/06/top-first-commentors/#comments</comments>
		<pubDate>Thu, 06 Mar 2008 09:37:36 +0000</pubDate>
		<dc:creator>Denis</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WordPress 插件]]></category>
		<category><![CDATA[WordPress 留言插件]]></category>
		<category><![CDATA[沙发]]></category>

		<guid isPermaLink="false">http://fairyfish.net/?p=1262</guid>
		<description><![CDATA[English The plugin will show the top first commentors (the numner is number is set by user) of your blog. Installation and Usage: Upload the file top-first-commentors.php to the /wp-content/plugins/ directory Activate the plugin through the &#8216;Plugins&#8217; menu in WordPress Place &#60;?php top_first_commentors(); ?&#62; in your templates Navigate to Manage > Option > Top First [...]]]></description>
			<content:encoded><![CDATA[<h2>English</h2>
<p>The plugin will show the top first commentors (the numner is number is set by user) of your blog.</p>
<p><strong>Installation and Usage:</strong></p>
<ol>
<li>Upload the file <code>top-first-commentors.php</code> to the <code>/wp-content/plugins/</code> directory</li>
<li>Activate the plugin through the &#8216;Plugins&#8217; menu in WordPress</li>
<li>Place <code>&lt;?php top_first_commentors(); ?&gt;</code> in your templates</li>
<li>Navigate to <code>Manage > Option > Top First Commentors</code> to configure plugin output.</li>
<li>The plugin support widget, if you theme support widget, you can drop it to your sidebar.</li>
</ol>
<p><span id="more-1262"></span><br />
<strong>Download</strong>: <a href="http://wordpress.org/extend/plugins/top-first-commentors/">Top First Commentors</a></p>
<p>If you have any problem, please leave me a comment.</p>
<p>You can donate via payapl to support the plugin&#8217;s development, <img src='http://fairyfish.b0.upaiyun.com/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  </p>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input name="cmd" value="_xclick" type="hidden" />
<input name="business" value="honghua.deng@gmail.com" type="hidden" />
<input name="item_name" value="Donation to fairyfish.net" type="hidden" />
<input name="no_shipping" value="0" type="hidden" />
<input name="no_note" value="1" type="hidden" />
<input name="currency_code" value="USD" type="hidden" />
<input name="tax" value="0" type="hidden" />
<input name="lc" value="US" type="hidden" />
<input name="bn" value="PP-DonationsBF" type="hidden" />
<input src="https://www.paypal.com/en_US/i/btn/x-click-butcc-donate.gif" name="submit" alt="PayPal" type="image" border="0" /> <img src="https://www.paypal.com/en_US/i/scr/pixel.gif" border="0" height="1" width="1" /><br />
</form>
<h2>中文</h2>
<p>这个插件就是以前开发的那个关于沙发匪徒的插件。能够显示你博客沙发排名。把它改装下，能够给国外的沙发党使用，并且采用了 WordPress Object Cache. 速度应该有提升。</p>
<p><strong>安装和使用：</strong></p>
<ol>
<li>上传文件 <code>top-first-commentors.php</code> 到 <code>/wp-content/plugins/</code> 目录下</li>
<li>在插件菜单下激活插件</li>
<li>在模板文件中插入 <code>&lt;?php top_first_commentors(); ?&gt;</code> 模板函数</li>
<li>在管理界面下，<code>Manage > Option > Top First Commentors</code> 中配置插件的输出</li>
<li>该插件也支持 Widget。</li>
</ol>
<p><strong>下载：</strong>: <a href="http://wordpress.org/extend/plugins/top-first-commentors/">Top First Commentors</a></p>
<p>如果有什么问题，请给我留言。</p>
<p>&gt;&gt;&gt;<a href="http://fairyfish.net/2008/03/06/top-first-commentors/" title="Top First Commentors">继续阅读全文</a> ...</p><hr /><p><a href="http://s.click.taobao.com/t_8?e=7HZ5x%2BOzcBqQvUL9HREWEoUWa1c%3D&p=mm_25083601_0_0" rel="nofollow"><img src="http://fairyfish.net/wp-content/banner/notyet.gif"></a></p>
<p>
&copy; <a href="http://fairyfish.net/" title="我爱水煮鱼">我爱水煮鱼</a>
 / <a href="http://fairyfish.net/bookmark/?url=http://fairyfish.net/2008/03/06/top-first-commentors/&title=Top+First+Commentors&tags=WordPress 插件, WordPress 留言插件, 沙发, "  title="Top First Commentors">收藏本文</a>
 / <a href="http://fairyfish.net/2008/03/06/top-first-commentors/#comments" title="Top First Commentors">16条评论</a>
 / <a href="http://feed.fairyfish.net" title="订阅我爱水煮鱼">RSS 订阅</a>
 / <a href="http://fairyfish.net/go/wpjam" title="WordPress JAM">长期承接 WordPress 项目</a>
 / <a href="http://fairyfish.net/coupon/" title="主机域名优惠码">主机域名优惠码</a>
 / <a href="http://weibo.com/denishua/" title="新浪微博">新浪微博</a>
</p><h3>相关日志</h3><ul class="related_post"><li><a href="http://fairyfish.net/m/comment-reply-notification-14/" title="Comment Reply Notification 更新到 1.4">Comment Reply Notification 更新到 1.4</a></li>
<li><a href="http://fairyfish.net/2009/05/03/wordpress-comment-digg/" title="WordPress 插件推荐：WordPress Comment Digg">WordPress 插件推荐：WordPress Comment Digg</a></li>
<li><a href="http://fairyfish.net/2009/02/19/comment-reply-notification-12/" title="Comment Reply Notification 更新到 1.2">Comment Reply Notification 更新到 1.2</a></li>
<li><a href="http://fairyfish.net/2008/12/29/comment-reply-notification-10/" title="Comment Reply Notification 更新到 1.0">Comment Reply Notification 更新到 1.0</a></li>
<li><a href="http://fairyfish.net/2008/11/29/ajax-comment-pager/" title="WordPress 插件推荐： AJAX Comment Pager">WordPress 插件推荐： AJAX Comment Pager</a></li>
<li><a href="http://fairyfish.net/2008/11/03/comment-reply-notification/" title="WordPress 留言回复通知插件：Comment Reply Notification">WordPress 留言回复通知插件：Comment Reply Notification</a></li>
</ul><img src="http://fairyfish.net/wp-content/plugins/all-in-one/ga.php?utmac=MO-328125-5&amp;utmn=26572195&amp;utmr=-&amp;utmp=%2Frss%2F2008%2F03%2F06%2Ftop-first-commentors%2F&amp;utmdt=Top+First+Commentors&amp;guid=ON" />]]></content:encoded>
			<wfw:commentRss>http://fairyfish.net/2008/03/06/top-first-commentors/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>自己动手写 WordPress 插件：窗体化插件 2</title>
		<link>http://fairyfish.net/2007/11/12/write-plugin-by-yourself-widget-2/</link>
		<comments>http://fairyfish.net/2007/11/12/write-plugin-by-yourself-widget-2/#comments</comments>
		<pubDate>Sun, 18 Nov 2007 16:17:35 +0000</pubDate>
		<dc:creator>Denis</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Widget]]></category>
		<category><![CDATA[WordPress 插件]]></category>
		<category><![CDATA[WordPress 教程]]></category>
		<category><![CDATA[沙发]]></category>

		<guid isPermaLink="false">http://fairyfish.net/2007/11/12/write-plugin-by-yourself-widget-2/</guid>
		<description><![CDATA[上一节我们讲解了如何窗体化插件的第一部分，今天我们将继续第二部分，如何给我们创建的 Widget 创建选项 Panel。 我想使用沙发二代的同学已经感觉现在很轻松了，如果主题支持，根本不用修改模板就能调用该插件。但是最求完美的同学会发现默认输出的 Title 是“最沙发的人”。有些比较追求个性的同学总是希望自己定义标题的。好吧，这一节，我们就完成这部分同学的愿望，能够自定义标题。并推出沙发三代！ 如何自定义标题呢？其实就是在 Widget 能够提供一个选项的界面，让用户自己输入标题。好吧，搜索下或者看看别人的插件（偶经常这样写插件的，如果你的插件因此被我偷师了，算你倒霉！嘿嘿！），发现是通过 register_widget_control 这个 hook 绑定的。这样事情就变得很简单了。我们把选项的数据存储到一个名字叫做 widget_sofa option 中即可。修改如下： 在昨天创建的 widget_sidebar_sofa 的函数的最后中添加如下代码： function widget_sofa_options() { $sofa_options = $new_sofa_options = get_option('widget_sofa'); //获取数据库中的 widget_sofa if ( $_POST["sofa_submit"] ) { //如果提交更新 $new_sofa_options['title'] = strip_tags(stripslashes($_POST["sofa_title"])); if ( $sofa_options != $new_sofa_options ) { //如果有更新 $sofa_options = $new_sofa_options; update_option('widget_sofa', $sofa_options); } } $title [...]]]></description>
			<content:encoded><![CDATA[<p>上一节我们讲解了<a href="http://fairyfish.net/2007/11/10/write-plugin-by-yourself-widget-1/">如何窗体化插件的第一部分</a>，今天我们将继续第二部分，如何给我们创建的 Widget 创建选项 Panel。</p>
<p>我想使用沙发二代的同学已经感觉现在很轻松了，如果主题支持，根本不用修改模板就能调用该插件。但是最求完美的同学会发现默认输出的 Title 是“最沙发的人”。有些比较追求个性的同学总是希望自己定义标题的。好吧，这一节，我们就完成这部分同学的愿望，能够自定义标题。并推出沙发三代！<br />
<span id="more-1127"></span><br />
如何自定义标题呢？其实就是在 Widget 能够提供一个选项的界面，让用户自己输入标题。好吧，搜索下或者看看别人的插件（偶经常这样写插件的，如果你的插件因此被我偷师了，算你倒霉！嘿嘿！），发现是通过 <code>register_widget_control</code> 这个 hook 绑定的。这样事情就变得很简单了。我们把选项的数据存储到一个名字叫做 widget_sofa option 中即可。修改如下：</p>
<p>在昨天创建的 <code>widget_sidebar_sofa</code> 的函数的最后中添加如下代码：</p>
<pre><a style="color: #0000ff" href="http://www.php.net/function">function</a> widget_sofa_options() {
	$sofa_options = $new_sofa_options = get_option('<span style="color: #8b0000">widget_sofa</span>'); <span style="color: #008000">//获取数据库中的 widget_sofa</span>
	<a style="color: #0000ff" href="http://www.php.net/if">if</a> ( $_POST["<span style="color: #8b0000">sofa_submit</span>"] ) { <span style="color: #008000">//如果提交更新</span>
		$new_sofa_options['<span style="color: #8b0000">title</span>'] = <a style="color: #ffa500" href="http://www.php.net/strip_tags">strip_tags</a>(<a style="color: #ffa500" href="http://www.php.net/stripslashes">stripslashes</a>($_POST["<span style="color: #8b0000">sofa_title</span>"]));
		<a style="color: #0000ff" href="http://www.php.net/if">if</a> ( $sofa_options != $new_sofa_options ) { <span style="color: #008000">//如果有更新</span>
			$sofa_options = $new_sofa_options;
			update_option('<span style="color: #8b0000">widget_sofa</span>', $sofa_options);
		}
	}
	$title = attribute_escape($sofa_options['<span style="color: #8b0000">title</span>']);
<span style="color: #0000ff">?&gt;</span>
	<span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">label</span> <span style="color: #ff0000">for</span>=<span style="color: #0000ff">"wp_sofa_title"</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;?</span>php _e('<span style="color: #8b0000">Title:</span>'); <span style="color: #0000ff">?&gt;</span> <span style="color: #0000ff">&lt;</span><span style="color: #800000">input</span> <span style="color: #ff0000">style</span>=<span style="color: #0000ff">"width: 250px;"</span> <span style="color: #ff0000">id</span>=<span style="color: #0000ff">"sofa_title"</span> <span style="color: #ff0000">name</span>=<span style="color: #0000ff">"sofa_title"</span> <span style="color: #ff0000">type</span>=<span style="color: #0000ff">"text"</span> <span style="color: #ff0000">value</span>=<span style="color: #0000ff">"&lt;?php echo $title; ?&gt;"</span> <span style="color: #0000ff">/&gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">label</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span>
	<span style="color: #0000ff">&lt;</span><span style="color: #800000">input</span> <span style="color: #ff0000">type</span>=<span style="color: #0000ff">"hidden"</span> <span style="color: #ff0000">id</span>=<span style="color: #0000ff">"sofa_submit"</span> <span style="color: #ff0000">name</span>=<span style="color: #0000ff">"sofa_submit"</span> <span style="color: #ff0000">value</span>=<span style="color: #0000ff">"1"</span> <span style="color: #0000ff">/&gt;</span>
<span style="color: #0000ff">&lt;?</span>php
}

register_widget_control('<span style="color: #8b0000">WP-Sofa</span>', '<span style="color: #8b0000">widget_sofa_options</span>', 300, 90);</pre>
<p>上面这段代码就是创建一个 Widget 选项的界面。代码非常简单，也做注释，我这里也不多说了。</p>
<p>然后昨天的创建的 <code>widget_sofa</code> 函数中的 <code><a style="color: #0000ff" href="http://www.php.net/echo">echo</a> $before_widget;</code> 中插入以下几行：</p>
<pre><span style="color: #0000ff">&lt;?</span>
$sofa_options = get_option('<span style="color: #8b0000">widget_sofa</span>');
$title = $sofa_options['<span style="color: #8b0000">title</span>'];
<a style="color: #0000ff" href="http://www.php.net/if">if</a> ( empty($title) ) $title = '<span style="color: #8b0000">最沙发的人</span>';
</pre>
<p>这段代码是获取用户设置的标题，如果没有设置，则显示默认的“最沙发的人”。</p>
<p>好了，这节到此为止，下一节我们讲解<a href="http://fairyfish.net/2007/11/19/write-plugin-by-yourself-widget-api/"> WordPress 的 API</a>。请保持关注。沙发三代下载：<a href="http://wpcn.googlecode.com/files/wp-sofa-3.0.zip">wp-sofa-3.0.zip</a></p>
<p>&gt;&gt;&gt;<a href="http://fairyfish.net/2007/11/12/write-plugin-by-yourself-widget-2/" title="自己动手写 WordPress 插件：窗体化插件 2">继续阅读全文</a> ...</p><hr /><p><a href="http://s.click.taobao.com/t_8?e=7HZ5x%2BOzcBqQvUL9HREWEoUWa1c%3D&p=mm_25083601_0_0" rel="nofollow"><img src="http://fairyfish.net/wp-content/banner/notyet.gif"></a></p>
<p>
&copy; <a href="http://fairyfish.net/" title="我爱水煮鱼">我爱水煮鱼</a>
 / <a href="http://fairyfish.net/bookmark/?url=http://fairyfish.net/2007/11/12/write-plugin-by-yourself-widget-2/&title=%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E5%86%99+WordPress+%E6%8F%92%E4%BB%B6%EF%BC%9A%E7%AA%97%E4%BD%93%E5%8C%96%E6%8F%92%E4%BB%B6+2&tags=Widget, WordPress 插件, WordPress 教程, 沙发, "  title="自己动手写 WordPress 插件：窗体化插件 2">收藏本文</a>
 / <a href="http://fairyfish.net/2007/11/12/write-plugin-by-yourself-widget-2/#comments" title="自己动手写 WordPress 插件：窗体化插件 2">10条评论</a>
 / <a href="http://feed.fairyfish.net" title="订阅我爱水煮鱼">RSS 订阅</a>
 / <a href="http://fairyfish.net/go/wpjam" title="WordPress JAM">长期承接 WordPress 项目</a>
 / <a href="http://fairyfish.net/coupon/" title="主机域名优惠码">主机域名优惠码</a>
 / <a href="http://weibo.com/denishua/" title="新浪微博">新浪微博</a>
</p><h3>相关日志</h3><ul class="related_post"><li><a href="http://fairyfish.net/2007/11/10/write-plugin-by-yourself-widget-1/" title="自己动手写 WordPress 插件：窗体化插件 1">自己动手写 WordPress 插件：窗体化插件 1</a></li>
<li><a href="http://fairyfish.net/2007/12/22/write-plugin-by-yourself-option/" title="自己动手写 WordPress 插件：后台选项">自己动手写 WordPress 插件：后台选项</a></li>
<li><a href="http://fairyfish.net/2007/11/26/write-plugin-by-yourself-cron/" title="自己动手写 WordPress 插件：使用 WP-Cron">自己动手写 WordPress 插件：使用 WP-Cron</a></li>
<li><a href="http://fairyfish.net/2007/11/19/write-plugin-by-yourself-api/" title="自己动手写 WordPress 插件：使用 API">自己动手写 WordPress 插件：使用 API</a></li>
<li><a href="http://fairyfish.net/2007/11/09/write-plugin-by-yourself-begin/" title="自己动手写 WordPress 插件：开始">自己动手写 WordPress 插件：开始</a></li>
<li><a href="http://fairyfish.net/2008/12/08/quick-press-widget/" title="WordPress 插件推荐：Quick Press Widget">WordPress 插件推荐：Quick Press Widget</a></li>
</ul><img src="http://fairyfish.net/wp-content/plugins/all-in-one/ga.php?utmac=MO-328125-5&amp;utmn=782876314&amp;utmr=-&amp;utmp=%2Frss%2F2007%2F11%2F12%2Fwrite-plugin-by-yourself-widget-2%2F&amp;utmdt=%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E5%86%99+WordPress+%E6%8F%92%E4%BB%B6%EF%BC%9A%E7%AA%97%E4%BD%93%E5%8C%96%E6%8F%92%E4%BB%B6+2&amp;guid=ON" />]]></content:encoded>
			<wfw:commentRss>http://fairyfish.net/2007/11/12/write-plugin-by-yourself-widget-2/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>自己动手写 WordPress 插件：窗体化插件 1</title>
		<link>http://fairyfish.net/2007/11/10/write-plugin-by-yourself-widget-1/</link>
		<comments>http://fairyfish.net/2007/11/10/write-plugin-by-yourself-widget-1/#comments</comments>
		<pubDate>Sun, 18 Nov 2007 15:16:16 +0000</pubDate>
		<dc:creator>Denis</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Widget]]></category>
		<category><![CDATA[WordPress 插件]]></category>
		<category><![CDATA[WordPress 教程]]></category>
		<category><![CDATA[沙发]]></category>

		<guid isPermaLink="false">http://fairyfish.net/2007/11/10/%e8%87%aa%e5%b7%b1%e5%8a%a8%e6%89%8b%e5%86%99%e6%8f%92%e4%bb%b6%ef%bc%9a%e7%aa%97%e4%bd%93%e5%8c%96%e6%8f%92%e4%bb%b6/</guid>
		<description><![CDATA[上一节我们通过一个很简单并且很有意义的插件 WP-Sofa 给大家讲解了如何自己动手开始写插件，今天将和大家讲解如和窗体化这个插件，并推出我们的沙发二代。 首先，什么是窗体化（widgetizing）呢？简单的说，窗体化就是让侧边栏适合 Widget 这个插件（从 2.2 开始，WordPress 已经内置了 Widget），它能让你非常容易就能够重新整理侧边栏的模块，而不需要手工去修改代码。 立刻就会跑出第二个问题，主题不支持 Widget，怎么办？能怎么办，不懂代码的，换一个主题咯，懂的修改代码让它支持咯，如何修改？看文章：窗体化侧边栏 废话说完了，那我们开始我们今天的主题：窗体化你的插件。 首先，我们让插件能够支持 Widget 只是一个额外的功能，原有的手工调用的功能还是要保持。所以我们把原有的代码作如下改动： 把原有的sofa 这个函数的函数名修改为 get_sofa。 把最后的 echo $output; 修改成 return $output;。 然后创建一个新的 sofa 函数。如下： function sofa(){ $output = get_sofa(); echo $output; } 这样保证了原来的 sofa 函数还能自动调用。 下面我们开始 widget 这个插件： 首先了解下基本的 Widget 语法： &#60;?php function widget_myuniquewidget($args) { extract($args); ?&#62; &#60;?php echo $before_widget; ?&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>上一节我们通过一个很简单并且很有意义的插件 WP-Sofa 给大家讲解了<a href="http://fairyfish.net/2007/11/09/write-plugin-by-yourself-begin/">如何自己动手开始写插件</a>，今天将和大家讲解如和窗体化这个插件，并推出我们的沙发二代。</p>
<p>首先，什么是窗体化（widgetizing）呢？简单的说，窗体化就是让侧边栏适合 Widget 这个插件（从 2.2 开始，WordPress 已经内置了 Widget），它能让你非常容易就能够重新整理侧边栏的模块，而不需要手工去修改代码。</p>
<p>立刻就会跑出第二个问题，主题不支持 Widget，怎么办？能怎么办，不懂代码的，换一个主题咯，懂的修改代码让它支持咯，如何修改？看文章：<a href="http://fairyfish.net/2007/06/13/wp-theme-lesson-6e-widgetizing-sidebar/">窗体化侧边栏</a></p>
<p>废话说完了，那我们开始我们今天的主题：窗体化你的插件。<br />
<span id="more-1122"></span><br />
首先，我们让插件能够支持 Widget 只是一个额外的功能，原有的手工调用的功能还是要保持。所以我们把原有的代码作如下改动：<br />
把原有的<code>sofa</code> 这个函数的函数名修改为 <code>get_sofa</code>。<br />
把最后的 <code>echo $output;</code> 修改成 <code>return $output;</code>。<br />
然后创建一个新的 sofa 函数。如下：</p>
<pre><a style="color: #0000ff" href="http://www.php.net/function">function</a> sofa(){
	$output = get_sofa();
	<a style="color: #0000ff" href="http://www.php.net/echo">echo</a> $output;
}</pre>
<p>这样保证了原来的 sofa 函数还能自动调用。</p>
<p>下面我们开始 widget 这个插件：</p>
<p>首先了解下<strong>基本的 Widget 语法</strong>：</p>
<pre><span style="color: #0000ff">&lt;?</span>php
<a href="http://www.php.net/function" style="color: #0000ff">function</a> widget_myuniquewidget($args) {
       <a href="http://www.php.net/extract" style="color: #ffa500">extract</a>($args);
<span style="color: #0000ff">?&gt;</span>
       <span style="color: #0000ff">&lt;?</span>php <a href="http://www.php.net/echo" style="color: #0000ff">echo</a> $before_widget; <span style="color: #0000ff">?&gt;</span>
       <span style="color: #0000ff">&lt;?</span>php <a href="http://www.php.net/echo" style="color: #0000ff">echo</a> $before_title . '<span style="color: #8b0000">My Unique Widget</span>' . $after_title; <span style="color: #0000ff">?&gt;</span>
               Hello, World!
       <span style="color: #0000ff">&lt;?</span>php <a href="http://www.php.net/echo" style="color: #0000ff">echo</a> $after_widget; <span style="color: #0000ff">?&gt;</span>
<span style="color: #0000ff">&lt;?</span>php
}
register_sidebar_widget('<span style="color: #8b0000">My Unique Widget</span>', '<span style="color: #8b0000">widget_myuniquewidget</span>');
<span style="color: #0000ff">?&gt;</span></pre>
<p>上面的代码用用 register_sidebar_widget 注册函数自己之后，输出 widget 标题 &#8216;My Unique Widget&#8217; 及內容 &#8216;Hello, World!&#8217;。</p>
<p><strong>只要把标题替换成自己的标题，然后把 &#8216;Hello, World!&#8217; 替换成自己的内容即可。</strong></p>
<p>然后又从 WordPress Widgets 说明文档上知道：不要在插件导入之后执行任何代码，并使用 plugins_loaded 这个hook。从而得知 add_action 的对象是 plugins_loaded。</p>
<p>根据上面的分析，我们的 Sofa 的 widget 函数为：</p>
<pre><span style="color: #0000ff">&lt;?</span>
<a style="color: #0000ff" href="http://www.php.net/function">function</a> widget_sidebar_sofa() {
	<a style="color: #0000ff" href="http://www.php.net/function">function</a> widget_sofa($args) {
	    <a style="color: #ffa500" href="http://www.php.net/extract">extract</a>($args);
		<a style="color: #0000ff" href="http://www.php.net/echo">echo</a> $before_widget;
		<a style="color: #0000ff" href="http://www.php.net/echo">echo</a> $before_title . '<span style="color: #8b0000">最沙发的人</span>' . $after_title;
			$output = get_sofa();
			<a style="color: #0000ff" href="http://www.php.net/echo">echo</a> $output;
		<a style="color: #0000ff" href="http://www.php.net/echo">echo</a> $after_widget;
	}
	register_sidebar_widget('<span style="color: #8b0000">WP-Sofa</span>', '<span style="color: #8b0000">widget_sofa</span>');
}

add_action('<span style="color: #8b0000">plugins_loaded</span>', '<span style="color: #8b0000">widget_sidebar_sofa</span>');</pre>
<p>OK，这节到此为止。哦，你错了，下一节我们将继续这个话题：<a href="http://fairyfish.net/2007/11/12/write-plugin-by-yourself-widget-2/">窗体化插件 2</a>，还有什么好讲的呢？到时候关注就行了，嘿嘿。根据 <a href="http://www.underone.com/2007/11/09/sofa/">Underone 的建议</a> 把插件的名字改为最沙发的人，另外在抢沙发战役中屡屡败给某著名沙发党<a href="http://caitou.com/">大猫</a>和<a href="http://hi.baidu.com/huge">胡戈戈</a>同学，所以该插件的作者名字也该成：抢不到沙发的人。如果你因此认为这是两个插件，本人不负任何责任。第二版下载地址：<a href="http://wpcn.googlecode.com/files/wp-sofa-2.0.zip">wp-sofa-2.0.zip</a>。</p>
<p>&gt;&gt;&gt;<a href="http://fairyfish.net/2007/11/10/write-plugin-by-yourself-widget-1/" title="自己动手写 WordPress 插件：窗体化插件 1">继续阅读全文</a> ...</p><hr /><p><a href="http://s.click.taobao.com/t_8?e=7HZ5x%2BOzcBqQvUL9HREWEoUWa1c%3D&p=mm_25083601_0_0" rel="nofollow"><img src="http://fairyfish.net/wp-content/banner/notyet.gif"></a></p>
<p>
&copy; <a href="http://fairyfish.net/" title="我爱水煮鱼">我爱水煮鱼</a>
 / <a href="http://fairyfish.net/bookmark/?url=http://fairyfish.net/2007/11/10/write-plugin-by-yourself-widget-1/&title=%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E5%86%99+WordPress+%E6%8F%92%E4%BB%B6%EF%BC%9A%E7%AA%97%E4%BD%93%E5%8C%96%E6%8F%92%E4%BB%B6+1&tags=Widget, WordPress 插件, WordPress 教程, 沙发, "  title="自己动手写 WordPress 插件：窗体化插件 1">收藏本文</a>
 / <a href="http://fairyfish.net/2007/11/10/write-plugin-by-yourself-widget-1/#comments" title="自己动手写 WordPress 插件：窗体化插件 1">7条评论</a>
 / <a href="http://feed.fairyfish.net" title="订阅我爱水煮鱼">RSS 订阅</a>
 / <a href="http://fairyfish.net/go/wpjam" title="WordPress JAM">长期承接 WordPress 项目</a>
 / <a href="http://fairyfish.net/coupon/" title="主机域名优惠码">主机域名优惠码</a>
 / <a href="http://weibo.com/denishua/" title="新浪微博">新浪微博</a>
</p><h3>相关日志</h3><ul class="related_post"><li><a href="http://fairyfish.net/2007/11/12/write-plugin-by-yourself-widget-2/" title="自己动手写 WordPress 插件：窗体化插件 2">自己动手写 WordPress 插件：窗体化插件 2</a></li>
<li><a href="http://fairyfish.net/2007/12/22/write-plugin-by-yourself-option/" title="自己动手写 WordPress 插件：后台选项">自己动手写 WordPress 插件：后台选项</a></li>
<li><a href="http://fairyfish.net/2007/11/26/write-plugin-by-yourself-cron/" title="自己动手写 WordPress 插件：使用 WP-Cron">自己动手写 WordPress 插件：使用 WP-Cron</a></li>
<li><a href="http://fairyfish.net/2007/11/19/write-plugin-by-yourself-api/" title="自己动手写 WordPress 插件：使用 API">自己动手写 WordPress 插件：使用 API</a></li>
<li><a href="http://fairyfish.net/2007/11/09/write-plugin-by-yourself-begin/" title="自己动手写 WordPress 插件：开始">自己动手写 WordPress 插件：开始</a></li>
<li><a href="http://fairyfish.net/2008/12/08/quick-press-widget/" title="WordPress 插件推荐：Quick Press Widget">WordPress 插件推荐：Quick Press Widget</a></li>
</ul><img src="http://fairyfish.net/wp-content/plugins/all-in-one/ga.php?utmac=MO-328125-5&amp;utmn=1165286591&amp;utmr=-&amp;utmp=%2Frss%2F2007%2F11%2F10%2Fwrite-plugin-by-yourself-widget-1%2F&amp;utmdt=%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E5%86%99+WordPress+%E6%8F%92%E4%BB%B6%EF%BC%9A%E7%AA%97%E4%BD%93%E5%8C%96%E6%8F%92%E4%BB%B6+1&amp;guid=ON" />]]></content:encoded>
			<wfw:commentRss>http://fairyfish.net/2007/11/10/write-plugin-by-yourself-widget-1/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>自己动手写 WordPress 插件：开始</title>
		<link>http://fairyfish.net/2007/11/09/write-plugin-by-yourself-begin/</link>
		<comments>http://fairyfish.net/2007/11/09/write-plugin-by-yourself-begin/#comments</comments>
		<pubDate>Sun, 18 Nov 2007 15:15:00 +0000</pubDate>
		<dc:creator>Denis</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WordPress 插件]]></category>
		<category><![CDATA[WordPress 教程]]></category>
		<category><![CDATA[沙发]]></category>

		<guid isPermaLink="false">http://fairyfish.net/2007/11/09/write-plugin-by-yourself-begin/</guid>
		<description><![CDATA[WordPress 之所以被广泛应用，一个很重要的原因，他很有多插件，多到什么程度呢，就像天上的星星一样多，哈哈，形容得真恶心，自己寒一个。今天开始给大家写一些原创性的文章：自己动手写插件，今天是第一篇，算是一个开始，从一个最简单插件开始，刚刚写好的，厉害吧！也是对阿里妈妈插件大赛的一个支持吧！ 一个最简单的插件包括以下两部分：插件头信息和一个可在模板中使用的函数。那我们从第一步头信息开始： 自己动手写插件的第一步就是定义插件头信息： /* Plugin Name: WP 的沙发 Plugin URI: http://fairyfish.net/ Description: 本人代表广大 blogger 仅此插件献给沙发党以表彰他们对博客做出的杰出奉献 Version: 沙发一代 Author: 某低调沙发党 Author URI: http://fairyfish.net/ */ 这里我们定义了插件名称，版本，作者，下载地址，和简单的介绍。 插件的第二步是定义一个可在模板中使用的模板函数： 我开始的这个沙发插件非常简单，不会含有任何的任何的 filter 和 hook。所以我们这个插件实际上只需要对 WordPress 的 Comment 表进行查询，获取抢得沙发最多的三个留言者即可。 原本这个插件只需一条还算复杂的 SQL 语句即可搞定，但是著名的空间上盘古的 MySQL 的版本还是 4.0，泪奔，不支持 SQL 嵌套。算了还是贴出我写得很菜的 SQL 语句： SELECT * , count( first_comments.comment_author ) AS comment_comments FROM ( SELECT [...]]]></description>
			<content:encoded><![CDATA[<p>WordPress 之所以被广泛应用，一个很重要的原因，他很有多插件，多到什么程度呢，就像天上的星星一样多，哈哈，形容得真恶心，自己寒一个。今天开始给大家写一些原创性的文章：自己动手写插件，今天是第一篇，算是一个开始，从一个最简单插件开始，刚刚写好的，厉害吧！也是对<a href="http://fairyfish.net/2007/10/23/alimama-wordpress-plugin-competition/">阿里妈妈插件大赛</a>的一个支持吧！</p>
<p>一个最简单的插件包括以下两部分：插件头信息和一个可在模板中使用的函数。那我们从第一步头信息开始：<br />
<span id="more-1119"></span><br />
<strong>自己动手写插件的第一步就是定义插件头信息：</strong></p>
<pre><span style="color: #008000">/*
Plugin Name: WP 的沙发
Plugin URI: http://fairyfish.net/
Description: 本人代表广大 blogger 仅此插件献给沙发党以表彰他们对博客做出的杰出奉献
Version: 沙发一代
Author: 某低调沙发党
Author URI: http://fairyfish.net/
*/</span></pre>
<p>这里我们定义了插件名称，版本，作者，下载地址，和简单的介绍。</p>
<p><strong>插件的第二步是定义一个可在模板中使用的模板函数：</strong></p>
<p>我开始的这个沙发插件非常简单，不会含有任何的任何的 filter 和 hook。所以我们这个插件实际上只需要对 WordPress 的 Comment 表进行查询，获取抢得沙发最多的三个留言者即可。</p>
<p>原本这个插件只需一条还算复杂的 SQL 语句即可搞定，但是著名的空间上盘古的 MySQL 的版本还是 4.0，泪奔，不支持 SQL 嵌套。算了还是贴出我写得很菜的 SQL 语句：</p>
<pre><a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=SELECT&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99">SELECT</a> * , <a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=count&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99">count</a>( first_comments.comment_author ) <a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=AS&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99">AS</a> comment_comments <a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=FROM&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99">FROM</a> ( <a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=SELECT&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99">SELECT</a> * <a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=FROM&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99">FROM</a> ( <a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=SELECT&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99">SELECT</a> comment_author, comment_post_id, comment_author_url <a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=FROM&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99">FROM</a> wp_comments <a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=WHERE&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99">WHERE</a> comment_type = '<span style="color: #8b0000"></span>' <a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=AND&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99">AND</a> user_id =0 <a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=AND&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99">AND</a> comment_approved = '<span style="color: #8b0000">1</span>' <a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=ORDER&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99">ORDER</a> <a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=BY&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99">BY</a> comment_date )ordered_comments <a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=GROUP&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99">GROUP</a> <a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=BY&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99">BY</a> ordered_comments.comment_post_id )first_comments <a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=GROUP&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99">GROUP</a> <a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=BY&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99">BY</a> first_comments.comment_author <a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=ORDER&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99">ORDER</a> <a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=BY&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99">BY</a> comment_comments <a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=DESC&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99">DESC</a> LIMIT 3</pre>
<p>既然不支持，按只有自己写了代码了，创建一个叫做 sofa 的函数。程序的代码非常简单，基本的逻辑如下：</p>
<ol>
<li>查出含有留言的 Post 的 ID。</li>
<li>然后找出它们的第一条留言的留言者和其博客，帮把这些信息写到一个数组中。</li>
<li>对数组进行处理找出抢到沙发的三个留言者。</li>
<li>输出他们。</li>
</ol>
<p>具体代码：</p>
<pre><a style="color: #0000ff" href="http://www.php.net/function">function</a> sofa(){
	<a style="color: #0000ff" href="http://www.php.net/global">global</a> $wpdb;

	$first_commentors = <a style="color: #ffa500" href="http://www.php.net/array">array</a>(); <span style="color: #008000">//初始化沙发党数组</span>

	$q = "<span style="color: #8b0000">SELECT DISTINCT comment_post_id FROM $wpdb-&gt;comments WHERE comment_type ='' AND user_id = 0 AND comment_approved = '1'</span>";
	$have_comment_post_ids = $wpdb-&gt;get_results($q); <span style="color: #008000">//获取有留言的日志ID</span>
	<a style="color: #0000ff" href="http://www.php.net/foreach">foreach</a> ($have_comment_post_ids <a style="color: #0000ff" href="http://www.php.net/as">as</a> $have_comment_post_id){
		$q = "<span style="color: #8b0000">SELECT comment_author FROM $wpdb-&gt;comments WHERE comment_type ='' AND user_id = 0 AND comment_approved = '1' AND comment_post_id = $have_comment_post_id-&gt;comment_post_id order by comment_date limit 1</span>";
		$first_comment = $wpdb-&gt;get_results($q);  <span style="color: #008000">//获取沙发党</span>
		<a style="color: #ffa500" href="http://www.php.net/array_push">array_push</a>($first_commentors,$first_comment[0] -&gt; comment_author); <span style="color: #008000">//添加进沙发党数组</span>
	}

	$first_commentors = (<a style="color: #ffa500" href="http://www.php.net/array_count_values">array_count_values</a> ($first_commentors)); <span style="color: #008000">//统计</span>
	<a style="color: #ffa500" href="http://www.php.net/arsort">arsort</a>($first_commentors); <span style="color: #008000">//排序</span>

	$first_commentors_author = <a style="color: #ffa500" href="http://www.php.net/array_keys">array_keys</a>($first_commentors);<span style="color: #008000">//获取沙发党名字</span>

	$output = "<span style="color: #8b0000"></span>"; <span style="color: #008000">//初始化输出字符串</span>
	$output .= '<span style="color: #8b0000">&lt;ul class="wp_sofa"&gt;</span>';
	<a style="color: #0000ff" href="http://www.php.net/for">for</a>($i=0; $i&lt;3; $i++){
		$title="<span style="color: #8b0000"></span>";
		<a style="color: #0000ff" href="http://www.php.net/if">if</a>($i==0)$title = "<span style="color: #8b0000">状元：</span>";
		<a style="color: #0000ff" href="http://www.php.net/if">if</a>($i==1)$title = "<span style="color: #8b0000">榜眼：</span>";
		<a style="color: #0000ff" href="http://www.php.net/if">if</a>($i==2)$title = "<span style="color: #8b0000">探花：</span>";
		$q = "<span style="color: #8b0000">SELECT comment_author_url FROM $wpdb-&gt;comments WHERE comment_type ='' AND user_id = 0 AND comment_approved = '1' AND comment_author_url !='' AND comment_author = '$first_commentors_author[$i]' limit 1</span>";
		$first_comment_url = $wpdb-&gt;get_results($q); <span style="color: #008000">//获取沙发党的博客</span>
		<a style="color: #0000ff" href="http://www.php.net/if">if</a>($first_comment_url){
			$output .= '<span style="color: #8b0000">&lt;li&gt;&lt;a href="</span>' . $first_comment_url[0] -&gt; comment_author_url . '<span style="color: #8b0000">" title="</span>' . $first_commentors_author[$i].'<span style="color: #8b0000">"&gt;</span>' . $title.$first_commentors_author[$i] . '<span style="color: #8b0000">&lt;/a&gt;(</span>' . $first_commentors["<span style="color: #8b0000">$first_commentors_author[$i]</span>"].'<span style="color: #8b0000">)&lt;/li&gt;</span>';
		} <a style="color: #0000ff" href="http://www.php.net/else">else</a> {
			$output .= '<span style="color: #8b0000">&lt;li&gt;</span>' . $title.$first_commentors_author[$i] . '<span style="color: #8b0000">(</span>'.$first_commentors["<span style="color: #8b0000">$first_commentors_author[$i]</span>"] . '<span style="color: #8b0000">)&lt;/li&gt;</span>';
		}
	}
	$output .= '<span style="color: #8b0000">&lt;/ul&gt;</span>';
	<a style="color: #0000ff" href="http://www.php.net/echo">echo</a> $output;<span style="color: #008000">//输出沙发党前三甲</span>
}
<span style="color: #0000ff">?&gt;</span></pre>
<p>然后在模板上（一般是在侧边拦侧）调用这个 sofa 函数即可。调用的方法为：</p>
<pre><span style="color:#0000FF">&lt;?</span>php <a href="http://www.php.net/if" style="color:#0000FF">if</a>(<a href="http://www.php.net/function_exists" style="color:#FFA500">function_exists</a>('<span style="color:#8B0000">sofa</span>')) { sofa(); } <span style="color:#0000FF">?&gt;</span></pre>
<p>我们自己动手写插件的第一篇就到此为止，有任何问题请留言，但是抢沙发没有奖。<br />
下一节我们讲讲如何<a href="http://fairyfish.net/2007/11/10/write-plugin-by-yourself-widget/">窗体化（Widgetize）该插件</a>，请大家保持关注，本人首次尝试写教程，如有不好的地方，欢迎大家提出批评和意见。</p>
<p>该插件演示请看本博客侧边栏订阅的下面！</p>
<p>这篇教程所实现的插件下载地址：<a href="http://wpcn.googlecode.com/files/wp-sofa-1.0.zip">WP-Sofa</a>。并以此插件献给某著名沙发党<a href="http://caitou.com/">大猫</a>和<a href="http://hi.baidu.com/huge">胡戈戈</a>同学。</p>
<p>&gt;&gt;&gt;<a href="http://fairyfish.net/2007/11/09/write-plugin-by-yourself-begin/" title="自己动手写 WordPress 插件：开始">继续阅读全文</a> ...</p><hr /><p><a href="http://s.click.taobao.com/t_8?e=7HZ5x%2BOzcBqQvUL9HREWEoUWa1c%3D&p=mm_25083601_0_0" rel="nofollow"><img src="http://fairyfish.net/wp-content/banner/notyet.gif"></a></p>
<p>
&copy; <a href="http://fairyfish.net/" title="我爱水煮鱼">我爱水煮鱼</a>
 / <a href="http://fairyfish.net/bookmark/?url=http://fairyfish.net/2007/11/09/write-plugin-by-yourself-begin/&title=%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E5%86%99+WordPress+%E6%8F%92%E4%BB%B6%EF%BC%9A%E5%BC%80%E5%A7%8B&tags=WordPress 插件, WordPress 教程, 沙发, "  title="自己动手写 WordPress 插件：开始">收藏本文</a>
 / <a href="http://fairyfish.net/2007/11/09/write-plugin-by-yourself-begin/#comments" title="自己动手写 WordPress 插件：开始">39条评论</a>
 / <a href="http://feed.fairyfish.net" title="订阅我爱水煮鱼">RSS 订阅</a>
 / <a href="http://fairyfish.net/go/wpjam" title="WordPress JAM">长期承接 WordPress 项目</a>
 / <a href="http://fairyfish.net/coupon/" title="主机域名优惠码">主机域名优惠码</a>
 / <a href="http://weibo.com/denishua/" title="新浪微博">新浪微博</a>
</p><h3>相关日志</h3><ul class="related_post"><li><a href="http://fairyfish.net/2007/12/22/write-plugin-by-yourself-option/" title="自己动手写 WordPress 插件：后台选项">自己动手写 WordPress 插件：后台选项</a></li>
<li><a href="http://fairyfish.net/2007/11/26/write-plugin-by-yourself-cron/" title="自己动手写 WordPress 插件：使用 WP-Cron">自己动手写 WordPress 插件：使用 WP-Cron</a></li>
<li><a href="http://fairyfish.net/2007/11/19/write-plugin-by-yourself-api/" title="自己动手写 WordPress 插件：使用 API">自己动手写 WordPress 插件：使用 API</a></li>
<li><a href="http://fairyfish.net/2007/11/12/write-plugin-by-yourself-widget-2/" title="自己动手写 WordPress 插件：窗体化插件 2">自己动手写 WordPress 插件：窗体化插件 2</a></li>
<li><a href="http://fairyfish.net/2007/11/10/write-plugin-by-yourself-widget-1/" title="自己动手写 WordPress 插件：窗体化插件 1">自己动手写 WordPress 插件：窗体化插件 1</a></li>
<li><a href="http://fairyfish.net/2008/08/14/creating-tables-with-plugins/" title="为插件添加数据表">为插件添加数据表</a></li>
</ul><img src="http://fairyfish.net/wp-content/plugins/all-in-one/ga.php?utmac=MO-328125-5&amp;utmn=1407621396&amp;utmr=-&amp;utmp=%2Frss%2F2007%2F11%2F09%2Fwrite-plugin-by-yourself-begin%2F&amp;utmdt=%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E5%86%99+WordPress+%E6%8F%92%E4%BB%B6%EF%BC%9A%E5%BC%80%E5%A7%8B&amp;guid=ON" />]]></content:encoded>
			<wfw:commentRss>http://fairyfish.net/2007/11/09/write-plugin-by-yourself-begin/feed/</wfw:commentRss>
		<slash:comments>39</slash:comments>
		</item>
	</channel>
</rss>

