WordPress 2.3: Tag It or Not ? 标签海前的犹豫不决

WordPress Logo

时值中秋佳节之时,WordPress官方也终于发布了它们的最新礼物:WordPress 2.3正式版。其中新增的内置标签分类系统是本次更新的亮点。

然而对早已拥有数种标签插件的WordPress来说,这次升级却让老用户(包括店长)犹豫起来——鉴于WordPress 2.3对数据库结构和分类系统都做了较大的调整,类似Jerome’s Keywords,Simple Tagging和Ultimate Tag Warrior等等比较流行的插件都将被逐步淘汰……该选用默认工具呢?还是保留加强套餐?

经过昨天对客栈数据库的反复折磨(破坏性实验),店长最终决定将系统升级至WordPress 2.3,这里向各位提交我们的试用报告。无论你是新手还是熟客,希望本文会对你的WordPress生活带来帮助。

WordPress 2.3 vs WordPress 2.2

WordPress 2.2.x VS WordPress 2.3 使用篇

WordPress 2.3为初级用户作出了什么调整?如果WordPress 2.3是技术上的又一次飞跃,那对于普通用户来说,这个飞跃是否显而易见?在本节我们会大致浏览一下2.3相对2.2的功能改进(除了标签之外)。

I. 所见即所得编辑器(WYSIWYG Editor)

WYSIWYG Editor

WordPress系统一向以简洁和标准性著称,因此无论是后台界面还是前台内容,都尽可能的符合W3C标准来配置。2.3版以前的WordPress的所见即所得编辑器就是一例:WP2.2使用修改过的TinyMCE,在生成代码时有诸多的限制,也不方便用户添加功能。但简洁也是有代价的,看似干净的界面并不能满足许多个人用户的需求,因此在2.3版中WordPress的开发团队专门保留了扩展功能,类似段落,字体颜色和特殊符号现在无需另外激活了。

店长感想:对于使用离线编辑器或是直接写代码的我来说,WYSIWYG编辑器只是累赘;但我相信95%以上的网民更倾向于在自己的网站上完成作文,提供一个比2.2.3完整的编辑界面是对广大WordPress用户群的妥协(正面的)。

小提示:确保你的插件使用[abc]而不是<abc>作为替换字串,TinyMCE会毫不犹豫的抹杀非法HTML标签(默认允许标签参见wp-includes下的kses.php)。

II. 文章状态(Post Status)

Post Status

允许将文章标记为等待验证(pending review),方便管理者检查后发布。2.3以前的状态系统让拥有过多的草稿(draft)成为头痛的事情,因为后台没法分类显示处于不同状态的文章,一堆草稿显示在编辑页面的上方也让人心烦。新版本的界面让管理文章有了快捷的选择。

店长感想:对于多人博客来说又是一大喜讯,这倒像是为了方便网站管理者而开发的功能。

小提示:未发布过的草稿/等待验证的文章都没有发布时间,因此要选择Status为相应的值才能找到它们。

III. 更新检查(Update Notification)

Update Notification

使用WordPress的最大优势莫过于其灵活的插件系统,甚至有“溺爱开发者”的好评流传……对于WordPress新手来说,下载插件,上传插件,点击启动这三个安装步骤也非常容易掌握。剩下的问题,似乎只有更新插件的烦恼了。

而WordPress的开发团队也非常适时的加入了插件版本检查功能,通过官方的插件目录API,用户能及时掌握插件的更新情况,并从官方网站下载新版本。

店长感想:更新检查让我想起客栈鸡尾酒吧使用的Vanilla论坛系统,至少现在我们不用在个人网站上寻找“更新”的字样了。至于WP自身的更新提示,似乎有点多此一举?也许对升级有敦促作用吧。

小提示:喜欢使用老插件/系统?或是单纯的不想连接到官网?这里有个小巧的禁止检查插件(相信下个官方版本会加入此选项。)

IV. 规范链接(Canonical URLs)

这可能是2.3最让网站主振奋的功能。WordPress 2.3的神奇之处就是它强大的链接美化功能,但2.3将链接美化提升到了新的高度,所有连接到某个特定页面的链接方式,都会被正确的重置(301 Redirect)到同一个规范连接上。

例如客栈的首页,其实这些链接都会给出相同的内容

https://bitinn.net/

http://

https://bitinn.net/index.php/

https://bitinn.net/?paged=1

https://bitinn.net/page/1/

他们都会被重置到第一条的链接,这就是规范链接的雏形。经过开发团队多次调整,这个功能在2.3得以比较完美的实现。本功能会在文章,页面,标签等等多种连接上起作用。另一方面,如果你在发布帖子后修改了帖子的slug(缩略名),则输入旧版的slug也会自动转向到新的连接上,这也是相当人性化的改进。

店长感想:无论你是懒人还是搜索排名狂,自动转向都是管理网站的好帮手。

小提示:有冲突?自然有WordPress插件帮你缓解压力。

V. 其他更新

1. 无过滤上传,WordPress的Admin级别现在能上传任意格式的文件。

2. jQuery,在2.2版本时开发团队就决定要逐步从Prototype向jQuery转移,新版的Dashboard好像真的比旧版快一些。

3. 永久链接结构,加入了对分类/标签文字的替换(默认为category和tag)。

值得普通用户关注的更新大致就到这里。

WordPress 2.2.x VS WordPress 2.3 技术篇

(如果你不在意技术问题,请跳过本节。)

内核才是将2.3与2.2从本质上区别开的地方。对Taxonomy(分类系统)的完全更新是本次标签系统的根基,同时也是许多问题的来源。

先来说说升级前的数据库状况——

categories 包含 2.3以前“分类”的数据,id,名称,缩略名,条目数量等等。

link2cat 包含 2.3以前“链接”的数据,特有id,自身id,以及对应分类的id。

post2cat 类似 link2cat,唯一的区别是它们对应“文章”和“页面”

这三个数据表在升级2.3后会被抛弃。这自然会引起所有直接查询这三个表的插件乃至主题风格的罢工。因此如果你是某个老风格/插件的使用者(或是过于现代化的K2),都必将迎来一大轮汗水与泪水交杂的更新时光。引用开发者Ryan Boren的,就是“既然这个更新会引起兼容问题,不如做得彻底一些,直接做个完全不同的更好用的分类模式出来……”

于是新的Taxonomy API诞生了,它在三个新的数据表上工作——

WordPress New Database Schema

terms 同时包含“分类”和“标签”新旧两种分类方式,包含了特有term_idname为实际显示的字串,slug为缩略名(用于生成URI),term_group将同类term分组(暂时没投入使用);

term_relationships 和原来的link2cat/post2cat结构类似,不过post和link并存于这个表,object_idpostslinks表里对应的id,而term_taxonomy_id是object所属term在另外一个表term_taxonomy里的特有id;

term_taxonomy 是定义term类型与内容的表。term_taxonomy_id是term的特有id,term_id对应term在terms表里的特有id,taxonomy控制term的类型,descriptionparentcount分别记录对应term的描述,父层term的id以及与term有联系的object个数。

呼,这里还真多特有名词,让我们来解释下两个名词在WordPress 2.3里的基本意思。

term:任何分类(文章分类/链接分类)和标签,都属于term。

object:指任何文章,页面和链接。由于链接和文章处在不同的表,很明显它们的object_id可能重叠。

简单总结下,terms表定义标签和分类的名称,term_taxonomy包含了term的类型和其他信息,而则是term_relationships描述term与object之间的关系。

这样的分类系统对WordPress有什么好处,又会带来什么混乱?

优势

  • 可延展性:原来的分类模式让增加功能变得繁琐,例如当你希望添加与“分类”有不同性质的“标签”时,尽管它们的内容几乎相同,你却没法将两者放在同一个表里。

  • 集中控制:既然标签和分类包含类似的信息,为什么不将它们集中管理?

  • 简化模型:post和link都属于object,category和tag都属于term,这样的抽象分类有助于规划简洁的代码。

劣势

  • 无兼容性:我们已经说过大部分自行提供标签功能的插件都已无法运作,因为它们与新的Database Schema有冲突;进一步说,这些插件都将停止开发,取而代之的,是WordPress 2.3缺乏的标签管理系统。从官方的语气上看,标签管理的空白似乎是刻意的,开发团队希望由WordPress社区的广大开发者来设计一款最好的插件,在2.4版时加入默认系统。

  • 定义混乱:WordPress 2.3发布后,许多用户提出的疑问,今后用“分类”还是“标签”?的确,尽管2.3附带了分类->标签的转换工具,却缺少实用的管理工具,让普通用户焦头烂额。

另一方面,鉴于标签的定义,它们是不该有hierarchical relationship(层次关系)的,而分类则可以(例如“小说”分类可以是“文学”分类的下层),从分类向标签转换时是否会再次混淆这个定义呢……有待观察。

WordPress 2.2.x VS WordPress 2.3 取舍篇

回顾WordPress 2.0之后的每次大规模更新(2.1/2.2/2.3),似乎都会调整数据库和融入新功能,而这次的两道主菜分别是全新的分类模式大红大紫的标签系统;同理,2.3的升级代价依旧是你的插件/风格需要更新,除非你是那种一概使用默认的人……升级是否值得?是本节讨论的重点之一。

I. 你对标签工具的依赖程度:

Simple Tagging Importer

让我们尊重事实,当前的标签小屋只能用潜力无限来形容,它有成为富丽堂皇的豪宅的将来,但未来还很遥远

就拿客栈使用的Simple Tagging来作比较——嵌入标签,相关文章,标签建议,批量修改,对”.”号的支持,自定义tag cloud……等等功能的逝去让我们悲痛不已……是的,数个代替品已经浮出水面,但它们相比Simple Tagging还简陋得可怜,再者,谁愿意将一个插件拆成6-7个来安装?

另一方面是URI的生成,升级之后我们才发现WordPress内置的Simple Tagging数据导入器会将默认使用下划线代替空格的slug变成用连字符代替,这毫无疑问破坏了客栈的原有链接(例如Suzumiya_Haruhi变成Suzumiya-Haruhi)。最后店长不得不自行写了个插件暂时回避问题(相信不久的将来我可以将规范链接的功能用上。)

如果你从不使用标签插件,则你在升级时无需考虑这个负面因素。

II. 你的插件/模板是否与被替换的数据表有关:

官方已经有比较简单的插件/模板兼容列表,如果你使用的插件/模板不在列表上,有个简单的检查步骤:

  • 确保你的插件不直接查询categories,link2cat,post2cat这三个数据表;

  • 旧模板显示友情链接和文章分类要使用官方提供的Template Tags,或者修改至使用新的数据表。

假如有大量的插件/模板进入了危险地带,则应等待插件作者更新后再升级,避免整个网站长时间停摆;反之可自行调整或暂时禁用。

III. 你对新功能是否感兴趣:

对于初级用户来说,2.3的明亮前程其实很朦胧。我们在内核篇所提及的技术更新都是为了将来的开发铺路,并没有直接影响到用户当前的使用习惯。如果你对新加入的功能并不满意,留待2.3.x乃至2.4再更新也许是明智的选择(当前2.2.3版本并没有公开的安全漏洞)。

小结:本次更新对习惯“默认系统”的用户来说是小菜一碟,升级也没什么大不了;反倒是大量安装插件的用户要注意升级带来的负面影响。

WordPress 2.2.x VS WordPress 2.3 捷径篇

ok,倘若你决定要大胆升级,以下是些值得参考的信息——

1. 内置标签系统支持”+”号和”,”号选择数个标签,例如在客栈上

https://bitinn.net/tag/Moe,Otaku/ 代表所有包括MoeOtaku标签的文章。

https://bitinn.net/tag/Moe+Otaku/ 代表所有包括MoeOtaku标签的文章。

2. 新模板标签the_tagswp_tag_cloud,默认风格已经更新,可以参考。

3. 导入器,除了默认的几个导入器外,现在也可以通过插件导入数据,相信很快会有正规插件从其他Blog平台转移到WordPress(例如流行的PJ-Blog)。

4. 代码查询,曾经为寻找一个函数而翻遍WordPress?这是你的救星。

5. 标签管理,目前比较好的几个插件为——

Incoming Links at Dashboard

6. Dashboard,有点怀念你的Technorati链接?还是想看看除了WP Planet以外的文章?现在修改wp-admin下的index-extra.php就能实现!

将Google Blogsearch的链接替换为”feeds.technorati.com/cosmos/rss/?url=”能显示最新的连入链接,而”technorati.com/blogs/你的链接?reactions”能做到以前的More Links功能。

7. 如果你对新标签系统的连字符”-“比较反感,参考Ryan写的插件能变为用下划线”_”作为标签中空格的替代。

被替换的sanitize_title_with_dashes()负责对所有slug的处理,更变之后会影响今后发贴时永久链接的结构(已发布的帖子不会改变)。这个函数与添加标签的函数关系如下——

wp_set_post_tags() 是修改tag信息的基本函数,包括wp_add_post_tags()都会调用它。

wp_set_post_tags() 通过wp_set_object_terms()完成对特定object的设置,这里当然是将文章标上tag(数据库里叫post_tag)

wp_set_object_terms() 引用wp_insert_term()添加不存在于数据库的新term,这里term特指post_tag。

判断term是否存在和添加term时都会调用sanitize_title()来过滤字串,而它通过filter引用sanitize_title_with_dashes()。

可见WordPress对重复利用代码非常重视,之前提及的抽象分类就是为了这种优势而设计的。

因此只要将这个filter移除,换上自己写的filter就可以修改slug的生成方式了。详细情况请到本节第四条建议的网站查询。

8. 留意标签添加的bug,如果在最后一个tag后面再加上”,”号会导致数据表被写入一个没有name,以id作为slug的标签,这个情况是否独立有待验证(我关闭了全部插件,重新发贴,问题依旧)。

9. 删除文章不影响标签,如果你有一个标签abc,它仅存在于一篇文章上,删除该文章并不会同时删除标签。

10. 要替换条目8和9造成的空白标签,请使用第五条介绍的Tag Managing Thing来删除/融合标签。

————————————

嗯,本次报告暂时到这里,如有新发现和小技巧我会补充。仍有疑问的请留言,我尽可能解答。

客栈已经完成到WordPress 2.3的过渡了,概括来说2.3是进步多于遗憾,相信不会让各位失望,2.4的大跃进则更加让人期待!

TBC

19th, Oct. 更新Simple-Tag看起来是SimpleTagging的最佳接班人,客栈使用中。

Author: 店长

The Master of BitInn

7 thoughts on “WordPress 2.3: Tag It or Not ? 标签海前的犹豫不决”

  1. WordPress database error: [Table ‘tsukisor_blog.wp_post2cat’ doesn’t exist]
    SELECT p2c.category_id AS cat_id, COUNT(p2c.rel_id) AS numposts, UNIX_TIMESTAMP(max(posts.post_date_gmt)) + ‘-8′ AS last_post_date, UNIX_TIMESTAMP(max(posts.post_date_gmt)) AS last_post_date_gmt FROM wp_post2cat p2c INNER JOIN wp_posts posts ON p2c.post_id=posts.id WHERE (posts.post_status=’publish’ OR posts.post_status=’static’) AND posts.post_date_gmt <= ‘2007-09-28 03:18:58’ GROUP BY p2c.category_id ORDER BY numposts DESC

    这个错误……怎么解决……

  2. >确保你的插件不直接查询categories,link2cat,post2cat这三个数据表;
    一个个测试插件,看看是哪个导致错误。
    ——
    >旧模板显示友情链接和文章分类要使用官方提供的Template Tags,或者修改至使用新的数据表。
    如果不是插件的问题,则是你的风格可能有直接查询数据库的代码,找找上面三个关键词。
    ——
    你的网站链接几乎全部有转向问题,建议用最新版默认风格测试下,仍有问题的话可能是插件冲突或后台忘记更新永久链接。

  3. 求助:请问

    WordPress内置的Simple Tagging数据导入器会将默认使用下划线代替空格的slug变成用连字符代替,这毫无疑问破坏了客栈的原有链接(例如Suzumiya_Haruhi变成Suzumiya-Haruhi)。最后店长不得不自行写了个插件暂时回避问题(相信不久的将来我可以将规范链接的功能用上。)

    能否放出这个插件,救命。。谢谢

Comments are closed.