<?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>Fwolf's Blog &#187; WordPress - Fwolf's Blog</title>
	<atom:link href="http://www.fwolf.com/blog/post/tag/wordpress/feed" rel="self" type="application/rss+xml" />
	<link>http://www.fwolf.com/blog</link>
	<description>随心·随意·随缘·努力～</description>
	<lastBuildDate>Tue, 29 Dec 2009 14:58:13 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>HTTP&#8211;&gt;HTTPS</title>
		<link>http://www.fwolf.com/blog/post/405</link>
		<comments>http://www.fwolf.com/blog/post/405#comments</comments>
		<pubDate>Sat, 21 Jun 2008 08:58:00 +0000</pubDate>
		<dc:creator>Fwolf</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Hosted]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[fail]]></category>
		<category><![CDATA[https]]></category>
		<category><![CDATA[Rewrite]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">https://www.fwolf.com/blog/?p=405</guid>
		<description><![CDATA[我无法愤怒，因为不知道该生谁的气。

几天前，网站突然无法访问了，没有响应（不是reset），一开始还以为事网络的问题，后来发现不是，用其他国外主机作跳板可以正常访问，也就是说，在出国的网络出口被DROP了。

我和我们合租的邻居们不会有什么过激的言论，也没有什么PORN的内容，咋就这样了呢。没有客服，原因也没法找了，只能先恢复访问，向MT提交了support request，很快（33分钟后）就得到了的IP，应用在主机上，谁知才2天，又完蛋了。

现在要了第3个IP（这次的响应速度更快，12分钟），同时准备把所有http访问重定向到https访问，算是有些强制吧，弄了个脚本定时执行。没办法，没有别的招数，如果再被封，我也回天无术了。

使用https方式访问网站，速度上没有太大的影响（会有一点点的，服务端加密和客户端解密要耗时），关键事客户端会弹出一个非信任证书的提示，接受或者同意或者永久同意即可，FF3会出一个提示页，上面也有按钮可以添加证书为永久信任证书。如果我们每个域名都单独购买证书的话也不是不可以，不过费用不菲。

http到https的导向其实很容易，用rewrite：

RewriteCond %{HTTPS} !on [NC]
RewriteRule (.*) https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]


为了使用方便，专门搞了个小脚本，在每个网站的根下添加.htaccess文件，在所有子目录现有的.htaccess文件中添加/更新这段内容。

和wordpress配合使用的时候，遇到了一些麻烦，浪费了我2天2夜的时间，也许还浪费了1个IP，如果早弄好也许第2个IP就不会出事了。这个问题就是，rewrite后重定向到https又会被重定向回http，把rewriterule仔细得看过来看过去也没找到错误，后来发现问题在wordpress上，只要在设置中把2个网站地址更改为https开头就行了。原先的转向死循环就是因为rewriterule把http转向到了https，然后wordpress发现访问地址和网站地址不一样，又给转向回了http。



如果无法进入wordpress的管理界面，也可以直接更改数据库，表wp_options中，option_name为siteurl和home这两项，option_id分别是1和46。

再次赞 (MT)的服务，鄙视国内的网络侦探。

参考


Smart HTTP and HTTPS RewriteRule Redirects
Administration Over SSL
Force SSL
让Firefox 3上的未认证ssl简单一点


好像其他人也有类似遭遇


冰古blog
晕死，竟然godaddy的vps的独立IP也被封！
HTTPS for WordPress


Update @ 2008-06-26

取消了强制https，原因一来感觉https消耗的资源和影响的速度比预想中的要多，二来强制也只是相对的，有点知识的就能够绕开，三来没有证书（即使购买了证书也不可能所有域名合用），麻烦多多，FF里有吓人的警告，IE下要狂点确认，很多工具也不支持https，四来取消了强制并不代表https不可用，革命靠自觉，感觉有危险的时候用户自己就知道用https了。

	Tags: fail, https, Rewrite, WordPress

	Related posts
	
	配置Apache的ssl安全连接 (3)
	生成用于web服务器的openssl证书 (1)
	更改 WordPress 自动生成摘要的方式 (17)
	搞定WordPress的Permalinks (6)
	如何为网站添加sitemap文件 (3)


]]></description>
			<content:encoded><![CDATA[<p>我无法愤怒，因为不知道该生谁的气。</p>

<p>几天前，网站突然无法访问了，没有响应（不是reset），一开始还以为事网络的问题，后来发现不是，用其他国外主机作跳板可以正常访问，也就是说，在出国的网络出口被DROP了。</p>

<p>我和我们合租的邻居们不会有什么过激的言论，也没有什么PORN的内容，咋就这样了呢。没有客服，原因也没法找了，只能先恢复访问，向MT提交了support request，很快（33分钟后）就得到了的IP，应用在主机上，谁知才2天，又完蛋了。</p>

<p>现在要了第3个IP（这次的响应速度更快，12分钟），同时准备把所有http访问重定向到https访问，算是有些强制吧，弄了个脚本定时执行。没办法，没有别的招数，如果再被封，我也回天无术了。</p>

<p>使用https方式访问网站，速度上没有太大的影响（会有一点点的，服务端加密和客户端解密要耗时），关键事客户端会弹出一个非信任证书的提示，接受或者同意或者永久同意即可，FF3会出一个提示页，上面也有按钮可以添加证书为永久信任证书。如果我们每个域名都单独购买证书的话也不是不可以，不过费用不菲。</p>

<p>http到https的导向其实很容易，用rewrite：</p>

<pre><code>RewriteCond %{HTTPS} !on [NC]
RewriteRule (.*) https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
</code></pre>

<p>为了使用方便，专门搞了个小脚本，在每个网站的根下添加.htaccess文件，在所有子目录现有的.htaccess文件中添加/更新这段内容。</p>

<p>和wordpress配合使用的时候，遇到了一些麻烦，浪费了我2天2夜的时间，也许还浪费了1个IP，如果早弄好也许第2个IP就不会出事了。这个问题就是，rewrite后重定向到https又会被重定向回http，把rewriterule仔细得看过来看过去也没找到错误，后来发现问题在wordpress上，只要在设置中把2个网站地址更改为https开头就行了。原先的转向死循环就是因为rewriterule把http转向到了https，然后wordpress发现访问地址和网站地址不一样，又给转向回了http。</p>

<p><img src="http://img517.imageshack.us/img517/6117/20080621155340738x130scwn5.png" alt="" /></p>

<p>如果无法进入wordpress的管理界面，也可以直接更改数据库，表wp_options中，option_name为siteurl和home这两项，option_id分别是1和46。</p>

<p>再次赞 (MT)的服务，鄙视国内的网络侦探。</p>

<h4>参考</h4>

<ul>
<li><a href="http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html">Smart HTTP and HTTPS RewriteRule Redirects</a></li>
<li><a href="http://codex.wordpress.org/Administration_Over_SSL">Administration Over SSL</a></li>
<li><a href="http://almosteffortless.com/wordpress/force-ssl/">Force SSL</a></li>
<li><a href="http://blog.cathayan.org/item/1796">让Firefox 3上的未认证ssl简单一点</a></li>
</ul>

<h4>好像其他人也有类似遭遇</h4>

<ul>
<li><a href="http://bingu.net/blog/515/bingu-returns/">冰古blog</a></li>
<li><a href="http://bbs.idcspy.com/thread-24921-1-2.html">晕死，竟然godaddy的vps的独立IP也被封！</a></li>
<li><a href="http://wordpress.org/extend/plugins/https-for-wordpress/">HTTPS for WordPress</a></li>
</ul>

<h4>Update @ 2008-06-26</h4>

<p>取消了强制https，原因一来感觉https消耗的资源和影响的速度比预想中的要多，二来强制也只是相对的，有点知识的就能够绕开，三来没有证书（即使购买了证书也不可能所有域名合用），麻烦多多，FF里有吓人的警告，<a href="http://www.fwolf.com/blog/post/408#comment-10515">IE下要狂点确认</a>，很多工具也不支持https，四来取消了强制并不代表https不可用，革命靠自觉，感觉有危险的时候用户自己就知道用https了。</p>

	Tags: <a href="http://www.fwolf.com/blog/post/tag/fail" title="fail" rel="tag">fail</a>, <a href="http://www.fwolf.com/blog/post/tag/https" title="https" rel="tag">https</a>, <a href="http://www.fwolf.com/blog/post/tag/rewrite" title="Rewrite" rel="tag">Rewrite</a>, <a href="http://www.fwolf.com/blog/post/tag/wordpress" title="WordPress" rel="tag">WordPress</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.fwolf.com/blog/post/273" title="配置Apache的ssl安全连接 (2006-12-27)">配置Apache的ssl安全连接</a> (3)</li>
	<li><a href="http://www.fwolf.com/blog/post/407" title="生成用于web服务器的openssl证书 (2008-06-25)">生成用于web服务器的openssl证书</a> (1)</li>
	<li><a href="http://www.fwolf.com/blog/post/102" title="更改 WordPress 自动生成摘要的方式 (2005-12-19)">更改 WordPress 自动生成摘要的方式</a> (17)</li>
	<li><a href="http://www.fwolf.com/blog/post/87" title="搞定WordPress的Permalinks (2005-11-07)">搞定WordPress的Permalinks</a> (6)</li>
	<li><a href="http://www.fwolf.com/blog/post/241" title="如何为网站添加sitemap文件 (2006-10-17)">如何为网站添加sitemap文件</a> (3)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.fwolf.com/blog/post/405/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>升级WP旧模板，让它支持Widgets</title>
		<link>http://www.fwolf.com/blog/post/402</link>
		<comments>http://www.fwolf.com/blog/post/402#comments</comments>
		<pubDate>Sat, 10 May 2008 21:09:11 +0000</pubDate>
		<dc:creator>Fwolf</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[relate]]></category>
		<category><![CDATA[sidebar]]></category>
		<category><![CDATA[tag]]></category>
		<category><![CDATA[theme]]></category>
		<category><![CDATA[widgets]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.fwolf.com/blog/?p=402</guid>
		<description><![CDATA[正如大家所见，我使用的WordPress模板已经是很旧很旧的了，是以前在WordPress 1.5还是1.0系列的默认模板之上，简单修改而来的。没有选用三栏布局，因为我喜欢用稍微大一点的字体，三栏布局对我来说侧边栏东西太多，加上文章长了以后侧边栏的下面空白很大。不过旧模板自然也就没有Widgets：

No Sidebars Defined

You are seeing this message because the theme you are currently using isn’t widget-aware, meaning that it has no sidebars that you are able to change. For information on making your theme widget-aware, please follow these instructions.


刚开始我还能忍受，Sidebar上没有的东西俺自己手工加上，不过用上Simple Tags插件之后，感叹到了插件和Tags的强大，Relate Post很方便，可Relate Tags就是出不来，探查一番，原因应该就是我的模板不支持Widgets。所以忍不住了，模板可以不变样，但不能不升级，我就动手把它改成支持Widgets的吧。

刚才的提示中已经给出了修改指引的链接，首先把模板中的Sidebar改成ul形式的，Theme Editor -&#62; Sidebar (sidebar.php)，第一行的ul换成div即可：

&#60;ul id="sidebar"&#62;
......中间的很多内容
&#60;/ul&#62;


看了一下，对外观没有太大影响，css应该是用id来引用的，不过还是需要调整一点css：

/* 启用Widgets后Sidebar样式有些变化，在这里修正 */
#sidebar {list-style: none;}
#sidebar li ul li:before [...]]]></description>
			<content:encoded><![CDATA[<p>正如大家所见，我使用的WordPress模板已经是很旧很旧的了，是以前在WordPress 1.5还是1.0系列的默认模板之上，简单修改而来的。没有选用三栏布局，因为我喜欢用稍微大一点的字体，三栏布局对我来说侧边栏东西太多，加上文章长了以后侧边栏的下面空白很大。不过旧模板自然也就没有Widgets：</p>

<pre><code>No Sidebars Defined

You are seeing this message because the theme you are currently using isn’t widget-aware, meaning that it has no sidebars that you are able to change. For information on making your theme widget-aware, please follow these instructions.
</code></pre>

<p>刚开始我还能忍受，Sidebar上没有的东西俺自己<a href="366">手工加上</a>，不过用上<a href="http://wordpress.org/extend/plugins/simple-tags/">Simple Tags</a>插件之后，感叹到了插件和Tags的强大，Relate Post很方便，可Relate Tags就是出不来，探查一番，原因应该就是我的模板不支持Widgets。所以忍不住了，模板可以不变样，但不能不升级，我就动手把它改成支持Widgets的吧。</p>

<p>刚才的提示中已经给出了<a href="http://automattic.com/code/widgets/themes/">修改指引的链接</a>，首先把模板中的Sidebar改成<code>ul</code>形式的，<code>Theme Editor -&gt; Sidebar (sidebar.php)</code>，第一行的<code>ul</code>换成<code>div</code>即可：</p>

<pre><code>&lt;ul id="sidebar"&gt;
......中间的很多内容
&lt;/ul&gt;
</code></pre>

<p>看了一下，对外观没有太大影响，css应该是用id来引用的，不过还是需要调整一点css：</p>

<pre><code>/* 启用Widgets后Sidebar样式有些变化，在这里修正 */
#sidebar {list-style: none;}
#sidebar li ul li:before {
    content: "\00BB \0020";
}
#sidebar li ul li {
    margin-bottom: 5px;
}
</code></pre>

<p>然后还是修改Sidebar模板文件，加入是否有动态Sidebar的检查、如果有就调入的PHP代码：</p>

<pre><code>&lt;ul id="sidebar"&gt;
&lt;?php if ( !function_exists('dynamic_sidebar')
    || !dynamic_sidebar() ) : ?&gt;
......中间的很多内容
&lt;?php endif; ?&gt;
&lt;/ul&gt;
</code></pre>

<p>代码一共就3行，前面加2行，后面加一行，就是个简单的判断而已。别着急，现在还没有完成，还有最后一步。</p>

<p>在模板目录下，比如我的就是<code>wp-content/themes/fwolfs-blog</code>这个目录，创建一个新文件<code>functions.php</code>，内容就4行：</p>

<pre><code>&lt;?php
if ( function_exists('register_sidebar') )
    register_sidebar();
?&gt;
</code></pre>

<p>好了，现在再刷新<code>Design -&gt; Widgets</code>页面，就有内容了，我的旧模板现在也支持Widgets了。</p>

<p>同样的，<code>Design -&gt; Theme Editor</code>页面中也会多一项可编辑内容：</p>

<pre><code>Theme Functions (functions.php)
</code></pre>

<p>PS1: 如果要添加多个Sidebar，需要模板的支持，也就是模板中制定需要几个Sidebar，在Design中就能管理几个（<code>register_sidebars(n)</code>，n就是Sidebar数量）。</p>

<p>PS2: 如果想在Widgets的Text里面内嵌php代码，比如设定只有首页才显示BlogRoll，那么需要安装<a href="http://wordpress.org/extend/plugins/php-code-widget/">PHP Code Widget</a>插件，并使用<code>PHP Code</code>代码块。直接在原来的Text中写php代码的话，会原封不动的被当成php代码输出，昏死。</p>

<p>PS3: 一切都折腾好了，Relate Tags功能还是得手工添加php代码块到Widgets中：</p>

<pre><code>&lt;?php
if (is_tag()) {
    st_related_tags();
    st_remove_related_tags();
}
?&gt;
</code></pre>

	Tags: <a href="http://www.fwolf.com/blog/post/tag/hack" title="hack" rel="tag">hack</a>, <a href="http://www.fwolf.com/blog/post/tag/plugin" title="plugin" rel="tag">plugin</a>, <a href="http://www.fwolf.com/blog/post/tag/relate" title="relate" rel="tag">relate</a>, <a href="http://www.fwolf.com/blog/post/tag/sidebar" title="sidebar" rel="tag">sidebar</a>, <a href="http://www.fwolf.com/blog/post/tag/tag" title="tag" rel="tag">tag</a>, <a href="http://www.fwolf.com/blog/post/tag/theme" title="theme" rel="tag">theme</a>, <a href="http://www.fwolf.com/blog/post/tag/widgets" title="widgets" rel="tag">widgets</a>, <a href="http://www.fwolf.com/blog/post/tag/wordpress" title="WordPress" rel="tag">WordPress</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.fwolf.com/blog/post/366" title="WordPress升级到2.3.1 (2007-11-02)">WordPress升级到2.3.1</a> (0)</li>
	<li><a href="http://www.fwolf.com/blog/post/102" title="更改 WordPress 自动生成摘要的方式 (2005-12-19)">更改 WordPress 自动生成摘要的方式</a> (17)</li>
	<li><a href="http://www.fwolf.com/blog/post/241" title="如何为网站添加sitemap文件 (2006-10-17)">如何为网站添加sitemap文件</a> (3)</li>
	<li><a href="http://www.fwolf.com/blog/post/296" title="WordPress 插件编写简例 (2007-02-26)">WordPress 插件编写简例</a> (13)</li>
	<li><a href="http://www.fwolf.com/blog/post/87" title="搞定WordPress的Permalinks (2005-11-07)">搞定WordPress的Permalinks</a> (6)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.fwolf.com/blog/post/402/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>WordPress升级后分类乱码的原因及解决</title>
		<link>http://www.fwolf.com/blog/post/394</link>
		<comments>http://www.fwolf.com/blog/post/394#comments</comments>
		<pubDate>Fri, 04 Apr 2008 17:41:15 +0000</pubDate>
		<dc:creator>Fwolf</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[charset]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.fwolf.com/blog/?p=394</guid>
		<description><![CDATA[另外一个网站WordPress很久没有升级了，主要是嫌网站太慢，ssh上去操作麻烦，加上主人也很少更新。不过当Wordpress Automatic upgrade出现之后这一切都简单多了我只要在页面上点点鼠标就能升级了，顺便还能把WP的文件和数据库打包下载到本地。同时，WP的新版2.5还支持插件的自动升级，以后无论是升级WP还是升级插件，基本上就不用ssh了。

Wordpress Automatic upgrade的安装和WP的升级基本顺利，不过中间执行完upgrade.php升级数据库后，返回wpau有一个错误，没什么提示信息，直接retry后说升级不成功，清除结果再次运行就没问题了。

升级成功之后，blog标题成了？？问号，我知道这是字符集的问题，看了看wp-include/wp-db.php中已经可以自动识别字符集（原来都是自己hack这个文件），就在wp-config.php中添加了两句配置：

define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');


乱码问题解决。以为这就没什么事，又分类的名称怎么都成了“？？”了，到分类管理里面一看还是问号，编辑修改成中文保存后依然是问号，如果改成英文的就没事了，其它的内容比如文章什么的中文都正常，怎么回事呢？

左思右想，觉得还是和升级时候的那个错误有关，我是从比较旧版本的WP升级过来的，以前是通过hack wp-include/wp-db.php文件设置数据库用utf8编码连接，升级过程中这个文件被新版文件覆盖了，而wp-config.php中添加相应设置之前有一个空档，而升级数据库恰恰是在这个空档时进行的。WP 2.3添加了tag功能，后来查看分类的数据表发现分类和tag是保存在一起的，所以可以确认这些被修改了的数据表在创建时，程序并不是使用utf8编码连接的数据库服务器，而是默认的latin1_swedish_ci字符集。在这样字符集的数据表中，自然是无法保存中文的，所以原来的中文、新输入的中文就都变成了问号。

解决方法有些麻烦，因为没有用phpMyAdmin，都是直接编辑好sql命令在mysql中执行的，好在涉及到的表不多：


wp_term_relationships
wp_term_taxonomy
wp_terms
wpau_active_plugins_info
wpau_upgrade_log


修改表的字符集语法如下：

ALTER TABLE [table_name]  DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;


这还没完，还得把每个表中的字符型字段的编码转换过来，这个就略微多一点了：

# 查看表中各列的详细情况，包括字符集：
show full columns from wp_term_relationships;

# 更改列的字符集或类型、长度
alter table  wp_term_taxonomy change taxonomy taxonomy varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
alter table  wp_term_taxonomy change description description longtext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;

alter table  wp_terms [...]]]></description>
			<content:encoded><![CDATA[<p>另外一个网站WordPress很久没有升级了，主要是嫌网站太慢，ssh上去操作麻烦，加上主人也很少更新。不过当<a href="http://wordpress.org/extend/plugins/wordpress-automatic-upgrade/">Wordpress Automatic upgrade</a>出现之后这一切都简单多了我只要在页面上点点鼠标就能升级了，顺便还能把WP的文件和数据库打包下载到本地。同时，WP的新版2.5还支持插件的自动升级，以后无论是升级WP还是升级插件，基本上就不用ssh了。</p>

<p><a href="http://wordpress.org/extend/plugins/wordpress-automatic-upgrade/">Wordpress Automatic upgrade</a>的安装和WP的升级基本顺利，不过中间执行完<code>upgrade.php</code>升级数据库后，返回wpau有一个错误，没什么提示信息，直接retry后说升级不成功，清除结果再次运行就没问题了。</p>

<p>升级成功之后，blog标题成了？？问号，我知道这是字符集的问题，看了看<code>wp-include/wp-db.php</code>中已经可以自动识别字符集（原来都是自己hack这个文件），就在<code>wp-config.php</code>中添加了两句配置：</p>

<pre><code>define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');
</code></pre>

<p>乱码问题解决。以为这就没什么事，又分类的名称怎么都成了“？？”了，到分类管理里面一看还是问号，编辑修改成中文保存后依然是问号，如果改成英文的就没事了，其它的内容比如文章什么的中文都正常，怎么回事呢？</p>

<p>左思右想，觉得还是和升级时候的那个错误有关，我是从比较旧版本的WP升级过来的，以前是通过hack <code>wp-include/wp-db.php</code>文件设置数据库用utf8编码连接，升级过程中这个文件被新版文件覆盖了，而<code>wp-config.php</code>中添加相应设置之前有一个空档，而升级数据库恰恰是在这个空档时进行的。WP 2.3添加了tag功能，后来查看分类的数据表发现分类和tag是保存在一起的，所以可以确认这些被修改了的数据表在创建时，程序并不是使用utf8编码连接的数据库服务器，而是默认的latin1_swedish_ci字符集。在这样字符集的数据表中，自然是无法保存中文的，所以原来的中文、新输入的中文就都变成了问号。</p>

<p>解决方法有些麻烦，因为没有用phpMyAdmin，都是直接编辑好sql命令在mysql中执行的，好在涉及到的表不多：</p>

<ul>
<li>wp_term_relationships</li>
<li>wp_term_taxonomy</li>
<li>wp_terms</li>
<li>wpau_active_plugins_info</li>
<li>wpau_upgrade_log</li>
</ul>

<p>修改表的字符集语法如下：</p>

<pre><code>ALTER TABLE [table_name]  DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
</code></pre>

<p>这还没完，还得把每个表中的字符型字段的编码转换过来，这个就略微多一点了：</p>

<pre><code># 查看表中各列的详细情况，包括字符集：
show full columns from wp_term_relationships;

# 更改列的字符集或类型、长度
alter table  wp_term_taxonomy change taxonomy taxonomy varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
alter table  wp_term_taxonomy change description description longtext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;

alter table  wp_terms change name name varchar(55) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
alter table  wp_terms change slug slug varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;

alter table  wpau_active_plugins_info change plugin_name plugin_name varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
alter table  wpau_active_plugins_info change plugin_status plugin_status varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;

alter table wpau_upgrade_log change task_name task_name varchar(150) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
alter table wpau_upgrade_log change task_status task_status varchar(150) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
alter table wpau_upgrade_log change task_description task_description varchar(150) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
alter table wpau_upgrade_log change task_log task_log text CHARACTER SET utf8 COLLATE utf8_general_ci NULL;
</code></pre>

<p>其实wpau的两个表不用改的，老外设计的程序一般不会写中文进去，改过来只是好看一些。</p>

<p>另外WP 2.5把slug弄没了很不舒服，虽然现在我只用id作permanent link，但还是原意有个整齐一点的slug更好看，所以用上了<a href="http://blog.2i2j.com/being-humble-opinion/wp-plugins-slug-show-in-post-of-wordpress25.html">slugshow插件</a>，希望WP啥时候把那个貌似智能其实很傻的功能改过来。</p>

<h4>Update @ 2008-04-05</h4>

<p>差点忘记了还有一个<a href="http://www.gracecode.com/Archive/Display/1298">css裸奔节</a>，顺便贴一下我blog首页穿衣服和不穿衣服的样子，首先是穿衣服的：</p>

<p><a href="http://img509.imageshack.us/my.php?image=sblog1207408366991gs3.png" target="_blank"><img src="http://img509.imageshack.us/img509/7793/sblog1207408366991gs3.th.png" border="0" alt="Free Image Hosting at www.ImageShack.us" /></a></p>

<p>然后是不穿衣服的：</p>

<p><a href="http://img87.imageshack.us/my.php?image=fwolfsblog1207408413561bm7.png" target="_blank"><img src="http://img87.imageshack.us/img87/3391/fwolfsblog1207408413561bm7.th.png" border="0" alt="Free Image Hosting at www.ImageShack.us" /></a></p>

<p>我的<a href="312">脱衣脚本</a>还是很好用的嘛。</p>

	Tags: <a href="http://www.fwolf.com/blog/post/tag/charset" title="charset" rel="tag">charset</a>, <a href="http://www.fwolf.com/blog/post/tag/css" title="css" rel="tag">css</a>, <a href="http://www.fwolf.com/blog/post/tag/mysql" title="mysql" rel="tag">mysql</a>, <a href="http://www.fwolf.com/blog/post/tag/wordpress" title="WordPress" rel="tag">WordPress</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.fwolf.com/blog/post/102" title="更改 WordPress 自动生成摘要的方式 (2005-12-19)">更改 WordPress 自动生成摘要的方式</a> (17)</li>
	<li><a href="http://www.fwolf.com/blog/post/87" title="搞定WordPress的Permalinks (2005-11-07)">搞定WordPress的Permalinks</a> (6)</li>
	<li><a href="http://www.fwolf.com/blog/post/404" title="忙碌的5月 (2008-06-13)">忙碌的5月</a> (10)</li>
	<li><a href="http://www.fwolf.com/blog/post/241" title="如何为网站添加sitemap文件 (2006-10-17)">如何为网站添加sitemap文件</a> (3)</li>
	<li><a href="http://www.fwolf.com/blog/post/369" title="在无线网络中使用RADIUS服务器+mysql进行用户认证 (2007-11-15)">在无线网络中使用RADIUS服务器+mysql进行用户认证</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.fwolf.com/blog/post/394/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress升级到2.3.1</title>
		<link>http://www.fwolf.com/blog/post/366</link>
		<comments>http://www.fwolf.com/blog/post/366#comments</comments>
		<pubDate>Thu, 01 Nov 2007 18:02:33 +0000</pubDate>
		<dc:creator>Fwolf</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[sidebar]]></category>
		<category><![CDATA[tag]]></category>
		<category><![CDATA[widgets]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.fwolf.com/blog/post/366</guid>
		<description><![CDATA[以前用的是2.2版本，现在最新版是2.3.1，我看重的主要改进是添加了tag的支持，就升过来了。

升级过程非常简单，下载包，解压，覆盖，然后执行一下wp-admin/upgrade.php就可以了。

忘记了WordPress从哪个版本开始支持Widgets功能的，可我用的这个模板是从1.5版本的默认主题，一路改过来的，虽然没有动大手术，琐碎的修改还是有一些的。对于我这个懒人来说，重新套模板然后更改显然是不划算的，虽然后来学聪明了，有些修改作成了插件，剩下的好像也不少，所以尽可能的在旧模板的基础上更改。

Widgets好像就是个可高度自定义的sidebar，在我现在的模板中，打开Widgets页面总是提示“No Sidebars Defined”，不支持，好在我的要求也不高，咱自己动手，丰衣足食。

Wordpress的wp-includes/widgets.php这个文件，是Widgets的主要实现代码，所以修改主要是参照了这个文件的内容。好了，开始编辑现在这个旧模板的sidebar文件。

首先，要把存档archive改成下拉列表框，月份多了实在看着不舒服，widgets.php中有这么一段：

function wp_widget_archives($args) {
    extract($args);
    $options = get_option('widget_archives');
    $c = $options['count'] ? '1' : '0';
    $d = $options['dropdown'] ? '1' : '0';
    $title = empty($options['title']) ? __('Archives') : $options['title'];

    echo $before_widget;
    echo $before_title [...]]]></description>
			<content:encoded><![CDATA[<p>以前用的是2.2版本，现在最新版是2.3.1，我看重的主要改进是添加了tag的支持，就升过来了。</p>

<p>升级过程非常简单，下载包，解压，覆盖，然后执行一下<code>wp-admin/upgrade.php</code>就可以了。</p>

<p>忘记了WordPress从哪个版本开始支持Widgets功能的，可我用的这个模板是从1.5版本的默认主题，一路改过来的，虽然没有动大手术，琐碎的修改还是有一些的。对于我这个懒人来说，重新套模板然后更改显然是不划算的，虽然后来学聪明了，有些修改作成了插件，剩下的好像也不少，所以尽可能的在旧模板的基础上更改。</p>

<p>Widgets好像就是个可高度自定义的sidebar，在我现在的模板中，打开Widgets页面总是提示“No Sidebars Defined”，不支持，好在我的要求也不高，咱自己动手，丰衣足食。</p>

<p>Wordpress的<code>wp-includes/widgets.php</code>这个文件，是Widgets的主要实现代码，所以修改主要是参照了这个文件的内容。好了，开始编辑现在这个旧模板的sidebar文件。</p>

<p>首先，要把存档archive改成下拉列表框，月份多了实在看着不舒服，widgets.php中有这么一段：</p>

<pre><code>function wp_widget_archives($args) {
    extract($args);
    $options = get_option('widget_archives');
    $c = $options['count'] ? '1' : '0';
    $d = $options['dropdown'] ? '1' : '0';
    $title = empty($options['title']) ? __('Archives') : $options['title'];

    echo $before_widget;
    echo $before_title . $title . $after_title;

    if($d) {
?&gt;
        &lt;select name="archive-dropdown" onchange='document.location.href=this.options[this.selectedIndex].value;'&gt; &lt;option value=""&gt;&lt;?php echo attribute_escape(__('Select Month')); ?&gt;&lt;/option&gt; &lt;?php wp_get_archives("type=monthly&amp;format=option&amp;show_post_count=$c"); ?&gt; &lt;/select&gt;
</code></pre>

<p>可以看出，内置的<code>wp_get_archives</code>函数的参数，原来只有<code>type=monthly</code>，现在多了<code>format=option</code>和<code>show_post_count=$c</code>，前者应该代表是否下拉列表框形式显示，值的定义为<code>$options['dropdown']</code>；后者是是否显示本月文章计数，值的定义为<code>$options['count']</code>，并且都是用1代表真，0代表假，所以修改就简单了，把原来的：</p>

<pre><code>&lt;?php wp_get_archives('type=monthly'); ?&gt;
</code></pre>

<p>更改为：</p>

<pre><code>        &lt;select name="archive-dropdown" onchange='document.location.href=this.options[this.selectedIndex].value;'&gt; &lt;option value=""&gt;&lt;?php echo attribute_escape(__('Select Month')); ?&gt;&lt;/option&gt; &lt;?php wp_get_archives("type=monthly&amp;format=option&amp;show_post_count=1"); ?&gt; &lt;/select&gt;
</code></pre>

<p>就行了。</p>

<p>然后，把archive月份存档和category分类列表的位置互换，分类列表放在上面，直接调整代码顺序即可，同时给分类列表也加上分类计数的显示：</p>

<pre><code>            &lt;li&gt;&lt;h2&gt;Categories&lt;/h2&gt;
                &lt;ul&gt;
                &lt;?php wp_list_cats('sort_column=name&amp;show_count=1'); ?&gt;
                &lt;/ul&gt;
            &lt;/li&gt;
</code></pre>

<p>最后，添加Tag Cloud，没有这个升级就白作了，参照widgets.php中的：</p>

<pre><code>function wp_widget_tag_cloud($args) {
    extract($args);
    $options = get_option('widget_tag_cloud');
    $title = empty($options['title']) ? __('Tags') : $options['title'];

    echo $before_widget;
    echo $before_title . $title . $after_title;
    wp_tag_cloud();
    echo $after_widget;
}
</code></pre>

<p>没什么太复杂的，直接调用<code>wp_tag_cloud()</code>函数，连参数都没有，最终代码为：</p>

<pre><code>            &lt;li&gt;&lt;h2&gt;Tags Cloud&lt;/h2&gt;
                &lt;ul&gt;
                &lt;?php wp_tag_cloud(); ?&gt;
                &lt;/ul&gt;
            &lt;/li&gt;
</code></pre>

<p>这样就大功告成了，虽然模板不支持Widgets，侧边栏倒也符合我的基本使用需要了。</p>

<h4>参考</h4>

<ul>
<li><a href="http://codex.wordpress.org/Template_Tags/wp_tag_cloud">wp_tag_cloud函数的详细说明文档</a></li>
</ul>

	Tags: <a href="http://www.fwolf.com/blog/post/tag/hack" title="hack" rel="tag">hack</a>, <a href="http://www.fwolf.com/blog/post/tag/php" title="PHP" rel="tag">PHP</a>, <a href="http://www.fwolf.com/blog/post/tag/sidebar" title="sidebar" rel="tag">sidebar</a>, <a href="http://www.fwolf.com/blog/post/tag/tag" title="tag" rel="tag">tag</a>, <a href="http://www.fwolf.com/blog/post/tag/widgets" title="widgets" rel="tag">widgets</a>, <a href="http://www.fwolf.com/blog/post/tag/wordpress" title="WordPress" rel="tag">WordPress</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.fwolf.com/blog/post/402" title="升级WP旧模板，让它支持Widgets (2008-05-11)">升级WP旧模板，让它支持Widgets</a> (4)</li>
	<li><a href="http://www.fwolf.com/blog/post/102" title="更改 WordPress 自动生成摘要的方式 (2005-12-19)">更改 WordPress 自动生成摘要的方式</a> (17)</li>
	<li><a href="http://www.fwolf.com/blog/post/87" title="搞定WordPress的Permalinks (2005-11-07)">搞定WordPress的Permalinks</a> (6)</li>
	<li><a href="http://www.fwolf.com/blog/post/296" title="WordPress 插件编写简例 (2007-02-26)">WordPress 插件编写简例</a> (13)</li>
	<li><a href="http://www.fwolf.com/blog/post/399" title="Gregarius编辑feed时中文乱码的解决 (2008-05-02)">Gregarius编辑feed时中文乱码的解决</a> (1)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.fwolf.com/blog/post/366/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress 插件编写简例</title>
		<link>http://www.fwolf.com/blog/post/296</link>
		<comments>http://www.fwolf.com/blog/post/296#comments</comments>
		<pubDate>Mon, 26 Feb 2007 06:41:47 +0000</pubDate>
		<dc:creator>Fwolf</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[example]]></category>
		<category><![CDATA[fliter]]></category>
		<category><![CDATA[hooks]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.fwolf.com/blog/post/296</guid>
		<description><![CDATA[虽然市面上有很多 WordPress 的插件，但未必能够满足我们那些稍微“变态”一些的需求，所以，参照wp官方的插件编写指南，写下这个简单的说明和小例子，希望对大家有所帮助。

插件编写需要php的基础知识，并且本说明的内容大多只适用于wp1.5以后版本。

插件程序建议放置在wp-content/plugins/目录，如果有多个程序文件的话，可以在这个目录下建立子目录，程序所需的资源文件建议也放在这个目录下，便于更新和管理。

wp插件主要分为两种：


Action 对wp的行为事件进行修改，比如修改数据库，发送邮件或者修改显示结构等。
Filter 对wp的输入输出内容进行修改。


在本例中，我们将建立一个简单的Filter插件，替换wp本来的文章摘要生成功能，把以前手工修改代码实现的内容，用插件来替代。

wp推荐在插件程序中加入这样的文件头，便于wp辨认插件的信息，就像下面这样：


&#60;?php
/*
	Plugin Name: 插件名称
	Plugin URI: http://插件网址
	Description: 插件说明
	Version: 插件版本
	Author: 插件作者
	Author URI: http://作者网址
*/


插件的代码风格主要是基于过程方式的，所以要尽力避免函数重名，可以在函数名之前加上自己的名称前缀，也可以把自己的类包含在一个类当中，不过小型插件还不至于复杂到要使用类的程度吧？

函数的编写就是php代码了，注意Filter一定要返回数据，即使没有修改也要返回，不然后续的其他函数就没法干活了。更多的信息可以看官方的插件api。

编写完成之后，函数是不会自动执行的，wp为插件函数的执行提供了一种hook机制，就是在原始的wp程序中，预置了一些hook或者叫挂载点，通过把插件函数挂在这些hook上，就可以被执行，目前wp提供的挂载点一览见Hooks列表。

针对我编写的函数，是要挂在生成文章摘要的地方，查找了一下Hooks列表，发现和摘要（excerpt）相关的有：

default_excerpt 
excerpt_edit_pre
excerpt_save_pre 
get_the_excerpt
the_excerpt


从名称可以看出，default_excerpt是文章的默认摘要，excerpt_edit_pre和excerpt_save_pre是编辑文章是对摘要进行的预处理，get_the_excerpt是取摘要，the_excerpt是返回摘要。我编写的是生成摘要的功能，应该挂在get_the_excerpt或者是the_excerpt上，考虑the_excerpt可能更“底层”一些，挂在这里。

挂载的语法也是一个php函数调用，格式如下：


add_filter&#40;'hook_name', 'your_filter', &#91;priority&#93;, &#91;accepted_args&#93;&#41;;


priority为优先级，默认为10，数字小的会先执行；accepted_args为参数个数，默认值为1，如果插件函数需要多个参数的话需要自行设定。这两个参数在使用默认值的时候都可省略。

基本上有这些就够了，我的插件程序完整代码如下：


&#60;?php
/*
	Plugin Name: Excerpt Trimmer
	Plugin URI: http://www.fwolf.com/
	Description: 替换wp本身的“摘要”生成功能，用于在列表或者查询页面显示文章部分内容。
	Version: 1.0
	Author: Fwolf
	Author URI: http://www.fwolf.com/
*/
&#160;
function fw_excerpt&#40;$text&#41;
&#123;
	$excerpt_length = 4;
	$words = explode&#40;&#34;\n&#34;, $text, $excerpt_length + 1&#41;;
	if &#40;count&#40;$words&#41; &#62; $excerpt_length&#41; &#123;
		array_pop&#40;$words&#41;;
		array_push&#40;$words, '&#60;p /&#62;......&#60;a href=&#34;' . get_permalink&#40;$post-&#62;ID&#41; . '&#34;&#62;[阅读全文]&#60;/a&#62;'&#41;;
		$text = implode&#40;&#34;\n&#34;, $words&#41;;
	&#125;
	return $text;
&#125; // end [...]]]></description>
			<content:encoded><![CDATA[<p>虽然市面上有很多 WordPress 的插件，但未必能够满足我们那些稍微“变态”一些的需求，所以，参照wp官方的<a href="http://codex.wordpress.org/Writing_a_Plugin">插件编写指南</a>，写下这个简单的说明和小例子，希望对大家有所帮助。</p>

<p>插件编写需要php的基础知识，并且本说明的内容大多只适用于wp1.5以后版本。</p>

<p>插件程序建议放置在<code>wp-content/plugins/</code>目录，如果有多个程序文件的话，可以在这个目录下建立子目录，程序所需的资源文件建议也放在这个目录下，便于更新和管理。</p>

<p>wp插件主要分为两种：</p>

<ul>
<li>Action 对wp的行为事件进行修改，比如修改数据库，发送邮件或者修改显示结构等。</li>
<li>Filter 对wp的输入输出内容进行修改。</li>
</ul>

<p>在本例中，我们将建立一个简单的Filter插件，替换wp本来的文章摘要生成功能，把以前<a href="102">手工修改代码实现的内容</a>，用插件来替代。</p>

<p>wp推荐在插件程序中加入这样的文件头，便于wp辨认插件的信息，就像下面这样：</p>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">/*
	Plugin Name: 插件名称
	Plugin URI: http://插件网址
	Description: 插件说明
	Version: 插件版本
	Author: 插件作者
	Author URI: http://作者网址
*/</span></pre></div></div>


<p>插件的代码风格主要是基于过程方式的，所以要尽力避免函数重名，可以在函数名之前加上自己的名称前缀，也可以把自己的类包含在一个类当中，不过小型插件还不至于复杂到要使用类的程度吧？</p>

<p>函数的编写就是php代码了，注意Filter一定要返回数据，即使没有修改也要返回，不然后续的其他函数就没法干活了。更多的信息可以看<a href="http://codex.wordpress.org/Plugin_API">官方的插件api</a>。</p>

<p>编写完成之后，函数是不会自动执行的，wp为插件函数的执行提供了一种hook机制，就是在原始的wp程序中，预置了一些hook或者叫挂载点，通过把插件函数挂在这些hook上，就可以被执行，目前wp提供的挂载点一览见<a href="http://codex.wordpress.org/Plugin_API/Hooks">Hooks</a>列表。</p>

<p>针对我编写的函数，是要挂在生成文章摘要的地方，查找了一下<a href="http://codex.wordpress.org/Plugin_API/Hooks">Hooks</a>列表，发现和摘要（excerpt）相关的有：</p>

<pre><code>default_excerpt 
excerpt_edit_pre
excerpt_save_pre 
get_the_excerpt
the_excerpt
</code></pre>

<p>从名称可以看出，default_excerpt是文章的默认摘要，excerpt_edit_pre和excerpt_save_pre是编辑文章是对摘要进行的预处理，get_the_excerpt是取摘要，the_excerpt是返回摘要。我编写的是生成摘要的功能，应该挂在get_the_excerpt或者是the_excerpt上，考虑the_excerpt可能更“底层”一些，挂在这里。</p>

<p>挂载的语法也是一个php函数调用，格式如下：</p>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'hook_name'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'your_filter'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#91;</span>priority<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#91;</span>accepted_args<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>


<p>priority为优先级，默认为10，数字小的会先执行；accepted_args为参数个数，默认值为1，如果插件函数需要多个参数的话需要自行设定。这两个参数在使用默认值的时候都可省略。</p>

<p>基本上有这些就够了，我的插件程序完整代码如下：</p>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">/*
	Plugin Name: Excerpt Trimmer
	Plugin URI: http://www.fwolf.com/
	Description: 替换wp本身的“摘要”生成功能，用于在列表或者查询页面显示文章部分内容。
	Version: 1.0
	Author: Fwolf
	Author URI: http://www.fwolf.com/
*/</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> fw_excerpt<span style="color: #009900;">&#40;</span><span style="color: #000088;">$text</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$excerpt_length</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$words</span> <span style="color: #339933;">=</span> <span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$text</span><span style="color: #339933;">,</span> <span style="color: #000088;">$excerpt_length</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$words</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #000088;">$excerpt_length</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #990000;">array_pop</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$words</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #990000;">array_push</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$words</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'&lt;p /&gt;......&lt;a href=&quot;'</span> <span style="color: #339933;">.</span> get_permalink<span style="color: #009900;">&#40;</span><span style="color: #000088;">$post</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">ID</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&quot;&gt;[阅读全文]&lt;/a&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$text</span> <span style="color: #339933;">=</span> <span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$words</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$text</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">// end of func fw_excerpt</span>
&nbsp;
add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'the_excerpt'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'fw_excerpt'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>


<p>可以看出插件程序也就是由上面介绍的3部分组成：文件头，函数体，挂载声明。</p>

<p>其实就简单插件来讲，最关键的是找对相应的hook，这就要靠经验和摸索了，wp官方文档好像也没有对每个hook作出详细的解释。</p>

<p>现在，把我这个插件程序保存为<code>wp-contents/plugin/excerpt.php</code>，登录wp，进入plugin设置，就能够看到“Excerpt Trimmer”插件了，启用之就大功告成了。我还存了一份在<a href="http://groups.google.com/group/Fwolf-Tools/t/c133d65b8c812271">这里</a>，方便下载。</p>

	Tags: <a href="http://www.fwolf.com/blog/post/tag/example" title="example" rel="tag">example</a>, <a href="http://www.fwolf.com/blog/post/tag/fliter" title="fliter" rel="tag">fliter</a>, <a href="http://www.fwolf.com/blog/post/tag/hooks" title="hooks" rel="tag">hooks</a>, <a href="http://www.fwolf.com/blog/post/tag/php" title="PHP" rel="tag">PHP</a>, <a href="http://www.fwolf.com/blog/post/tag/plugin" title="plugin" rel="tag">plugin</a>, <a href="http://www.fwolf.com/blog/post/tag/wordpress" title="WordPress" rel="tag">WordPress</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.fwolf.com/blog/post/102" title="更改 WordPress 自动生成摘要的方式 (2005-12-19)">更改 WordPress 自动生成摘要的方式</a> (17)</li>
	<li><a href="http://www.fwolf.com/blog/post/87" title="搞定WordPress的Permalinks (2005-11-07)">搞定WordPress的Permalinks</a> (6)</li>
	<li><a href="http://www.fwolf.com/blog/post/241" title="如何为网站添加sitemap文件 (2006-10-17)">如何为网站添加sitemap文件</a> (3)</li>
	<li><a href="http://www.fwolf.com/blog/post/402" title="升级WP旧模板，让它支持Widgets (2008-05-11)">升级WP旧模板，让它支持Widgets</a> (4)</li>
	<li><a href="http://www.fwolf.com/blog/post/366" title="WordPress升级到2.3.1 (2007-11-02)">WordPress升级到2.3.1</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.fwolf.com/blog/post/296/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
