'WordPress' 分类的存档

Yskin's Table of Contents Generator——TOC自动生成器

2006年7月13日,想弄一个类似Wikipedia上文章目录的功能,希望能参考Wikipedia的格式,只要用"==title=="这样就可以自动生成标题,并在文章的开头根据这些标题自动生成目录。写了一点代码,但是没有完成,能力有限啊。2007年1月10日,也就是半个月前,在鼓捣我的Projects页面的时候,偶然发现了Table of Contents GeneratorTable of Contents Generator插件,可以为文章自动生成一个目录,方便浏览者查阅。这个功能不错,有点类似Word的目录域功能,只要在合适的地方添加一个目录域,这个地方就会显示当前文档的目录,而且当你修改文档的时候目录也会自动更新。

看了一下这个插件的源代码,不是很满意,于是就重新写了一个,用于我的Projects页面。Scott Yang用的堆栈,我觉得不太好,就用了一个数组模拟堆栈,写出来的代码也短一些。Scott还考虑了对分页文章的处理,我没写过分页文章,而且现在很多喜欢分页文章的人都用了Coolcode.cn的AJAX分页插件,两个插件兼容性上也会有一些问题,所以分页功能我就不予考虑了。再在大的函数开头建几个类变量的引用,这样整个程序小了很多。

给目录上方上面加了一个标题“Table of Contents”,这样就和Wikipedia里的目录很象了。Wikipedia里的文章目录标题旁边有一个链接,点击它可以隐藏或显示目录内容。我懒得弄那个链接了,直接通过JavaScript代码控制当点击标题时隐藏或显示下面的TOC框。参考了WordPress Codex里这个页面的JavaScript代码,弄好了点击隐藏TOC功能。JavaScript代码很简单,但有一个问题是:当隐藏TOC内容后,因为标题“Table of Contents”比目录部分窄很多,所以整个TOC块的会突然变窄,有点难看。Wikipedia里没对这个情况进行处理,点隐藏就突然变窄,点显示又突然变宽。而WordPress Codex里则使用固定宽度的TOC框,固定宽度在目录里有比较长的标题的情况下比较好。查了一些CSS方面的资料,使用JavaScript在隐藏的时候把TOC框的clientWidth值赋给toctitle.style.width。这样在Firefox下没有问题,IE里却还是不行。用JavaScript的alert()函数查看TOC框的clientWidth值,发现是0。在网上逛了很久,都说没有办法。最终,只有用offsetWidth这个属性。offsetWidth和clientWidth的区别是,前者包括border的宽度,而后者不包括。最终写出了比较完美的代码,在IE6 SP2、Firefox 1.5.0.6、Opera 9.10下均测试通过。

还有锚的问题。Scott的插件里用标题生成锚,WordPress Codex里用标题URL encode后去除百分号生成锚。这样做有一个好处就是,当增加标题的时候,锚地址不会变,因为锚地址只和标题文字有关,和顺序无关。缺点是,中文标题生成的锚地址会很长。我用的是序号的方法,这样做的好处是当修改标题时锚地址仍然不变,而且在中文环境下锚地址也会短些。总之,两种方式各有所长吧。

前几天忙于WordPress 2.0.7和WordPress 2.1,今天抽了点时间又看了下这个插件。插件在文章页面显示没有问题,但是在feed里出了问题。查了很久,将近3个小时,看代码看得我快崩溃了,最后才发现类的对象只建立一次,它是被重复使用的。把初始化变量移到函数里,问题就解决了,可以release了。

请移步到“Yskin's Table of Contents Generator”主页下载软件并查看更多信息。

WordPress 2.1里feed不显示more标签后面文字的问题

天佑一直使用着WordPress 2.1版本,从老早以前的Alpha版本就一直跟着svn走了。他对WordPress 2.1版本了解的比较多一些,也写了一些文章讲了一些WordPress 2.1的问题。

WordPress 2.1有一个feed的问题,在天佑的这篇文章里有详细描述,并向WordPress开发组报了bug #2582。这个问题会影响同时使用全文feed和more标签的用户。当你在文章里使用的more标签时,Blog首页里这篇文章的显示将会在more标签这儿截断,并在后面显示"read more"字样,指向文章页面。从WordPress 2.0系列以前,WordPress对more标签的处理一直是只影响Blog首页,不影响archive页,也不影响feed里的全文输出。但是,WordPress 2.1里却改了,feed里一样会在more标签这儿截断。

我想没人会喜欢这个修改。既然选了feed全文输出,就希望feed里是完整的全文。more标签只是用于维护Blog首页的干净整洁,同时影响feed可不好。随着WordPress 2.1的正式发布,我想会有很多人关注到这个问题。冤有头,债有主,虽然是2006年3月的事了,我还是要查一下这个bug到底是怎么来的。

按照天佑报的bug里的说法,他是在3645版本里发现有这个bug的。我往前找了一下,找到Changeset 3638。很明显,这个bug出现的原因是因为WordPress把wp-rss2.php等文件的载入方式改了。以前是用require()函数载入的,在3638里被改为通过load_template()函数载入。以前WordPress的wp-rdf.php, wp-rss.php, wp-rss2.php, wp-atom.php文件的开头都有一句$more = 1;,这句代码保证了feed的输出的始终是全文。在[3638]里,载入方式被改变,这些feed文件在一个函数里被载入,导致这里的$more变量由全局变量变成了一个局部变量,于是,bug就产生了。

显然这个修改不是WordPress开发组故意为之,而是无心之过。但是,在天佑报了bug以后,Mark说," This is intended behavior."Mark认为这是故意为之,并且认为这种方式更好一些。这个Ticket还吸引了ryan和matt,他们也认为这样更好,并且认为WP 1.5里就是用这种方式处理的,并且还在[4184]里做了一些优化。但是资深WPer天佑立刻指出,WP 1.5和2.0一样,这个改变发生在WP 2.1 Alpha里。

最终,这个事就被这么确定下来了。WordPress开发组完全无视我们强烈的要求,在WordPress 2.1里对feed的输出方式做出这么重大的改变。随着WordPress 2.1的正式发布,会有越来越多的人发现这个问题,就在昨天还有人在天佑的那个ticket里表示了异议。这种输出方式的重大改变,如果确实这种功能的话,也该给一个选项啊,这样强行的改变,不顾广大用户的感受,只凭自己的喜好,出了问题后还狡辩说是故意为之,一个字:可耻!

可笑的是,4个feed文件中的$more = 1;代码依然被保留了下来,还在WordPress 2.1的源代码里静静的躺着。好好的躺着吧,最好一直躺到WordPress 2.2里。

解决的方法嘛,除了按照天佑所说,修改/wp-includes/query.php文件之外,还可以直接修改那4个feed文件,把$more = 1;修改为global $more; $more = 1;,或者$GLOBALS['more'] = 1;

最后,作为一个懒人,未免以后升级WordPress时需要修改4个feed文件这么劳累,做了个小插件,在WordPress源代码里随便找了个地方插进去,对$more变量做了处理。阿土伯说,傻人有傻福。

请移步到“WordPress 2.1 feed Tuneup”主页下载软件并查看更多信息。

点点游WordPress 2.1中文版

点点游WordPress 2.1中文版点点游大大制作的中文化的WordPress版本。点点游大大一直致力于WordPress本身和WordPress模版的汉化,从很久以前就开始为WordPress的每个发布版本制作中文版了。这个“中文版”不同于“中文包”,中文包只是数据文件,WordPress只是从中文包zh_CN.mo文件里读取翻译后的文字并显示出来,所以,WordPress没有提供给语言包翻译的字符串,以及一些因为在语言包被调用之前显示而无法提供给语言包翻译的字符串(比如一些错误信息),中文包都无能为力。而点点游制作的中文版对这些地方做了细致的汉化,甚至一些注释部分都汉化了。

但是,点点游大大没有给出中文版修改了WordPress原版哪些部分的说明,或许是因为太忙吧。因此,网上流传着很多流言,有的说中文版/中文包“严重影响速度”,有的说中文版下某些插件或模版无法正常工作,换回原版WP就好了。所以,继上次我写了点点游WordPress 2.0.5中文版修改记录,这次再写一下点点游WordPress 2.1中文版的修改记录。

  1. /wp-admin/admin-functions.php文件中,把用户名称的显示从“名 姓”修改为“姓名”。这样比较符合中国人的习惯,不过修改后的姓名中间没有加空格。
  2. /wp-admin/edit.php文件中,把文章管理页面中按月浏览的那个月份列表从“May 2006”修改为“2006年5月”
  3. /wp-admin/edit-comments.php和wp-admin/moderation.php文件中,把评论管理页面中的评论日期格式由"M j, g:i A"修改为“n月j日, g:i A”
  4. /wp-admin/index.php和/wp-admin/index-extra.php文件中,在后台Dashboard里添加来自"http://www.gtp2p.com/feed/"的新闻。呃,看看新闻也不错哈。Technorati的feed这次没有被移除,因为WP 2.1的异步feed读取已经避免了Dashboard打开慢的问题了。
  5. /wp-admin/setup-config.php文件做了全面的汉化。这是在上传WordPress文件后,建立wp-config.php文件的程序,对这个文件进行汉化,方便了初次安装WordPress的用户,让他们可以在中文界面下填写数据库用户名密码等信息。
  6. /wp-admin/upgrade-functions.php文件里给__('about')加了一个urlencode函数。
  7. /wp-admin/wp-admin.css以及TinyMCE的CSS文件中,把字体大小小于12px的全部调成12px,英文里10px的字都还能看,中文里12px已经是能忍耐的最小字号了,再小的化Windows的宋体字体文件里就没有相应的字号,显示出来就会很小又很模糊了。这对于中文用户很有帮助。不过我把我的Firefox中文最小字体设成了12px,要不然,别的不说,Google Calendar里的中文都看不清了。Firefox的这个功能真不错,哈哈。
  8. 汉化Akismet、Hello Dolly这两个插件的名称和说明部分。
  9. WordPress Database Backup插件已经在WordPress 2.1里被移出核心了,但是点点游大大为了方便中文用户,将这个插件集成进中文版,并进行了细致的汉化,还把所有的get_settings()换成了get_option(),以兼容WordPress 2.1。不过,集成的是1.7版。我记得WordPress核心里的这个插件老早就改为1.8版了。而且,好多人都说,这个插件的旧版本已经不能在WordPress 2.1里使用了。WordPress Database Backup插件已经换了开发者,并推出了修正了bug并兼容WordPress 2.1的WordPress Database Backup 2.0。所以,请使用WordPress 2.1的朋友们及时升级到新版本。
  10. 汉化了内置的WordPress Classic和WordPress Default两个主题。
  11. 汉化普通编辑器的快捷按钮,通过增加中文js文件汉化TinyMCE编辑器。在TinyMCE中增加分页按钮,修改了可视化编辑器中两个图片文件,把"More"替换成“更多”。
  12. /wp-includes/general-template.php文件好像有点不对,这好像是个旧版的文件,很多地方和WordPress 2.1正式版对不上号。比如,WordPress 2.1里编辑器中的两个标签名分别是"Visual"和"Code",这两个名称是2006年11月17日被修改为现在的样子的,以前叫"Editor"和"HTML"。[via]而点点游中文版里还是以前的名字,所以,中文版里的这个文件起码是去年11月17日之前的旧文件。
  13. /wp-includes/gettext.php文件中加入一句$string = str_replace("\r\n", "\n", $string); // Fix multi-line string problem.。因为点点游中文版把所有文件都由UNIX格式改成了DOS格式,所以要加上这一句来修正bug?
  14. 将GNU许可证文件license.txt替换成中文版。
  15. 汉化readme.html使用说明文件。
  16. 将wp-config-sample.php文件中的说明部分全部汉化,并将define ('WPLANG', '');修改为define ('WPLANG', 'zh_CN');
  17. 在/wp-includes/languages/目录下增加wordpress.pot,zh_CN.po,zh_CN.mo三个文件,其中zh_CN.mo为中文包。
  18. /wp-admin/install.php、/wp-includes/wp-db.php、wp-blog-header.php、wp-settings.php文件中错误信息的汉化。

所有修改的内容都在这里。下次再遇到一些插件的问题,模版的问题,以及WordPress本身的问题,就不要再往点点游的中文版上怀疑了。

另外,希望使用点点游WordPress 2.1中文版的用户去升级一下WordPress Database BackupWordPress Database Backup插件。还有,最好找来WordPress 2.1原版里的/wp-includes/general-template.php文件上传覆盖一下,差别还是满大的,免得有bug什么的。

WordPress 2.1的一个小cookie兼容问题

我还没有升级到WordPress 2.1,不过我在一个子目录下装了一个WordPress 2.1。这几天只用过几次,发现主Blog这边的WordPress 2.0.7的编辑页面里,右边的那些小框框都不能拖动了,标题栏右边用来展开框框的加减号也不见了。看了下Firefox的JavaScript控制台,发现报了一个错误,好像是cookie有问题。

小小的研究了一下。WordPress会自动记住这些框框的顺序,以及打开或关闭。这些自然不会记录在服务器上,而是用cookie记录的。找到控制这些框框的js文件:/wp-includes/js/dbx.js,发现里面在设置cookie的时候,path被设置为"/"。WordPress的其他cookie,比如记录用户登陆状态的cookie,都是有记录path的,所以多个目录下的不同WordPress互相之间不影响。而这个dbx.js只是个js文件,无法象PHP文件那样使用SITECOOKIEPATH常量获得当前WordPress在域名下的哪一个PATH,所以直接用"/"也是无奈。问题是,如果多个WordPress都是同一个版本的话,那么就等于是共用该设置,大不了一个WP里调整过顺序,其他的WP也跟着调整了而已。而WordPress 2.0.7和WordPress 2.1里,这段cookie保存的格式是不一样的。WordPress 2.0.7里是:

grabit=2+,3+,4+,5+,0-,1-,6-&advancedstuff=0-,1+,2-

而WordPress 2.1里则是

grabit:3+|0+|5+|4+|1-|2-&advancedstuff:0-|1+|2-

结果我的WordPress 2.0.7读取了cookie,在解析时发现格式不对后,就直接出错了。

没办法,改了一下WordPress 2.1里的dbx.js文件,把path改成目录名。然后把原来的cookie删了,两边都重新调整了一下,这下不冲突了。WordPress 2.0.7里带的是DBX 2.02,而WordPress 2.1里带的是DBX 2.05。找来DBX 2.05的源代码看了一下。从WordPress 2.0.7升级到WordPress 2.1应该没问题的,不会出现错误,因为DBX 2.05里写了this.cookie[i] = this.cookie[i].replace(/\|/g, ',');this.cookie[i]= this.cookie[i].replace(/:/g, '=');这样的代码,哈哈。

Update:这几天用的还行,只是偶尔(大概两天一次)会出现问题。想了半天,好像"/"的cookie可以同时影响"/"和"/nc/"是不是啊。火大,直接把WordPress 2.1的dbx.js上传替换了WordPress 2.0.7的文件,好像也没有不兼容。看了一下,把2.1和2.0.7的编辑文章页面侧边栏框框的顺序调成一样,两者的cookie里的顺序有一点不一样。所以,二者不能共用cookie。唉,还是尽快升级的好。

WordPress 2.1发布

WordPress 2.1
WordPress 2.1已于北京时间2007年1月23日早上5点58分正式发布了。唉,前几天听人说是要准备1月22号发布,果然就在22号发布出来了。这个从WordPress 2.0刚发布不久就开始筹划准备的WordPress 2.1,今天终于算是圆满了。WordPress 2.1的代号是Ella,汗,说到Ella就让我想起S.H.E.了。

继续阅读《WordPress 2.1发布》

Windows自带的WordPress图标

在Windows XP里,找一个位于NTFS格式磁盘里的文件夹,在上面点右键->属性->自定义->更改图标,输入"%SystemRoot%\system32\moricons.dll",回车。把滚动条往右拖一拖,找到WordPress的那个图标,单击选中,一路点确定退出来。好了,现在这个文件夹就有了WordPress的图标了。
WordPress icon in Windows

这个moricons.dll文件是Windows XP自带的,看文件名,应该是"more icons"的意思吧。好吧,我承认,这个wp应该是Wordpad写字板的意思。这个dll文件里放的都是一些早期的图标,比如右下角的那只小狐狸,可不是Firefox哦,应该是微软收购Foxbase/FoxPro后用的图标吧。

WordPress 2.0.7发布

呼,14号才RC2的WordPress 2.0.7,今天早上5点41分就release了。上次WordPress 2.0.6是2007年1月5日发布的,这才十天时间,2.0.7就出来了。

正如WordPress官方Blog所说,这次这么着急的发布是因为有两个重要的bug需要修复:一个是FeedBurner读取feed的问题,一个是旧版PHP的bug。这次从WordPress 2.0.6升级到2.0.7只修改了下面七个文件,所以只要上传覆盖这七个文件就可以完成升级了。

  • wp-admin\inline-uploading.php
  • wp-admin\post.php
  • wp-content\plugins\akismet\akismet.php
  • wp-includes\classes.php
  • wp-includes\functions.php
  • wp-includes\version.php
  • wp-settings.php

这次的更新有如下几项:

  1. 现在删除page后,页面将会自动跳转到“管理->页面”页。[4692]
    另外,WordPress官方Blog上所说的“删除page的时候不再提示"Are You Sure?"”,乱讲!
  2. 修正在IE浏览器里向页面发送原始尺寸的图片时,"height"属性不正确的问题。[4706]
    这个bug只出现在IE浏览器里,而不影响Firefox浏览器。因为,Firefox在返回一个对象的innerHTML属性时,已经将这段html整理过,给每个标签的每个属性加上双引号。汗,Firefox真是强悍。[via]
  3. 修正某些情况下不能正确返回HTTP 304的bug。[4715]
    这个bug出现在某些PHP版本中,当magic_quotes_gpc打开时,$_SERVER数组里的某些项会被两次addslashes()。我的服务器正好有这个问题,前几天trac.wordpress.org上在讨论FeedBurner的那个bug的时候我就发现,我的feed根本不返回304 Not Modified。其他的一些资源文件,比如CSS文件,返回304是由Apache控制的,这些304都能正确返回。而Blog页面和feed等,都是由WordPress控制是否返回304的,显然问题出现在WordPress上。今天在2.0.6里做了个小hack试了一下,确实是一个双引号"前面被加了三个反斜线。不过,我自己写的PHP程序却没有这种现象发生,$_SERVER只被addslashes()了一次,奇怪奇怪。这个修正再加上下面的第五个修正,我的feed现在可以正确返回HTTP 304了。记得以前听人说,好像是车东说的,FeedBurner抓取feed时,都是先发一个HEAD命令过来,看看feed是否更新,然后再决定是否抓取,感情这么多年来,我的feed从未返回过304呀,可真是辛苦了FeedBurner了。
    另外,这个bug:#2597在2006年4月初就在WordPress 2.1里修复了,现在Mark终于想起我们2.0.x系列的用户了,555~~
  4. 针对PHP 4.4.3之前以及5.1.4之前的版本的zend_hash_del_key_or_index bug进行了修改,防止,运行在这些版本PHP之上,并且Apache的register_globals被打开的WordPress被攻击。
    这是个大bug,攻击者可以进行SQL注入,通过查询数据库获取管理员密码,然后直接登陆WordPress后台。[4717]
    详细的情况在我的这篇文章里有说明,还是推荐大家尽快更新WordPress到2.0.7。
  5. 修正所谓“FeedBurner问题”。[4684], [4724]
    在WordPress 2.0.6里,为了兼容新推出的PHP 5.2而做了一些修改,在PHP运行在非cgi方式下时,只设置了Status头,而不设置HTTP Header里第一行的"HTTP/1.1 200"。这样,当FeedBurner的服务器读取feed时,发现开头写着"HTTP/1.1 200 OK",然后后面却写着"Status: 304 Not Modified"时,FeedBurner就蒙了。然后,FeedBurner烧录过的feed就变成了一个空白页面。我想,FeedBurner是采信了前面的HTTP 200,认为这是一个正常的返回,而WordPress认为已经标记这个返回为304,所以返回的内容是空的,于是,FeedBurner就把这个空字符串写入数据库,我们就有了一个空feed。当然,这也不怪FeedBurner,据trac.wordpress.org上大家所说,Firefox 2.0也是这样处理的,除非你用Ctrl+F5刷新,这时Firefox不会发送If-Modified-Since和If-None-Match两个HTTP头,这样WP就不会返回304了。#3435
    另外,有人推荐使用header()函数的http_response_code参数,来强制PHP更新HTTP相应代码。[via #3528]这个参数是在PHP 4.3.0版被加上的,所以有了[4724]这个更新。我测试了一下,在我的服务器上加不加都无所谓。不过加上也没什么不好,以防万一嘛。
  6. Akismet从1.2.1升级到1.8.1,汗。

OK,快升级吧。

WordPress <= 2.0.6 wp-trackback.php SQL injection

WordPress <= 2.0.6 wp-trackback.php sql injection admin hash disclosure exploitWordPress <= 2.0.6 wp-trackback.php sql injection admin hash disclosure exploit, 2007年1月8日暴出的这个WordPress的SQL注入漏洞,攻击者可以通过Trackback来攻击WordPress,执行SQL语句。示例攻击程序可以读取数据库中ID为1用户的密码和用户名。因为WordPress是将用户的密码用MD5加密后存入数据库的,所以读取出来的是MD5过的用户密码。拿到密码后,可以通过伪造Cookies以ID为1的用户身份登陆WordPress。一般ID为1的用户就是系统管理员,而且WordPress安装时将其设为"admin",并且不允许修改,所以攻击成功后就可以拿到管理员身份。

这个程序要求服务器的PHP版本在4.4.3或者5.1.4以下,而且要求register_globals为on。我看了一下我的服务器,PHP版本是4.4.2。而我的Blog已经升到WordPress 2.0.6了,就拿自己的Blog做了一下测试。在服务器上放上程序,打开后,看着那串MD5字符串慢慢地,一个一个地跳出来,而且和数据库里的一字不差,那个寒呀。

又拿blog.edward.in做了下测试。(继上次测试之后,edward的Blog这次又被我拿来测试,为什么当我需要测试时,我总是第一个想起你呢,我亲爱的edward?)下面是程序的输出:

---------------------------------------------------------------------------
Wordpress <= 2.0.6 wp-trackback.php Zend_Hash_Del_Key_Or_Index /
/ sql injection admin hash disclosure exploit
(needs register_globals=on, 4 <= PHP < 4.4.3,< 5.1.4)
by rgod
dork: "is proudly powered by WordPress"
mail: retrog at alice dot it
site: http://retrogod.altervista.org
---------------------------------------------------------------------------

pwd hash   -> 6830a34a0e19cf16be362f030d96****
admin user -> ad

MD5字符串的最后4位已经屏蔽。用户名嘛,因为用户名显示的很慢,差不多要三四分钟才能出一位字符,不过看头两个字符,肯定是"admin"啦。

拿到"pwd hash",也就是MD5过的用户密码,接着关掉Firefox,修改了一下Cookies,把MD5过的用户密码再MD5一遍写进去。然后打开Firefox,登陆edward的Blog,右上角已经显示出"Site Admin"字样,点一下就可以进入后台了。
blog.edward.in的WP后台

想查看一下服务器的信息,就在插件里找了一下,找到安装了但是没启用的Akismet插件。到插件编辑器里修改这个文件,把PHP探针的代码拷进去,点更新文件后,发现插件直接没了。汗,估计是被杀毒软件给K掉了。于是,老老实实地修改了模版文件,加入一句<?php phpinfo() ?>。显示结果是这个服务器运行的是PHP 4.4.1,而register_globals也开着。

查了一下WordPress的源代码,这个漏洞是攻击wp-trackback.php文件,漏洞的产生是因为PHP的Zend_Hash_Del_Key_Or_Index函数有问题。[via]另外查了一下最新的WordPress 2.1 beta 2,这个版本怕是也有这个bug。WordPress官方已经做出更新:Changeset 4717,估计WordPress 2.0.7很快就能发布了,到时这个漏洞就可以被补上了。

WordPress 2.0.6 发布

昨晚还在想,WordPress 2.0.6应该快发布了,要准备一下,没想到今天早上一上网,看WordPress的changeset时发现/wp-includes/version.php文件已经被修改了,WordPress 2.0.6已于昨晚9点24分正式发布了。哈,从RC2到release还真是快啊。

这个版本更新不大,具体更新有下列几项:

  1. 在wp_redirect()函数后使用exit命令以结束脚本的运行。[4470]
    只不过有的地方用exit;,有的地方用exit();,呵呵。
  2. 使用$wp=& new WP();这样的代码,添加了&符号。[4487]
    开始觉得这样是为了提高执行速度,后来看了#3267,里面提到$wp = new WP();会"get destroyed before the shutdown hook is called"(在shutdown hook被调用之前销毁),而$wp =& new WP();,"This extends the life of these objects to _after_ the shutdown hook is called."(这将使这些对象的生命期延续到shutdown hook被调用之后。)
    复杂复杂,牵涉到PHP自动销毁对象的问题。
  3. 修正WordPress 2.0.5遗留的,当PHP运行在FastCGI模式时,WP使用wp_redirect()函数进行302转向时出现500错误的bug。[via] [4514]
  4. 解决当MySQL运行在strict mode时在上传文件时出现"WordPress database error: [Field 'post_content_filtered' doesn't have a default value]"错误的问题。[4530]
    现在不用再做那个数据库hack了。
  5. sidebar的按月存档(Archives)列表中的日期格式现在被i18n化了。(所有调用wp_get_archives()函数实现显示按月存档的,无论模版还是Widgets还是SBM,都将被影响)以前要把按月存档(Archives)列表改为中文日期格式需要修改WordPress源代码,点点游做的WordPress中文版就是这么做的。现在WordPress语言包已经可以控制日期格式了。
    这个事情还真是麻烦,最早是2005年7月28日有人报了bug #1540,要求把按月存档的日期格式i18n化。后来我又报了一个#3307。再后来,Ryan终于在[4545]里做了修改。不过,Ryan犯了两个错误,写错了__()函数的名称和错改了两个不该被i18n化的字符串。然后,nbachiyski报了bug #3438,要求把那两个错改的字符串改回来,结果被Mark无情地驳回。我又在#3438里对这个问题做了更详细的说明,最终Mark表示认同。Ryan在[4636][4641]里把两个错误都改正了。唉,一点点小事,费了这么大周折。
  6. gettext中,array_shift()函数的参数要求是一个变量,而非函数的返回值。[via] [4555]
  7. 修正了处理MD5字符串的正则表达式的错误。[4581]
    这儿可能引起攻击,不过我没想出攻击的办法。
  8. 在删除文章时,修改属于该文章的附件的post_parent值。[4602]
  9. 一个新过滤器"query",允许插件截获SQL语句,并进行处理。需要注意的是,有些SQL语句是在插件被载入之前被发送的,如果要对这部分SQL语句进行处理,则需要插件放一个特殊的文件做hack,并且需要使用WP 2.1才行。[4620]
  10. Quicktags(就是不使用可视化编辑器时编辑框上面的一排小按钮)现在可以在Safari浏览器中使用了。[4640]
  11. 新的anti-XSS function(防XSS跨站脚本攻击的函数)——attribute_escape()。[4656]
    其实里面就一行代码:return wp_specialchars($text, true);
  12. 添加了"js_escape"和"attribute_escape"两个过滤器。[4661]
  13. 修正了某些恶意评论破坏Blog页面的问题。#2714 [4662]
  14. 在clean_url()函数里对协议名称进行检查。[4672]
    报的bug在#3515,里面给出的代码我尝试了一下,就是下面的第一个评论。点一下评论作者名称,就会弹出一个对话框显示cookie。
  15. 接收Trackback并进行处理时的一些调整。[4677]
    这个修改有点麻烦,stripslashes()函数是不可以乱用的。[via]
  16. Blogger导入工具现在写明只能导入旧的blogger.com帐号,不能支持Google新推出的Blogger。这是因为Google在2006年12月底已经把以前的Blogger beta正式发布了。[4680]
  17. Akismet做了点小修改,把整理wp_comments表的概率从4/5降低到1/1000。

参考:在WordPress 2.0.6里被解决的bug列表WordPress 2.0.6 Content Summar。从后一个地址得到一个消息:

The WordPress 2.0 series is now officially on its way to becoming part of the Debian Stable product and as a result, and as discussed in October, patches will continue to be released in 2.0 series for the next 3-5 years.

看来,WordPress 2.0系列要一直更新下去了。嘿嘿,等到WordPress 2.0.10的时候,我就是元老啦。

WordPress 2.0.6的升级方法嘛,上传文件,覆盖,完了。有需要修改的文件,比如/wp-includes/wp-db.php文件,记得修改下。

另外,WordPress 中文包已更新,没啥变化,除了Blogger导入工具有所修改,以及“按月存档”列表日期格式的i18n化。我把月份的翻译全部改成了类似“1月”这样,然后把"%1$s %2$d"翻译成"%2$d年%1$05s",这样,sidebar里的“按月存档”就会显示成“2006年01月”、“2006年11月”这样了。要求Blog编码方式使用UTF-8时才行,因为UTF-8里汉字占3个字节,再加上两位数字,正好5位。我翻了半天PHP手册才弄出来的,很不错吧 :)

WordPress在中文世界有不少人在使用,虽然国内的IIS+ASP主机的价格比Apache+PHP要便宜很多。每次WordPress升级,都会例行性地出现一些现象:很多Blog上会写一篇文章,《WordPress 2.0.6发布啦》,然后配上从WordPress开发日志里拷过来的几条更新日志,有的直接贴英文原文,好心一点的还给翻译下。然后再贴一段广为流传的极其复杂的升级步骤,大致是“备份某些文件,停用插件,再删除全部文件,上传新文件,恢复某些文件,再一个一个启用插件。”同时,还会有一帮人大呼小叫。比如,“没必要升级新版,够用就好。”、“2.0.5和2.0.6相比哪个速度更快些?”、“中文版发布了吗?”。够用就好是不错,不过,这种小升级一般都是bug fix,你连changelog都不看就可以断定这些bug不会影响到你吗?速度更快么,这种小升级哪能比较出速度来?又不是WP 1.5和WP 2.0相比。中文版,唉,很多人需要的是中文版,中文包用不了,建一个目录上传一个文件太累了。而且,2.0.6的中文包比起上一版来只增加了几项,新中文包没出来之前,先升级了WordPress本身又能怎样?

另外,我一直认为WordPress开发组发布新版本是为了修复bug的,可是某些人却一直确信,WordPress开发组发布新版本是为了制造bug,让WordPress运行速度更慢,或者是无聊想逼着用户升级的。

P.S. WordPress 2.0.7已经在筹备中,WordPress 2.1已经beta 1了,期待ing。既然2.1已经beta了,大概WordPress开发组会把工作中心转到2.1上吧,2.1应该会在2.0.7之前发布。

Update:偶然间看到/wp-includes/wp-db.php文件的最后$wpdb = new wpdb(DB_USER, DB_PASSWORD, DB_NAME, DB_HOST);这一句还没有加上&符号,不知道会不会引起问题。WordPress开发组好像已经开始着手解决WordPress运行在PHP 5.2和FastCGI下的问题,Mark已经弄了个PHP 5.2的测试环境。svn里已经有了做了一些修改,这个问题有望在WordPress 2.0.7里和WordPress 2.1里解决。

WordPress 2.0.5里有几个攻击办法,正在研究中。

Language Switcher——在后台切换WordPress语言

2006年12月27日,突发奇想,觉得可以写一个在后台就可以很方便切换WordPress语言的插件。WordPress通过gettext支持语言包,而语言包有3种:WordPress本身的语言包、模版语言包、插件语言包。我觉得插件可以检索所有已安装的语言包(也就是mo文件),并在WordPress后台显示出来。另外,gettext的语言包总是用空字符串对应的翻译字符串来存储语言包的信息,这些信息可以显示出来供使用者参考。

这个插件花了3个下午。根据我的Google Calendar的记录:12月27日下午,5个半小时;12月28日下午,4个半小时;12月31日下午,3个半小时。12月28号晚上,写了两天,觉得差不多完成了,本来准备发布出来,但是肚子饿,跑去吃饭了,就没发。29、30号忙,又拖了两天,今天又仔细看了一下,发现还有很多或大或小的问题,比如在没修改过wp-config.php里的WPLANG常量定义时没法工作。呼,还好28号没发布出来,要不然就丢人丢大发了。又花了点时间解决了一下,现在发布出来。

插件的原理是设置$locale变量。WordPress的get_locale()函数会先读取这个变量,如果不存在才会去检查常量WPLANG。所以,本插件只要设置一下全局变量$locale,就可以绕过常量WPLANG,控制WordPress的语言。不过,当有插件使用load_plugin_textdomain()函数载入自己的语言包的时候,就会调用get_locale()函数。所以,我们的插件需要成为第一个载入的插件。这个问题在这里有过讨论,有人提出给插件添加等级,高等级的插件先载入;有人说语言包应该在插件都载入完以后再统一载入。最后,markjaquith以一句"Shouldn't plugins be able to manipulate the active plugins array to 'shuffle' themselves to the front if need be?"来结束讨论。所以,没办法,只有从插件调用顺序上想办法。查了下ASCII码表,选中了"$"符号。把插件的名字起成"$language-switcher.php",因为WordPress会按照ASCII码顺序调用插件,而大多数插件的文件名都是以英文字母开头的,所以这个插件将在其他插件之前被执行。

在后台里添加一个选项页。选项页代码里,在/wp-includes/languages/目录里查找*.mo文件,此为WordPress的语言包;在当前模版的目录里查找*.mo文件,此为模版的语言包;在/wp-content/plugins/目录里递归查找*.mo文件,此为插件的语言包。用gettext依次读取各个mo文件,把空字符串的翻译读出来,解析出各项信息,包括名称、修订日期、译者、国家、语言、编码、翻译字符串数,然后显示出来。另外,在当前正在被使用的语言包后面显示一个红色的"(active)"字样。

在选择新的语言,并点更新选项后,新的选项页面还是原来的语言。没办法,设置的更新是在代码执行到很靠后的地方才被完成的。所以,我想加一个自动刷新页面的js,在网上查了些自动刷新页面的JavaScript代码,都说可以用window.location.reload()这个函数。我试了一下,好像有点问题。因为在点“更新选项”后,浏览器是以POST方式把数据发回服务器的。所以在刷新页面时,Firefox会提示“要查看的页面含有过期数据。”,IE也有类似的提示,这样不爽啊。想了一下,用了window.location.href = window.location.href;这句代码,那个提示就没了。然后用setTimeout()函数设置让它在页面载入5秒之后执行,OK了。

拿我写的WordPress简体中文包,还有Kirin Lin的WordPress繁体中文包,还有我的K2模版中文包以及我装的3个插件的中文包做了测试。因为台湾地震的原因,点点游的中文版下不下来,要不然也应该拿来看一下。插件后台截图在这里。那个Dagon Design Sitemap Generator插件的简体中文包,明显是拿Kirin Lin大大的繁体中文包改的,连"Country: TAIWAN"都没改过来,嘻嘻。

Language Switcher插件的简体中文包也写好,一起发布啦。

请移步到“Language Switcher”主页下载软件并查看更多信息。