
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的更新比较大,WordPress 2.1(849,260字节)比WordPress 2.0.7(639,463字节)大了不少,WordPress开发组说有超过550条bug被修复。不过, 在WordPress 2.1里被关闭的ticket列表中有631条。做为一个全新的版本,而不是象WordPress 2.0.7这样的bug fix版本,我们更关注的是它新增的功能,而不是修复的bug。因为已知的bug在WordPress 2.0.x系列的更新中也有被修复。WordPress开发日志上写的有下面几项,我一一做一下翻译和解释:
- Autosave自动保存功能,确保您不会再丢失文章。(Autosave makes sure you never lose a post again. )
- Autosave自动保存,类似与Gmail的自动保存功能,可以在您写新文章的时候,隔一段时间就自动保存文章内容,避免因浏览器或操作系统崩溃造成文章丢失。这个功能只有在写新文章时被启用,等于是隔一段时间就在后台自动执行一次“保存并继续编辑”的操作。很好的一个功能,怪不得被放到第一条,毕竟,在写了很多字之后,因为浏览器或者操作系统的崩溃,或者发布文章出错,导致那么多文字丢失,是一件很令人沮丧的事情。不过,以后不能随便新建文章了,因为只有新建了文章,隔几分钟,自动保存功能触发,一篇Draft草稿就诞生了。
- 我们新设计的标签式编辑器,允许您在编辑文章时,在可视化编辑器和普通编辑器之间随意切换。(Our new tabbed editor allows you to switch between WYSIWYG and code editing instantly while writing a post.)
-
原有的TinyMCE的html代码编辑按钮被取消了。新增了"Visual"和"Code"两个标签,可以在编辑文章时,随时在可视化编辑器和普通编辑器之间切换。TinyMCE也从2.0RC4升级到2.0.8,bug肯定修复了不少。另外,可以直接在可视化编辑器里输入<小于号了,而不用再象以前那样输入html实体了。这好像更傻瓜化了吧,code也可以直接输入了。
在Nicky那儿看到,“WordPress 2.1 beta2取消了2.1 Alpha3里可视化编辑器的一些按钮功能”[via]我没怎么关注WordPress 2.1的修改过程,不太清楚这些按钮是什么时候被增加以及去掉的。不过,我拿Firefox的DOM查看器看了一下,好像有一些按钮在那里,只是被"display:none;"了而已。不妨进入您的WordPress 2.1的编辑页面,按下Alt+v,看看有什么效果,嘿嘿。
这次新增高级功能按钮有:文字样式(就是H1,H2那些)、下划线、居中、文字颜色、粘贴为纯文本(Paste as Plain Text)、粘贴为富文本(Paste from Word)、去除格式(可以把选中的部分转换为纯文本)、清理代码(Cleanup messy code,用不大着,很多时候会自动清理的,比如切换到普通编辑器时)、插入特殊符号(这个很有用,很方便)、撤销和重做(Undo, Redo,这两个以前就有了,只是现在被移到高级按钮区了)。另外,拼写检查功能在下面的第4条有介绍。
普通编辑器和html代码编辑还是有所不同的,普通编辑器里所有的
<br />和<p>都被替换成回车了。另外,以前在TinyMCE的html代码编辑器里,如果想删除一个html标签,只要在标签名称那里随便加个字符,点Update的时候TinyMCE会因为这个标签不是标准的html标签而自动清除掉它。而该标签后面对应的结束标签,也因为没有匹配而被清除掉了。这样真是很方便。另外,如果想清除一个html标签里的属性,比如每次从flickr复制图片代码过来时,都要把外层的那个title属性去掉,也是把属性名加个字符,这样这个属性就会被去掉,而整个标签不受影响。现在,html代码编辑器没了,普通编辑器又没这功能,唉,只好一条一条自己删了。 - 无损的XML导入导出功能,可以让您很方便地在不同的WordPress Blog之前转移您的Blog内容。(The lossless XML import and export makes it easy for you to move your content between WordPress blogs.)
- XML导入导出功能,使用的是WordPress eXtended
RSS(WXR)格式。这个东西应该是Matt老大写的,最早用在wordpress.com上,这里有一个人把它写成了插件。现在,WordPress
2.1集成进了这个功能,用户可以很方便地进行导出和导入,实现WordPress to WordPress
import功能。
这个WXR格式是基于RSS 2.0格式的,里面不仅输出了基本的WordPress feed的内容,还加上了WordPress自己的一些东西,包括文章的各种信息,比如文章ID、发布时间、分类、状态、缩略名等等,还有属于文章的评论,包括评论的所有状态信息。WordPress 2.1和WPMU都支持导入WXR文件,所以导出来的文件可以在另一个WordPress 2.1架设的Blog或者WPMU架设的BSP上直接导入。另外,如果有其他Blog系统想导入WordPress架设的Blog,也不用费心研究WordPress的数据结构了,直接研究这个WXR格式,用XML文件处理函数把文件中的数据解析出来就可以了。
如果你要从一个WordPress Blog转移所有数据到另一个WordPress Blog上,那么用这个导入导出功能最好不过了,你的所有文章、页面、分类、评论、自定义字段等等都不会丢失。(好像不包括链接耶)当然,这只限于BSP到自己架设、自己架设到BSP、BSP到BSP,如果是自己架设的WordPress Blog转移服务器,还是直接迁移文件和数据库更好一些,这样链接、WordPress的各种设置,以及插件模版等等都会保留。
Update:今天shurarai发email来问我:怎样从my.donews.com导出数据到自己架设的Blog上。其实my.donews.com也是WPMU架设的,只是把导出菜单隐藏起来了而已。不妨登陆进去后,进入"http://my.donews.com/yskin/wp-admin/export.php"这样的地址,点那个"Download Export File"按钮,然后在自己架设的WordPress 2.1上选择从WordPress导入就可以了。
- 我们全新设计的可视化编辑器现在还包括拼写检查功能。(Our completely redone visual editor also now includes spell checking.)
- 拼写检查功能,可以象Word那样对文章内容进行拼写检查。不过只支持英文,不支持中文。如果写的文章里有一些英文,那么用这个拼写检查功能检查一下也不错啊。不过,很多计算机方面的词它都不认识,比如"WordPress",比如"Blog"...
- 新增搜索引擎保密选项,可以让您的Blog不ping Technorati和FeedBurner等服务器,也不被Google等搜索引擎收录。(New search engine privacy option allows you take you to indicate your blog shouldn’t ping or be indexed by search engines like Google.)
-
搜索引擎保密功能,允许你设置您的Blog为隐藏状态,可以禁止搜索引擎索引收录您的Blog,这样别人无法搜索到这个Blog,只能通过其他地址链接过来或者直接输入地址访问。这个功能是WordPress通过直接接管对robots.txt文件的访问,输出禁止所有搜索引擎访问的代码,并且在输出页面时输出一个meta标签来实现的。
看起来很不错的功能,不过怕是满足不了某些人的需求。很多人提到过希望整个Blog加密,只有输入密码才能看到Blog内容。不知道为啥会有这样的需求,难道都是一些小女生写的心情日记?记得MSN Space有这样的功能,WordPress里嘛,要么你给每篇文章都加上密码,要么利用.htaccess文件让所有访问都需要密码。最好是直接用一个日记软件得了,放在本地又不会被人访问到,干嘛非要弄Blog呢。
如果WordPress使用者自己弄了robots.txt文件,则WordPress对robots.txt的接管将会失效,因为.htaccess文件里定义的是:当文件不存在时才将请求转给WordPress处理。哈哈,这个功能设计的真巧妙。
- 你可以将一个page设置为Blog的首页,而把本该在Blog首页显示的最新文章内容放在一个page里。这样你可以很容易就把WordPress变成一个CMS系统了。(You can set any “page” to be the front page of your site, and put the latest posts somewhere else, making it much easier to use WordPress as a content management system.)
- 也就是说,你可以新建一个page,起名叫"frontpage",然后到后台->选项->输出里设定"Front page"为"frontpage",则frontpage页面里的内容就会显示在首页,甚至frontpage的地址也是首页的地址。因为WordPress的page有一个功能叫页面模版,你可以专为这个首页page建立一个页面模版,从而很方便地控制首页的显示内容。再新建一个page,起名叫"posts",然后设定"Posts page"为"posts",则本该在首页显示的最新十篇文章的内容就会显示在"http://abc.com/posts/"这个page里。这样,WordPress就不再只是一个Blog系统,而更像一个CMS内容管理系统了。
- 对数据库进行操作的SQL语句变得更高效,更快速了。来自MySQL AB的Domas Mituzas将WordPress对数据库进行的所有SQL语句进行了一次细致的梳理。(Much more efficient database code, faster than previous versions. Domas Mituzas from MySQL went over all our queries with a fine-toothed comb.)
- 这一条讲的应该是整个WordPress源代码中所有的SQL操作语句被梳理了一遍,以提高SQL执行效率。wp-db.php文件好像没有什么改动,对比WordPress 2.0.7的wp-db.php文件,好像只是增加了很多注释,以及增加了对PHP 5.2的支持,以及修正了程序需要连接多个数据库时的bug。
- 链接分类现在开始支持子分类了,并且可以在添加链接时动态添加分类了。(Links in your blogroll now support sub-categories and you can add categories on the fly.)
- 链接分类现在支持子分类,因为链接分类已经和文章分类合并了。现在在添加链接的时候可以动态添加分类,就像编辑文章时一样,只要在填入分类名后点"Add",WordPress就会使用AJAX在后台添加这个分类。(又学到一个新词:on the fly,意思是dynamic, on the run。)
- 重新设计的登录页面,来自Shuttle项目。(Redesigned login screen from the Shuttle project.)
- 新的登录页面,好看的很。不过我N久没见过登录页面了,打开Firefox就直接进管理后台了。什么时候能把Shuttle项目的其他设计也整合进后台,那后台就漂亮的多啦。
- AJAX技术被用于自定义字段、评论审核及删除,使得这些操作变得更加快捷。我(Matt)最中意的是评论页面,现在批准和不批准评论都是通过AJAX实现的,不用再刷新页面了。(More AJAX to make custom fields, moderation, deletions, and more all faster. My favorite is the comments page, which new lets you approve or unapprove things instantly.)
- 将AJAX技术用于更多的地方,这样很多操作就可以变得更快捷方便了。
- page现在也可以象post一样成为草稿或者私人的了。(Pages can now be drafts, or private.)
- 私人page,不知道有啥用捏?
- 后台管理页面进行了更新,现在载入更快了,而且视觉效果也更加一致了。(Our admin has been refreshed to load faster and be more visually consistent.)
- JavaScript脚本更多了,应该是载入更慢了才是,哈哈。
- 现在Dashboard会立即显示出来,然后再在后台慢慢载入各个feed。(The dashboard now instantly and brings RSS feeds asynchronously in the background.)
- 现在Dashboard不再是先读取feed,等3个feed读取完了再一起输出到浏览器,而是先输出到浏览器,然后在后台慢慢载入3个feed,载入完成后再显示出来。这样就不会再有国内的服务器因为不能访问Technorati而导致Dashboard载入很慢的问题了。
- 评论feed现在将包含所有的评论,而不再只是最新的十条评论了。(Comment feeds now include all the comments, not just the last 10.)
- 我汗,feed里要放那么多条评论干嘛?看了一下源代码,Blog主feed(http://yskin.net/comments/feed/)还是象原来那样只显示最新的十条评论,而文章和页面的评论feed则包含所有评论。呼,还好。
- 更好的i18n支持,并支持RTL语言。(Better internationalization and support for right-to-left languages.)
- right-to-left language,就是从右到左写的语言,中文不是,日文不是,韩文不是,好像阿拉伯文是从右到左写的吧。更好的i18n支持,等我做WordPress 2.1中文包的时候就能感受到了。
- 新的上传文件管理页面,可以很方便地管理所有上传的图片,视频及音频。(The upload manager lets you easily manage all your uploads pictures, video, and audio.)
- 这次新增的上传文件管理页面还算不错,不用象以前那样总是要到文章编辑页面才能管理上传文件了。不过我不用这个功能,上传文件我都是通过ftp上传的。
- 包含了最新的Akismet 2.0插件。(A new version of the Akismet plugin is bundled.)
- 新版Akismet。这个插件国外的服务器用用还不错,国内的服务器用起来就不见得好咯。
另外官方还说WordPress里有复活节彩蛋。OMG,开源的程序也会有彩蛋,那不是很容易找么?呃,不知道"http://abc.com/wp-admin/options.php"这样的页面算不算彩蛋?
对于WordPress插件和模版的作者们,这次WordPress 2.1也提供了很多新功能。主要有:
- Psuedo-cron伪定时功能,允许你定时执行一些操作,就像真的定时功能一样。(Psuedo-cron functionality let’s you schedule events much like cron.)
-
这里提供的是伪定时功能。不要看到一个“伪”字就望而却步,我们每天编程用着伪随机函数不也照样用的很好?以前有一个wp-cron插件
,用于定时功能,不过只是个40多行的小程序。现在,WordPress
2.1自带了定时功能,而且比WP-cron插件好得多。
WP-cron插件也是伪定时功能,因为它靠的是每次有来访者访问Blog页面时检查当前时间,如果当前时间记录在数据库中的时间了,则执行预设好的操作,并修改数据库中的时间。假如你的Blog的访问者很少,比如定在上午8点执行操作,而直到10点才有访问者访问Blog,则预设好的操作要到10点才能执行。因此,这种定时功能只能算“伪”定时功能。
WordPress 2.1提供的定时功能更强大一些。WP-cron插件有一些毛病,比如,一个访问者在凌晨12点访问了Blog,正好触发了定时器,WP-cron会先修改数据库中保存的时间,并在"shutdown"添加hook。当页面输出结束后,数据库备份数据库自动备份程序开始被执行。数据库备份是需要一点时间的,所以如果这个访问者在这段时间内关闭了浏览器,那么浏览器会发送reset信号切断与服务器TCP链接。Apache收到信号后,会要求PHP解析器停止执行脚本。于是,数据库备份程序就被终止运行了。结果就是,这一天你没收到数据库备份文件。WordPress 2.1自带的定时功能则好很多,把定时程序的执行放在了wp-cron.php文件里,并使用了
ignore_user_abort(true)这样的代码来防止PHP程序因客户端断开连接而被终止运行。不过,因为用了fsockopen()函数,不知道会不会在某些服务器上不能使用啊。 - 用户管理页面现在可以很方便地处理成千上万的用户。(Users admin can now comfortably handle hundreds of thousands of users.)
- 但是我没感觉到用户管理页面有什么变化呀。或许是因为我只有一个用户吧,嘿嘿。
- 使用新的WP_Error类来进行错误报告和错误管理。(The new WP_Error class cleans up how we do error reporting and handling.)
- 这样可以用于同时报告多个错误。而且,wp_die()函数的大量运用,方便了中文用户。
- JavaScript载入器可以让插件能更容易地包含更为强大的功能。(The javascript loader makes it easier for plugins to include rich functionality.)
- WP_Scripts可以让WordPress本身和插件都能更方便地管理JavaScript脚本。
- 大量新hook和API。(Tons of new hooks and APIs.)
- 我最喜欢hook了,嘿嘿。今天在WordPress论坛看到有人把这句翻译成“成吨的...”,晕倒。
- 我们开始在代码里填入内置文档。(We’ve started to fill out our code inline documentation.)
- 以后就可以弄一个类似JavaDoc的工具来直接从WordPress源代码生成WordPress文档?
- 图像和缩略图处理函数现在允许多媒体插件调用。(Image and thumbnail API allows for richer media plugins.)
- 自定义页首、颜色选择器、图片剪裁功能。(Custom header, color picker, and image cropping framework.)
- 自定义页首(Custom header),提供一些API以便模版很方便地建立一个自定义页首选项页。Color picker就是当使用默认模版时,进入后台->模版->Header Image and Color,点击Font Color出现的那个选择颜色的框框。Image cropping frameword就是在自定义页首功能里可以裁减上传的页首图片的功能。貌似这些功能以前也有啊。
WordPress 2.0系列取得了空前的成功(空前而不绝后),下载量超过180万次。感谢Mark Jaquith的工作。我们委托他继续维护WordPress 2.0系列,进行稳定修正、安全修正和bug修复,一直到2010年。(Mark错关过两个bug报告,被我揪了出来。Terrible ticket closer)
另外,基于过去3年来在开发WordPress过程中所学到的东西,我们决定增加版本发布的频率,象Ubuntu那样,每天发布几个重大更新版本。因此,WordPress史上第一次定下下一个版本的发布日期:2007年4月23日。( Mark说,WordPress开发组将先疯狂的编写代码两个月,然后再拿一个月时间修复bug,对代码进行整理和优化。然后将发布一个新版本,并进行一个月的公开测试。不过,这些只是plan而已,呵呵。)
另外,WordPress开发组将首先考虑用户们投票选出来的功能。欢迎来我们的Idea board,说说您希望WordPress 2.2新增的功能,以及对已经提出的要求投票。(去瞅了一眼,很多人提了很多新功能要求,比如,WordPress自动升级、插件和模版自动升级、插件新版本通知、后台一键自动下载安装模版和插件、在后台关闭整个Blog、Tag支持、悬停菜单、自定义菜单、访问统计、文章阅读次数、相关文章功能、文章/页面版本管理、评论预览、发表评论时订阅评论更新、Thread comment、当请求URL和永久链接不同时自动重定向、ATOM 1.0支持、Blogroll链接点击数记录;还有一些功能增强要求,比如,"Make it faster"、禁用所有插件功能、可定制的Dashboard、增强Draft草稿功能、自定义TinyMCE工具栏、登录页面使用SSL连接、页面分类、文章模版、分类模版、修改管理员名称、删除子分类后将其中的文章转移到父分类中;还有其他一些建立WordPress官方插件库、模版库、语言包库等等。我也该去提点建议,让WordPress开发组重视一下中文的问题。)
OK,以上是WordPress开发组给我们描绘的一片歌舞升平的景象,WordPress 2.1不好的方面都只字未提,下面我补充一下。
WordPress 2.1里,MySQL最低版本要求从MySQL 3.23.23升到了MySQL 4.0,而PHP最低版本要求维持在PHP 4.2不变。[via]插件的兼容性在WordPress 2.1的测试版时很突出,但是WordPress 2.1发布之前,WordPress开发组加入了一个/wp-includes/deprecated.php文件,并把将要被移出核心的函数和变量放入这个文件里。所以,在WordPress 2.1正式版里,这些函数还都能用,比如table*变量和get_settings()函数。到WordPress 2.2时,WordPress开发组就会把这个文件从源代码中移除,所以,WordPress 2.2发布之日才是大限,现在插件的兼容性应该没太大的问题。中文WordPress工具箱也没问题。
WordPress Database
Backup插件被移出核心了。而插件作者Scott
Merill已经退出WordPress的开发,转向Habari了。[via]但是,WordPress
Database Backup未死。有人接替了Skippy继续开发WordPress Database Backup
,并已经推出了适用于WordPress 2.1的WordPress Database Backup
2.0
。这个是Scott
Merill
授权的,修正了一些bug,并同时支持WP-cron插件和WordPress 2.1的定时功能。
功能增加很多,改动也很多,等我再仔细研究一下再写。
这次升级还是比较大的,我还要观望,看看我用的模版和插件是否和WordPress
2.1有冲突。所以,很可耻是,这篇关于WordPress 2.1的文章是在WordPress
2.0.7里写的。K2模版最近做了很多升级,大多都是针对WordPress
2.1提供支持的。现在K2的最新版本是r279。最近听很多人说,他们在使用“最新版的K2 0.9.1”,OMG,K2
0.9.1是去年8月底的事了,为啥就不去K2
Nightlies下载新一点的版本呢?插件也要看一下,现在WP
2.1已经正式发布了,一些插件作者应该开始着手进行升级了。WordPress文档里有一个插件与WordPress
2.1兼容性列表,不兼容的插件也就几个,我只认得
BLC。
插件的兼容大多出在使用了$table*变量,在WordPress 2.1里要换成$wpdb->*,象中文WordPress工具箱就是这样,桑椹在1月18日说,“大概得等
2.1 出来了以后,我才会有动力修改吧”[via]
在我的Blog上放一个下载:WordPress 2.1 下载(MD5: 749D46D7A6D82E6B4DB03962D7AB0FDE,文件大小:849,260字节),现在http://wordpress.org/download/上下载好慢,估计WordPress的服务器快被疯狂下载的人群挤爆了吧。还好我早上就下了,早起的鸟儿有虫吃,啦啦啦。
升级的步骤嘛,虽然我还没升级,不过恐怕还是直接上传覆盖就完了。当然,这些怕是要检查一下插件,看看有没有不兼容的情况。而且,升级完文件后,进入后台肯定会弹出要求升级数据库的提示,直接点进链接升级下数据库就完了。
中文包嘛,最近几天在修改WordPress 2.0.7的中文包,全部1388条字符串,一个一个地找出源文件中的对应位置和后台显示出来的位置,有些名词要仔细地找最合适的中文翻译,有的要做搜索引擎选举,还要,弄了好几天才弄了50%。WordPress 2.1还有将近400条字符串要翻译,唉。我还是要把WP 2.0.x的中文包弄好再开始弄2.1的,不然仓促弄出来太对不起观众了。
Kirin Lin的WordPress 2.1繁体中文包和点点游的 WordPress 2.1中文版都已经发布了,他们从很早就关注WordPress 2.1,并且制作了多个WP 2.1 alpha和beta版本的中文包,所以现在做WP 2.1正式版的中文包很快。还有,今天偶然发现Wady自己制作了一个WordPress 2.1中文包。WordPress 2.1中文包,1364条字符串,全部翻下来很不容易啊。而且Wady还认真研究了__ngettext()函数,最后在Kirin Lin的中文包里找到了答案。这个函数老早就在WordPress里了,但是一直没有被调用过,所以WordPress 2.0.x系列的语言包里就不需要加这个关键词。从WordPress 2.1开始,这个函数开始被大量使用。我在WordPress 2.0.6发布的那天研究了下这个函数,并在网上找了一圈资料,也参考了Drupal中文包制作者们的一些说明,最终才知道该怎么处理。唉,我太笨了,象Wady一样参考一下Kirin Lin的中文包不就行了?点点游一直在用WordPress官方的pot文件。记得以前WP 2.1 beta版的时候,WordPress官方的pot文件并没有加这个关键词,直到2006年12月24日点点游的 WordPress 2.1 Alpha3 r4662里都还没加上。不过,从点点游的 WordPress 2.1 beta2开始,pot文件就已经增加了这个关键词,看来WordPress开发组注意到了这个问题,又或者有WordPress语言包作者提出了这个问题,所以,现在已经没问题了。不过我还是保持着从WordPress源文件更新po文件的习惯,我更相信我的POEdit,嘿嘿。
等我过几天做WordPress 2.1中文包的时候,我就有3个中文包可供参考,多么幸福啊,哇咔咔咔。
在Windows
XP里,找一个位于NTFS格式磁盘里的文件夹,在上面点右键->属性->自定义->更改图标,输入"%SystemRoot%\system32\moricons.dll",回车。把滚动条往右拖一拖,找到WordPress的那个图标,单击选中,一路点确定退出来。好了,现在这个文件夹就有了WordPress的图标了。

这个moricons.dll文件是Windows XP自带的,看文件名,应该是"more icons"的意思吧。好吧,我承认,这个wp应该是Wordpad写字板的意思。这个dll文件里放的都是一些早期的图标,比如右下角的那只小狐狸,可不是Firefox哦,应该是微软收购Foxbase/FoxPro后用的图标吧。
呼,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
这次的更新有如下几项:
- 现在删除page后,页面将会自动跳转到“管理->页面”页。[4692]
另外,WordPress官方Blog上所说的“删除page的时候不再提示"Are You Sure?"”,乱讲! - 修正在IE浏览器里向页面发送原始尺寸的图片时,"height"属性不正确的问题。[4706]
这个bug只出现在IE浏览器里,而不影响Firefox浏览器。因为,Firefox在返回一个对象的innerHTML属性时,已经将这段html整理过,给每个标签的每个属性加上双引号。汗,Firefox真是强悍。[via] - 修正某些情况下不能正确返回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~~ - 针对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。 - 修正所谓“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]这个更新。我测试了一下,在我的服务器上加不加都无所谓。不过加上也没什么不好,以防万一嘛。 - Akismet从1.2.1升级到1.8.1,汗。
OK,快升级吧。
被nonozone点名了,这是我第一次参加这种游戏。下面回答他提出的5个问题。
- 如果你的MM不说话,你要怎么哄她?
道歉,不说话总是有原因的嘛,道歉并改正错误,让她满意不就行了嘛。 - 你早上起床的时候是先穿上衣还是裤子?我说的是内衣,嘿嘿。
深圳一年有¾的时间是穿短袖的,不用穿内衣。现在1月份还算有点冷,气温都降到10度以下了。早上起床嘛,就拿今天来说,上面的贴身羊毛衫昨晚没脱(因为我的被子薄),起床后先穿内裤,然后是裤子,然后是外套。 - 如果有一天地球上只剩下你,你要怎么找乐子?
如果地球上只剩下我,而根据常识,人类是不能无性繁殖的,所以,我要哀悼人类的毁灭,然后游览地球上的名山大川,最后要写下人类毁灭的原因,然后用Google翻译翻成多种语言,以告知后人(或者后面的什么动物)。 - 你觉得生活美好吗?
美好,只要互联网还在互联着,只要我能方便地接入互联网。2006年12月26日晚上8点半的台湾地震让我们,尤其是依靠MSN进行联络办公的人,如此的不知所措。还好我找了个澳大利亚代理用着,访问WordPress网站速度很不错。还有我这里一直上不了flickr,今天想了个好办法,改了cookie,终于上去了,bingo。 - 你觉得nono是一个非常有魅力的人吗?
不知道,不熟。不过凭以往的一点接触,还有他的Blog页面最下方的那串PHP错误信息来看,技术菜鸟是无疑地,嘻嘻。
呃,问题回答完了,还要想5个新问题传给另外5个人。物以类聚,人以群分,我和nono都在小明的WordPress群这个小圈子里,我认识的几个都被nono点完了,让我上哪去另找5个人啊。而且,记得以前听人说,好像是听嘿熊说的,cc协议和GPL协议最让人讨厌的,就是它要求使用者也要继承这个协议。比如一个程序里使用了一个GPL协议发布的函数,它也只能以GPL协议发布。这个游戏和GPL一样,也要求接的人再点5个人的名,可是我实在点不出来啊,唉,放弃。
P.S. 今天看《猫和老鼠》(TOM and
JERRY),看到了一个眼熟的词,AJAX。赶紧打开KMPlayer,截下一个全屏截图。

一直都在想,如果有一个Firefox扩展,可以在工具栏增加一个按钮,点击一下就可以把当前页面的URL中的数字加1,自动打开下一个页面,那该是多好呀。不过,一直忙,没有抽空去找这样的Firefox扩展。
今天突发奇想,觉得可以用JavaScript做这件事情。没研究过JavaScript,靠着一点C++的底子写了一小段JavaScript代码。这段js可以放进Firefox的书签或者IE的收藏夹,点击它一下就可以打开当前URL的下一个地址。(也就是把URL中的数字加一)比如,当前页面的地址是"http://yskin.net/1.html",则点击页面后自动打开"http://yskin.net/2.html"。哈哈,我也会写JavaScript啦,bingo
所有WordPress架设的Blog,不论是否使用了永久链接,都可以通过"http://yskin.net/?p=1"这样的方式进行访问。另外,如果想一页一页的看,可以使用"http://yskin.net/?paged=1"这样的地址,依次加下去,就可以10篇10篇地看完所有文章了。所以,如果想遍历一个Blog的所有文件,用这个JavaScript最合适了。
随手打开抓虾,找了里面添加链接的代码,弄了下面这个东西,很方便吧。
如果你的浏览器是IE,右键点击下面的按钮,选择“添加到收藏夹”,忽略弹出的安全提示,接着选择存到“链接”目录,点击确定。
如果你的浏览器是FireFox(握手握手),把这个按钮拖到浏览器的工具栏中即可。
![]()
Firefox 1.5.0.6和IE6 SP2下测试通过。
Update:升级,1.1,现在可以正确处理数字前面包含"0"的URL。
Update2:希望各位使用者到网站来右键添加链接,而不要直接在feed里添加。我倒不是为了访问量,只是刚刚发现在Bloglines里这篇文章的JavaScript代码都给过滤掉了。
《有趣的Unicode的BOM》,这个文章标题抄自周曙光的网络日志的这篇同名文章。抄标题的原因,详见文章末尾。呃,看到这里,你的手动了没?动了就是好奇心很强的人。如果是用鼠标拖动滚动条,电脑白痴;按PageDown键或者End键,电脑菜鸟;按Space键或者滚动鼠标滚轮,电脑高手。因为,“不知道IE工具栏第一个按钮的功能的,是普通用户;知道的,是高端用户。”
今天偶然看到那篇文章。(没有订feed看的习惯,555~~)Unicode这玩意很简单,又很复杂,值得好好研究。BOM这东西,有人说它是好东西,有人说它是罪魁祸首,反正说什么的都有。
文章提到3个问题,前两个是我所熟知的,最后一个我是第一次听说,而且在Google搜索一下,只有两个网站提到,自然,一个是我看的这篇文章,一个就是该问题的 出处咯。
用Windows记事本写txt文件,在文件开头加入".LOG"字样,那么在每次打开文件时,记事本会自动在文件最后加上当前日期。这个是N久以前的,在Windows 98的时代就有的一个特性。我还记得当时Windows 98发布时,报纸上经常提到这个技巧,说是Windows 98的新功能。另外,微软网站的文档《How to Use Notepad to Create a Log File》里也介绍了这一技巧。(当年Windows 98发布时,我是多么的激动啊,现在的Vista已经没感觉了,唉,年轻不再)这个小技巧好像直到现在还是经常被提起,比如在各大电脑杂志上。而且,经常有人说这是复活节彩蛋。拜托,按下Ctrl+R,输入winrar,回车,点帮助,关于,点一下上面的图片和左边的图标,那个叫复活节彩蛋。隐藏在你身边,在某个值得纪念的日子,比如复活节,被开发商公布看到的办法,或者是你偶然发现,得到的一个惊喜,那个才叫复活节彩蛋。
联通的问题。“联通”二字的编码是"C1AACDA8",当记事本读取的时候会出现判断错误,认为这是一个UTF-8编码文件,以UTF-8编码方式打开,所以出现错误。虽然显示出来的是一个黑块,不过可并不是只有一个字符哦。C1AA的二进制是1100000110101010,按照UTF-8两字节来拆开,Unicode编码是1101010,也就是6A,而两字节的UTF-8要在80以上才能使用,所以这个UTF-8编码是不存在的,所以记事本不显示。而CDA8,二进制1100110110101000,拆开的Unicode编码是1101101000,也就是368。在宋体字符里查了一下,查不到,不知道是那个国家的编码,反正是显示不出来就是了,只能显示一个黑块。所以,文章最后给出的答案,“第一种情况是将联通的Unicode编码54801A90当成ASCII编码解析,所以出现一些方块乱码”,乱讲。还有xfocus论坛2004年1月的 这个帖子,说4个字节中,前3个字节被当作BOM,只有第四个字节显示出来,乱讲 too. 不过,能知道UTF-8的BOM是3个字节,已经很高手了。
第三个问题,在记事本中输入"this sentences are notreadable",保存后再打开时变成中文乱码。这个事也是编码判断错误。其实想看记事本把它错误判断成什么编码是很简单的,在打开文件后,点文件->另存为,下面的编码一项就是记事本所认为的文本的编码方式。另外,在文件->打开里,选中一个文本文件,记事本也会立即进行识别,并把认为的编码方式显示在对话框下面的编码项中。(起码在我的Windows XP SP2里是这样的)这个字符写入文件后会被记事本认为是所谓的"Unicode"编码,也就是UTF-16编码。这也是记事本对编码判断的错误。xfocus论坛的 那个帖子,说是什么Unicode头,乱讲 too.
联通的问题和第三个问题,都是记事本编码判断错误的问题。这显然不是复活节菜单,也算不上bug。你不告诉软件所打开的文件的编码方式,他当然只能猜咯。猜总是会猜错的嘛。比如行尾符的问题,假如你的文件里就没有换行符,软件又怎么能给你判断呢?不止记事本,就是UEStudio,在打开有“联通”那两个字的文件时,也是认为是UTF-8编码,而且它还把C1AA这个编码给解析出来了,6A对应的字符的小写字母"j",它给显示出来了。不过,经常在网上或者电脑杂志看到这个火星贴被翻出来,还大都加上什么“已经打了最新的SP2”补丁之类的。唉,就知道SP2,SP2出来很久了,那么多Hotfix打了没啊?
最后,该点题了。“有趣的Unicode的BOM”,其实是最可怜的BOM。上述三个问题,和BOM一点关系都没有,可是后两个所谓的“Windows的bug”却被硬赖在BOM身上。我们的BOM,我们的Byte Order Mark,是多么的可怜啊。其实记事本在UTF-8和UTF-16编码的文件开头写入BOM并没有错,因为下次再用记事本打开的时候它就好识别了呀。那么多电脑菜鸟,有谁会在发现乱码之后,在打开对话框里调一下,选择一个正确的编码啊?只会脱口而出:“Windows的bug,Windows真难用。”
P.S. 后两个问题可以作为测试题。当别人回答你“不知道”的时候,电脑白痴;回来“是编码的问题”,电脑菜鸟;提到"Unicode",电脑高手;要是提到BOM,这个人你一定要抓住啊,他就是所谓的牛人啊。在这个知道IE工具栏第一个按钮的功能就是高手的年代,能吐出"BOM"三个字,那是多么牛的人啊,虽然,虽然BOM和这两个问题一点关系都没有。
PS2 找到新浪的一篇报道《微软记事本“闹鬼” 常用汉字输入变黑点》,2003年的,或许联通的问题就是2003年才出现的吧。还有这篇《关于“微软/联通”记事本问题的解释》,介绍的也很详细。“当文档中所有字符都在C0≤AA≤DF,80≤BB≤BF这个范围的时候,notepad都无法确认文档的格式,没有自动按照UTF-8格式来"Display"。”这话好像说反了,如果所有字符都在(C0-DF, 80-BF)这个范围内,文件就会被以UTF-8编码解析。至于原因嘛,嘿嘿,这个范围正好是UTF-8两字节编码的范围:110xxxxx 10xxxxxx (c0-df)(80-bf)。而我觉得,事实上Windows记事本所采用的判断编码的策略,其实就是以UTF-8编码方式解码,如果解码过程没有出现错误,也就是说这个文件按UTF-8编码方式解码没有问题,没有不符合UTF-8编码的字节,那么,记事本就认为他就是一个UTF-8文件。这也是没办法,对于没有BOM的文件来说,只有这个办法。而且,在PHP里判断编码方式也是用的这种办法,我写的程序也是用的这种办法,想要更好的办法?更好的办法就涉及到解析字符串,分析出里面句子的意思,判断是否是符合逻辑的句子了。
今天在写插件时,需要在一段字符的title属性里加入一大段文字。字符串本身用UNIX行尾符LF换行。我直接输出字符串,发现在IE和Firefox下都可以显示出断行。
<div title="123
456">text</div>
不过,Firefox的Html Validator扩展报了错。在网上搜了一圈,这里提到:
The (X)HTML DTDs define the contents of the title attribute as CDATA for which the W3C states:
User agents should interpret attribute values as follows:
- Replace character entities with characters,
- Ignore line feeds,
- Replace each carriage return or tab with a single space.
大概的意思是,XHTML DTD定义title属性为一个CDATA,而根据SGML里CDATA的定义,浏览器应该:替换所有html实体;忽略LF字符;替换所有CR字符和tab字符为一个空格。
按照W3C的说法,执行这3步后,所有的CR和LF字符已经他们的html实体都已消失或变成空格了。看起来在title里换行变成不可能的事了。不过,Firefox好像并没有转换CR字符为空格,而是把CR给忽略了。而LF字符倒是没有被处理,直接换行了。上面的代码,不用UNIX行尾符LF,而是用Mac行尾符CR,在IE下还能换行,但是在Firefox下,CR字符直接被忽略了。我还是很想通过W3C的验证,所以做了一下测试,使用LF字符或者LF的html实体
& #10;都是可以的。网上流传说可以用CR的html实体&
#13;,其实只是IE中可以,Firefox下一样不行。如果不追求符合W3C,那还不如直接把字符串转成UNIX行尾符输出呢。
<div title="123& #10;456">text</div>
还有,title里有小于号和单引号好像并不要紧,但是有双引号就不行了。这么说来,把字符串里的换行和双引号给替换一下输出就行了?唉,复杂复杂,晕了。这里有一个介绍这方面问题的页面,不过没太看懂。
发现CR的全称是Carriage Return,Carriage是字车的意思,Carriage Return意思是字车复位。LF的全称是Line Feed,喂进一行,就是新起一行的意思。这起源于打字机时代,每打到一行的末尾,打字员要手工把字车推回第一列,字车复位后,纸会上升一行。所以就有了ASCII码值为13的CR和ASCII码值为10的LF两个字符。而DOS和Windows下文本文件的新行用CR和LF两个字符表示,UNIX下用LF,Mac下用CR。呼,这些资料大概在上个世纪我就知道了,不过一直记不住两个字符的ASCII码是多少,现在复习一遍,这下我应该能记住了。[via]
P.S. 好像C++里"\n"在Windows下输出CRLF,在UNIX下输出LF,而"\r"输出CR。PHP里是"\n"输出的是LF,"\r"输出的是CR。[ via]
昨晚还在想,WordPress 2.0.6应该快发布了,要准备一下,没想到今天早上一上网,看WordPress的changeset时发现/wp-includes/version.php文件已经被修改了,WordPress 2.0.6已于昨晚9点24分正式发布了。哈,从RC2到release还真是快啊。
这个版本更新不大,具体更新有下列几项:
- 在wp_redirect()函数后使用exit命令以结束脚本的运行。[4470]
只不过有的地方用exit;,有的地方用exit();,呵呵。 - 使用
$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自动销毁对象的问题。 - 修正WordPress 2.0.5遗留的,当PHP运行在FastCGI模式时,WP使用wp_redirect()函数进行302转向时出现500错误的bug。[ via] [4514]
- 解决当MySQL运行在strict mode时在上传文件时出现"WordPress database error:
[Field 'post_content_filtered' doesn't have a default
value]"错误的问题。[4530]
现在不用再做那个数据库hack了。 -
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]里把两个错误都改正了。唉,一点点小事,费了这么大周折。 - gettext中,array_shift()函数的参数要求是一个变量,而非函数的返回值。[via] [4555]
- 修正了处理MD5字符串的正则表达式的错误。[4581]
这儿可能引起攻击,不过我没想出攻击的办法。 - 在删除文章时,修改属于该文章的附件的post_parent值。[4602]
- 一个新过滤器"query",允许插件截获SQL语句,并进行处理。需要注意的是,有些SQL语句是在插件被载入之前被发送的,如果要对这部分SQL语句进行处理,则需要插件放一个特殊的文件做hack,并且需要使用WP 2.1才行。[4620]
- Quicktags(就是不使用可视化编辑器时编辑框上面的一排小按钮)现在可以在Safari浏览器中使用了。[4640]
- 新的anti-XSS function(防XSS跨站脚本攻击的函数)——attribute_escape()。[4656]
其实里面就一行代码:return wp_specialchars($text, true); - 添加了"js_escape"和"attribute_escape"两个过滤器。[4661]
- 修正了某些恶意评论破坏Blog页面的问题。#2714 [4662]
- 在clean_url()函数里对协议名称进行检查。[4672]
报的bug在#3515,里面给出的代码我尝试了一下,就是下面的第一个评论。点一下评论作者名称,就会弹出一个对话框显示cookie。 - 接收Trackback并进行处理时的一些调整。[4677]
这个修改有点麻烦,stripslashes()函数是不可以乱用的。[via] - Blogger导入工具现在写明只能导入旧的blogger.com帐号,不能支持Google新推出的Blogger。这是因为Google在2006年12月底已经把以前的Blogger beta正式发布了。[4680]
- Akismet做了点小修改,把整理wp_comments表的概率从1/1000提高到1/5。
参考: 在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.6的升级方法嘛,上传文件,覆盖,完了。有需要修改的文件,比如/wp-includes/wp-db.php文件,记得修改下。
另外,WordPress 中文包已更新,没啥变化,除了Blogger导入工具有所修改,以及“按月存档”列表日期格式的i18n化。
P.S. WordPress 2.0.7已经在筹备中,WordPress 2.1已经beta 1了,期待ing。
