<?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>Becomin' Charles &#187; translate</title>
	<atom:link href="http://sexywp.com/tags/translate/feed" rel="self" type="application/rss+xml" />
	<link>http://sexywp.com</link>
	<description>Building another myself~~</description>
	<lastBuildDate>Thu, 29 Jul 2010 15:10:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
	
<!-- Start Of Script Generated By WP-PostViews Plus -->
<script type='text/javascript' src='http://sexywp.com/cc/wp-includes/js/jquery/jquery.js?ver=1.4.2'></script>
<script type="text/javascript">
/* <![CDATA[ */
jQuery.ajax({type:'GET',url:'http://sexywp.com/cc/wp-content/plugins/wp-postviews-plus/postviews_plus.php',data:'todowppvp=add&type=tag&id=55_1',cache:false,dataType:'script'});
/* ]]> */
</script>
<!-- End Of Script Generated By WP-PostViews Plus -->
	<item>
		<title>[WP新闻]官方插件目录的搜索更强了！</title>
		<link>http://sexywp.com/a-better-search-engine-of-wporg.htm</link>
		<comments>http://sexywp.com/a-better-search-engine-of-wporg.htm#comments</comments>
		<pubDate>Thu, 19 Feb 2009 06:40:06 +0000</pubDate>
		<dc:creator>Charles</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[translate]]></category>

		<guid isPermaLink="false">http://sexywp.com/?p=299</guid>
		<description><![CDATA[原文

WordPress.org的官方插件目录最大的问题，也是最常被抱怨的问题，就是那令人恶心的搜索。

以后不会再这样了。我们现在使用了Sphinx（一个“免费的开源的SQL全文搜索引擎”）来加强官方插件目录的搜索，无论是从官方网站搜索，还是从你WP的后台搜索插件（插件→添加新插件），搜索体验都会得到提升。

<span class="readmore"><a href="http://sexywp.com/a-better-search-engine-of-wporg.htm title="[WP新闻]官方插件目录的搜索更强了！>Keep Reading --- 335 words totally</a></span>]]></description>
			<content:encoded><![CDATA[<p><a href="http://wordpress.org/development/2009/02/new-and-improved-plugins-directory-search/">原文</a></p>
<p><a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>.org的官方插件目录最大的问题，也是最常被抱怨的问题，就是那令人恶心的搜索。</p>
<p>以后不会再这样了。我们现在使用了Sphinx（一个“免费的开源的SQL全文搜索引擎”）来加强官方插件目录的搜索，无论是从官方网站搜索，还是从你WP的后台搜索插件（插件→添加新插件），搜索体验都会得到提升。</p>
<p>现在，搜索功能更棒了。虽然还存在着一些奇怪的小问题（我们的错，不是Sphinx的），当然我们会在短期内修复的，但是能让每个人用上它，我们十分高兴:)。</p>
<p>目前，只有插件的标题、描述、安装、FAQ等等来自readme.txt的字段被索引，不过，我们很快会补充完整的，包括作者和tags等。</p>
<p>译注：刚才体验了一下，确实提升很大，当然，这是由于原来的搜索实在是太烂了！现在，输入以空格分隔的多个关键字，也可以得到相对准确的结果了，结果列表的相关度还是非常大的。</p>

	标签：<a href="http://sexywp.com/tags/news" title="news" rel="tag nofollow">news</a>, <a href="http://sexywp.com/tags/translate" title="translate" rel="tag nofollow">translate</a>, <a href="http://sexywp.com/tags/wordpress" title="WordPress" rel="tag nofollow">WordPress</a><br />
]]></content:encoded>
			<wfw:commentRss>http://sexywp.com/a-better-search-engine-of-wporg.htm/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>WordPress插件介绍：cformsII 及其汉化包</title>
		<link>http://sexywp.com/wp-plugins-cformsii-intro.htm</link>
		<comments>http://sexywp.com/wp-plugins-cformsii-intro.htm#comments</comments>
		<pubDate>Thu, 20 Nov 2008 09:28:50 +0000</pubDate>
		<dc:creator>Charles</dc:creator>
				<category><![CDATA[Plugins]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[my works]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[recommend]]></category>
		<category><![CDATA[translate]]></category>

		<guid isPermaLink="false">http://www.charlestang.cn/?p=261</guid>
		<description><![CDATA[Updated: 终于与插件原作者取得了联系，得到了作者的支持，本文链接已经被列到了官方插件主页上，热情的作者还帮忙制作了标题图片的汉化版本。本文底部的下载也就顺便升级到了9.3版本。

一直以来想给自己的博客添加联系表单功能，但是一直也没有碰到好的插件，直到在后台的最流行插件推荐那里，看到了cformsII，一款强大无匹的表单插件。cforms意思为custom forms，就是自定义表单的意思。

这款插件的主要功能有：

<span class="readmore"><a href="http://sexywp.com/wp-plugins-cformsii-intro.htm title="WordPress插件介绍：cformsII 及其汉化包>Keep Reading --- 760 words totally</a></span>]]></description>
			<content:encoded><![CDATA[<p><strong>Updated:</strong> 终于与插件原作者取得了联系，得到了作者的支持，本文链接已经被列到了官方插件主页上，热情的作者还帮忙制作了标题图片的汉化版本。本文底部的下载也就顺便升级到了9.3版本。</p>
<p>一直以来想给自己的博客添加联系表单功能，但是一直也没有碰到好的插件，直到在后台的最流行插件推荐那里，看到了cformsII，一款强大无匹的表单插件。cforms意思为custom forms，就是自定义表单的意思。</p>
<p>这款插件的主要功能有：</p>
<p>1. 设定自定义表单，允许插入到页面，日志中去；</p>
<p>2. 非常强悍的表单定制功能，支持各种表单域，可添加验证码，Ajax提交；<br />
<span id="more-261"></span></p>
<table style="width:auto;margin:10px auto">
<tr>
<td><a href="http://picasaweb.google.com/lh/photo/rbqn7EMl-UOrhE69R7os9Q"><img src="http://lh3.ggpht.com/_QYicOeu89Bk/SSUnQPWJewI/AAAAAAAAA30/OTrwQsaVefA/s400/cformsII-1.png" /></a></td>
</tr>
<tr>
<td style="font-family:arial,sans-serif; font-size:11px; text-align:right">cforms定制表单的界面</td>
</tr>
</table>
<table style="width:auto;margin:10px auto">
<tr>
<td><a href="http://picasaweb.google.com/lh/photo/x66z06qgz2c5DNnEsb4nHg"><img src="http://lh3.ggpht.com/_QYicOeu89Bk/SSUnQDlBPPI/AAAAAAAAA38/dIX6dpEK7Q4/s400/cformsII-2.png" /></a></td>
</tr>
<tr>
<td style="font-family:arial,sans-serif; font-size:11px; text-align:right">特定表单的属性设定界面</td>
</tr>
</table>
<p>3. 可以取代WP的评论表单；</p>
<p>4. 集成了Tell-A-Friend的功能；</p>
<p>5. 强悍方便的后台管理界面；</p>
<table style="width:auto;margin:10px auto">
<tr>
<td><a href="http://picasaweb.google.com/lh/photo/1XPY3jvFv9NZfEY6zNzYZA"><img src="http://lh4.ggpht.com/_QYicOeu89Bk/SSUnQaQ5RwI/AAAAAAAAA4E/TF3gxF7OSYE/s400/cformsII-3.png" /></a></td>
</tr>
<tr>
<td style="font-family:arial,sans-serif; font-size:11px; text-align:right">丰富的自定义功能</td>
</tr>
</table>
<table style="width:auto;margin:10px auto">
<tr>
<td><a href="http://picasaweb.google.com/lh/photo/bAJxU8Umdrpsfr9pL1P9Yg"><img src="http://lh4.ggpht.com/_QYicOeu89Bk/SSUowaWxsfI/AAAAAAAAA4k/CRePcyMBDiw/s400/cformsII-5.png" /></a></td>
</tr>
<tr>
<td style="font-family:arial,sans-serif; font-size:11px; text-align:right">在某个页面或者某篇日志插入表单是很轻松的</td>
</tr>
</table>
<p>6. 无比丰富的文档；</p>
<table style="width:auto;margin:10px auto">
<tr>
<td><a href="http://picasaweb.google.com/lh/photo/SPRDTq-VvWO1kEFU7jUUhA"><img src="http://lh5.ggpht.com/_QYicOeu89Bk/SSUnQSYaVHI/AAAAAAAAA4M/FHfMHePFEQs/s400/cformsII-4.png" /></a></td>
</tr>
<tr>
<td style="font-family:arial,sans-serif; font-size:11px; text-align:right">第一次看到在插件内部带有如此详尽的帮助</td>
</tr>
</table>
<p><strong><a href="http://www.deliciousdays.com/cforms-plugin/">插件主页</a> | <a href="http://wordpress.org/extend/plugins/cforms/">WP插件目录</a> | <a href="http://www.box.net/shared/41o7ej6v8v">v9.3版中文包下载地址</a> | <a href="http://www.box.net/shared/9rm2orm3dx">v10.0版中文包下载地址</a> | <a href="http://www.box.net/shared/u5akvdzoa3">v10.3版中文包下载地址</a> | <a href="http://www.box.net/shared/p9960drbdr">v10.4版中文包下载地址</a> | <a href="http://www.box.net/shared/a82rytib1j">v10.5版中文包下载</a> | <a href="http://www.box.net/shared/5xyrjp6dou">po文件下载地址</a></strong></p>
<p>关于中文包的使用说明：</p>
<p>中文包的目录结构:</p>
<div style="text-indent:0;margin-bottom:15px;color:blue">
<a href="http://sexywp.com/tags/plugins" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with plugins">plugins</a>-----cforms<br />
&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|_______cforms-admin.css<br />
&nbsp;&nbsp;&nbsp;&nbsp;|<br />
&nbsp;&nbsp;&nbsp;&nbsp;|_______cforms-zh_CN.mo
</div>
<p>使用<a href="http://sexywp.com/tags/plugins" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with plugins">plugins</a>作为跟目录，意思就是想告诉各位，<span style="color:red"><strong>使用的时候要把cforms-zh_CN.mo直接放在wp-content/<a href="http://sexywp.com/tags/plugins" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with plugins">plugins</a>目录下，而不要放在插件目录内</strong></span>。</p>
<p>特别附加了一个插件目录内的cforms-admin.css，该文件不是必须的，但是用这个文件替换了原来的文件后，会使后台看起来更加舒服一点，因为原来的英文后台字体设定得特别小。</p>
<p><strong>Updated:</strong>改插件目前升级到了9.3版，而中文包是针对9.2版本制作，经检查，只增加了一个短小的字符串（Title：标题），所以不对中文包进行更新了。</p>
<p><strong>Updated:</strong>插件升级到了9.4版本，字符串基本上没有变化，大家可以继续使用v9.3的汉化包~~</p>
<p><strong>Updated:</strong>插件升级到了10.0版本，增加了一个多页表单的功能，字符串更新74处，请升级到新版的同学更换语言包~~</p>
<p><strong>Updated:2009-2-21 15:55:01：</strong>插件升级到了10.3版，字符串更新了近30处，请需要更新的同学自行下载~~</p>

	标签：<a href="http://sexywp.com/tags/my-works" title="my works" rel="tag nofollow">my works</a>, <a href="http://sexywp.com/tags/plugins" title="plugins" rel="tag nofollow">plugins</a>, <a href="http://sexywp.com/tags/recommend" title="recommend" rel="tag nofollow">recommend</a>, <a href="http://sexywp.com/tags/translate" title="translate" rel="tag nofollow">translate</a>, <a href="http://sexywp.com/tags/wordpress" title="WordPress" rel="tag nofollow">WordPress</a><br />
]]></content:encoded>
			<wfw:commentRss>http://sexywp.com/wp-plugins-cformsii-intro.htm/feed</wfw:commentRss>
		<slash:comments>33</slash:comments>
		</item>
		<item>
		<title>插件开发全攻略（目录）</title>
		<link>http://sexywp.com/how-to-write-a-wp-plugin-contents.htm</link>
		<comments>http://sexywp.com/how-to-write-a-wp-plugin-contents.htm#comments</comments>
		<pubDate>Sun, 06 Jul 2008 03:33:58 +0000</pubDate>
		<dc:creator>Charles</dc:creator>
				<category><![CDATA[Plugins Develop]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[develop]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[translate]]></category>

		<guid isPermaLink="false">http://www.charlestang.cn/?p=114</guid>
		<description><![CDATA[隔了这么久，终于将这个系列文章都翻译完了，这么一遍走下来，实在觉得自己很浅薄，技术和语言水平都十分有限。恐怕也没有全部传达原作者的意图。

我打算陆续将该系列的文章校对一遍，并且打算将这个系列里面的例子改写成自己的例子，这样，我可以对文章有更准确的理解。



<span class="readmore"><a href="http://sexywp.com/how-to-write-a-wp-plugin-contents.htm title="插件开发全攻略（目录）>Keep Reading --- 308 words totally</a></span>]]></description>
			<content:encoded><![CDATA[<p>隔了这么久，终于将这个系列文章都翻译完了，这么一遍走下来，实在觉得自己很浅薄，技术和语言水平都十分有限。恐怕也没有全部传达原作者的意图。</p>
<p>我打算陆续将该系列的文章校对一遍，并且打算将这个系列里面的例子改写成自己的例子，这样，我可以对文章有更准确的理解。</p>
<p><span id="more-114"></span></p>
<p>这里，我罗列一下这个系列文章的目录吧。英文名字就是原文，底下的中文名字就是译文。</p>
<ol>
<li><a href="http://www.devlounge.net/articles/how-to-write-a-wordpress-plugin-introduction">How to Write a WordPress Plugin - Introduction</a></li>
<li><a href="http://sexywp.com/how-to-write-a-wp-plugin-01.htm">介绍</a></li>
<li><a href="http://www.devlounge.net/articles/seven-reasons-to-write-a-wordpress-plugin">Seven Reasons to Write a WordPress Plugin</a></li>
<li><a href="http://sexywp.com/how-to-write-a-wp-plugin-02.htm">编写插件的七个理由</a></li>
<li><a href="http://www.devlounge.net/articles/how-to-get-ideas-for-wordpress-plugins">How to Get Ideas for WordPress Plugins</a></li>
<li><a href="http://sexywp.com/how-to-write-a-wp-plugin-03.htm">怎样获得WordPress插件的创意</a></li>
<li><a href="http://www.devlounge.net/articles/structure-of-a-wordpress-plugin">Structure of a WordPress Plugin</a></li>
<li><a href="http://sexywp.com/how-to-write-a-wp-plugin-04.htm">WordPress插件的结构</a></li>
<li><a href="http://www.devlounge.net/articles/wordpress-plugin-actions">WordPress Plugin Actions</a></li>
<li><a href="http://sexywp.com/how-to-write-a-wp-plugin-05.htm">WordPress 插件Actions</a></li>
<li><a href="http://www.devlounge.net/articles/wordpress-plugin-filters">WordPress Plugin Filters</a></li>
<li><a href="http://sexywp.com/how-to-write-a-wp-plugin-06.htm">WordPress插件Filter</a></li>
<li><a href="http://www.devlounge.net/articles/constructing-an-wordpress-plugin-admin-panel">Constructing a WordPress Plugin Admin Panel</a></li>
<li><a href="http://sexywp.com/how-to-write-a-wp-plugin-07.htm">构造一个WordPress插件管理员面板</a></li>
<li><a href="http://www.devlounge.net/articles/constructing-a-wordpress-plugin-users-panel">Constructing a WordPress Plugin User&#8217;s Panel</a></li>
<li><a href="http://sexywp.com/how-to-write-a-wp-plugin-08.htm">构建一个WordPress插件用户面板</a></li>
<li><a href="http://www.devlounge.net/articles/wordpress-plugins-and-database-interaction">WordPress Plugins and Database Interaction</a></li>
<li><a href="http://sexywp.com/how-to-write-a-wp-plugin-09.htm">WordPress插件和数据库交互</a></li>
<li><a href="http://www.devlounge.net/articles/using-javascript-and-css-with-your-wordpress-plugin">Using JavaScript and CSS with your WordPress Plugin</a></li>
<li><a href="http://sexywp.com/how-to-write-a-wp-plugin-10.htm">在你的WordPress插件中使用Javascript和CSS</a></li>
<li><a href="http://www.devlounge.net/articles/using-ajax-with-your-wordpress-plugin">Using AJAX with your WordPress Plugin</a></li>
<li><a href="http://sexywp.com/how-to-write-a-wp-plugin-11.htm">在你的WP插件中使用AJAX</a></li>
<li><a href="http://www.devlounge.net/articles/releasing-and-promoting-your-wordpress-plugin">Releasing and Promoting Your WordPress Plugin</a></li>
<li><a href="http://sexywp.com/how-to-write-a-wp-plugin-12.htm">发布并推广你的WordPress插件</a></li>
</ol>
<p>原来的目录页面在：<a href="http://www.devlounge.net/extras/how-to-write-a-wordpress-plugin">这里</a></p>
<p>还提供PDF版本的下载哦。</p>
<p><a href="http://www.box.net/shared/n7urk9zuxi">中文版PDF下载（2008年12月22日11:57:51）</a></p>

	标签：<a href="http://sexywp.com/tags/develop" title="develop" rel="tag nofollow">develop</a>, <a href="http://sexywp.com/tags/plugins" title="plugins" rel="tag nofollow">plugins</a>, <a href="http://sexywp.com/tags/translate" title="translate" rel="tag nofollow">translate</a>, <a href="http://sexywp.com/tags/wordpress" title="WordPress" rel="tag nofollow">WordPress</a><br />
]]></content:encoded>
			<wfw:commentRss>http://sexywp.com/how-to-write-a-wp-plugin-contents.htm/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>插件开发全攻略（12）---发布并推广你的WordPress插件</title>
		<link>http://sexywp.com/how-to-write-a-wp-plugin-12.htm</link>
		<comments>http://sexywp.com/how-to-write-a-wp-plugin-12.htm#comments</comments>
		<pubDate>Thu, 03 Jul 2008 04:10:26 +0000</pubDate>
		<dc:creator>Charles</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[develop]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[translate]]></category>

		<guid isPermaLink="false">http://www.charlestang.cn/?p=108</guid>
		<description><![CDATA[在你完成了你了不起的WordPress插件后，在你发布和推广你的插件之前，还有一些事情需要考虑。

发布前

努力遵循标准

<span class="readmore"><a href="http://sexywp.com/how-to-write-a-wp-plugin-12.htm title="插件开发全攻略（12）---发布并推广你的WordPress插件>Keep Reading --- 1444 words totally</a></span>]]></description>
			<content:encoded><![CDATA[<p>在你完成了你了不起的<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>插件后，在你发布和推广你的插件之前，还有一些事情需要考虑。</p>
<h3>发布前</h3>
<h4>努力遵循标准</h4>
<p>虽然遵循<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>编码规范不是必须的，但是有些东西确实可以让你的生活变得简单。其中最有价值的一个建议是<strong>永远不要使用简写的PHP</strong>。原因呢？并非每个人都会将简写开启。</p>
<p><span id="more-108"></span></p>
<p>所以，不要这样写：</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Blue;">&lt;?</span><span style="color: Gray;"> </span><span style="color: #ffa500;">/*</span><span style="color: #ffa500;">your php code</span><span style="color: #ffa500;">*/</span><span style="color: Gray;"> </span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>而要这样写：</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Blue;">&lt;?php</span><span style="color: Gray;"> </span><span style="color: #ffa500;">/*</span><span style="color: #ffa500;">your php code</span><span style="color: #ffa500;">*/</span><span style="color: Gray;"> </span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<h4>确保你已经完全测试了你的插件</h4>
<p>找一些爱好者来测试你的插件。技术上来说，专门的测试人员是好的，但是你还是希望有一些普通的并不懂得编程语言的用户来测试。</p>
<p>找到所有的bug是不可能的，但是至少努力推出一个稳定的版本。</p>
<h4>确保你有一个Readme文件</h4>
<p>在你把插件向大众公开之前，确认一下你是否有一个Readme文件。这个文件应该包含最基本的安装流程介绍。对于一个要求严格的readme文件版本，请检查<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>推荐Readme格式。甚至有一个绝妙的Readme文件验证器。</p>
<h4>设立一个专门的<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>插件页面</h4>
<p>Ajay D'Souza曾经写过如何发布<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>主题的建议。他的建议也可以在某种程度上用在插件之上。</p>
<p>确保你设立了一个专门的插件页面。在这个页面上，用户可以找到关于这个插件的任何东西。这个插件的页面至少要包含以下的东西：</p>
<ul>
<li>对你的插件的一个简单描述</li>
<li>下载链接</li>
<li>特性列表</li>
<li>安装指南</li>
<li>版本历史</li>
<li>已知的bugs和冲突</li>
<li>截图或者demo</li>
<li>联系或者支持信息（或者允许评论
<li>
</ul>
<p>上述信息将帮助你提升你的插件，尤其是描述和特性部分。</p>
<h4>有一个好的目录结构</h4>
<p>我会力劝你总是把自己的插件放在一个目录里面，除了主要插件文件外的任何文件都应该放在子目录里面。确保你zip，gzip或者rar你的插件，使得人们可以非常简单的安装你的插件。</p>
<h4>你的插件需要修改模板或者文件修改吗？</h4>
<p>如果你的插件需要修改模板的设置或者文件，做好被bug报告和等待的帮助猛攻的准备。我认为，一个好的插件绝对不需要修改主题或者某个文件的。除非这个插件往<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>内核中添加了模板标签。</p>
<p>如果你的插件确实需要模板修改或者文件修改，在你的下载页面包含一些详细的例子，并且尽可能在你的发布中包含一些demo。</p>
<h3>推广你的插件</h3>
<p>在你拥有了你专门的下载页面后，是时候发布你插件的信息使得人们来下载你的插件了。你花在你的插件描述和特性的撰写上的时间是非产关键的，因为这决定了人们会否采用你的插件。其他人链接到你的插件也非常重要。</p>
<h4>在Weblog Tools Collection推广</h4>
<p>一个推广你的插件的很好的地方是在Weblog Tools Collection。在他们的插件发布栏目，你可以将你的详细描述投递，推荐你的插件。</p>
<h4>在<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>插件数据库推广</h4>
<p><a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>插件数据库是另一个添加你的插件的好去处。添加你的插件的过程不是那么一帆风顺的，但是有详细的指导。</p>
<h4>在<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>官方插件库推广</h4>
<p><a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>自己提供了主机来存放你的插件。不过，在你被允许添加你的插件之前，你必须满足几个条件。记住，任何宣传都是好的宣传。</p>
<h4>使用社会网络推广</h4>
<p>将你的插件添加到delicious，digg，和Stumble Upon。让你的朋友来帮忙。如果你的插件足够好，推荐就会广为流传。</p>
<h4>在你自己的博客上推广</h4>
<p>如果你的插件是人们会注意到的，在你自己的博客上使用吧。人们会开始问，你使用的到底是什么插件。口口相传是非常有效的，尤其是在博客社区内。</p>
<h3>结论</h3>
<p>你可以拥有世界上最好的插件，但是如果没有正确的发布和推广，只有很少的人会下载它。一旦你开始你的推广过程，倾听特性需求和bug报告是非常重要的，尤其是你的插件非常年轻的时候。如果你的插件不起作用，或者太多的人使用的时候遇到问题，人们下载的时候就会非常担忧。所以，在早期修复那些bug和添加重要的特性是非常重要的。绝大多数这样的问题可以在测试的过程中解决，但是有些bug只有在官方发布后才能看到。</p>
<h3>写在《插件开发全攻略》系列的结尾</h3>
<p>感谢您阅读插件开发系列文章的最后一篇。希望这个系列能够让您受益，并且帮助你为撰写自己的插件建立基础。非常感谢您的阅读。</p>

	标签：<a href="http://sexywp.com/tags/develop" title="develop" rel="tag nofollow">develop</a>, <a href="http://sexywp.com/tags/plugins" title="plugins" rel="tag nofollow">plugins</a>, <a href="http://sexywp.com/tags/translate" title="translate" rel="tag nofollow">translate</a>, <a href="http://sexywp.com/tags/wordpress" title="WordPress" rel="tag nofollow">WordPress</a><br />
]]></content:encoded>
			<wfw:commentRss>http://sexywp.com/how-to-write-a-wp-plugin-12.htm/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>插件开发全攻略(11)---在你的WP插件中使用AJAX</title>
		<link>http://sexywp.com/how-to-write-a-wp-plugin-11.htm</link>
		<comments>http://sexywp.com/how-to-write-a-wp-plugin-11.htm#comments</comments>
		<pubDate>Tue, 01 Jul 2008 05:41:23 +0000</pubDate>
		<dc:creator>Charles</dc:creator>
				<category><![CDATA[Plugins Develop]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[develop]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[translate]]></category>

		<guid isPermaLink="false">http://www.charlestang.cn/?p=106</guid>
		<description><![CDATA[越来越多的插件开始使用AJAX技术。我个人并没有在大多数的插件中看到过AJAX，但是使用AJAX来完成某个任务对你的插件来说可能是必要的。这篇文章将像你展示怎样在你的插件中使用AJAX。

这篇文章将在上一篇文章《在插件中添加js和css》的基础上继续。



<span class="readmore"><a href="http://sexywp.com/how-to-write-a-wp-plugin-11.htm title="插件开发全攻略(11)---在你的WP插件中使用AJAX>Keep Reading --- 852 words totally</a></span>]]></description>
			<content:encoded><![CDATA[<p>越来越多的插件开始使用AJAX技术。我个人并没有在大多数的插件中看到过AJAX，但是使用AJAX来完成某个任务对你的插件来说可能是必要的。这篇文章将像你展示怎样在你的插件中使用AJAX。</p>
<p>这篇文章将在上一篇文章<a href="http://sexywp.com/how-to-write-a-wp-plugin-09.htm">《在插件中添加js和css》</a>的基础上继续。</p>
<p><span id="more-106"></span></p>
<h3>建立一个新的PHP文件</h3>
<p>Devlounge Plugin Series插件已经有了如下的目录结构了：</p>
<ul>
<li>devloung-plugin-series
<ul>
<li>devlounge-plugin-series.php(main plugin file)</li>
<li>js
<ul>
<li>devlounge-plugin-series.js.php</li>
</ul>
</li>
<li>css
<ul>
<li>devlounge-plugin-series.css</li>
</ul>
</li>
<li>php
<ul>
<li>dl-plugin-ajax.php(新php文件)</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>注意，我的javascript文件的扩展名是<strong>php</strong>。我会在这篇文章后面解释这个变化的来历。</p>
<p>我已经建立了一个新的文件，并且把它放到了<strong>php</strong>文件夹中，并且命名为<strong>dl-plugin-ajax.php</strong>。我已经在这个文件中放了如下的代码：</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Blue;">&lt;?php</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Blue;">function_exists</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">add_action</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;    </span><span style="color: Green;">require_once</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">../../../../wp-config.php</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Green;">isset</span><span style="color: Olive;">(</span><span style="color: #00008b;">$dl_pluginSeries</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;    </span><span style="color: #00008b;">$dl_pluginSeries</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">showComments</span><span style="color: Olive;">(</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>这个段代码非常简单，并且仅为做AJAX调用而写。它确保了配置结构存在，从而我们可以调用类对象<strong>dl_pluginSeries</strong>，引用其他<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>函数和变量。然而，<strong>showComments</strong>函数还没有创建，我们下一个议程就是来做这件事。</p>
<h3>定义showComments函数</h3>
<p><strong>showComments</strong>函数将放在我们的<strong>DevloungPluginSeries</strong>类中：</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">&nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">showComments</span><span style="color: Olive;">(</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: Green;">global</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$wpdb</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;    </span><span style="color: #00008b;">$devloungecomments</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$wpdb</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">get_row</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">SELECT count(comment_approved) comments_count FROM </span><span style="color: #00008b;">$wpdb</span><span style="color: Red;">-&gt;comments where comment_approved = '1' group by comment_approved</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">ARRAY_A</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;    </span><span style="color: Green;">echo</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">You have </span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> . </span><span style="color: #00008b;">$devloungecomments</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">comments_count</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> . </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;"> comments on your blog</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>可能已经认出来了，这段代码在数据库交互这篇文章中出现过。此函数输出你博客上留言的数量。</p>
<h3>让JavaScript知道你的博客在哪里</h3>
<p>使用AJAX时，一个烦人的事情就是外部JavaScript文件不知道你博客安装路径是什么。我是通过在js后面添加php扩展名来处理这个问题的，因为这样，我就可以调用<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>函数了。在<strong>addHeaderCode</strong>函数中，我把代码从：</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">&nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">function_exists</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">wp_enqueue_script</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: Blue;">wp_enqueue_script</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">devlounge_plugin_series</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Blue;">get_bloginfo</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">wpurl</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;"> . </span><span style="color: #8b0000;">'</span><span style="color: Red;">/wp-content/plugins/devlounge-plugin-series/js/devlounge-plugin-series.js</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">prototype</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">0.1</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>换成：</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">&nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">function_exists</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">wp_enqueue_script</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: Blue;">wp_enqueue_script</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">devlounge_plugin_seriess</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Blue;">get_bloginfo</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">wpurl</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;"> . </span><span style="color: #8b0000;">'</span><span style="color: Red;">/wp-content/plugins/devlounge-plugin-series/js/devlounge-plugin-series.js.php</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">prototype</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">0.3</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>我唯一改变的是一个版本号码，还有就是给JavaScript文件添加了一个php扩展名。</p>
<h3>编写JavaScript</h3>
<p>这段脚本的目的是找到博客的URL，调用PHP文件，然后返回结果给用户。</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">&lt;?</span><span style="color: Blue;">php</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Blue;">function_exists</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">add_action</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;    </span><span style="color: Blue;">require_once</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">../../../../wp-config.php</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;?&gt;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">Event</span><span style="color: Gray;">.</span><span style="color: Blue;">observe</span><span style="color: Olive;">(</span><span style="color: Teal;">window</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">load</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Blue;">devloungePluginSeriesInit</span><span style="color: Gray;">, </span><span style="color: Green;">false</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">devloungePluginSeriesInit</span><span style="color: Olive;">(</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;    $</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">devlounge-link</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">onclick</span><span style="color: Gray;"> = </span><span style="color: Blue;">devloungePluginSeriesClick</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">devloungePluginSeriesClick</span><span style="color: Olive;">(</span><span style="color: Blue;">evt</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;    </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">url</span><span style="color: Gray;"> =  </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">&lt;?php bloginfo('wpurl') ?&gt;/wp-content/plugins/devlounge-plugin-series/php/dl-plugin-ajax.php</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;    </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">success</span><span style="color: Gray;"> = </span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">t</span><span style="color: Olive;">)</span><span style="color: Olive;">{</span><span style="color: Blue;">devloungePluginSeriesClickComplete</span><span style="color: Olive;">(</span><span style="color: Blue;">t</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;    </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">myAjax</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">Ajax</span><span style="color: Gray;">.</span><span style="color: Blue;">Request</span><span style="color: Olive;">(</span><span style="color: Blue;">url</span><span style="color: Gray;">, </span><span style="color: Olive;">{</span><span style="color: Blue;">method</span><span style="color: Gray;">:</span><span style="color: #8b0000;">'</span><span style="color: Red;">post</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Blue;">onSuccess</span><span style="color: Gray;">:</span><span style="color: Blue;">success</span><span style="color: Olive;">}</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;    </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">false</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">devloungePluginSeriesClickComplete</span><span style="color: Olive;">(</span><span style="color: Blue;">t</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;    </span><span style="color: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: Blue;">t</span><span style="color: Gray;">.</span><span style="color: Blue;">responseText</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li></ol></div></div>
<p>上述代码做了下面这些事情（记住，我们在使用Prototype）：</p>
<ul>
<li>确定配置结构是存在的，这样我们才能访问<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>函数</li>
<li>在文档已经装载后，<strong>devloungePluginSeriesInit</strong>函数被调用了</li>
<li>给你添加到文章末尾的链接上绑定了一个事件。如果你忘了，现在可以加进去。简单地找到文章，然后添加这段代码：&lt;a href="#" id="devlounge-link"&gt;Get the Number of Blog Comments&lt;/a&gt;</li>
<li>找到PHP文件的绝对路径</li>
<li>调用PHP文件</li>
<li>将反馈输出给用户</li>
</ul>
<h3>结果</h3>
<p>下一步，我们假设你已经把那个链接添加好了。我们点击链接“<strong>Get the Number of Blog Comments</strong>”，脚本使用AJAX调用了<strong>DevlongePluginSeries</strong>类中的函数，并且以对话框的形式返回了结果。</p>
<p>就如你看到的那样，我的本地安装版本，并没有多少评论。</p>

	标签：<a href="http://sexywp.com/tags/develop" title="develop" rel="tag nofollow">develop</a>, <a href="http://sexywp.com/tags/plugins" title="plugins" rel="tag nofollow">plugins</a>, <a href="http://sexywp.com/tags/translate" title="translate" rel="tag nofollow">translate</a>, <a href="http://sexywp.com/tags/wordpress" title="WordPress" rel="tag nofollow">WordPress</a><br />
]]></content:encoded>
			<wfw:commentRss>http://sexywp.com/how-to-write-a-wp-plugin-11.htm/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>插件开发全攻略（10）---在你的WordPress插件中使用Javascript和CSS</title>
		<link>http://sexywp.com/how-to-write-a-wp-plugin-10.htm</link>
		<comments>http://sexywp.com/how-to-write-a-wp-plugin-10.htm#comments</comments>
		<pubDate>Wed, 25 Jun 2008 13:24:04 +0000</pubDate>
		<dc:creator>Charles</dc:creator>
				<category><![CDATA[Plugins Develop]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[develop]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[translate]]></category>

		<guid isPermaLink="false">http://www.charlestang.cn/?p=100</guid>
		<description><![CDATA[现今的许多插件对javascript和层叠样式表依赖更多了。将你插件中的javascript和css放置到分离的文件中是非常重要的，那样做会使插件维护起来更加容易。此系列中的这个部分将介绍怎样在你的插件中加载javascript和CSS文件。



添加你的javascript

<span class="readmore"><a href="http://sexywp.com/how-to-write-a-wp-plugin-10.htm title="插件开发全攻略（10）---在你的WordPress插件中使用Javascript和CSS>Keep Reading --- 815 words totally</a></span>]]></description>
			<content:encoded><![CDATA[<p>现今的许多插件对javascript和层叠样式表依赖更多了。将你插件中的javascript和css放置到分离的文件中是非常重要的，那样做会使插件维护起来更加容易。此系列中的这个部分将介绍怎样在你的插件中加载javascript和CSS文件。</p>
<p><span id="more-100"></span></p>
<h3>添加你的javascript</h3>
<p>你的插件可能需要装载prototype类库，或者一个自定义的脚本。这一节将向你展示几个<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>函数，它们可以帮助你装载脚本，并且避免脚本冲突。</p>
<h4>wp_register_script函数</h4>
<p><strong>wp_register_script</strong>函数允许你注册要调用的脚本，并且允许你设定先决条件。比如说，如果你的脚本需要prototype事先加载，那么你可以通过这个函数来指定。</p>
<p>这里是<strong>wp_register_script</strong>函数的参数：<code>wp_register_script($handle,$src,$deps=array(),$ver=false);</code></p>
<ul>
<li><strong>handle</strong>是一个独一无二的名字，后面会用此名字引用你的脚本。这个参数是必须的。</li>
<li><strong>src</strong>是你的javascript文件的绝对路径。这个参数是必须的。</li>
<li><strong>deps</strong>是一个依赖数组。比如说，如果你的脚本需要使用prototype，你要把它罗列在这里。这个参数是可选的。</li>
<li><strong>ver</strong>是一个字符串，标明了脚本的版本。这个变量是可选的。</li>
</ul>
<p>举个例子，如果你有一个脚本要装载：<em>http://yourdomain.com/wp-content/<a href="http://sexywp.com/tags/plugins" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with plugins">plugins</a>/your-plugin-directory/js/script.js</em></p>
<p>让我们做一些假设：</p>
<ul>
<li>你希望handle的名字为“my_script_handle”。</li>
<li>你的脚本依赖于prototype类库</li>
<li>你的版本是1.0</li>
</ul>
<p>你将在你的插件代码初始化调用那个函数，或者在<strong>wp_head</strong> action之后调用：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">wp_register_script</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">my_script_handle</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">http://yourdomain.com/wp-content/plugins/your-plugin-directory/js/script.js</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">prototype</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">1.0</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></div></div>
<h4>wp_enqueue_script函数</h4>
<p><strong>wp_enqueue_script</strong>函数除了<strong>src</strong>参数是可选的以外，其他与<strong>wp_register_script</strong>是一样的。如果提供一个<strong>src</strong>，入队函数会<em>自动地注册</em>脚本，因此使用<strong>wp_register_script</strong>函数并不是必须的。然而，<strong>wp_register_script</strong>函数允许你手动注册你的脚本，这样，你可以仅使用一次<strong>wp_enqueue_script</strong>函数就将你所有的脚本装载。</p>
<p>如果我们像上一个例子中那样调用脚本，那么看起来像下面的样子：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">wp_enqueue_script</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">my_script_handle</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">http://yourdomain.com/wp-content/plugins/your-plugin-directory/js/script.js</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">prototype</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">1.0</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></div></div>
<h3>一个javascript的例子</h3>
<p>对于Devlounge Plugin Series插件，我们将添加一个javascript文件，后面的文章中会用它。使用这个文件的目的，就是为了说明怎样使用<strong>wp_enqueue_script</strong>函数。</p>
<ul>
<li>文件将会放下下列地址：http://yourdomain.com/wp-content/<a href="http://sexywp.com/tags/plugins" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with plugins">plugins</a>/devlounge-plugin-series/js/devlounge-plugin-series.js</li>
<li>这个文件依赖于prototype</li>
<li>版本是1.0</li>
</ul>
<p>你可能会回忆起，这个系列文章早期的一篇文章中，我们添加了一个action叫<strong>wp_head</strong>。那个action添加后，会调用一个函数，叫做<strong>addHeaderCode</strong>。让我们来修改这个函数，添加我们新的javascript：</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">function addHeaderCode() {</span></li>
<li><span style="color: Gray;">&nbsp;            if (function_exists('wp_enqueue_script')) {</span></li>
<li><span style="color: Gray;">&nbsp;                wp_enqueue_script('devlounge_plugin_series', get_bloginfo('wpurl') . '/wp-content/plugins/devlounge-plugin-series/js/devlounge-plugin-series.js', array('prototype'), '0.1');</span></li>
<li><span style="color: Gray;">&nbsp;            }</span></li>
<li><span style="color: Gray;">&nbsp;            $devOptions = $this-&gt;getAdminOptions();</span></li>
<li><span style="color: Gray;">&nbsp;            if ($devOptions['show_header'] == &quot;false&quot;) { return; }</span></li>
<li><span style="color: Gray;">&nbsp;            ?&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;!-- Devlounge Was Here --&gt;</span></li>
<li><span style="color: Gray;">&nbsp;            </span><span style="color: Blue;">&lt;?php</span></li>
<li><span style="color: Gray;">&nbsp;}</span></li></ol></div></div>
<p>上述代码的工作如下：</p>
<ul>
<li> 首先，检查<strong>wp_enqueue_script</strong>函数的存在性</li>
<li> 然后调用该函数 </li>
<li> 我们使用<strong> get_bloginfo('wpurl') </strong> 来得到<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>安装根目录，然后手写路径中剩下的部分 </li>
</ul>
<h3>加载层叠样式表</h3>
<p>我已经往我的样式目录里面添加了一个新的样式表。这里是我们的一些前提：</p>
<ul>
<li> 这个文件存储在下列位置：http://yourdomain.com/wp-content/<a href="http://sexywp.com/tags/plugins" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with plugins">plugins</a>/devlounge-plugin-series/css/devlounge-plugin-series.css </li>
<li> 我在这个CSS文件中指定了一个ID叫做#devlounge-link </li>
<li> <strong> 你已经添加了下面的代码 </strong> 在文章的末尾：&lt;a href="#" id="devlounge-link"&gt;取得博客留言的数量&lt;/a&gt;</li>
</ul>
<p>在样式表文件中，我已经添加了下面的ID：</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Blue;">#devlounge-link</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: Green;">background-color:</span><span style="color: #00008b;">#006</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: Green;">color:</span><span style="color: #00008b;">#fff</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li></ol></div></div>
<p>在插件中添加样式表，就和在<strong>addHeaderCode</strong>函数中添加一行代码一样简单：</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">function addHeaderCode() {</span></li>
<li><span style="color: Gray;">&nbsp;            echo '&lt;link type=&quot;text/css&quot; rel=&quot;stylesheet&quot; href=&quot;' . get_bloginfo('wpurl') . '/wp-content/plugins/devlounge-plugin-series/css/devlounge-plugin-series.css&quot; /&gt;' . &quot;\n&quot;;</span></li>
<li><span style="color: Gray;">&nbsp;            if (function_exists('wp_enqueue_script')) {</span></li>
<li><span style="color: Gray;">&nbsp;                wp_enqueue_script('devlounge_plugin_series', get_bloginfo('wpurl') . '/wp-content/plugins/devlounge-plugin-series/js/devlounge-plugin-series.js', array('prototype'), '0.1');</span></li>
<li><span style="color: Gray;">&nbsp;            }</span></li>
<li><span style="color: Gray;">&nbsp;            $devOptions = $this-&gt;getAdminOptions();</span></li>
<li><span style="color: Gray;">&nbsp;            if ($devOptions['show_header'] == &quot;false&quot;) { return; }</span></li>
<li><span style="color: Gray;">&nbsp;            ?&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;!-- Devlounge Was Here --&gt;</span></li>
<li><span style="color: Gray;">&nbsp;            </span><span style="color: Blue;">&lt;?php</span></li>
<li><span style="color: Gray;">&nbsp;}</span></li></ol></div></div>
<p>在第2行，我只是简单地打印出了新的样式表。</p>

	标签：<a href="http://sexywp.com/tags/develop" title="develop" rel="tag nofollow">develop</a>, <a href="http://sexywp.com/tags/plugins" title="plugins" rel="tag nofollow">plugins</a>, <a href="http://sexywp.com/tags/translate" title="translate" rel="tag nofollow">translate</a>, <a href="http://sexywp.com/tags/wordpress" title="WordPress" rel="tag nofollow">WordPress</a><br />
]]></content:encoded>
			<wfw:commentRss>http://sexywp.com/how-to-write-a-wp-plugin-10.htm/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>插件开发全攻略（09）---WordPress插件和数据库交互</title>
		<link>http://sexywp.com/how-to-write-a-wp-plugin-09.htm</link>
		<comments>http://sexywp.com/how-to-write-a-wp-plugin-09.htm#comments</comments>
		<pubDate>Mon, 23 Jun 2008 07:58:48 +0000</pubDate>
		<dc:creator>Charles</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[develop]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[translate]]></category>

		<guid isPermaLink="false">http://www.charlestang.cn/?p=99</guid>
		<description><![CDATA[当你编写一个插件的时候，你将不可避免地要将一些变量存储到数据库，或者将它们从数据库中取出。幸运的是，WordPress通过options和一个数据库对象，使得存取数据变得很简单。本文将会谈及如何在一个WordPress数据库中存储或者取回数据。



 在数据库中存储数据 

<span class="readmore"><a href="http://sexywp.com/how-to-write-a-wp-plugin-09.htm title="插件开发全攻略（09）---WordPress插件和数据库交互>Keep Reading --- 1051 words totally</a></span>]]></description>
			<content:encoded><![CDATA[<p>当你编写一个插件的时候，你将不可避免地要将一些变量存储到数据库，或者将它们从数据库中取出。幸运的是，<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>通过options和一个数据库对象，使得存取数据变得很简单。本文将会谈及如何在一个<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>数据库中存储或者取回数据。</p>
<p><span id="more-99"></span></p>
<h3> 在数据库中存储数据 </h3>
<p>将数据存储到<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>数据库，主要有两种方法：</p>
<ol>
<li> 创建你自己的表。</li>
<li> 使用Options </li>
</ol>
<p>由于绝大多数插件不需要它们自己的表，所以，我将只讨论使用options的方法。然而，<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a> Codex上面详细讨论了怎样设定你自己的表的方法。</p>
<h3> <a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a> Options </h3>
<p>使用<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a> Options，在数据库存储和取回数据就跟函数调用一样简单。<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>为options提供了四个函数：</p>
<ul>
<li> add_option </li>
<li> get_option </li>
<li> update_option </li>
<li> delete_option </li>
</ul>
<h4> add_option </h4>
<p><strong> add_option </strong> 函数接受四个参数，option的名字是必须的。四个参数是：<code> add_option($name,$value,$description,$autoload); </code></p>
<p>使用这个函数来添加将来要从数据库中取出的数据是很有好处的。</p>
<p>参数 <strong> $name </strong> 必须是独一无二的，否则你就会覆盖别人的option，或者别人会覆盖你的option。</p>
<p>我通常不用这个函数，因为 <strong> update_function </strong> 完全可以做相同的事情。</p>
<h4> get_option </h4>
<p><strong> get_option </strong> 函数允许你取回事先存储在数据库里的option。它只接受一个参数，就是option的名字。函数的格式是：<code> get_option($option_name); </code></p>
<h4> update_option </h4>
<p><strong> update_option </strong> 函数工作方式和 <strong> add_option </strong> 是一样的，除此之外，如果option已经存在，该函数会更新option的值。当往数据库中存储数据的时候，我个人喜欢使用这个双重功能的函数，尤甚于 <strong> add_option </strong> 。</p>
<h4> delete_option </h4>
<p><strong> delete_option </strong> 函数从数据库中删除options。函数的格式是：<code> delete_option($option_name); </code></p>
<h3> 一个代码范例 </h3>
<p>你可能会回忆起这个系列以前的文章中，我把options以array的形式存入数据库。这里是一个例子，并且还有一些说明分析：</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">//</span><span style="color: #ffa500;">Returns an array of admin options</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">getAdminOptions</span><span style="color: Olive;">(</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$devloungeAdminOptions</span><span style="color: Gray;"> = </span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">show_header</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> =&gt; </span><span style="color: #8b0000;">'</span><span style="color: Red;">true</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">'</span><span style="color: Red;">add_content</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> =&gt; </span><span style="color: #8b0000;">'</span><span style="color: Red;">true</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">'</span><span style="color: Red;">comment_author</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> =&gt; </span><span style="color: #8b0000;">'</span><span style="color: Red;">true</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">'</span><span style="color: Red;">content</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> =&gt; </span><span style="color: #8b0000;">'</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$devOptions</span><span style="color: Gray;"> = </span><span style="color: Blue;">get_option</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">adminOptionsName</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Green;">empty</span><span style="color: Olive;">(</span><span style="color: #00008b;">$devOptions</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">foreach</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: #00008b;">$devOptions</span><span style="color: Gray;"> </span><span style="color: Green;">as</span><span style="color: Gray;"> </span><span style="color: #00008b;">$key</span><span style="color: Gray;"> =&gt; </span><span style="color: #00008b;">$option</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$devloungeAdminOptions</span><span style="color: Olive;">[</span><span style="color: #00008b;">$key</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$option</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">update_option</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">adminOptionsName</span><span style="color: Gray;">, </span><span style="color: #00008b;">$devloungeAdminOptions</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$devloungeAdminOptions</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>在第 3-6 行，我创建了一个最终要作为option存入<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>数据库（ 12 行）的数组。我这么做是因为我不需要存储多个选项（每个选项都要查询一次数据库）。这个技术对代码臃肿，数据库查询和名字冲突都有所助益。</p>
<h3> <a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a> 数据库类 </h3>
<p>另一个在<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>数据库存储和取回数据的强大的方法是使用<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>数据库类对象。在一个函数中，这个类对象的引用方式如下：</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">&nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">sample_function</span><span style="color: Olive;">(</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">global</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$wpdb</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>在这个变量被引用了以后，你可以访问《<a href="http://codex.wordpress.org/Function_Reference/wpdb_Class">wpdb类中许多有用的函数</a>》。</p>
<p>举例来说，假如我们想要取回<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>博客的评论的总数。这是一个函数，通过使用WPDB类来实现这个目的：</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">&nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">sample_function</span><span style="color: Olive;">(</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">global</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$wpdb</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$comments</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$wpdb</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">get_row</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">SELECT count(comment_approved) comments_count FROM </span><span style="color: #00008b;">$wpdb</span><span style="color: Red;">-&gt;comments where comment_approved = '1' group by comment_approved</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">ARRAY_A</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">echo</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$comments</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">comments_count</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>上述函数完成了如下工作：</p>
<ul>
<li> 第2行，我们添加了一个 <code> $wpdb </code> 的引用。</li>
<li> 第3行，我们调用了一个wpdb类内部的函数 <code><strong> get_row </strong></code> </li>
<li> 第3行，我们从评论表（<code> $wpdb->comments </code>）中取回数据。这里我们指定返回的数据为一个联合数组（ARRAY_A）。 </li>
<li> 第4行，我们打印出结果。因为我希望数据的放回形式是联合数组，我只要调用我在SQL语句中赋值的变量就可以了，也就是 <code><strong> comments_count</strong></code></li>
</ul>
<p><strong>wpdb</strong> 类是一个有着许多功能的非常大的类。我建议查看一下 <a href="http://codex.wordpress.org/Function_Reference/wpdb_Class">WPDB类页面</a> ，看看<strong>wpdb类</strong>到底可以干些什么。</p>

	标签：<a href="http://sexywp.com/tags/develop" title="develop" rel="tag nofollow">develop</a>, <a href="http://sexywp.com/tags/plugins" title="plugins" rel="tag nofollow">plugins</a>, <a href="http://sexywp.com/tags/translate" title="translate" rel="tag nofollow">translate</a>, <a href="http://sexywp.com/tags/wordpress" title="WordPress" rel="tag nofollow">WordPress</a><br />
]]></content:encoded>
			<wfw:commentRss>http://sexywp.com/how-to-write-a-wp-plugin-09.htm/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>插件开发全攻略（08）---构建一个WordPress插件用户面板</title>
		<link>http://sexywp.com/how-to-write-a-wp-plugin-08.htm</link>
		<comments>http://sexywp.com/how-to-write-a-wp-plugin-08.htm#comments</comments>
		<pubDate>Sun, 22 Jun 2008 10:16:20 +0000</pubDate>
		<dc:creator>Charles</dc:creator>
				<category><![CDATA[Plugins Develop]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[develop]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[translate]]></category>

		<guid isPermaLink="false">http://www.charlestang.cn/?p=98</guid>
		<description><![CDATA[将会有这么一种情况，你将有一个主要的管理面板，但是希望能够让独立的用户设定他们自己的偏好。在Devlounge Plugin Series这个例子中，我们添加了一个是否把文字添加到文章末尾的选项。然而，假如一个登录用户不希望看到这段文字呢？为什么不给他们一个选择，而且不影响到所有其他的用户呢？



这篇文章将会涉及到这个问题，让你可以添加你自己的用户面板。

<span class="readmore"><a href="http://sexywp.com/how-to-write-a-wp-plugin-08.htm title="插件开发全攻略（08）---构建一个WordPress插件用户面板>Keep Reading --- 1020 words totally</a></span>]]></description>
			<content:encoded><![CDATA[<p>将会有这么一种情况，你将有一个主要的管理面板，但是希望能够让独立的用户设定他们自己的偏好。在Devlounge Plugin Series这个例子中，我们添加了一个是否把文字添加到文章末尾的选项。然而，假如一个登录用户不希望看到这段文字呢？为什么不给他们一个选择，而且不影响到所有其他的用户呢？</p>
<p><span id="more-98"></span></p>
<p>这篇文章将会涉及到这个问题，让你可以添加你自己的用户面板。</p>
<p><img src="http://lh5.ggpht.com/TangChao.ZJU/SF4i2dd9kRI/AAAAAAAAAdE/ZJZK2Lt6P-M/s800/users-panel.gif" style="border:none;clear:both;margin:15px auto;"/></p>
<h3>命名你的选项</h3>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">&nbsp;</span><span style="color: Green;">class</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">DevloungePluginSeries</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$adminOptionsName</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">DevloungePluginSeriesAdminOptions</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$adminUsersName</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">DevloungePluginSeriesAdminUsersOptions</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>第3行显示，我添加了一个成员函数，叫做<strong>adminUsersName</strong>。我给这个变量取了一个长而且独特的名字<strong>DevloungePluginSeriesAdminUsersOptions</strong>。</p>
<h3>设定你的缺省用户选项</h3>
<p>你将需要一个地方来初始化你的选项，尤其是当一个用户第一次激活了你的插件的时候。然而，这些选项在管理面板之外也应该起作用，不论用户是登录了还是没有登录。</p>
<p>这里是一个我引入到<strong>DevloungePluginSeries</strong>类中的函数：</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">//</span><span style="color: #ffa500;">Returns an array of user options</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">getUserOptions</span><span style="color: Olive;">(</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">global</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$user_email</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Green;">empty</span><span style="color: Olive;">(</span><span style="color: #00008b;">$user_email</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">get_currentuserinfo</span><span style="color: Olive;">(</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Green;">empty</span><span style="color: Olive;">(</span><span style="color: #00008b;">$user_email</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: #8b0000;">'</span><span style="color: Gray;">; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$devOptions</span><span style="color: Gray;"> = </span><span style="color: Blue;">get_option</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">adminUsersName</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Green;">isset</span><span style="color: Olive;">(</span><span style="color: #00008b;">$devOptions</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$devOptions</span><span style="color: Gray;"> = </span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Green;">empty</span><span style="color: Olive;">(</span><span style="color: #00008b;">$devOptions</span><span style="color: Olive;">[</span><span style="color: #00008b;">$user_email</span><span style="color: Olive;">]</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$devOptions</span><span style="color: Olive;">[</span><span style="color: #00008b;">$user_email</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">true,true</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">update_option</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">adminUsersName</span><span style="color: Gray;">, </span><span style="color: #00008b;">$devOptions</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$devOptions</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>这个函数完成以下任务：</p>
<ul>
<li>检查用户是否已经登陆（3-7行）。这个检查仅需要查看变量user_email是否设定即可。</li>
<li>尝试找到以前存储在数据库中的选项（第8行）。</li>
<li>如果没有找到option，设定默认值（第9-15行）。</li>
<li>返回option供你使用</li>
</ul>
<h3>初始化管理用户option</h3>
<p>可以在任何时候调用getUserOptions来取得用户管理options。然而，那么插件第一次安装的时候呢？应该有某种函数被调用，以取得用户选项。我添加了下面这个函数到init函数:</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">&nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">init</span><span style="color: Olive;">(</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">getAdminOptions</span><span style="color: Olive;">(</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">getUserOptions</span><span style="color: Olive;">(</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>第3行调用了新函数getUserOptions。由于已经有了一个action调用了init函数，不需要额外的步骤了。</p>
<h3>怎样使管理面板和用户面板一起工作</h3>
<p>你会回想起上一篇关于<a href="http://sexywp.com/how-to-write-a-wp-plugin-07.htm">设定一个管理面板</a>的文章中，<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>管理员可以设定文章末尾的内容，代码是否是否在头部显示，评论中的作者名字是否大写。而用户面板允许那些不是管理员的用户有能力设定他们是否希望这些options。</p>
<p>我们将允许用户决定，如果他们：</p>
<ul>
<li>想要内容在文章的末尾显示（仅当管理员启用了这个option）</li>
<li>想要评论作者的名字大写（仅当管理员启用了这个option）</li>
</ul>
<h3>设定用户面板函数</h3>
<p>我们要做的第一件事情就是编写一个函数来显示用户面板。函数名字为printAdminUsersPage。下一段代码将会读入我们早先设定的options并且检查一下是否有任何文章选项已经被提交。这一节中所有的代码都默认包含于printAdminUsersPage函数。</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">//Prints out the admin page</span></li>
<li><span style="color: Gray;">&nbsp;function printAdminUsersPage() {</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; global $user_email;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; if (empty($user_email)) {</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; get_currentuserinfo();</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; $devOptions = $this-&gt;getUserOptions();</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; //Save the updated options to the database</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; if (isset($_POST['update_devloungePluginSeriesSettings']) &amp;&amp; isset($_POST['devloungeAddContent']) &amp;&amp; isset($_POST['devloungeAuthor'])) {</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; if (isset($user_email)) {</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $devOptions[$user_email] = $_POST['devloungeAddContent'] . &quot;,&quot; . $_POST['devloungeAuthor'];</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ?&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;div class=&quot;updated&quot;&gt;&lt;p&gt;&lt;strong&gt;Settings successfully updated.&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">&lt;?php</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">update_option</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">adminUsersName</span><span style="color: Gray;">, </span><span style="color: #00008b;">$devOptions</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: #ffa500;">//</span><span style="color: #ffa500;">Get the author options</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: #00008b;">$devOptions</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$devOptions</span><span style="color: Olive;">[</span><span style="color: #00008b;">$user_email</span><span style="color: Olive;">]</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: #00008b;">$devOptions</span><span style="color: Gray;"> = </span><span style="color: Blue;">explode</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #00008b;">$devOptions</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">sizeof</span><span style="color: Olive;">(</span><span style="color: #00008b;">$devOptions</span><span style="color: Olive;">)</span><span style="color: Gray;">&gt;= </span><span style="color: Maroon;">2</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$content</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$devOptions</span><span style="color: Olive;">[</span><span style="color: Maroon;">0</span><span style="color: Olive;">]</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$author</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$devOptions</span><span style="color: Olive;">[</span><span style="color: Maroon;">1</span><span style="color: Olive;">]</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>上述代码：</p>
<ul>
<li>取回用户options（第7行）</li>
<li>存储发送的数据到数据库（第9-18行）</li>
<li>为用户读入用逗号分隔的变量</li>
</ul>
<p>下一段代码将会显示用户面板必须的HTML表单。所有的代码做的事情就是显示表单元素，并且读入已经取得的选项。</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">&lt;div class=wrap&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;form method=&quot;post&quot; action=&quot;</span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">echo</span><span style="color: Gray;"> </span><span style="color: #00008b;">$_SERVER</span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">REQUEST_URI</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">]</span><span style="color: Gray;">; </span><span style="color: Blue;">?&gt;</span><span style="color: Gray;">&quot;&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;h2&gt;Devlounge Plugin Series User Options&lt;/h2&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;h3&gt;Allow Content Added to the End of a Post?&lt;/h3&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;p&gt;Selecting &quot;No&quot; will disable the content from being added into the end of a post.&lt;/p&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;p&gt;&lt;label for=&quot;devloungeAddContent_yes&quot;&gt;&lt;input type=&quot;radio&quot; id=&quot;devloungeAddContent_yes&quot; name=&quot;devloungeAddContent&quot; value=&quot;true&quot; </span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$content</span><span style="color: Gray;"> == </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">true</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: Blue;">_e</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">checked=&quot;checked&quot;</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">DevloungePluginSeries</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: Olive;">}</span><span style="color: Blue;">?&gt;</span><span style="color: Gray;"> /&gt; Yes&lt;/label&gt;&nbsp; &nbsp; &lt;label for=&quot;devloungeAddContent_no&quot;&gt;&lt;input type=&quot;radio&quot; id=&quot;devloungeAddContent_no&quot; name=&quot;devloungeAddContent&quot; value=&quot;false&quot; </span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"> </span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$content</span><span style="color: Gray;"> == </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">false</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: Blue;">_e</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">checked=&quot;checked&quot;</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">DevloungePluginSeries</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: Olive;">}</span><span style="color: Blue;">?&gt;</span><span style="color: Gray;">/&gt; No&lt;/label&gt;&lt;/p&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;h3&gt;Allow Comment Authors to be Uppercase?&lt;/h3&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;p&gt;Selecting &quot;No&quot; will leave the comment authors alone.&lt;/p&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;p&gt;&lt;label for=&quot;devloungeAuthor_yes&quot;&gt;&lt;input type=&quot;radio&quot; id=&quot;devloungeAuthor_yes&quot; name=&quot;devloungeAuthor&quot; value=&quot;true&quot; </span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$author</span><span style="color: Gray;"> == </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">true</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: Blue;">_e</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">checked=&quot;checked&quot;</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">DevloungePluginSeries</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: Olive;">}</span><span style="color: Blue;">?&gt;</span><span style="color: Gray;"> /&gt; Yes&lt;/label&gt;&nbsp; &nbsp; &lt;label for=&quot;devloungeAuthor_no&quot;&gt;&lt;input type=&quot;radio&quot; id=&quot;devloungeAuthor_no&quot; name=&quot;devloungeAuthor&quot; value=&quot;false&quot; </span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"> </span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$author</span><span style="color: Gray;"> == </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">false</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: Blue;">_e</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">checked=&quot;checked&quot;</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">DevloungePluginSeries</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: Olive;">}</span><span style="color: Blue;">?&gt;</span><span style="color: Gray;">/&gt; No&lt;/label&gt;&lt;/p&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;div class=&quot;submit&quot;&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;input type=&quot;submit&quot; name=&quot;update_devloungePluginSeriesSettings&quot; value=&quot;</span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">_e</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">Update Settings</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">DevloungePluginSeries</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Blue;">?&gt;</span><span style="color: Gray;">&quot; /&gt;&lt;/div&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;/form&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &lt;/div&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">&lt;?php</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span><span style="color: #ffa500;">//</span><span style="color: #ffa500;">End function printAdminUsersPage()</span></li></ol></div></div>
<h3>设定用户面板Action</h3>
<p>当<a href="http://sexywp.com/how-to-write-a-wp-plugin-07.htm">设定管理面板</a>的时候，我们定义了一个函数叫做DevloungePluginSeries_ap，以帮助初始化管理面板。我们现在将要再次求助于此函数来添加我们的用户面板。</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">//</span><span style="color: #ffa500;">Initialize the admin and users panel</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Blue;">function_exists</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">DevloungePluginSeries_ap</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">DevloungePluginSeries_ap</span><span style="color: Olive;">(</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">global</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$dl_pluginSeries</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Green;">isset</span><span style="color: Olive;">(</span><span style="color: #00008b;">$dl_pluginSeries</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">function_exists</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">add_options_page</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: Blue;">add_options_page</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">Devlounge Plugin Series</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">Devlounge Plugin Series</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Maroon;">9</span><span style="color: Gray;">, </span><span style="color: Blue;">basename</span><span style="color: Olive;">(</span><span style="color: Green;">__FILE__</span><span style="color: Olive;">)</span><span style="color: Gray;">, </span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: Gray;">&amp;</span><span style="color: #00008b;">$dl_pluginSeries</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">printAdminPage</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">function_exists</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">add_submenu_page</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">add_submenu_page</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">profile.php</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Devlounge Plugin Series User Options</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Devlounge Plugin Series User Options</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: Blue;">basename</span><span style="color: Olive;">(</span><span style="color: Green;">__FILE__</span><span style="color: Olive;">)</span><span style="color: Gray;">, </span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: Gray;">&amp;</span><span style="color: #00008b;">$dl_pluginSeries</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">printAdminUsersPage</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>在第12行，你能看到一行代码：</p>
<ul>
<li>往profile.php页面中添加了一个子菜单</li>
<li>让一个用户级别高于或者等于0的用户访问用户面板</li>
<li>调用我们的printAdminUsersPage函数</li>
</ul>
<p>关于访问级别的（此例中为0）更详细的描述，可以参考<a href="http://codex.wordpress.org/User_Levels">用户级别</a>。</p>

	标签：<a href="http://sexywp.com/tags/develop" title="develop" rel="tag nofollow">develop</a>, <a href="http://sexywp.com/tags/plugins" title="plugins" rel="tag nofollow">plugins</a>, <a href="http://sexywp.com/tags/translate" title="translate" rel="tag nofollow">translate</a>, <a href="http://sexywp.com/tags/wordpress" title="WordPress" rel="tag nofollow">WordPress</a><br />
]]></content:encoded>
			<wfw:commentRss>http://sexywp.com/how-to-write-a-wp-plugin-08.htm/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>插件开发全攻略（07）---构造一个WordPress插件管理员面板</title>
		<link>http://sexywp.com/how-to-write-a-wp-plugin-07.htm</link>
		<comments>http://sexywp.com/how-to-write-a-wp-plugin-07.htm#comments</comments>
		<pubDate>Fri, 06 Jun 2008 08:26:49 +0000</pubDate>
		<dc:creator>Charles</dc:creator>
				<category><![CDATA[Plugins Develop]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[develop]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[translate]]></category>

		<guid isPermaLink="false">http://www.charlestang.cn/?p=89</guid>
		<description><![CDATA[任何需要用户输入（诸如改变一个变量）的插件，都需要某种管理面板。建立一个管理面板，并不是那么难的，所以，一个插件作者决定不创建管理面板，而是让用户自己去修改PHP代码的行为让我很是苦恼。让一个用户（TA的PHP只是可能是0）去修改代码通常来说不是一个好主意。本文将深入探讨成功地为你的插件创建管理面板，到底需要些什么。





<span class="readmore"><a href="http://sexywp.com/how-to-write-a-wp-plugin-07.htm title="插件开发全攻略（07）---构造一个WordPress插件管理员面板>Keep Reading --- 1657 words totally</a></span>]]></description>
			<content:encoded><![CDATA[<p>任何需要用户输入（诸如改变一个变量）的插件，都需要某种管理面板。<a href="http://codex.wordpress.org/Adding_Administration_Menus">建立一个管理面板</a>，并不是那么难的，所以，一个插件作者决定不创建管理面板，而是让用户自己去修改PHP代码的行为让我很是苦恼。让一个用户（TA的PHP只是可能是0）去修改代码通常来说不是一个好主意。本文将深入探讨成功地为你的插件创建管理面板，到底需要些什么。</p>
<p><span id="more-89"></span></p>
<p><a href="http://picasaweb.google.com/TangChao.ZJU/Blog02/photo#5209476529229978866"><img src="http://lh5.ggpht.com/TangChao.ZJU/SEvHTWZ83PI/AAAAAAAAAck/PV2Chbk0YdI/s800/admin-panel.gif" style="border:none;clear:both;margin:10px auto;"/></a></p>
<h3>存储变量的地方</h3>
<p>当你想要给你的插件创建一个管理面板的时候，你首先会碰到的问题之一就是到底在哪里存储变量值。非常幸运，<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>通过options使得这件事变得非常容易。我将会在后续的系列文章中解释options和数据库存储。现在来说，所有你需要做的事情就是点点你的头，然后跟着我的指导，把你自己的管理变量存储到<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>数据库中。</p>
<p>通常我考虑到options的时候做的第一件事情就是，给我的管理options取一个独特的名字。我把这个名字以成员变量的形式存储在我的类中。在这个Devlounge Plugin Series插件的例子中，我把这个变量声明添加到<strong>DevloungePluginSeries</strong>类中。</p>
<h3>命名你的管理Options</h3>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">class</span><span style="color: Gray;"> </span><span style="color: Blue;">DevloungePluginSeries</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: #00008b;">$adminOptionsName</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">DevloungePluginSeriesAdminOptions</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">DevloungePluginSeries</span><span style="color: Olive;">(</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: #ffa500;">//</span><span style="color: #ffa500;">constructor</span><span style="color: #ffa500;"></span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"></span></div></div>
<p>第2行显示了我存储我的成员变量的地方。我将我的变量命名为<strong>adminOptionsName</strong>并且给予它一个很长而且独特的值<strong>DevloungePluginSeriesAdminOptions</strong>。</p>
<h3>给你的管理Options设定缺省值</h3>
<p>你需要一个地方来初始化你的管理选项，尤其是当一个用户第一次激活你的插件的时候。然而，你还必须保证这些options在升级中是安全的，以防万一你决定将来添加更多的options。我使用的技巧是，提供一个专门的函数来调用你的管理options。你的插件的需求可能不一样，但是绝大多数的管理面板不会难以置信地复杂，所以一个函数对你的管理options来说，已经足够了。</p>
<p>下面这个函数是我插入到类DevloungePluginSeries中的：</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">//</span><span style="color: #ffa500;">Returns an array of admin options</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">getAdminOptions</span><span style="color: Olive;">(</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$devloungeAdminOptions</span><span style="color: Gray;"> = </span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">show_header</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> =&gt; </span><span style="color: #8b0000;">'</span><span style="color: Red;">true</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #8b0000;">'</span><span style="color: Red;">add_content</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> =&gt; </span><span style="color: #8b0000;">'</span><span style="color: Red;">true</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #8b0000;">'</span><span style="color: Red;">comment_author</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> =&gt; </span><span style="color: #8b0000;">'</span><span style="color: Red;">true</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #8b0000;">'</span><span style="color: Red;">content</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> =&gt; </span><span style="color: #8b0000;">'</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$devOptions</span><span style="color: Gray;"> = </span><span style="color: Blue;">get_option</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">adminOptionsName</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Green;">empty</span><span style="color: Olive;">(</span><span style="color: #00008b;">$devOptions</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">foreach</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: #00008b;">$devOptions</span><span style="color: Gray;"> </span><span style="color: Green;">as</span><span style="color: Gray;"> </span><span style="color: #00008b;">$key</span><span style="color: Gray;"> =&gt; </span><span style="color: #00008b;">$option</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$devloungeAdminOptions</span><span style="color: Olive;">[</span><span style="color: #00008b;">$key</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$option</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">update_option</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">adminOptionsName</span><span style="color: Gray;">, </span><span style="color: #00008b;">$devloungeAdminOptions</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$devloungeAdminOptions</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>这个函数做的事情是：</p>
<ul>
<li>给你的管理options赋默认值（3-6行） </li>
<li>尝试从数据库中找出以前存储过的值（第7行） </li>
<li>如果options曾经存储过，那么存储的值会覆盖默认值（8-11行） </li>
<li>options被存储到<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>数据库中（第12行） </li>
<li>options被返回供你使用（第13行） </li>
</ul>
<h3>初始化管理Options</h3>
<p>getAdminOptions函数可以在任何时候调用来获得管理options。然而，当插件第一次安装的时候呢？应该有某个函数被调用也能获得管理options。我在DevloungePluginSeries类中添加了这个函数：</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">&nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">init</span><span style="color: Olive;">(</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">getAdminOptions</span><span style="color: Olive;">(</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>短小简单。但是必须有一个action来调用这个函数。</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">add_action</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">activate_devlounge-plugin-series/devlounge-plugin-series.php</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,&nbsp; </span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: Gray;">&amp;</span><span style="color: #00008b;">$dl_pluginSeries</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">init</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></div></div>
<p>这个action有些复杂，但是很容易理清楚。下面是这个action做的事情：</p>
<ul>
<li>当一个插件被激活的时候你告诉它运行 </li>
<li>你给它主要的插件PHP文件，就是devlounge-plugin-series/devlounge-plugin-series.php。这当然是假设你把插件放到了wp-content/<a href="http://sexywp.com/tags/plugins" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with plugins">plugins</a>/目录中。 </li>
<li>你传递了一个引用给实例变量dl_pluginSeries并且调用了init函数。 </li>
</ul>
<p>所以，任何时候插件被激活，init函数都会被调用。</p>
<h3>管理面板怎样工作</h3>
<p>在我深入到创建实际的管理面板的代码的时候，描述一下管理面板的行为是有好处的。这里有一些你设定你管理面板的步骤：</p>
<ul>
<li>检查任何表单数据是否已经被提交。 </li>
<li>如果表单数据存在，输出提醒。 </li>
<li>显示管理面板Options。 </li>
</ul>
<p>在管理面板中，一个非常困扰你的问题可能是_e的使用。_e函数允许<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>搜索你文本的本地化版本。这将帮助<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>在将来翻译你的插件。这个函数的工作类似一个普通的echo，但是你传给它的是你的文本和一个标识变量（典型的是你的插件名称）。一个例子：</p>
<p><code>_e('Update Settings','DevloungePluginSeries');</code></p>
<p>这句代码和：</p>
<p><code>echo &quot;Update Settings&quot;;</code></p>
<p>是相同的。</p>
<h3>设置你的管理面板函数</h3>
<p>我们想要做的第一件事情就是设定一个函数，来真正地打印出一个管理面板。函数名字叫做printAdminPage。下一段代码将要读入我们早先设定的options并且检查是否所有的发布options已经被提交。这一段的所有代码假设写在printAdminPage函数中。</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">//Prints out the admin page</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; function printAdminPage() {</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; $devOptions = $this-&gt;getAdminOptions();</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; if (isset($_POST['update_devloungePluginSeriesSettings'])) {</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (isset($_POST['devloungeHeader'])) {</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $devOptions['show_header'] = $_POST['devloungeHeader'];</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (isset($_POST['devloungeAddContent'])) {</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $devOptions['add_content'] = $_POST['devloungeAddContent'];</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (isset($_POST['devloungeAuthor'])) {</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $devOptions['comment_author'] = $_POST['devloungeAuthor'];</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (isset($_POST['devloungeContent'])) {</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $devOptions['content'] = apply_filters('content_save_pre', $_POST['devloungeContent']);</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; update_option($this-&gt;adminOptionsName, $devOptions);</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ?&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;div class=&quot;updated&quot;&gt;&lt;p&gt;&lt;strong&gt;</span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">_e</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Settings Updated.</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">DevloungePluginSeries</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span><span style="color: Blue;">?&gt;</span><span style="color: Gray;">&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">&lt;?php</span></li>
<li><span style="color: Gray;">&nbsp;} </span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>上面所有代码做的是装载options并且测试是否表单的每个部分都已经被正确提交。if语句并不是必须的，但是有的时候对于调试来说很有用。第一被测试的表单变量是update_devloungePluginSeriesSettings。这个变量被赋值给我们的&#8220;提交&#8221;按钮。如果它没有被设定，那么说明这个表单没有被提交。</p>
<p>就像说好的一样，在第16行，我使用了apply_filters函数来格式化内容，以便存入数据库。</p>
<p>下一段代码将会显示一个HTML表单，那是管理面板所必须的。它有一些复杂，所以我会这里概括一下。所有的代码做的事情，就是显示表单元素和读入options。</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">&lt;div class=wrap&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;form method=&quot;post&quot; action=&quot;</span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">echo</span><span style="color: Gray;"> </span><span style="color: #00008b;">$_SERVER</span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">REQUEST_URI</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">]</span><span style="color: Gray;">; </span><span style="color: Blue;">?&gt;</span><span style="color: Gray;">&quot;&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;h2&gt;Devlounge Plugin Series&lt;/h2&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;h3&gt;Content to Add to the End of a Post&lt;/h3&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;textarea name=&quot;devloungeContent&quot; style=&quot;width: 80%; height: 100px;&quot;&gt;</span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">_e</span><span style="color: Olive;">(</span><span style="color: Blue;">apply_filters</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">format_to_edit</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #00008b;">$devOptions</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">content</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Olive;">)</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">DevloungePluginSeries</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Blue;">?&gt;</span><span style="color: Gray;">&lt;/textarea&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;h3&gt;Allow Comment Code in the Header?&lt;/h3&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;p&gt;Selecting &quot;No&quot; will disable the comment code inserted in the header.&lt;/p&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;p&gt;&lt;label for=&quot;devloungeHeader_yes&quot;&gt;&lt;input type=&quot;radio&quot; id=&quot;devloungeHeader_yes&quot; name=&quot;devloungeHeader&quot; value=&quot;true&quot; </span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$devOptions</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">show_header</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> == </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">true</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: Blue;">_e</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">checked=&quot;checked&quot;</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">DevloungePluginSeries</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: Olive;">}</span><span style="color: Blue;">?&gt;</span><span style="color: Gray;"> /&gt; Yes&lt;/label&gt;&nbsp; &nbsp; &lt;label for=&quot;devloungeHeader_no&quot;&gt;&lt;input type=&quot;radio&quot; id=&quot;devloungeHeader_no&quot; name=&quot;devloungeHeader&quot; value=&quot;false&quot; </span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"> </span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$devOptions</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">show_header</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> == </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">false</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: Blue;">_e</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">checked=&quot;checked&quot;</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">DevloungePluginSeries</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: Olive;">}</span><span style="color: Blue;">?&gt;</span><span style="color: Gray;">/&gt; No&lt;/label&gt;&lt;/p&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;h3&gt;Allow Content Added to the End of a Post?&lt;/h3&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;p&gt;Selecting &quot;No&quot; will disable the content from being added into the end of a post.&lt;/p&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;p&gt;&lt;label for=&quot;devloungeAddContent_yes&quot;&gt;&lt;input type=&quot;radio&quot; id=&quot;devloungeAddContent_yes&quot; name=&quot;devloungeAddContent&quot; value=&quot;true&quot; </span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$devOptions</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">add_content</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> == </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">true</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: Blue;">_e</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">checked=&quot;checked&quot;</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">DevloungePluginSeries</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: Olive;">}</span><span style="color: Blue;">?&gt;</span><span style="color: Gray;"> /&gt; Yes&lt;/label&gt;&nbsp; &nbsp; &lt;label for=&quot;devloungeAddContent_no&quot;&gt;&lt;input type=&quot;radio&quot; id=&quot;devloungeAddContent_no&quot; name=&quot;devloungeAddContent&quot; value=&quot;false&quot; </span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"> </span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$devOptions</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">add_content</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> == </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">false</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: Blue;">_e</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">checked=&quot;checked&quot;</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">DevloungePluginSeries</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: Olive;">}</span><span style="color: Blue;">?&gt;</span><span style="color: Gray;">/&gt; No&lt;/label&gt;&lt;/p&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;h3&gt;Allow Comment Authors to be Uppercase?&lt;/h3&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;p&gt;Selecting &quot;No&quot; will leave the comment authors alone.&lt;/p&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;p&gt;&lt;label for=&quot;devloungeAuthor_yes&quot;&gt;&lt;input type=&quot;radio&quot; id=&quot;devloungeAuthor_yes&quot; name=&quot;devloungeAuthor&quot; value=&quot;true&quot; </span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$devOptions</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">comment_author</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> == </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">true</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: Blue;">_e</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">checked=&quot;checked&quot;</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">DevloungePluginSeries</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: Olive;">}</span><span style="color: Blue;">?&gt;</span><span style="color: Gray;"> /&gt; Yes&lt;/label&gt;&nbsp; &nbsp; &lt;label for=&quot;devloungeAuthor_no&quot;&gt;&lt;input type=&quot;radio&quot; id=&quot;devloungeAuthor_no&quot; name=&quot;devloungeAuthor&quot; value=&quot;false&quot; </span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"> </span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$devOptions</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">comment_author</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> == </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">false</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: Blue;">_e</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">checked=&quot;checked&quot;</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">DevloungePluginSeries</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: Olive;">}</span><span style="color: Blue;">?&gt;</span><span style="color: Gray;">/&gt; No&lt;/label&gt;&lt;/p&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;div class=&quot;submit&quot;&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;input type=&quot;submit&quot; name=&quot;update_devloungePluginSeriesSettings&quot; value=&quot;</span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">_e</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">Update Settings</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">DevloungePluginSeries</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Blue;">?&gt;</span><span style="color: Gray;">&quot; /&gt;&lt;/div&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&lt;/form&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &lt;/div&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">&lt;?php</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span><span style="color: #ffa500;">//</span><span style="color: #ffa500;">End function printAdminPage()</span></li></ol></div></div>
<p>需要在上述代码中观察的是options的引用，和HTML和PHP是怎样集成的。</p>
<h3>设置管理面板Action</h3>
<p>现在，printAdminPage函数已经添加了，我们需要通过一个action调用它。首先函数必须被设定在正好在action的上面，在类的范围之外。</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">//</span><span style="color: #ffa500;">Initialize the admin panel</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Blue;">function_exists</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">DevloungePluginSeries_ap</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">DevloungePluginSeries_ap</span><span style="color: Olive;">(</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">global</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$dl_pluginSeries</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Green;">isset</span><span style="color: Olive;">(</span><span style="color: #00008b;">$dl_pluginSeries</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">function_exists</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">add_options_page</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: Blue;">add_options_page</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">Devlounge Plugin Series</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">Devlounge Plugin Series</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Maroon;">9</span><span style="color: Gray;">, </span><span style="color: Blue;">basename</span><span style="color: Olive;">(</span><span style="color: Green;">__FILE__</span><span style="color: Olive;">)</span><span style="color: Gray;">, </span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: Gray;">&amp;</span><span style="color: #00008b;">$dl_pluginSeries</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">printAdminPage</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>上面的代码做了下面这些事：</p>
<ul>
<li>创建了一个叫做DevloungePluginSeries_ap的函数。 </li>
<li>测试变量dl_pluginSeries是否存在（4-7行）。这个变量是我们的类的引用。 </li>
<li>一个叫做&#8220;Devlounge Plugin Series&#8221;的管理页面被初始化了，并且，我们的printAdminPage函数被引用了。（8-10行）。 </li>
</ul>
<p>add_options_page函数的调用方法为：</p>
<p>add_options_page(page_title,menu_title,access_level/capability,file,[function]);</p>
<p>访问级别（在这个例子中是9）在<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a> Codex的Users Levels page页面有详细的描述。</p>
<p>必须设置一个action来调用DevloungePluginSeries_ap函数：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">add_action</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">admin_menu</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">DevloungePluginSeries_ap</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></div></div>

	标签：<a href="http://sexywp.com/tags/develop" title="develop" rel="tag nofollow">develop</a>, <a href="http://sexywp.com/tags/plugins" title="plugins" rel="tag nofollow">plugins</a>, <a href="http://sexywp.com/tags/translate" title="translate" rel="tag nofollow">translate</a>, <a href="http://sexywp.com/tags/wordpress" title="WordPress" rel="tag nofollow">WordPress</a><br />
]]></content:encoded>
			<wfw:commentRss>http://sexywp.com/how-to-write-a-wp-plugin-07.htm/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>插件开发全攻略（06）---WordPress插件Filter</title>
		<link>http://sexywp.com/how-to-write-a-wp-plugin-06.htm</link>
		<comments>http://sexywp.com/how-to-write-a-wp-plugin-06.htm#comments</comments>
		<pubDate>Wed, 04 Jun 2008 10:48:18 +0000</pubDate>
		<dc:creator>Charles</dc:creator>
				<category><![CDATA[Plugins Develop]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[develop]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[translate]]></category>

		<guid isPermaLink="false">http://www.charlestang.cn/?p=86</guid>
		<description><![CDATA[Filter是一组使得你的插件可以插入来修改文字的函数。被修改的文字通常是要插入到数据库或者显示给终端用户看的。

WordPress Filter允许你修改几乎任何类型的显示文字，而且其功能十分强劲。通过Filter你可以修改文章，feed，怎么样在评论中的作者，还有很多，很多。

为了说明WordPress Filter的用处，我们会继续在已经存在的Devlounge Plugin Series代码上工作。

<span class="readmore"><a href="http://sexywp.com/how-to-write-a-wp-plugin-06.htm title="插件开发全攻略（06）---WordPress插件Filter>Keep Reading --- 828 words totally</a></span>]]></description>
			<content:encoded><![CDATA[<p><a href="http://codex.wordpress.org/Plugin_API/Filter_Reference">Filter</a>是一组使得你的插件可以插入来修改文字的函数。被修改的文字通常是要插入到数据库或者显示给终端用户看的。</p>
<p><a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a> Filter允许你修改几乎任何类型的显示文字，而且其功能十分强劲。通过Filter你可以修改文章，feed，怎么样在评论中的作者，还有很多，很多。</p>
<p>为了说明<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a> Filter的用处，我们会继续在已经存在的Devlounge Plugin Series代码上工作。</p>
<p><span id="more-86"></span><br />
<h3>添加一个内容Filter</h3>
<p>有一个你可以使用的很Cool的Filter是'the_content'。这个filter在文章内容被显示在浏览器之前执行。我们将要添加一行文字到文章内容的末尾。</p>
<p>根据<a href="http://codex.wordpress.org/Plugin_API">WordPress插件API</a>，添加一个filter的格式为：<code>add_filter('hook_name','your_filter',[priority],[accepted_args]);</code></p>
<p>我们只需要往<strong>DevloungePluginSeries</strong>类中添加一个函数。让我叫它<strong>addContent</strong>。</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">&nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">addContent</span><span style="color: Olive;">(</span><span style="color: #00008b;">$content</span><span style="color: Gray;">=</span><span style="color: #8b0000;">'</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: #00008b;">$content</span><span style="color: Gray;">.=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">&lt;p&gt;Devlounge Was Here&lt;/p&gt;</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$content</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>在上面的代码中，发生了以下的事件：</p>
<ul>
<li>上述函数会接受一个参数叫做<strong>content</strong> </li>
<li>如果调用时不传递参数，那么content会设定为默认值（空串） </li>
<li>参数<strong>content</strong>被附加了一行我们自定义的文本 </li>
<li>然后重新返回了content </li>
</ul>
<p>在向类添加了上述函数后，下一步要做的就是将它插入到'<strong>the_content</strong>'中，使得这个函数被调用。</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">//</span><span style="color: #ffa500;">Actions and Filters</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Green;">isset</span><span style="color: Olive;">(</span><span style="color: #00008b;">$dl_pluginSeries</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: #ffa500;">//</span><span style="color: #ffa500;">Actions</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: Blue;">add_action</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">wp_head</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: Gray;">&amp;</span><span style="color: #00008b;">$dl_pluginSeries</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">addHeaderCode</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">,</span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: #ffa500;">//</span><span style="color: #ffa500;">Filters</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: Blue;">add_filter</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">the_content</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: Gray;">&amp;</span><span style="color: #00008b;">$dl_pluginSeries</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">addContent</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>在这段代码的第6行你可以看到，添加了一个叫做'<strong>the_content</strong>'的filter，通过这个filter，我们的函数'<strong>addContent</strong>'会被调用。</p>
<p>如果插件启用，当一篇文章被显示的时候，文本&#8220;Devlounge Was Here&#8221;将会被显示到文章的末尾。</p>
<h3>添加一个作者Filter</h3>
<p>我在这里要展示另一个使用Filter的例子，我要展示一下怎么操纵显示一个评论的作者。我这里只是简单地让所有的作者名字都用大写显示。</p>
<p>我们只需要往<strong>DevloungePluginSeries</strong>类中添加一个函数。我们叫它<strong>authorUpperCase</strong>。</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">&nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">authorUpperCase</span><span style="color: Olive;">(</span><span style="color: #00008b;">$author</span><span style="color: Gray;">=</span><span style="color: #8b0000;">'</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">strtoupper</span><span style="color: Olive;">(</span><span style="color: #00008b;">$author</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>在上述代码中，做了这些事情：</p>
<p>上述函数会接受一个参数，叫做<strong>author</strong></p>
<p>如果没有参数，会被设定成默认值</p>
<p><strong>author</strong>字符串会以大写的形式返回</p>
<p>在函数被添加到类后，下一步是将它插入到'<strong>get_comment_author</strong>'中使它被调用。</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">//</span><span style="color: #ffa500;">Actions and Filters</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Green;">isset</span><span style="color: Olive;">(</span><span style="color: #00008b;">$dl_pluginSeries</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: #ffa500;">//</span><span style="color: #ffa500;">Actions</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: Blue;">add_action</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">wp_head</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: Gray;">&amp;</span><span style="color: #00008b;">$dl_pluginSeries</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">addHeaderCode</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">,</span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: #ffa500;">//</span><span style="color: #ffa500;">Filters</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: Blue;">add_filter</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">the_content</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: Gray;">&amp;</span><span style="color: #00008b;">$dl_pluginSeries</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">addContent</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: Blue;">add_filter</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">get_comment_author</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: Gray;">&amp;</span><span style="color: #00008b;">$dl_pluginSeries</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">authorUpperCase</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>像你在第7行看到的，我们添加了一个'<strong>get_comment-author</strong>' filter，然后，我们的函数'<strong>authorUpperCase</strong>'会被调用。</p>
<p>如果插件已经启用，并且一篇日志的评论是可见的，那么评论的作者名字会以大写显示。</p>
<h3>应用Filter</h3>
<p>使用Filter可以做的更强大的是，你可以动态地调用他们。没有必要每次运行都添加一次filter。你可以在任何时候在你的代码里面调用filter。</p>
<p><strong>apply_filters</strong>的格式是：apply_filter('filter name','you text');</p>
<p>你会在这个系列的后续文章中看到<strong>apply_filters</strong>的例子。</p>

	标签：<a href="http://sexywp.com/tags/develop" title="develop" rel="tag nofollow">develop</a>, <a href="http://sexywp.com/tags/plugins" title="plugins" rel="tag nofollow">plugins</a>, <a href="http://sexywp.com/tags/translate" title="translate" rel="tag nofollow">translate</a>, <a href="http://sexywp.com/tags/wordpress" title="WordPress" rel="tag nofollow">WordPress</a><br />
]]></content:encoded>
			<wfw:commentRss>http://sexywp.com/how-to-write-a-wp-plugin-06.htm/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>插件开发全攻略（05）---WordPress 插件Actions</title>
		<link>http://sexywp.com/how-to-write-a-wp-plugin-05.htm</link>
		<comments>http://sexywp.com/how-to-write-a-wp-plugin-05.htm#comments</comments>
		<pubDate>Tue, 03 Jun 2008 06:47:35 +0000</pubDate>
		<dc:creator>Charles</dc:creator>
				<category><![CDATA[Plugins Develop]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[develop]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[translate]]></category>

		<guid isPermaLink="false">http://www.charlestang.cn/?p=85</guid>
		<description><![CDATA[WordPress actions允许作为插件作者的你插入到WordPress应用中并且执行一段代码。一个Action的例子就是，你想要在一个用户发布完一篇文章或者留下一篇留言的时候执行一个动作。

一些我使用极其频繁的Action有：



<span class="readmore"><a href="http://sexywp.com/how-to-write-a-wp-plugin-05.htm title="插件开发全攻略（05）---WordPress 插件Actions>Keep Reading --- 479 words totally</a></span>]]></description>
			<content:encoded><![CDATA[<p><a href="http://codex.wordpress.org/Plugin_API#Actions">WordPress actions</a>允许作为插件作者的你插入到<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>应用中并且执行一段代码。一个Action的例子就是，你想要在一个用户发布完一篇文章或者留下一篇留言的时候执行一个动作。</p>
<p>一些我使用极其频繁的Action有：</p>
<ul>
<li>admin_menu：允许你给你的插件设置一个管理面板。 </li>
<li>wp_head：允许你将代码插入到博客的&lt;head&gt;标签内。 </li>
</ul>
<p>  <span id="more-85"></span></p>
<h3>Action在行动</h3>
<p>当定义一个<a href="http://sexywp.com/how-to-write-a-wp-plugin-04.htm">WordPress插件的结构</a>的时，我为某些Action留下了一块地方。在这个例子中，我们将使得一段代码可以在<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>博客中的&lt;head&gt;标签内运行。</p>
<p>首先，我们需要在<strong>DevloungePluginSeries</strong>类中添加一个函数：</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">&nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">addHeaderCode</span><span style="color: Olive;">(</span><span style="color: Olive;">)</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &lt;!-- </span><span style="color: Blue;">Devlounge</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">Was</span><span style="color: Gray;"> </span><span style="color: Blue;">Here</span><span style="color: Gray;">--&gt;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>上面一段代码的作用是输出HTML注释。相当简单，但是你实际上可以输出任何东西。为了调用这个函数，我们要添加一个Action。</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">//</span><span style="color: #ffa500;">Actions and Filters</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Green;">isset</span><span style="color: Olive;">(</span><span style="color: #00008b;">$dl_pluginSeries</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: #ffa500;">//</span><span style="color: #ffa500;">Actions</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: Blue;">add_action</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">wp_head</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: Gray;">&amp;</span><span style="color: #00008b;">$dl_pluginSeries</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">addHeaderCode</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">,</span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: #ffa500;">//</span><span style="color: #ffa500;">Filters</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>从<a href="http://codex.wordpress.org/Plugin_API">WordPress插件API</a>中我们可以知道，add_action的结构如下：<code>add_action('hook_name','your_function_name',[priority],[accepted_args]);</code></p>
<p>由于我们是在一个类的内部调用一个函数，我们传递给Action一个数组，里面包含我们的类对象的引用（dl_pluginSeries）和我们想要调用的函数名（addHeaderCode）。我们已经给我们的插件设定了一个优先级为1，数字越小，执行时间越靠前。</p>
<h3>运行代码</h3>
<p>如果Devlounge Plugin Series插件被启用了，使用【查看-&gt;源文件】应该可以在你的博客的源码中看到注释&#8220;Devlounge was here&#8221;。</p>
<h3>移除Action</h3>
<p>如果你的插件动态地添加Action，你也可以使用remove_action来动态地移除action。用法如下：</p>
<p><code>remove_action('action_hook','action_function')。</code></p>

	标签：<a href="http://sexywp.com/tags/develop" title="develop" rel="tag nofollow">develop</a>, <a href="http://sexywp.com/tags/plugins" title="plugins" rel="tag nofollow">plugins</a>, <a href="http://sexywp.com/tags/translate" title="translate" rel="tag nofollow">translate</a>, <a href="http://sexywp.com/tags/wordpress" title="WordPress" rel="tag nofollow">WordPress</a><br />
]]></content:encoded>
			<wfw:commentRss>http://sexywp.com/how-to-write-a-wp-plugin-05.htm/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>插件开发全攻略（04）---WordPress插件的结构</title>
		<link>http://sexywp.com/how-to-write-a-wp-plugin-04.htm</link>
		<comments>http://sexywp.com/how-to-write-a-wp-plugin-04.htm#comments</comments>
		<pubDate>Sun, 01 Jun 2008 11:32:47 +0000</pubDate>
		<dc:creator>Charles</dc:creator>
				<category><![CDATA[Plugins Develop]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[develop]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[translate]]></category>

		<guid isPermaLink="false">http://www.charlestang.cn/?p=72</guid>
		<description><![CDATA[开发一个WordPress插件的一个更重要的方面，是你怎样设计它的结构。本文将研究几个关于设计插件结构的提示，以帮助你组织你的插件资源，避免名字冲突。每一个插件作者的插件的结构都不尽相同，所以这些提示只是我的个人偏好。我将首先简单地描述一下一个WordPress插件是怎样工作的，然后介绍一个插件的结构。

WordPress插件怎样工作

在将一个插件放入到wp-content/plugins/目录后，插件应该自动的处于可以安装的状态。

<span class="readmore"><a href="http://sexywp.com/how-to-write-a-wp-plugin-04.htm title="插件开发全攻略（04）---WordPress插件的结构>Keep Reading --- 776 words totally</a></span>]]></description>
			<content:encoded><![CDATA[<p>开发一个<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>插件的一个更重要的方面，是你怎样设计它的结构。本文将研究几个关于设计插件结构的提示，以帮助你组织你的插件资源，避免名字冲突。每一个插件作者的插件的结构都不尽相同，所以这些提示只是我的个人偏好。我将首先简单地描述一下一个<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>插件是怎样工作的，然后介绍一个插件的结构。</p>
<h3><a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>插件怎样工作</h3>
<p>在将一个插件放入到wp-content/<a href="http://sexywp.com/tags/plugins" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with plugins">plugins</a>/目录后，插件<a href="http://codex.wordpress.org/Managing_Plugins">应该自动的处于可以安装的状态</a>。</p>
<p>当一个插件被&#8220;启用&#8221;，等同于告知<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>将你的代码装载到&#8220;每&#8221;个页面（包括管理页面）。这也就是为什么当你启用了很多的插件的时候，你的<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>可能非常慢的原因，这是由它所引入的代码的量决定的。</p>
<p><span id="more-72"></span></p>
<p>从你的插件被启用，<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>自动将你的代码装载后开始，你可以利用<a href="http://codex.wordpress.org/Plugin_API">WordPress插件API</a>。你还可以使用<a href="http://codex.wordpress.org/Template_Tags">WordPress模板标签</a>或者创建你自己的函数。</p>
<p>如果你计划开发一个改变文章内容或者评论的插件，我建议你读一下<a href="http://codex.wordpress.org/The_Loop">WordPress loop</a>。<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a> loop是一个显示你的文章的循环。有些模板标签在这个循环外面无法工作，所以，你准确地知道你代码在哪里执行是非常必要的。你可通过使用<a href="http://codex.wordpress.org/Plugin_API#Actions">Actions</a>和<a href="http://codex.wordpress.org/Plugin_API#Filters">Filters</a>来控制这一点，这将会在将来的文章中解释。</p>
<h3>文件夹结构</h3>
<p>所有的<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>插件都会被安装到wp-content/<a href="http://sexywp.com/tags/plugins" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with plugins">plugins</a>目录中。有些插件作者的插件只包含一个文件，但是我推荐你总是创建一个文件夹来保存你的插件。</p>
<p>典型地，我会把我的插件放在如下的目录结构中：</p>
<ul>
<li>插件文件夹名称（你插件的名字，没有空格或者特殊字符）
<ul>
<li>插件PHP文件 </li>
<li>js文件夹（存放javascript文件） </li>
<li>css文件夹（存放样式表文件） </li>
<li>php文件夹（存放其他的PHP文件） </li>
</ul>
</li>
</ul>
<p>举例来说，这是一个我创建的样例结构：</p>
<ul>
<li>devlounge-plugin-series
<ul>
<li>devlounge-plugin-series.php </li>
<li>js </li>
<li>css </li>
<li>php </li>
</ul>
</li>
</ul>
<p>在devlounge-plugin-series文件夹中，我将只包含主要的PHP文件，把其他的文件都放到他们各自属于的文件夹中。这个结构将帮助其他插件作者在查看你的代码的时候，能够分辨哪个是主要的插件文件，哪些是支持插件正常工作的附属文件。</p>
<p><a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>还建议将图片放到一个文件夹中，并且包含一个readme文件在你的插件中。</p>
<h3>主要插件文件</h3>
<p>当你开始编写一个插件的时候，前面七行用来描述你的插件。</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Blue;">&lt;?php</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">/*</span></li>
<li><span style="color: #ffa500;">&nbsp;Plugin Name: Your Plugin Name Here</span></li>
<li><span style="color: #ffa500;">&nbsp;Plugin URI: Your Plugin URI</span></li>
<li><span style="color: #ffa500;">&nbsp;Version: Current Plugin Version</span></li>
<li><span style="color: #ffa500;">&nbsp;Author: Who Are You?</span></li>
<li><span style="color: #ffa500;">&nbsp;Description: What does your plugin do？</span></li>
<li><span style="color: #ffa500;">&nbsp;</span><span style="color: #ffa500;">*/</span></li></ol></div></div>
<p>第3行是让你命名你的插件的。第4行是向用户指出插件所在的网址的。第5行让你指定当前的版本。第6行让你设定插件的作者。第7行是对插件的描述。</p>
<p>下面展示的是一个已经填写完毕的范例：</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">/*</span></li>
<li><span style="color: #ffa500;">&nbsp;Plugin Name: Devlounge Plugin Series</span></li>
<li><span style="color: #ffa500;">&nbsp;Plugin URI: </span><span style="color: Blue;">http://www.devlounge.net/</span></li>
<li><span style="color: #ffa500;">&nbsp;Version: v1.00</span></li>
<li><span style="color: #ffa500;">&nbsp;Author: Ronald Huereca</span></li>
<li><span style="color: #ffa500;">&nbsp;Description: A sample plugin for a Devlounge series.</span></li>
<li><span style="color: #ffa500;">&nbsp;</span><span style="color: #ffa500;">*/</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>下面展示的是插件在<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>插件面板上出现的截图。</p>
<p><img style="border:none;margin:10px auto;clear:both;" src="http://lh3.ggpht.com/TangChao.ZJU/SEKLOyGpJbI/AAAAAAAAAbE/XMn77sNe0LM/s800/htwawp4-1.gif" /></p>
<h3>设定一个类结构</h3>
<p>开发一个插件，并不需要你对<a href="http://www.onlamp.com/pub/a/php/2002/07/18/php_foundations.html">PHP类</a>了若指掌，但是如果你真的很熟悉，那会很有帮助。为了避免与其他的<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>插件发生名字冲突，一个类结构是必须的。如果别人在插件当中使用了和你一样的函数名，那么就会发生一个错误，<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>可能会无法响应直到你删除那个插件。</p>
<p>为了避免名字冲突，所有的插件都使用一个PHP类结构是急需的。这里有一些&#8220;骨架&#8221;代码，可以帮助你创建一个类结构。</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">&nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Blue;">class_exists</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">DevloungePluginSeries</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: Green;">class</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">DevloungePluginSeries</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">DevloungePluginSeries</span><span style="color: Olive;">(</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: #ffa500;">//</span><span style="color: #ffa500;">constructor</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">//</span><span style="color: #ffa500;">End Class DevloungePluginSeries</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>上述代码的含义是，首先检查是否有一个名叫DevloungePluginSeries的类存在。如果这个类不存在，那么创建这个类。</p>
<h3>初始化你的类</h3>
<p>下面的代码将会初始化你的类。</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">&nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">class_exists</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">DevloungePluginSeries</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: #00008b;">$dl_pluginSeries</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">DevloungePluginSeries</span><span style="color: Olive;">(</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>上面的代码检查是否类DevloungePluginSeries已经存在了。如果已经存在，那么一个变量$dl_pluginSeries将会被创建，并且会使用一个DevloungePluginSeries类的对象给它赋值。</p>
<p>设置Actions和Filters</p>
<p>下面的代码段是用来放置<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a> Actions和Filters的地方（我会在后续的文章中详细讲）。</p>
<div class="hl-surround"><div class="hl-main"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li>&nbsp;<span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">//</span><span style="color: #ffa500;">Actions and Filters</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Green;">isset</span><span style="color: Olive;">(</span><span style="color: #00008b;">$dl_pluginSeries</span><span style="color: Olive;">)</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: #ffa500;">//</span><span style="color: #ffa500;">Actions</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; &nbsp; </span><span style="color: #ffa500;">//</span><span style="color: #ffa500;">Filters</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">?&gt;</span></li></ol></div></div>
<p>上述代码首先确认$dl_pluginSeries是否已经被设定。如果设定了（仅当类存在的时候），那么就会设定合适的actions和filters。</p>

	标签：<a href="http://sexywp.com/tags/develop" title="develop" rel="tag nofollow">develop</a>, <a href="http://sexywp.com/tags/plugins" title="plugins" rel="tag nofollow">plugins</a>, <a href="http://sexywp.com/tags/translate" title="translate" rel="tag nofollow">translate</a>, <a href="http://sexywp.com/tags/wordpress" title="WordPress" rel="tag nofollow">WordPress</a><br />
]]></content:encoded>
			<wfw:commentRss>http://sexywp.com/how-to-write-a-wp-plugin-04.htm/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>插件开发全攻略（03）---怎样获得WordPress插件的创意</title>
		<link>http://sexywp.com/how-to-write-a-wp-plugin-03.htm</link>
		<comments>http://sexywp.com/how-to-write-a-wp-plugin-03.htm#comments</comments>
		<pubDate>Fri, 30 May 2008 14:01:08 +0000</pubDate>
		<dc:creator>Charles</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[develop]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[translate]]></category>

		<guid isPermaLink="false">http://www.charlestang.cn/?p=69</guid>
		<description><![CDATA[如果你已经被说服而想要研究一下创建你自己的WordPress插件的可能性，那么找到一个可以让你开始行动的一个创意可能是非常困难的。幸运的是，有很多地方可以让你找到开发你自己的插件的灵感。在本文中，我会罗列好几个方法使你可以找到开发你自己的WordPress插件的创意。

倾听你的读者

你的读者是你获得插件创意的宝库。比如说，一个读者可能需要一个简单的方式来回复或者编辑评论。因为博客的读者是使用你博客最多的人，他们往往对于你的博客还缺乏哪些功能有着独特的洞察力。就在那天，我的一个读者请求我能不能让评论在发布前可以预览一下。幸运地是已经有一些插件可以提供这个功能了，但是有时候，你的读者会建议一些还没有被插件实现的功能。

<span class="readmore"><a href="http://sexywp.com/how-to-write-a-wp-plugin-03.htm title="插件开发全攻略（03）---怎样获得WordPress插件的创意>Keep Reading --- 876 words totally</a></span>]]></description>
			<content:encoded><![CDATA[<p>如果你已经被说服而想要研究一下创建你自己的<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>插件的可能性，那么找到一个可以让你开始行动的一个创意可能是非常困难的。幸运的是，有很多地方可以让你找到开发你自己的插件的灵感。在本文中，我会罗列好几个方法使你可以找到开发你自己的<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>插件的创意。</p>
<h3>倾听你的读者</h3>
<p>你的读者是你获得插件创意的宝库。比如说，一个读者可能需要一个简单的方式来回复或者编辑评论。因为博客的读者是使用你博客最多的人，他们往往对于你的博客还缺乏哪些功能有着独特的洞察力。就在那天，我的一个读者请求我能不能让评论在发布前可以预览一下。幸运地是已经有一些插件可以提供这个功能了，但是有时候，你的读者会建议一些还没有被插件实现的功能。</p>
<p><span id="more-69"></span><br />
<h3>倾听你自己的心声</h3>
<p>&#8220;如果<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>可以&#8230;&#8230;就好了&#8221;</p>
<p>如果你发现<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>缺少一个你非常需要的特性，为什么不自己写一个插件来实现呢？机遇就在于如果你渴望添加这个特性，那么别人也一样。</p>
<h3>检查一下博客资源</h3>
<p>像<a href="http://www.blogherald.com/">The Blog Herald</a>和<a href="http://weblogtoolscollection.com/">Weblog Tools Collection</a>，正是插件创意的宝库。周三，The Blog Herald有一个专栏，叫《<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>星期三》。这个专栏里面是插件需求和&#8220;愿望列表&#8221;。而Weblog Tools Collection几乎每一天都会发布一款插件，从那里，你可以了解人们需要什么样的插件。</p>
<h3>检查<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>支持论坛</h3>
<p><a href="http://wordpress.org/support/">WordPress支持论坛</a>里面到处都是寻找帮助以扩展他们的<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>博客的人。一个典型的找寻插件创意的板块是Requests and Feedback论坛。另一个地方是<a href="http://wordpress.org/extend/ideas/">WordPress ideas page</a>。</p>
<h3>研究API</h3>
<p>诸如Flickr，FeedBurner，Google Maps这样的在线服务，还有其他提供API服务，使得第三方应用拥有使用他们服务的能力。通过这些API，你可以开始通过编程创建你自己的<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>解决方案。</p>
<p>如果有一个你非常喜欢的服务，但是你想把它集成到你的<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>中，那么调查一下这个服务的API看看能不能开发一个好的插件。</p>
<h3>第三方应用</h3>
<p>伴随着<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>博客，人们可能已经装了许多的第三方应用。这一类的例子有<a href="http://www.haveamint.com/">Mint</a>（译者注：网站分析程序），<a href="http://getvanilla.com/">Vanilla</a>（译者注：论坛程序），其他还有许多。为什么不开发一个插件来集成第三方应用到一个<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>博客呢？</p>
<h3>存在的<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>插件</h3>
<p>如果你找到一个你非常喜欢的<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>插件，并且想要发布一个带有你自己的创意的分支版本，那么请放手干吧。如果你不喜欢某个特定的插件的实现方式，建立你自己的实现吧。有许多的插件做得都是相同的事情，但是还是有一些细微地差别的。</p>

	标签：<a href="http://sexywp.com/tags/develop" title="develop" rel="tag nofollow">develop</a>, <a href="http://sexywp.com/tags/plugins" title="plugins" rel="tag nofollow">plugins</a>, <a href="http://sexywp.com/tags/translate" title="translate" rel="tag nofollow">translate</a>, <a href="http://sexywp.com/tags/wordpress" title="WordPress" rel="tag nofollow">WordPress</a><br />
]]></content:encoded>
			<wfw:commentRss>http://sexywp.com/how-to-write-a-wp-plugin-03.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>插件开发全攻略（02）---编写插件的七个理由</title>
		<link>http://sexywp.com/how-to-write-a-wp-plugin-02.htm</link>
		<comments>http://sexywp.com/how-to-write-a-wp-plugin-02.htm#comments</comments>
		<pubDate>Thu, 29 May 2008 02:29:31 +0000</pubDate>
		<dc:creator>Charles</dc:creator>
				<category><![CDATA[Plugins Develop]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[develop]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[translate]]></category>

		<guid isPermaLink="false">http://www.charlestang.cn/?p=95</guid>
		<description><![CDATA[当写作《插件开发全攻略》系列文章的时候，我想，首先罗列一些为什么WordPress用户想要编写一个WordPress插件的理由是有好处的。

下面罗列了为什么一个WordPress用户应该考虑编写一个WordPress插件的七个理由。



<span class="readmore"><a href="http://sexywp.com/how-to-write-a-wp-plugin-02.htm title="插件开发全攻略（02）---编写插件的七个理由>Keep Reading --- 1161 words totally</a></span>]]></description>
			<content:encoded><![CDATA[<p>当写作《插件开发全攻略》系列文章的时候，我想，首先罗列一些为什么<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>用户想要编写一个<a href="http://wordpress.org/extend/plugins/">WordPress插件</a>的理由是有好处的。</p>
<p>下面罗列了为什么一个<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>用户应该考虑编写一个<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>插件的七个理由。</p>
<p><span id="more-52"></span></p>
<ol>
<li>
<h3>你喜欢一个插件的创意，但是不喜欢这个插件的实现方式</h3>
<p>无论是在<a href="http://weblogtoolscollection.com/">Weblog Tools Collection</a>还是在官方的<a href="http://wordpress.org/development/2007/03/plugin-directory/">WordPress插件目录</a>或者<a href="http://wp-plugins.net/">WordPress插件数据库</a>寻找插件，你将不可避免的找到一个插件，能够满足你的需求，但是只能在某种程度上满足你的需求。</p>
<p>你很喜欢这个插件的创意，但是却并不是那么喜欢插件作者使用的实现方法。为什么不创建你自己的分立的版本来实现你最初的那个创意呢？</p>
</li>
<li>
<h3>你想修改已经存在的插件的代码</h3>
<p>有时候，一个插件的输出需要修改一下，或者你想要的某个功能正好没有。虽然你可以尝试说服插件作者来添加你要的特性，但是插件作者通常都非常忙或者他们不喜欢你的建议。一个插件作者要为一个免费插件提供支持，维护需要付出很多努力。有时候，一个插件很可能已经没有任何人去维护它了。</p>
<p>在插件作者不能满足你的需求的这种情况下，就全靠你自己采取主动来修改存在的插件代码了。如果你的工作做得足够好并且做了足够多的修改，你可以再次发布这个插件，只要原来这个插件发布于与<a href="http://www.gnu.org/licenses/gpl.html">GPL相兼容的许可</a>就行。</p>
<p>通常当我安装或者测试一个新的插件的时候，我要做的第一件事情，就是查看一下代码，看看有什么我可以修改的，有什么我不可以修改的，我有可能往里面添加什么或者拿掉什么。</p>
</li>
<li>
<h3>你想要扩展一个插件</h3>
<p>有时候一个插件本身很好，但是你想要在它的基础上建立并且发布你自己的版本。比如说，你可能认为一个插件在使用了AJAX后会工作得更好，或者添加更多的钩子以使它能够与其他插件兼容。你可能想要给它添加一个管理面板使得你不需要深入到代码里去修改输出。</p>
<p>就想前面提出的一样，如果一个插件是兼容GPL许可的，你可以自由地发布你自己的版本。</p>
</li>
<li>
<h3>你想要可移植的主题代码</h3>
<p>对于像我们这样选择自己从零开始创建主题的玩家，你可能会发现你自己在很多地方重用着一段代码。编写你自己的插件，组合所有的代码小片段使得你可以像使用模板标签一样来使用那些代码，不是更好吗？</p>
<p>模板标签的美丽就在于你可以一次又一次地在你的主题或者任何一个你将来要创建的主题中使用它们。并且，你只需要在一个地方修改这些代码，而不是很多处地方。</p>
</li>
<li>
<h3>你是一个主题设计者</h3>
<p>如果你是一个<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>模板设计者，我可能会劝说你，符合逻辑的下一步是成为一个插件作者。编写插件将使得你对于<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>的行为有更进一步的了解，接着，你就可以扩展那些你已经发布的模板的功能了。</p>
</li>
<li>
<h3>你想要赚钱</h3>
<p>一个好的插件作者通常可以因为他的工作而获得回报。一些插件作者也可以获得捐赠或者为提供额外的支持或者咨询而收取费用。</p>
</li>
<li>
<h3>你想获得链接</h3>
<p>当我发布<a href="http://www.raproject.com/">Reader Appreciation Project</a>的时候，我的其中一个目的就是快速建立传入链接。我知道的最好的方法就是写一些<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>插件并且提高它们的功能。我的其中一个插件（<a href="http://www.raproject.com/ajax-edit-comments/">WP Ajax Edit Comments</a>）竟然非常地流行，目前已经为我带来了超过100个传入链接了。</p>
</li>
</ol>

	标签：<a href="http://sexywp.com/tags/develop" title="develop" rel="tag nofollow">develop</a>, <a href="http://sexywp.com/tags/plugins" title="plugins" rel="tag nofollow">plugins</a>, <a href="http://sexywp.com/tags/translate" title="translate" rel="tag nofollow">translate</a>, <a href="http://sexywp.com/tags/wordpress" title="WordPress" rel="tag nofollow">WordPress</a><br />
]]></content:encoded>
			<wfw:commentRss>http://sexywp.com/how-to-write-a-wp-plugin-02.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>插件开发全攻略（01）---介绍</title>
		<link>http://sexywp.com/how-to-write-a-wp-plugin-01.htm</link>
		<comments>http://sexywp.com/how-to-write-a-wp-plugin-01.htm#comments</comments>
		<pubDate>Wed, 28 May 2008 07:15:11 +0000</pubDate>
		<dc:creator>Charles</dc:creator>
				<category><![CDATA[Plugins Develop]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[develop]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[translate]]></category>

		<guid isPermaLink="false">http://www.charlestang.cn/?p=93</guid>
		<description><![CDATA[对于许多WordPress用户来说，插件是必须的。WordPress 插件使得那些只有很少或者没有编程能力的用户可以扩展他们博客的功能。插件的形式多种多样，在WordPress中，插件几乎可以做任何事情。

即便是WordPress这样一个优秀的独立应用程序，仍旧有许多方面有缺憾。用户所要求的越来越多的WordPress所应该具有的特性，都很可能被开发成插件。此外，还有很多没有实现的创意，而且，每一天还有更多的创意被提出。

在已经发布了三款插件之后（不包括我自己写给自己用的那些），我意识到了一些WordPress的局限性，我希望能够分享一些我已经学到的（我仍旧在学）关于创建WordPress插件的一些经验。最终，我将会开始写一个系列，专门讨论编写你自己的WordPress插件的过程中遇到的各种各样的问题。这个系列将会从非常基础的话题开始，并且假设你的插件知识是零基础。

<span class="readmore"><a href="http://sexywp.com/how-to-write-a-wp-plugin-01.htm title="插件开发全攻略（01）---介绍>Keep Reading --- 1007 words totally</a></span>]]></description>
			<content:encoded><![CDATA[<p>对于许多<a href="http://wordpress.org">WordPress</a>用户来说，插件是必须的。<a href="http://wordpress.org/extend/plugins/">WordPress 插件</a>使得那些只有很少或者没有编程能力的用户可以扩展他们博客的功能。插件的形式多种多样，在<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>中，插件几乎可以做任何事情。</p>
<p>即便是<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>这样一个优秀的独立应用程序，仍旧有许多方面有缺憾。用户所要求的越来越多的<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>所应该具有的特性，都很可能被开发成插件。此外，还有很多没有实现的创意，而且，每一天还有更多的创意被提出。</p>
<p>在已经发布了三款插件之后（不包括我自己写给自己用的那些），我意识到了一些<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>的局限性，我希望能够分享一些我已经学到的（我仍旧在学）关于创建<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>插件的一些经验。最终，我将会开始写一个系列，专门讨论编写你自己的<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>插件的过程中遇到的各种各样的问题。这个系列将会从非常基础的话题开始，并且假设你的插件知识是零基础。</p>
<h3>这个系列是为谁准备的？</h3>
<p>这个系列是为了任何一个好奇或者想要学习怎样编写他们自己的<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>插件的用户撰写的。这个系列的读者应该有中级程度的PHP知识，知道一点点JavaScript，并且有相当的CSS知识。</p>
<p>这个插件系列将会使主题模板设计者受益，还有那些想要修补插件代码的人，还有那些想从零开始编写自己的插件的人。</p>
<p><span id="more-53"></span></p>
<h3>完成工作必备利器</h3>
<p>使用任何文本编辑器都可以写插件。这里是一些我个人使用的创建插件的工具。</p>
<ul>
<li>Dreamweaver </li>
<li>Firefox </li>
<li><a href="http://www.joehewitt.com/software/firebug/">Firebug（Firefox的插件）</a></li>
<li><a href="http://chrispederick.com/work/web-developer/">Web Developer（Firefox的插件）</a></li>
<li><a href="http://sourceforge.net/projects/xampp/">XAMPP</a>和一个本地安装的<a href="http://wordpress.org">WordPress</a></li>
</ul>
<p>这个系列假设你使用的是<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a> 2.1.x或者更新的版本。</p>
<h3>代码范例</h3>
<p>我所使用的所有的代码在每篇文章的结论一节都提供下载。我会随着内容推进，逐步完善我的代码，所以每一份下载都会不同。我将会创建一个实际上什么都做不了的插件，但是足够向你展示一个插件工作的基础了。</p>
<p>由于这个系列里的每篇文章都是在上一篇的基础之上，所以推荐按照顺序来阅读这个系列里面的文章。</p>
<p>我极力建议你使用本地<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>来安装调试测试插件，而不是在一个你用来发表你的文章的正规的<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>上。</p>
<h3>话题</h3>
<p>我计划从非常基础的内容开始，然后快速推进到更加核心的<a href="http://sexywp.com/tags/wordpress" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress">WordPress</a>插件函数的内容。这个系列不会关注插件开发中太过细节的东西，但是希望能够给你一个很好的开始开发你自己的插件的基础。如果你有任何问题或者建议，请留言，或者使用<a href="http://www.devlounge.net/contact">Devlounge Contact Form</a>插件给我发送Email（译者：也可以给我留言）。我请你不要依赖<a href="http://www.devlounge.net/">Devlounge</a>或者支持，而是使用<a href="http://wordpress.org/support/">WordPress支持论坛</a>。</p>
<h3>技术</h3>
<p>我在我的代码范例中使用的某些技术可能不是最好的代码表达方式。你可能会对我没有使用许多的便捷写法而有所微词。我在这里提前抱歉。每个人有不同的编码风格。</p>
<p>只要是插件技术，结构，行为，或者其他讨厌的东西，如果有更好的方式被我忽略了，那么我非常乐意倾听。</p>

	标签：<a href="http://sexywp.com/tags/develop" title="develop" rel="tag nofollow">develop</a>, <a href="http://sexywp.com/tags/plugins" title="plugins" rel="tag nofollow">plugins</a>, <a href="http://sexywp.com/tags/translate" title="translate" rel="tag nofollow">translate</a>, <a href="http://sexywp.com/tags/wordpress" title="WordPress" rel="tag nofollow">WordPress</a><br />
]]></content:encoded>
			<wfw:commentRss>http://sexywp.com/how-to-write-a-wp-plugin-01.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
