<?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>GCCFeli.cn &#187; 插件</title> <atom:link href="http://gccfeli.cn/tag/%e6%8f%92%e4%bb%b6/feed" rel="self" type="application/rss+xml" /><link>http://gccfeli.cn</link> <description></description> <lastBuildDate>Thu, 14 Jul 2011 08:18:00 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.1</generator> <atom:link rel='hub' href='http://gccfeli.cn/?pushpress=hub'/> <item><title>解析 WordPress 插件机制</title><link>http://gccfeli.cn/2009/03/wordpress-plugin-principle.html</link> <comments>http://gccfeli.cn/2009/03/wordpress-plugin-principle.html#comments</comments> <pubDate>Mon, 16 Mar 2009 09:45:15 +0000</pubDate> <dc:creator>Felicia</dc:creator> <category><![CDATA[Php]]></category> <category><![CDATA[精华]]></category> <category><![CDATA[转载]]></category> <category><![CDATA[WordPress]]></category> <category><![CDATA[插件]]></category><guid
isPermaLink="false">http://www.gccfeli.cn/?p=313</guid> <description><![CDATA[<p>转载自：http://hpyer.cn/dissect-wordpress-plugin.html</p><p>一直对软件的组件、插件架构非常感兴趣，我认为现在开发任何应用程序，一定要有一个架构良好的插件机制，这样可以吸引其他人来开发插件，极大的扩充系统的功能。Eclipse就是一个非常棒的例子，几乎你想什么功能，都可以从社区中找到相应的第三方插件。Firefox也同样如此，它的插件机制非常灵活（尤其是相对IE而言），因此Firefox社区中可以找到各种各样的插件。<br
/> <span
class="readmore"><a
href="http://gccfeli.cn/2009/03/wordpress-plugin-principle.html" title="解析 WordPress 插件机制">阅读全文（2395字）</a></span>]]></description> <content:encoded><![CDATA[<p>转载自：http://hpyer.cn/dissect-wordpress-plugin.html</p><p>一直对软件的组件、插件架构非常感兴趣，我认为现在开发任何应用程序，一定要有一个架构良好的插件机制，这样可以吸引其他人来开发插件，极大的扩充系统的功能。Eclipse就是一个非常棒的例子，几乎你想什么功能，都可以从社区中找到相应的第三方插件。Firefox也同样如此，它的插件机制非常灵活（尤其是相对IE而言），因此Firefox社区中可以找到各种各样的插件。<br
/> <span
id="more-313"></span></p><h3>1)WordPress读取所有可用的插件</h3><p>在文件“/wp-admin/includes/plugin.php” 中，函数 get_plugins() 用来从文件系统得到所有的插件。原理很简单，就是读取“wp-content/plugins”目录下的所有PHP文件。这个函数允许一级的子文件夹，也就是说在’wp-content/plugins’下面的PHP文件，以及所以在此目录下的一级子文件夹内部的PHP文件被列作插件的候选，用下面的函数去进一步提取插件信息。这样的好处是方便用户利用文件夹来对插件进行管理和组织。</p><p>而函数 get_plugin_data() 则用来得到插件的描述（Plugin Descriptor），主要包括插件的版本、名称、作者，等信息，而这些其实是以注释的方式存在的。用WordPress中自带的Hello插件来举例：</p><div
class="hl-wrapper"><div
class="hl-surround"><div
class="hl-main"><span
class="hl-inlinetags">&lt;?php</span><span
class="hl-code"><br
/></span><span
class="hl-comment">/*<br
/>Plugin Name: Hello Dolly<br
/>Plugin URI: </span><span
class="hl-url">http://wordpress.org/</span><span
class="hl-comment">#<br
/>Description: This is not just a plugin, it symbolizes the hope and enthusiasm of an entire generation summed up in two words sung most famously by Louis Armstrong: Hello, Dolly. When activated you will randomly see a lyric from &lt;cite&gt;Hello, Dolly&lt;/cite&gt; in the upper right of your admin screen on every page.<br
/>Author: Matt Mullenweg<br
/>Version: 1.5<br
/>Author URI: </span><span
class="hl-url">http://ma.tt/</span><span
class="hl-comment"><br
/>*/</span><span
class="hl-code"><br
/></span><span
class="hl-inlinetags">?&gt;</span></div></div></div><p>这样，在get_plugin_data函数中，就可以来得到插件的详细信息。</p><div
class="hl-wrapper"><div
class="hl-surround"><div
class="hl-main"><span
class="hl-inlinetags">&lt;?php</span><span
class="hl-code"><br
/></span><span
class="hl-reserved">function</span><span
class="hl-code"> </span><span
class="hl-identifier">get_plugin_data</span><span
class="hl-brackets">(</span><span
class="hl-code"> </span><span
class="hl-var">$plugin_file</span><span
class="hl-code"> </span><span
class="hl-brackets">)</span><span
class="hl-code"> </span><span
class="hl-brackets">{</span><span
class="hl-code"><br
/>&nbsp;&nbsp; &nbsp;</span><span
class="hl-var">$plugin_data</span><span
class="hl-code"> = </span><span
class="hl-identifier">implode</span><span
class="hl-brackets">(</span><span
class="hl-code"> </span><span
class="hl-quotes">''</span><span
class="hl-code">, </span><span
class="hl-identifier">file</span><span
class="hl-brackets">(</span><span
class="hl-code"> </span><span
class="hl-var">$plugin_file</span><span
class="hl-code"> </span><span
class="hl-brackets">))</span><span
class="hl-code">;<br
/>&nbsp;&nbsp; &nbsp;</span><span
class="hl-identifier">preg_match</span><span
class="hl-brackets">(</span><span
class="hl-code"> </span><span
class="hl-quotes">'</span><span
class="hl-string">|Plugin Name:(.*)$|mi</span><span
class="hl-quotes">'</span><span
class="hl-code">, </span><span
class="hl-var">$plugin_data</span><span
class="hl-code">, </span><span
class="hl-var">$plugin_name</span><span
class="hl-code"> </span><span
class="hl-brackets">)</span><span
class="hl-code">;<br
/>&nbsp;&nbsp; &nbsp;</span><span
class="hl-identifier">preg_match</span><span
class="hl-brackets">(</span><span
class="hl-code"> </span><span
class="hl-quotes">'</span><span
class="hl-string">|Plugin URI:(.*)$|mi</span><span
class="hl-quotes">'</span><span
class="hl-code">, </span><span
class="hl-var">$plugin_data</span><span
class="hl-code">, </span><span
class="hl-var">$plugin_uri</span><span
class="hl-code"> </span><span
class="hl-brackets">)</span><span
class="hl-code">;<br
/>&nbsp;&nbsp; &nbsp;</span><span
class="hl-identifier">preg_match</span><span
class="hl-brackets">(</span><span
class="hl-code"> </span><span
class="hl-quotes">'</span><span
class="hl-string">|Description:(.*)$|mi</span><span
class="hl-quotes">'</span><span
class="hl-code">, </span><span
class="hl-var">$plugin_data</span><span
class="hl-code">, </span><span
class="hl-var">$description</span><span
class="hl-code"> </span><span
class="hl-brackets">)</span><span
class="hl-code">;<br
/>&nbsp;&nbsp; &nbsp;</span><span
class="hl-identifier">preg_match</span><span
class="hl-brackets">(</span><span
class="hl-code"> </span><span
class="hl-quotes">'</span><span
class="hl-string">|Author:(.*)$|mi</span><span
class="hl-quotes">'</span><span
class="hl-code">, </span><span
class="hl-var">$plugin_data</span><span
class="hl-code">, </span><span
class="hl-var">$author_name</span><span
class="hl-code"> </span><span
class="hl-brackets">)</span><span
class="hl-code">;<br
/>&nbsp;&nbsp; &nbsp;</span><span
class="hl-identifier">preg_match</span><span
class="hl-brackets">(</span><span
class="hl-code"> </span><span
class="hl-quotes">'</span><span
class="hl-string">|Author URI:(.*)$|mi</span><span
class="hl-quotes">'</span><span
class="hl-code">, </span><span
class="hl-var">$plugin_data</span><span
class="hl-code">, </span><span
class="hl-var">$author_uri</span><span
class="hl-code"> </span><span
class="hl-brackets">)</span><span
class="hl-code">;<br
/>&nbsp;<br
/>&nbsp;&nbsp; &nbsp;</span><span
class="hl-reserved">if</span><span
class="hl-code"> </span><span
class="hl-brackets">(</span><span
class="hl-code"> </span><span
class="hl-identifier">preg_match</span><span
class="hl-brackets">(</span><span
class="hl-code"> </span><span
class="hl-quotes">&quot;</span><span
class="hl-string">|Version:(.*)|i</span><span
class="hl-quotes">&quot;</span><span
class="hl-code">, </span><span
class="hl-var">$plugin_data</span><span
class="hl-code">, </span><span
class="hl-var">$version</span><span
class="hl-code"> </span><span
class="hl-brackets">))</span><span
class="hl-code"><br
/>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span
class="hl-var">$version</span><span
class="hl-code"> = </span><span
class="hl-identifier">trim</span><span
class="hl-brackets">(</span><span
class="hl-code"> </span><span
class="hl-var">$version</span><span
class="hl-brackets">[</span><span
class="hl-number">1</span><span
class="hl-brackets">]</span><span
class="hl-code"> </span><span
class="hl-brackets">)</span><span
class="hl-code">;<br
/>&nbsp;&nbsp; &nbsp;</span><span
class="hl-reserved">else</span><span
class="hl-code"><br
/>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span
class="hl-var">$version</span><span
class="hl-code"> = </span><span
class="hl-quotes">''</span><span
class="hl-code">;<br
/>&nbsp;&nbsp; &nbsp;<br
/>&nbsp;&nbsp; &nbsp;</span><span
class="hl-var">$description</span><span
class="hl-code"> = </span><span
class="hl-identifier">wptexturize</span><span
class="hl-brackets">(</span><span
class="hl-code"> </span><span
class="hl-identifier">trim</span><span
class="hl-brackets">(</span><span
class="hl-code"> </span><span
class="hl-var">$description</span><span
class="hl-brackets">[</span><span
class="hl-number">1</span><span
class="hl-brackets">]</span><span
class="hl-code"> </span><span
class="hl-brackets">))</span><span
class="hl-code">;<br
/>&nbsp;<br
/>&nbsp;&nbsp; &nbsp;</span><span
class="hl-var">$name</span><span
class="hl-code"> = </span><span
class="hl-var">$plugin_name</span><span
class="hl-brackets">[</span><span
class="hl-number">1</span><span
class="hl-brackets">]</span><span
class="hl-code">;<br
/>&nbsp;&nbsp; &nbsp;</span><span
class="hl-var">$name</span><span
class="hl-code"> = </span><span
class="hl-identifier">trim</span><span
class="hl-brackets">(</span><span
class="hl-code"> </span><span
class="hl-var">$name</span><span
class="hl-code"> </span><span
class="hl-brackets">)</span><span
class="hl-code">;<br
/>&nbsp;&nbsp; &nbsp;</span><span
class="hl-var">$plugin</span><span
class="hl-code"> = </span><span
class="hl-var">$name</span><span
class="hl-code">;<br
/>&nbsp;&nbsp; &nbsp;</span><span
class="hl-reserved">if</span><span
class="hl-code"> </span><span
class="hl-brackets">(</span><span
class="hl-quotes">''</span><span
class="hl-code"> != </span><span
class="hl-identifier">trim</span><span
class="hl-brackets">(</span><span
class="hl-var">$plugin_uri</span><span
class="hl-brackets">[</span><span
class="hl-number">1</span><span
class="hl-brackets">])</span><span
class="hl-code"> &amp;&amp; </span><span
class="hl-quotes">''</span><span
class="hl-code"> != </span><span
class="hl-var">$name</span><span
class="hl-code"> </span><span
class="hl-brackets">)</span><span
class="hl-code"> </span><span
class="hl-brackets">{</span><span
class="hl-code"><br
/>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span
class="hl-var">$plugin</span><span
class="hl-code"> = </span><span
class="hl-quotes">'</span><span
class="hl-string">&lt;a href=&quot;</span><span
class="hl-quotes">'</span><span
class="hl-code"> . </span><span
class="hl-identifier">trim</span><span
class="hl-brackets">(</span><span
class="hl-code"> </span><span
class="hl-var">$plugin_uri</span><span
class="hl-brackets">[</span><span
class="hl-number">1</span><span
class="hl-brackets">]</span><span
class="hl-code"> </span><span
class="hl-brackets">)</span><span
class="hl-code"> . </span><span
class="hl-quotes">'</span><span
class="hl-string">&quot; title=&quot;</span><span
class="hl-quotes">'</span><span
class="hl-code">.</span><span
class="hl-identifier">__</span><span
class="hl-brackets">(</span><span
class="hl-code"> </span><span
class="hl-quotes">'</span><span
class="hl-string">Visit plugin homepage</span><span
class="hl-quotes">'</span><span
class="hl-code"> </span><span
class="hl-brackets">)</span><span
class="hl-code">.</span><span
class="hl-quotes">'</span><span
class="hl-string">&quot;&gt;</span><span
class="hl-quotes">'</span><span
class="hl-code">.</span><span
class="hl-var">$plugin</span><span
class="hl-code">.</span><span
class="hl-quotes">'</span><span
class="hl-string">&lt;/a&gt;</span><span
class="hl-quotes">'</span><span
class="hl-code">;<br
/>&nbsp;&nbsp; &nbsp;</span><span
class="hl-brackets">}</span><span
class="hl-code"><br
/>&nbsp;<br
/>&nbsp;&nbsp; &nbsp;</span><span
class="hl-reserved">if</span><span
class="hl-code"> </span><span
class="hl-brackets">(</span><span
class="hl-quotes">''</span><span
class="hl-code"> == </span><span
class="hl-var">$author_uri</span><span
class="hl-brackets">[</span><span
class="hl-number">1</span><span
class="hl-brackets">]</span><span
class="hl-code"> </span><span
class="hl-brackets">)</span><span
class="hl-code"> </span><span
class="hl-brackets">{</span><span
class="hl-code"><br
/>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span
class="hl-var">$author</span><span
class="hl-code"> = </span><span
class="hl-identifier">trim</span><span
class="hl-brackets">(</span><span
class="hl-code"> </span><span
class="hl-var">$author_name</span><span
class="hl-brackets">[</span><span
class="hl-number">1</span><span
class="hl-brackets">]</span><span
class="hl-code"> </span><span
class="hl-brackets">)</span><span
class="hl-code">;<br
/>&nbsp;&nbsp; &nbsp;</span><span
class="hl-brackets">}</span><span
class="hl-code"> </span><span
class="hl-reserved">else</span><span
class="hl-code"> </span><span
class="hl-brackets">{</span><span
class="hl-code"><br
/>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span
class="hl-var">$author</span><span
class="hl-code"> = </span><span
class="hl-quotes">'</span><span
class="hl-string">&lt;a href=&quot;</span><span
class="hl-quotes">'</span><span
class="hl-code"> . </span><span
class="hl-identifier">trim</span><span
class="hl-brackets">(</span><span
class="hl-code"> </span><span
class="hl-var">$author_uri</span><span
class="hl-brackets">[</span><span
class="hl-number">1</span><span
class="hl-brackets">]</span><span
class="hl-code"> </span><span
class="hl-brackets">)</span><span
class="hl-code"> . </span><span
class="hl-quotes">'</span><span
class="hl-string">&quot; title=&quot;</span><span
class="hl-quotes">'</span><span
class="hl-code">.</span><span
class="hl-identifier">__</span><span
class="hl-brackets">(</span><span
class="hl-code"> </span><span
class="hl-quotes">'</span><span
class="hl-string">Visit author homepage</span><span
class="hl-quotes">'</span><span
class="hl-code"> </span><span
class="hl-brackets">)</span><span
class="hl-code">.</span><span
class="hl-quotes">'</span><span
class="hl-string">&quot;&gt;</span><span
class="hl-quotes">'</span><span
class="hl-code"> . </span><span
class="hl-identifier">trim</span><span
class="hl-brackets">(</span><span
class="hl-code"> </span><span
class="hl-var">$author_name</span><span
class="hl-brackets">[</span><span
class="hl-number">1</span><span
class="hl-brackets">]</span><span
class="hl-code"> </span><span
class="hl-brackets">)</span><span
class="hl-code"> . </span><span
class="hl-quotes">'</span><span
class="hl-string">&lt;/a&gt;</span><span
class="hl-quotes">'</span><span
class="hl-code">;<br
/>&nbsp;&nbsp; &nbsp;</span><span
class="hl-brackets">}</span><span
class="hl-code"><br
/>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span
class="hl-reserved">return</span><span
class="hl-code"> </span><span
class="hl-reserved">array</span><span
class="hl-brackets">(</span><span
class="hl-quotes">'</span><span
class="hl-string">Name</span><span
class="hl-quotes">'</span><span
class="hl-code"> =&gt; </span><span
class="hl-var">$name</span><span
class="hl-code">, </span><span
class="hl-quotes">'</span><span
class="hl-string">Title</span><span
class="hl-quotes">'</span><span
class="hl-code"> =&gt; </span><span
class="hl-var">$plugin</span><span
class="hl-code">, </span><span
class="hl-quotes">'</span><span
class="hl-string">Description</span><span
class="hl-quotes">'</span><span
class="hl-code"> =&gt; </span><span
class="hl-var">$description</span><span
class="hl-code">, </span><span
class="hl-quotes">'</span><span
class="hl-string">Author</span><span
class="hl-quotes">'</span><span
class="hl-code"> =&gt; </span><span
class="hl-var">$author</span><span
class="hl-code">, </span><span
class="hl-quotes">'</span><span
class="hl-string">Version</span><span
class="hl-quotes">'</span><span
class="hl-code"> =&gt; </span><span
class="hl-var">$version</span><span
class="hl-brackets">)</span><span
class="hl-code">;<br
/>&nbsp;&nbsp; &nbsp;</span><span
class="hl-brackets">}</span><span
class="hl-code"><br
/></span><span
class="hl-inlinetags">?&gt;</span></div></div></div><h3>2)启用 &#038; 禁用插件</h3><p>启用（禁用）插件的操作都在Plugins.php中，比如我要Deactive “Hello”这个插件，最后的URL其实是这个样子：</p><p>http://localhost/blog/wp-admin/plugins.php?action=deactivate&#038;plugin=hello.php</p><p>其中，“Action”表示动作，值为“active”或者“deactivate”，而“Plugin”表示动作的对象插件，此处为“hello.php”。得到动作指令后，首先从数据库中取出当前已经激活的插件。</p><div
class="hl-wrapper"><div
class="hl-surround"><div
class="hl-main"><span
class="hl-inlinetags">&lt;?php</span><span
class="hl-code"> </span><span
class="hl-var">$current</span><span
class="hl-code"> = </span><span
class="hl-identifier">get_settings</span><span
class="hl-brackets">(</span><span
class="hl-quotes">'</span><span
class="hl-string">active_plugins</span><span
class="hl-quotes">'</span><span
class="hl-brackets">)</span><span
class="hl-code">; </span><span
class="hl-inlinetags">?&gt;</span></div></div></div><p>然后根据动作，重新生成已激活插件数组，存入数据库，并重新加载此页。加载的时候就需要考虑这些已经激活的插件是怎么工作的了。<br
/> BTW：附上数据库的Options表中0插件和只有1个插件的值：<br
/> 没有插件：<br
/> a:1:{i:0;s:0:&#8221;";}</p><p>只有Hello插件：<br
/> a:2:{i:0;s:0:&#8221;";i:1;s:9:&#8221;hello.php&#8221;;}</p><h3>3)如何加载启用的插件到系统中</h3><p>WordPress中的每页都会包含“wp-config.php”文件，而“wp-config.php”中也会自动加载“wp-settings.php”文件。在“wp-settings.php”文件中，可以找到以下与插件相关的代码片断：</p><div
class="hl-wrapper"><div
class="hl-surround"><div
class="hl-main"><span
class="hl-inlinetags">&lt;?php</span><span
class="hl-code"><br
/></span><span
class="hl-reserved">if</span><span
class="hl-code"> </span><span
class="hl-brackets">(</span><span
class="hl-code"> </span><span
class="hl-identifier">get_option</span><span
class="hl-brackets">(</span><span
class="hl-quotes">'</span><span
class="hl-string">active_plugins</span><span
class="hl-quotes">'</span><span
class="hl-brackets">)</span><span
class="hl-code"> </span><span
class="hl-brackets">)</span><span
class="hl-code"> </span><span
class="hl-brackets">{</span><span
class="hl-code"><br
/>&nbsp;&nbsp; &nbsp;</span><span
class="hl-var">$current_plugins</span><span
class="hl-code"> = </span><span
class="hl-identifier">get_option</span><span
class="hl-brackets">(</span><span
class="hl-quotes">'</span><span
class="hl-string">active_plugins</span><span
class="hl-quotes">'</span><span
class="hl-brackets">)</span><span
class="hl-code">;<br
/>&nbsp;&nbsp; &nbsp;</span><span
class="hl-reserved">if</span><span
class="hl-code"> </span><span
class="hl-brackets">(</span><span
class="hl-code"> </span><span
class="hl-identifier">is_array</span><span
class="hl-brackets">(</span><span
class="hl-var">$current_plugins</span><span
class="hl-brackets">)</span><span
class="hl-code"> </span><span
class="hl-brackets">)</span><span
class="hl-code"> </span><span
class="hl-brackets">{</span><span
class="hl-code"><br
/>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span
class="hl-reserved">foreach</span><span
class="hl-code"> </span><span
class="hl-brackets">(</span><span
class="hl-var">$current_plugins</span><span
class="hl-code"> </span><span
class="hl-reserved">as</span><span
class="hl-code"> </span><span
class="hl-var">$plugin</span><span
class="hl-brackets">)</span><span
class="hl-code"> </span><span
class="hl-brackets">{</span><span
class="hl-code"><br
/>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span
class="hl-reserved">if</span><span
class="hl-code"> </span><span
class="hl-brackets">(</span><span
class="hl-code"> </span><span
class="hl-quotes">''</span><span
class="hl-code"> != </span><span
class="hl-var">$plugin</span><span
class="hl-code"> &amp;&amp; </span><span
class="hl-number">0</span><span
class="hl-code"> == </span><span
class="hl-identifier">validate_file</span><span
class="hl-brackets">(</span><span
class="hl-var">$plugin</span><span
class="hl-brackets">)</span><span
class="hl-code"> &amp;&amp; </span><span
class="hl-identifier">file_exists</span><span
class="hl-brackets">(</span><span
class="hl-identifier">WP_PLUGIN_DIR</span><span
class="hl-code"> . </span><span
class="hl-quotes">'</span><span
class="hl-string">/</span><span
class="hl-quotes">'</span><span
class="hl-code"> . </span><span
class="hl-var">$plugin</span><span
class="hl-brackets">)</span><span
class="hl-code"> </span><span
class="hl-brackets">)</span><span
class="hl-code"><br
/>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span
class="hl-reserved">include_once</span><span
class="hl-brackets">(</span><span
class="hl-identifier">WP_PLUGIN_DIR</span><span
class="hl-code"> . </span><span
class="hl-quotes">'</span><span
class="hl-string">/</span><span
class="hl-quotes">'</span><span
class="hl-code"> . </span><span
class="hl-var">$plugin</span><span
class="hl-brackets">)</span><span
class="hl-code">;<br
/>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span
class="hl-brackets">}</span><span
class="hl-code"><br
/>&nbsp;&nbsp; &nbsp;</span><span
class="hl-brackets">}</span><span
class="hl-code"><br
/></span><span
class="hl-brackets">}</span><span
class="hl-code"><br
/></span><span
class="hl-inlinetags">?&gt;</span></div></div></div><p>可见，这段代码会取出系统中所有启用的插件，并包含进来。所以在每页加载的时候，都会首先包含这些插件代码。那么，这些插件自己在加载的时候都做了什么呢？</p><h3>4)插件的加载</h3><p>插件的加载其实最重要的一个部分就是插件的事件注册机制，WordPress插件中的事件注册其实和Eclipse中的扩展点（Extension-Point）机制非常相像，而这种类似“插销”、“插销座”的软件插拔方式也成为了最近软件组件架构方面应用最多的实践。<br
/> 事件注册过程中比较重要的几个函数分别是：do_action、add_action、add_filter。WordPress中默认定义了很多扩展点（也可以叫做“钩子”），或者说注册了很多系统事件（WP中的正规叫法应该是“Action Tag”），比如“admin_head”表示Admin页面的Head输出事件，“publish_post”表示发布一篇帖子的事件等等。而插件要做的就是扩展这些扩展点，或者说挂接这些钩子，从而实现系统的扩展功能。add_action就是通常插件扩展某个扩展点用到的函数，而do_action 是扩展点本身开始执行的函数。<br
/> 刚才说过WordPress中的每一页执行前都会Include所有Active的插件代码，而这些代码通常都会用“add_action”来将自己的函数注册到系统的扩展点中。这样，在扩展点执行的时候，就会找到系统中所有已经挂接到这个扩展点上的插件的函数来执行之，从而扩充系统的功能。<br
/> WordPress中的很多功能也都是通过这种插件结构来实现的，默认注册了很多系统事件，都在’default-filter.php’中。比如：</p><div
class="hl-wrapper"><div
class="hl-surround"><div
class="hl-main"><span
class="hl-inlinetags">&lt;?php</span><span
class="hl-code"> </span><span
class="hl-identifier">add_action</span><span
class="hl-brackets">(</span><span
class="hl-quotes">'</span><span
class="hl-string">publish_post</span><span
class="hl-quotes">'</span><span
class="hl-code">, </span><span
class="hl-quotes">'</span><span
class="hl-string">generic_ping</span><span
class="hl-quotes">'</span><span
class="hl-brackets">)</span><span
class="hl-code">; </span><span
class="hl-inlinetags">?&gt;</span></div></div></div><p>这个是用来在发布每篇帖子的时候发送XML-RPC Ping的。再比如：</p><div
class="hl-wrapper"><div
class="hl-surround"><div
class="hl-main"><span
class="hl-inlinetags">&lt;?php</span><span
class="hl-code"> </span><span
class="hl-identifier">add_filter</span><span
class="hl-brackets">(</span><span
class="hl-quotes">'</span><span
class="hl-string">the_content</span><span
class="hl-quotes">'</span><span
class="hl-code">, </span><span
class="hl-quotes">'</span><span
class="hl-string">convert_smilies</span><span
class="hl-quotes">'</span><span
class="hl-brackets">)</span><span
class="hl-code">; </span><span
class="hl-inlinetags">?&gt;</span></div></div></div><p>用来将正文（content）中的笑脸符号转换为图像。<br
/> 还是举“Hello”插件来说。Hello插件会随机的在Admin Page的右上角显示一段话，它的工作原理是这样的：<br
/> 在每一个Admin page的前面都有</p><div
class="hl-wrapper"><div
class="hl-surround"><div
class="hl-main"><span
class="hl-inlinetags">&lt;?php</span><span
class="hl-code"> </span><span
class="hl-reserved">require_once</span><span
class="hl-brackets">(</span><span
class="hl-quotes">'</span><span
class="hl-string">admin-header.php</span><span
class="hl-quotes">'</span><span
class="hl-brackets">)</span><span
class="hl-code">; </span><span
class="hl-inlinetags">?&gt;</span></div></div></div><p>而在“admin-head.php”中将会执行扩展点“admin-head”的所有扩展：</p><div
class="hl-wrapper"><div
class="hl-surround"><div
class="hl-main"><span
class="hl-inlinetags">&lt;?php</span><span
class="hl-code"> </span><span
class="hl-identifier">do_action</span><span
class="hl-brackets">(</span><span
class="hl-quotes">'</span><span
class="hl-string">admin_head</span><span
class="hl-quotes">'</span><span
class="hl-code">, </span><span
class="hl-quotes">''</span><span
class="hl-brackets">)</span><span
class="hl-code">; </span><span
class="hl-inlinetags">?&gt;</span></div></div></div><p>这样，就会执行所有挂接到admin_head的函数，Admin Page 的 Footer 部分也是类似。</p><h3>5)如果插件中涉及UI</h3><p>其实是一样的。以WordPress FeedBurner Plugin中添加菜单为例。<br
/> 如果想添加一个菜单，就需要注册“admin_menu”这个Action Tag（系统事件）即可：<br
/> <?php add_action('admin_menu', 'ol_add_feedburner_options_page'); ?></p><p>插件中的这个函数为：</p><div
class="hl-wrapper"><div
class="hl-surround"><div
class="hl-main"><span
class="hl-inlinetags">&lt;?php</span><span
class="hl-code"><br
/></span><span
class="hl-reserved">function</span><span
class="hl-code"> </span><span
class="hl-identifier">ol_add_feedburner_options_page</span><span
class="hl-brackets">()</span><span
class="hl-code"> </span><span
class="hl-brackets">{</span><span
class="hl-code"><br
/>&nbsp;&nbsp; &nbsp;</span><span
class="hl-reserved">if</span><span
class="hl-code"> </span><span
class="hl-brackets">(</span><span
class="hl-identifier">function_exists</span><span
class="hl-brackets">(</span><span
class="hl-quotes">'</span><span
class="hl-string">add_options_page</span><span
class="hl-quotes">'</span><span
class="hl-brackets">))</span><span
class="hl-code"> </span><span
class="hl-brackets">{</span><span
class="hl-code"><br
/>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span
class="hl-identifier">add_options_page</span><span
class="hl-brackets">(</span><span
class="hl-quotes">'</span><span
class="hl-string">FeedBurner</span><span
class="hl-quotes">'</span><span
class="hl-code">, </span><span
class="hl-quotes">'</span><span
class="hl-string">FeedBurner</span><span
class="hl-quotes">'</span><span
class="hl-code">, </span><span
class="hl-number">8</span><span
class="hl-code">, </span><span
class="hl-identifier">basename</span><span
class="hl-brackets">(</span><span
class="hl-reserved">__FILE__</span><span
class="hl-brackets">)</span><span
class="hl-code">, </span><span
class="hl-quotes">'</span><span
class="hl-string">ol_feedburner_options_subpanel</span><span
class="hl-quotes">'</span><span
class="hl-brackets">)</span><span
class="hl-code">;<br
/>&nbsp;&nbsp; &nbsp;</span><span
class="hl-brackets">}</span><span
class="hl-code"><br
/></span><span
class="hl-brackets">}</span><span
class="hl-code"><br
/></span><span
class="hl-inlinetags">?&gt;</span></div></div></div><p>“add_options_page”这个函数就会在系统的“Options”菜单中添加“FeedBurner”这样一个子菜单。</p><h3>6)其它</h3><p>还有一些简单的插件就是只提供一些API函数。比如Most_Commented Plugin，它提供一个API “mdv_most_commented”：通过数据库查询得到评论最多的文章，并加以显示。因为这个插件已经被Include过，所以可以用这个API来进行显示。</p> ]]></content:encoded> <wfw:commentRss>http://gccfeli.cn/2009/03/wordpress-plugin-principle.html/feed</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Topcoder Arena 插件使用方法</title><link>http://gccfeli.cn/2009/02/topcoder-arena-plugin.html</link> <comments>http://gccfeli.cn/2009/02/topcoder-arena-plugin.html#comments</comments> <pubDate>Wed, 11 Feb 2009 02:26:08 +0000</pubDate> <dc:creator>Felicia</dc:creator> <category><![CDATA[Topcoder SRM]]></category> <category><![CDATA[TopCoder]]></category> <category><![CDATA[插件]]></category><guid
isPermaLink="false">http://www.gccfeli.cn/?p=296</guid> <description><![CDATA[<p>TopCoder是一个优秀的网上编程竞赛平台。网站上同时提供了不少辅助性的插件，大部分是参赛者所贡献的。这些插件可以根据题目描述自动生成代码模版以及测试用例，便于在比赛中节约时间，以最高的效率解决问题。</p><p>插件<a
href="http://www.topcoder.com/tc?module=Static&#038;d1=applet&#038;d2=plugins">下载</a></p> <span
class="readmore"><a
href="http://gccfeli.cn/2009/02/topcoder-arena-plugin.html" title="Topcoder Arena 插件使用方法">阅读全文（1795字）</a></span>]]></description> <content:encoded><![CDATA[<p>TopCoder是一个优秀的网上编程竞赛平台。网站上同时提供了不少辅助性的插件，大部分是参赛者所贡献的。这些插件可以根据题目描述自动生成代码模版以及测试用例，便于在比赛中节约时间，以最高的效率解决问题。</p><p>插件<a
href="http://www.topcoder.com/tc?module=Static&#038;d1=applet&#038;d2=plugins">下载</a></p><p>以CodeProcessor+FileEdit+TZTester为例介绍一下插件组合的安装方法： 策略设置<br
/> <span
id="more-296"></span><br
/> 首先要修改系统的安全设置，找到java plugin所用的策略文件，一般是Program FilesJavajre1.5.0_02libsecurityjava.policy，在其中加入如下几行</p><div
class="hl-wrapper"><div
class="hl-surround"><div
class="hl-main">grant codeBase &quot;http://www.topcoder.com/-&quot; {<br
/>&nbsp;&nbsp; &nbsp;permission java.lang.RuntimePermission &quot;setSecurityManager&quot;;<br
/>&nbsp;&nbsp; &nbsp;permission java.lang.RuntimePermission &quot;createSecurityManager&quot;;<br
/>};</div></div></div><p>这一步可能需要重新启动系统才能生效。 安装插件</p><ol><li>下载插件</li><li>启动TCApplet并登陆</li><li>在option中选择Editor</li><li>点ADD</li><li>name可以随便取一个，如CodeProcessor</li><li>EntryPoint填：codeprocessor.EntryPoint，注意区分大小写</li><li>classpath一栏，反复使用Browse加入CodeProcessor.jar，FileEdit.jar，TZTester.jar等，也可以手动输入，多个类之间以”;”隔开，可以使用相对路径。</li><li>如果设置正确，在点ok后，列表中就会多出一项</li><li>选择CodeProcessor，点Configure<ol><li>在Editor EntryPoint里输入fileedit.EntryPoint，Configure可以对Editor进行详细的配置</li><li>在Processor Class里输入tangentz.TZTester，Verify可以校验输入是否正确</li><li>配置fileedit，将模版文件修改成TZTester提供的形式，</li></ol></li></ol><div
class="hl-wrapper"><div
class="hl-surround"><div
class="hl-main"><span
class="hl-prepro">#include </span><span
class="hl-quotes">&lt;</span><span
class="hl-string">functional</span><span
class="hl-quotes">&gt;</span><span
class="hl-prepro"></span><span
class="hl-code"><br
/></span><span
class="hl-prepro">#include </span><span
class="hl-quotes">&lt;</span><span
class="hl-string">algorithm</span><span
class="hl-quotes">&gt;</span><span
class="hl-prepro"></span><span
class="hl-code"><br
/></span><span
class="hl-prepro">#include </span><span
class="hl-quotes">&lt;</span><span
class="hl-string">stdexcept</span><span
class="hl-quotes">&gt;</span><span
class="hl-prepro"></span><span
class="hl-code"><br
/></span><span
class="hl-prepro">#include </span><span
class="hl-quotes">&lt;</span><span
class="hl-string">iostream</span><span
class="hl-quotes">&gt;</span><span
class="hl-prepro"></span><span
class="hl-code"><br
/></span><span
class="hl-prepro">#include </span><span
class="hl-quotes">&lt;</span><span
class="hl-string">sstream</span><span
class="hl-quotes">&gt;</span><span
class="hl-prepro"></span><span
class="hl-code"><br
/></span><span
class="hl-prepro">#include </span><span
class="hl-quotes">&lt;</span><span
class="hl-string">fstream</span><span
class="hl-quotes">&gt;</span><span
class="hl-prepro"></span><span
class="hl-code"><br
/></span><span
class="hl-prepro">#include </span><span
class="hl-quotes">&lt;</span><span
class="hl-string">numeric</span><span
class="hl-quotes">&gt;</span><span
class="hl-prepro"></span><span
class="hl-code"><br
/></span><span
class="hl-prepro">#include </span><span
class="hl-quotes">&lt;</span><span
class="hl-string">iomanip</span><span
class="hl-quotes">&gt;</span><span
class="hl-prepro"></span><span
class="hl-code"><br
/></span><span
class="hl-prepro">#include </span><span
class="hl-quotes">&lt;</span><span
class="hl-string">cstdlib</span><span
class="hl-quotes">&gt;</span><span
class="hl-prepro"></span><span
class="hl-code"><br
/></span><span
class="hl-prepro">#include </span><span
class="hl-quotes">&lt;</span><span
class="hl-string">cstring</span><span
class="hl-quotes">&gt;</span><span
class="hl-prepro"></span><span
class="hl-code"><br
/></span><span
class="hl-prepro">#include </span><span
class="hl-quotes">&lt;</span><span
class="hl-string">utility</span><span
class="hl-quotes">&gt;</span><span
class="hl-prepro"></span><span
class="hl-code"><br
/></span><span
class="hl-prepro">#include </span><span
class="hl-quotes">&lt;</span><span
class="hl-string">cctype</span><span
class="hl-quotes">&gt;</span><span
class="hl-prepro"></span><span
class="hl-code"><br
/></span><span
class="hl-prepro">#include </span><span
class="hl-quotes">&lt;</span><span
class="hl-string">vector</span><span
class="hl-quotes">&gt;</span><span
class="hl-prepro"></span><span
class="hl-code"><br
/></span><span
class="hl-prepro">#include </span><span
class="hl-quotes">&lt;</span><span
class="hl-string">string</span><span
class="hl-quotes">&gt;</span><span
class="hl-prepro"></span><span
class="hl-code"><br
/></span><span
class="hl-prepro">#include </span><span
class="hl-quotes">&lt;</span><span
class="hl-string">bitset</span><span
class="hl-quotes">&gt;</span><span
class="hl-prepro"></span><span
class="hl-code"><br
/></span><span
class="hl-prepro">#include </span><span
class="hl-quotes">&lt;</span><span
class="hl-string">cmath</span><span
class="hl-quotes">&gt;</span><span
class="hl-prepro"></span><span
class="hl-code"><br
/></span><span
class="hl-prepro">#include </span><span
class="hl-quotes">&lt;</span><span
class="hl-string">queue</span><span
class="hl-quotes">&gt;</span><span
class="hl-prepro"></span><span
class="hl-code"><br
/></span><span
class="hl-prepro">#include </span><span
class="hl-quotes">&lt;</span><span
class="hl-string">stack</span><span
class="hl-quotes">&gt;</span><span
class="hl-prepro"></span><span
class="hl-code"><br
/></span><span
class="hl-prepro">#include </span><span
class="hl-quotes">&lt;</span><span
class="hl-string">ctime</span><span
class="hl-quotes">&gt;</span><span
class="hl-prepro"></span><span
class="hl-code"><br
/></span><span
class="hl-prepro">#include </span><span
class="hl-quotes">&lt;</span><span
class="hl-string">list</span><span
class="hl-quotes">&gt;</span><span
class="hl-prepro"></span><span
class="hl-code"><br
/></span><span
class="hl-prepro">#include </span><span
class="hl-quotes">&lt;</span><span
class="hl-string">map</span><span
class="hl-quotes">&gt;</span><span
class="hl-prepro"></span><span
class="hl-code"><br
/></span><span
class="hl-prepro">#include </span><span
class="hl-quotes">&lt;</span><span
class="hl-string">set</span><span
class="hl-quotes">&gt;</span><span
class="hl-prepro"></span><span
class="hl-code"><br
/>&nbsp;<br
/></span><span
class="hl-reserved">using</span><span
class="hl-code"> </span><span
class="hl-types">namespace</span><span
class="hl-code"> </span><span
class="hl-identifier">std</span><span
class="hl-code">;<br
/>&nbsp;<br
/></span><span
class="hl-prepro">#define</span><span
class="hl-code"> </span><span
class="hl-identifier">PB</span><span
class="hl-code"> </span><span
class="hl-identifier">push_back</span><span
class="hl-prepro"></span><span
class="hl-code"><br
/></span><span
class="hl-prepro">#define</span><span
class="hl-code"> </span><span
class="hl-identifier">MP</span><span
class="hl-code"> </span><span
class="hl-identifier">make_pair</span><span
class="hl-prepro"></span><span
class="hl-code"><br
/>&nbsp;<br
/></span><span
class="hl-types">typedef</span><span
class="hl-code"> </span><span
class="hl-identifier">vector</span><span
class="hl-code">&lt;</span><span
class="hl-types">int</span><span
class="hl-code">&gt; </span><span
class="hl-identifier">VI</span><span
class="hl-code">;<br
/></span><span
class="hl-types">typedef</span><span
class="hl-code"> </span><span
class="hl-identifier">vector</span><span
class="hl-code">&lt;</span><span
class="hl-identifier">string</span><span
class="hl-code">&gt; </span><span
class="hl-identifier">VS</span><span
class="hl-code">;<br
/></span><span
class="hl-types">typedef</span><span
class="hl-code"> </span><span
class="hl-identifier">vector</span><span
class="hl-code">&lt;</span><span
class="hl-types">double</span><span
class="hl-code">&gt; </span><span
class="hl-identifier">VD</span><span
class="hl-code">;<br
/></span><span
class="hl-types">typedef</span><span
class="hl-code"> </span><span
class="hl-identifier">pair</span><span
class="hl-code">&lt;</span><span
class="hl-types">int</span><span
class="hl-code">,</span><span
class="hl-types">int</span><span
class="hl-code">&gt; </span><span
class="hl-identifier">PII</span><span
class="hl-code">;<br
/></span><span
class="hl-types">typedef</span><span
class="hl-code"> </span><span
class="hl-types">long</span><span
class="hl-code"> </span><span
class="hl-types">long</span><span
class="hl-code"> </span><span
class="hl-identifier">LL</span><span
class="hl-code">;<br
/></span><span
class="hl-types">typedef</span><span
class="hl-code"> </span><span
class="hl-types">unsigned</span><span
class="hl-code"> </span><span
class="hl-types">long</span><span
class="hl-code"> </span><span
class="hl-types">long</span><span
class="hl-code"> </span><span
class="hl-identifier">ULL</span><span
class="hl-code">;<br
/>&nbsp;<br
/></span><span
class="hl-types">class</span><span
class="hl-code"> $</span><span
class="hl-identifier">CLASSNAME</span><span
class="hl-code">$ </span><span
class="hl-brackets">{</span><span
class="hl-code"><br
/></span><span
class="hl-reserved">public</span><span
class="hl-code">:<br
/>$</span><span
class="hl-identifier">RC</span><span
class="hl-code">$ $</span><span
class="hl-identifier">METHODNAME</span><span
class="hl-code">$</span><span
class="hl-brackets">(</span><span
class="hl-code">$</span><span
class="hl-identifier">METHODPARMS</span><span
class="hl-code">$</span><span
class="hl-brackets">)</span><span
class="hl-code"> </span><span
class="hl-brackets">{</span><span
class="hl-code"><br
/>&nbsp;&nbsp; &nbsp;<br
/></span><span
class="hl-brackets">}</span><span
class="hl-code"><br
/>$</span><span
class="hl-identifier">TESTCODE</span><span
class="hl-code">$<br
/></span><span
class="hl-brackets">}</span><span
class="hl-code">; <br
/>&nbsp;<br
/></span><span
class="hl-comment">// BEGIN CUT HERE</span><span
class="hl-code"><br
/></span><span
class="hl-types">int</span><span
class="hl-code"> </span><span
class="hl-identifier">main</span><span
class="hl-brackets">()</span><span
class="hl-code"> </span><span
class="hl-brackets">{</span><span
class="hl-code"><br
/>&nbsp;&nbsp; &nbsp;$</span><span
class="hl-identifier">CLASSNAME</span><span
class="hl-code">$ </span><span
class="hl-identifier">___test</span><span
class="hl-code">;<br
/>&nbsp;&nbsp; &nbsp;</span><span
class="hl-identifier">___test</span><span
class="hl-code">.</span><span
class="hl-identifier">run_test</span><span
class="hl-brackets">(</span><span
class="hl-code">-</span><span
class="hl-number">1</span><span
class="hl-brackets">)</span><span
class="hl-code">;<br
/></span><span
class="hl-brackets">}</span><span
class="hl-code"><br
/></span><span
class="hl-comment">// END CUT HERE</span></div></div></div><p>使用方法</p><p>打开题目，fileedit便会将解析题目得到的代码模版保存到本地文件中，TCApplet的编辑框中则输出提示信息。在竞赛过程中，可以选择将模版保存到指定的文件中，这样可以不用反复在IDE中手动加载；练习过程中，则可以选择保存到与类名相同的文件中，便于归档。TZTester会自动往代 码中加入测试用例，这些代码用自定义标记隔开，在提交系统进行编译测试的过程时候会被自动过滤。</p><p>在使用fileedit生成代码的时候可能会出现缩进不整齐的情况，可以用Astyle格式化。</p><p>与fileedit同类的还有KawigiEdit和PopsEdit等，这两个是独立的编辑器，不需要外部软件和IDE。各种Editor都可以脱离CodeProcessor使用，对于简单的应用已经足够。PopsEdit甚至还支持java代码的调试</p><p>TZTester生成的测试代码中，每个测试用例被写在同一行内。可读性比较差。而ExampleBuilder生成的代码则比较繁琐，并且在头部加入了一堆辅助函数。</p><p>其他几个插件还没有尝试，网页上也提供了插件编写的API，可以创建自己的插件</p> ]]></content:encoded> <wfw:commentRss>http://gccfeli.cn/2009/02/topcoder-arena-plugin.html/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk
Page Caching using disk (enhanced) (user agent is rejected)
Database Caching 9/15 queries in 0.014 seconds using disk

Served from: gccfeli.cn @ 2012-05-22 08:39:25 -->
