<?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; WordPress</title> <atom:link href="http://gccfeli.cn/tag/wordpress/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>CodeColorer的可视化插入代码</title><link>http://gccfeli.cn/2010/10/codecolorer-insert-code-in-wysiwyg-editor.html</link> <comments>http://gccfeli.cn/2010/10/codecolorer-insert-code-in-wysiwyg-editor.html#comments</comments> <pubDate>Tue, 19 Oct 2010 23:31:15 +0000</pubDate> <dc:creator>Felicia</dc:creator> <category><![CDATA[网络技术]]></category> <category><![CDATA[CodeColorer]]></category> <category><![CDATA[WordPress]]></category><guid
isPermaLink="false">http://gccfeli.cn/2010/10/codecolorer-insert-code-in-wysiwyg-editor.html</guid> <description><![CDATA[<p>因为原先用的代码高亮插件CoolCode不能高亮C#代码，最近尝试着使用另一个非常优秀的代码高亮插件<a
href="http://kpumuk.info/projects/wordpress-plugins/codecolorer/">CodeColorer</a>来显示代码。CodeColorer使用牛X的<a
href="http://qbnz.com/highlighter/">GeSHi</a>库作为后端，能支持上百种不同语言的高亮，的确十分强大。</p> <span
class="readmore"><a
href="http://gccfeli.cn/2010/10/codecolorer-insert-code-in-wysiwyg-editor.html" title="CodeColorer的可视化插入代码">阅读全文（597字）</a></span>]]></description> <content:encoded><![CDATA[<p>因为原先用的代码高亮插件CoolCode不能高亮C#代码，最近尝试着使用另一个非常优秀的代码高亮插件<a
href="http://kpumuk.info/projects/wordpress-plugins/codecolorer/">CodeColorer</a>来显示代码。CodeColorer使用牛X的<a
href="http://qbnz.com/highlighter/">GeSHi</a>库作为后端，能支持上百种不同语言的高亮，的确十分强大。</p><p>然而美中不足的是，CodeColorer的当前版本默认不支持在可视化编辑状态下插入代码，如果在HTML编辑状态下插入代码，一旦切换到可视化状态，代码格式就全乱了。</p><p>但是通过仔细观察CodeColorer的代码可以发现，作者注释掉了一段很小的代码</p><pre>
<div class="codecolorer-container php mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>136<br />137<br />138<br />139<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">// if (get_user_option('rich_editing') == 'true') {</span><br />
<span style="color: #666666; font-style: italic;">// &nbsp; add_filter('mce_external_plugins', array('CodeColorerLoader', 'AddTinyMCEPlugin'));</span><br />
<span style="color: #666666; font-style: italic;">// &nbsp; add_filter('mce_buttons', array('CodeColorerLoader', 'RegisterTinyMCEButton'));</span><br />
<span style="color: #666666; font-style: italic;">// }</span></div></td></tr></tbody></table></div>
</pre><p>这段代码正是提供可视化插入代码的功能，我们将其恢复，就能在可视化编辑器中发现一个新增的Code按钮，点它即可插入代码。通过这种方式插入代码，就算在HTML编辑状态和可视化编辑状态之间切换，也是没有问题的！</p><p>传说中的Code按钮：</p><p><a
href="http://gccfeli.cn/wp-content/uploads/2010/10/image.png"><img
style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://gccfeli.cn/wp-content/uploads/2010/10/image_thumb.png" border="0" alt="image" width="153" height="60" /></a></p> ]]></content:encoded> <wfw:commentRss>http://gccfeli.cn/2010/10/codecolorer-insert-code-in-wysiwyg-editor.html/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>GCCFeli.cn新主题上线</title><link>http://gccfeli.cn/2009/04/gccfelicn-new-them.html</link> <comments>http://gccfeli.cn/2009/04/gccfelicn-new-them.html#comments</comments> <pubDate>Thu, 09 Apr 2009 07:14:46 +0000</pubDate> <dc:creator>Felicia</dc:creator> <category><![CDATA[心情日记]]></category> <category><![CDATA[MathML]]></category> <category><![CDATA[WordPress]]></category> <category><![CDATA[主题]]></category><guid
isPermaLink="false">http://gccfeli.cn/?p=514</guid> <description><![CDATA[<p>一直觉得PicturePan设计的主题非常不错，虽然他是不折不扣的微软拥护者，但是他的WordPress主题在Linux + FireFox下看起来仍然很好。之前GCCFeli.cn用的就是他的LS主题。不久前他将博客主题更换了，新主题确实比以前更简洁优美，我看了代码觉得改进了不少，试用一下也是非常喜欢，就决定长期使用了（当然我作了一些改动，让这个主题更适应我的博客）。</p><p>伴随新主题上线，我还把博客加上了MathML功能。这样在博客里写一些数学公式就不需要图片了，<del
datetime="2009-04-12T02:16:48+00:00">有个LaTeXMath.js的脚本可以将类似LaTeX格式的公式转换成MathML标记显示出来(IE可能需要装个MathPlayer的插件)</del>ASCIIMathMLwFallback.js这个脚本可以用MathML显示公式和SVG图，并且能在IE没有MathPlayer的情况下转换成图片。不过还是装了插件效果比较好。默认支持MathML的浏览器比如FireFox没有这个问题。看来效果很不错，比如：</p> <span
class="readmore"><a
href="http://gccfeli.cn/2009/04/gccfelicn-new-them.html" title="GCCFeli.cn新主题上线">阅读全文（691字）</a></span>]]></description> <content:encoded><![CDATA[<p>一直觉得PicturePan设计的主题非常不错，虽然他是不折不扣的微软拥护者，但是他的WordPress主题在Linux + FireFox下看起来仍然很好。之前GCCFeli.cn用的就是他的LS主题。不久前他将博客主题更换了，新主题确实比以前更简洁优美，我看了代码觉得改进了不少，试用一下也是非常喜欢，就决定长期使用了（当然我作了一些改动，让这个主题更适应我的博客）。</p><p>伴随新主题上线，我还把博客加上了MathML功能。这样在博客里写一些数学公式就不需要图片了，<del
datetime="2009-04-12T02:16:48+00:00">有个LaTeXMath.js的脚本可以将类似LaTeX格式的公式转换成MathML标记显示出来(IE可能需要装个MathPlayer的插件)</del>ASCIIMathMLwFallback.js这个脚本可以用MathML显示公式和SVG图，并且能在IE没有MathPlayer的情况下转换成图片。不过还是装了插件效果比较好。默认支持MathML的浏览器比如FireFox没有这个问题。看来效果很不错，比如：</p><p>$H_n=\ln n + \gamma + \frac{1}{2n} &#8211; \frac{1}{12n^2} + \frac{1}{120n^4} &#8211; \frac{\theta_{2,n}}{252n^6}$</p><p>另外一个改动就是将网站的www去掉了，做了重定向，现在访问地址都是gccfeli.cn</p><p>目前网站的最近30个post的永久链接是手工写的，再往前的永久链接是自动生成的。我准备全部改成手工写的英文链接，自动生成的链接含有中文，在浏览器里面怪怪的……</p><p>以后打算写一个用于相册展示JavaScript，今年Word Finals回来又会产生大量的照片：）</p> ]]></content:encoded> <wfw:commentRss>http://gccfeli.cn/2009/04/gccfelicn-new-them.html/feed</wfw:commentRss> <slash:comments>2</slash:comments> </item> <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>Blog搬家过程中三大BlogWriter的使用感想</title><link>http://gccfeli.cn/2008/02/blogwriters-compare.html</link> <comments>http://gccfeli.cn/2008/02/blogwriters-compare.html#comments</comments> <pubDate>Wed, 20 Feb 2008 13:19:10 +0000</pubDate> <dc:creator>Felicia</dc:creator> <category><![CDATA[心情日记]]></category> <category><![CDATA[BlogWriter]]></category> <category><![CDATA[Blog搬家]]></category> <category><![CDATA[WordPress]]></category><guid
isPermaLink="false">http://www.gccfeli.cn/?p=130</guid> <description><![CDATA[<p>寒假的时候，想自己建一个Blog，彻底摆脱BSP的控制。虽然Blog托管给BSP有好处（比如可能发布到BSP首页带来更多的流量），但是我还是喜欢更自由的Blog管理方式。于是在53dns花了2米买了个域名，又在meyu.net花了75米买了个空间。空间是php+MySQL的，当然装了个WordPress。于是张罗着把原先cppblog的文章转移过来。</p><p>看上去不过是转移141篇文章，但是本人很懒，不想一个一个手工复制粘贴并且重新调整格式。于是baidu一下，找到几个Blog搬家软件和网站，都不怎么样，无法提供我需要的搬家服务。cppblog的数据备份下来个xml文件，在WordPress里面也无法导入，原因是格式不对。也想过写个程序转换xml格式，但是苦于不了解WordPress的导入xml结构，于是放弃了这个念头。</p> <span
class="readmore"><a
href="http://gccfeli.cn/2008/02/blogwriters-compare.html" title="Blog搬家过程中三大BlogWriter的使用感想">阅读全文（1452字）</a></span>]]></description> <content:encoded><![CDATA[<p>寒假的时候，想自己建一个Blog，彻底摆脱BSP的控制。虽然Blog托管给BSP有好处（比如可能发布到BSP首页带来更多的流量），但是我还是喜欢更自由的Blog管理方式。于是在53dns花了2米买了个域名，又在meyu.net花了75米买了个空间。空间是php+MySQL的，当然装了个WordPress。于是张罗着把原先cppblog的文章转移过来。</p><p>看上去不过是转移141篇文章，但是本人很懒，不想一个一个手工复制粘贴并且重新调整格式。于是baidu一下，找到几个Blog搬家软件和网站，都不怎么样，无法提供我需要的搬家服务。cppblog的数据备份下来个xml文件，在WordPress里面也无法导入，原因是格式不对。也想过写个程序转换xml格式，但是苦于不了解WordPress的导入xml结构，于是放弃了这个念头。</p><p>继续baidu&#8230;&#8230;然后就发现了一个BlogWriter，叫做Zoundry。抱着试试看的态度，我装了它。一开始感觉还不错，至少能一次性把我的cppblog中的所有文章全部下载到本地。不过看看About页面，Zoundry已经在2005年停止更新了。我试用了一段时间，搬了大概20篇文章过来，感觉效率不高。而且Zoundry有个缺点，貌似对xml文件的解析有问题，cppblog中的代码框经过Zoundry解析之后，缩进全部没有了，代码都成了顶格的了，特难看。我只好手工把代码删掉，先把除了代码之外的文字搬过来。</p><p>用Zoundry一段时间之后，我就想试试看其他的BlogWriter怎么样。记得2006年我刚来WHU的时候，跟Snoopy住在一起，他那时非常推荐Windows Live Writer。我就下载下来试用。Windows Live Writer的安装非常慢，是在线安装。弄了好久之后终于安好了。设置一番，可以连上两个Blog系统。接下来我就非常郁闷了。我用Windows Live Writer查看cppblog的文章时，每次它都要从服务器下载所有文章列表，非常慢&#8230;&#8230;大概每打开一篇文章（我是先搬较早写的文章），就要等好几分钟，甚至更长时间，让我受不了。和Windows Live Writer相反，Zoundry采取了聪明得多的方法，它在本地保存了一份文章列表，每次我查看文章时，它就只到服务器下载我要看的那篇。M$的白痴，真是太傻了&#8230;&#8230;居然设计出这样一种算法&#8230;&#8230;</p><p>无奈我放弃了Windows Live Writer。之后我又baidu到Zoundry的升级版Zoundry Raven。Zoundry Raven非常强大，我用它迅速转移了剩下的100多篇文章，感觉上操作比Zoundry要简便不少，能自动选择保留原文的日期（Zoundry要手动选日期），发布文章的时候可以在后台运行，马上能打开下一篇文章。</p><p>可恶的是，我在WordPress官网上下的latest版本居然是2.2.2的，只好重新下了个2.3.3版的，升级了一下。这下糟糕了，Zoundry Raven无法正常跟2.3.3版的Word Press交互&#8230;&#8230;</p><p>于是我又回归了用浏览器在线编辑文档，就这样手工慢慢地把代码贴过去&#8230;&#8230;</p><p>到现在为止，我的Blog搬家工作基本上完成了。纵观三大BlogWriter，它们各有不足之处，都不能够很好地提供我需要的服务。BlogWriter的开发者还得继续努力啊！</p> ]]></content:encoded> <wfw:commentRss>http://gccfeli.cn/2008/02/blogwriters-compare.html/feed</wfw:commentRss> <slash:comments>3</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 1/15 queries in 0.013 seconds using disk

Served from: gccfeli.cn @ 2012-02-07 15:18:40 -->
