更改WordPress永久链接设置

  WordPress博客的永久链接Permalink有许多种格式,个人认为最好的格式是/%post_id%,无他,惟短尔。
  
  在WordPress设置中把永久链接更改为/%post_id%后,建议一短到底,以example.com的域名形式作为博客地址,同时把www.example.com通过301重定向永久跳转到example.com,即在.htaccess中加入:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.example.com$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]

  如果是中途变更永久链接形式为/%post_id%,例如从/archives/%post_id%变更为/%post_id%,还需要将诸如example.com/archives/123这样形式的外链,通过301重定向永久跳转到example.com/123,以保证别人通过外链或搜索引擎访问时不出现404页面,即在.htaccess中加入:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.com$ [NC]
RewriteRule ^archives/(.+)$ http://example.com/$1 [R=301,L]

  类似地,从example.com/?p=123跳转到example.com/123的.htaccess写法是:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.com$ [NC]
RewriteRule ^?p= (.+)$ http://example.com/$1 [R=301,L]

  
  使用example.com作为域名后,如果追求完美,还可以将WordPress数据库wp_posts表中的永久链接字段guid中的www.example.com更新为example.com,即执行SQL语句:

UPDATE wp_posts SET guid = REPLACE ( guid, “www. example.com”, “example.com” )

  
  另外,个人觉得博客没必要使用伪静态地址,在链接后加上.html纯属画蛇添足。

WordPress无法发布中文日志解决办法

  前几天博客突然无法发布中文日志,殚精竭虑想不出来哪里出错,很是困扰。
  写信给国内甚至台湾我认为比较出色的WordPress博客站长求助,仍找不到问题所在。许多站长建议我升级到WordPress最新版本2.7.1。在本地测试我的K2_WalltzLee主题(修改自K2 RC6)与WordPress2.7.1的兼容性时,发现会出现许多样式上的错位,再加上我改动过现在正在使用的WordPress版本的源码,真要折腾升级的话估计没个十天半个月弄不好。幸好我没有傻乎乎地直接在虚拟主机上升级,不然就完蛋了,有备份也没用,根本回不到原来的样子,还要面对几千行的代码从头改。现在想起后怕得头皮一阵发麻。天塌下来只有你一个人被砸死,别人都好好的,也许这就是独立站点最大的痛苦和最大的快乐所在吧。
  另外我不喜欢2.7.1的后台界面,一键升级功能对我这种改源码的用户没有任何意义,2.7.1版本发布时,WordPress老大Matt还给我发了封邮件,说你们这帮不升级的家伙是不是住在岩石下面啊,快快升级到2.7.1吧,这是我们一顿折腾后最完美的作品了!唉,你这么说的话就拜托以后别再升级了。对WordPress的频频升级我真感到不能理解。
  

症状
  1.可以发布英文日志。但只要标题或正文中含有中文,就会发布出错,主机CPU占用100%并出现超时提示:
  Fatal error: Maximum execution time of 30 seconds exceeded in/…/wp-includes/post.php on line 1287
  并且每次报错的具体文件和行数都不相同,有时会报错在一些并不存在的行数。
  2.与主机php的超时设定无关,按网上的方法修改php.ini把超时设定成多久都没用。
  3.日志会存为草稿,编辑草稿再发布也不行,但在可以修改并保存草稿。
  4.与插件和主题无关,停用所有插件,换回默认主题,问题仍然存在。
  5.与虚拟主机的PHP/MySQL软件版本无关。
  6.之前已经发布的中文日志可以编辑添加中文并保存。可以通过先发布英文日志、再把英文日志修改成中文日志的方法发布中文日志(苍天啊,我前两篇日志就是这么发布的)。
  

解决
  在论坛上我搜索到其他的朋友也碰到过这个问题,但不知如何解决。这其实是一个只存在于WordPress2.5.1的BUG,在2008年5月已经有人向WordPress提交了这个BUG的报告:some post text (persian) causes timeout on publish (not save)(某些包含波斯语的文本在发布时会导致超时错误)。中文和波斯语是一个德性,哈哈。
  官方已给出修正方法,详见这里,在wp-includes/post.php第1289行,用绿色部分的代码替换掉红色部分的代码。
  

感谢
  问题能解决,必须感谢yskin的帮助,在我求助的六个看上去都很牛的站长中,只有他给出了可以绕过BUG的办法,鹤立牛群。从yskin的解释中能深刻感觉到他对WordPress的熟悉程度远胜别人一筹,有实力的人就是不一样。在我找到解决方案后,yskin还耐心地对我刨根问底的追问给出了自己的解答:

  从PHP的角度来讲,这两段代码应该是一样的,原来的代码使用的是双引号内直接使用$变量,后者是用类似C语言的printf函数的方式,在需要使用变量的地方用%s代替,然后后面跟上变量。
  原则上PHP对两种方式的处理应该是一样的,并且都可以保证正确。后面这段代码把$alt_post_name和$post_type单独作为$wpdb->prepare()函数的参数,而该函数里有:array_walk($args, array(&$this, ‘escape_by_ref’)); 这样一段代码对所有参数做一个处理,所以估计是这里有bug导致中文录入的出错。

  对比起其它寥寥数语的回复,yskin上千字的邮件让人感动,从邮件的条理性、针对性、严谨性我看到了一个认真、缜密、踏实、助人为乐的人,他教会我的不仅仅是WordPress里几个PHP语句。

K2主题页面相关问题解析及一些零碎

  我在修改K2主题时的一些体会,写出来也许对碰到类似问题的朋友有些帮助。主要是关于header里页面的问题,还有一些零碎的事项,写下来也算是一个修改工作的备忘录吧。
  

页面相关文件位置
  “页面”在K2主题里用header下的menu字段定义。其中:
  PHP输出控制在
  app\includes\display.php 25-48行 函数function k2_header_menu()
  CSS样式控制在
  css\core.css.php中”Main Menu in Header”注释下
  

隐藏页面的方法
  网上已经有如何隐藏某个页面的详细介绍,参看这里
  

页面翻页后同时显示主页和当前页面问题的解决
   页面如果不涉及翻页是不会出现这个BUG的,但是如果页面涉及翻页,“主页”和当前页面会同时显示为选中状态,因为is_archive和is_paged判断同时为true。
  这个问题及其它类似的问题的解决,关键在于状态标签的使用。WordPress官网上有关于状态标签的详细说明,见这里。我的体会是,状态标签是非常有用的,在WordPress程序中使用频率也非常高。
  在上文提到的k2_header_menu函数中,<li></li>中的if语句就是判断哪个页面为当前页面的语句,原文的or判断太繁琐,只留下一个你需要的条件即可,其它的可以注释掉。另补充两句比较有用的判断语句:
  is_home() && !is_paged()
  is_category(’31’)
  前者已经有很多文章介绍用法。后者适用于调用了某个分类(标签、作者等等也一样)的页面。例如我的“照片”页面调用了“凝视有时”这个分类,分类序号是31(获得分类序号的方法请自行Google),用了is_category判断后“照片”页面的翻页就会显示正常了,否则从第二页开始“主页”和“照片”会同时显示为当前页面。
  

K2主题的其它注意事项
  1.K2的css文件并不符合W3C标准,因为它的style.css实际上引用了css文件夹下的core.css.php,如果你希望网站能通过W3C的CSS验证,可以把core.css.php文件改为相同名称替换掉根目录下的style.css文件,但记得把第一行注释掉:
  <?php require(‘gzip-header-css.php’); ?>
  

  2.如果你需要自己撰写新的页面模板,保存时必须存为UTF-8编码,保存为UTF-8无BOM和ANSI编码都会出现header上空行的问题,IE内核浏览器还会出现header右侧错位的问题。
  

  3.K2主题大量使用了嵌套、引用的函数和模块,使得自定义性较差。如果自己编写模板需要改变某些函数和模块,在app文件夹下可找到所有K2自己的函数和模块。
  

  4.我修改的K2主题在IE6下有一个小BUG,每篇日志的第一条评论的评论者ID背景色无填充。另外通过这一个多月的使用我发现,不同机器上的IE6和基于IE6内核的遨游浏览器对样式表的解析各有不同。IE7和Firefox表现完美。鉴于IE6这款浏览器可以把一个程序员活活整死,而我只是个门外汉,还是放下强迫症的倾向,由它去吧!

更换K2主题

  换主题就像死过一次一样,用四天时间和几千行代码搏斗。
  这次使用的主题是K2RC6,没有使用最新的版本K2RC7 是因为K2RC6和我的WordPress2.5.1兼容性最好。不打算升级到WordPress2.7,我不需要那些可能拖慢网站的功能,另外我修改过WordPress2.5.1的源代码,升级意味着要重新改一遍源代码,那是自寻烦恼。
  现在用的这个K2主题是经过修改的,本地Apache/MySQL/PHP的编程调试环境我用的是XAMPP LITE。主要改动有以下几个方面:
  最大的动作在留言系统。我个人不喜欢ajax免刷新式留言,并且K2原来的留言样式不大好看,Gravatar不与留言者名称对齐,默认Gravatar又黑又粗,看起来乱七八糟。改成默认主题的留言样式。
  K2毕竟是外国人的主题,中文表现并不理想。除了汉化这种必要步骤,还把侧边栏与主栏间距扩大了10像素,侧边栏列表项目稍微空半格,给照片加边框,图片不加边框,改大字体,适当地方字体加粗,增加header中menu列表的margin,修改引用样式,去掉所有时间、留言、标签、编辑旁的png小图标,等等。
  代码方面重新为几个页面按K2的结构做template让其能正确显示。改正页面翻页后header同时显示主页和页面的bug。
  简单概括,就是把默认主题Kubrick和K2拼起来。
  我先后用过两个主题,默认主题Kubrick和K2主题,皆出自Michael Heilemann之手,整个修改过程我对他的崇拜之情不断加深。他在Kubrick里告诉我代码能简洁到什么程度,用K2让我知道盘根错节可以和条理清晰共存,代码能如此复杂精巧,我觉得他仿佛集天真无邪的孩童和神机妙算的老千于一身,可怕而令人着迷。在Kubrick的style.css代码结尾的注释里,他写道:“Daisy给我你肯定的回答吧,爱你让我痴狂,这不会是那种老套的婚礼,我没钱给你买马车,但坐在我自行车后座上你会甜蜜悠长!”在K2的theloop.php代码开头的注释里,他写道:“对这么精美的艺术品,下手轻点!”真性情的奔放加牛逼哄哄的自信,偶像啊偶像。这个哥本哈根的30岁帅哥个人博客PR是7,太猛了太猛了,徐静蕾王小峰之流的博客在他面前简直不值一提,行走江湖最终还是要靠实力说话啊。
  程序调试让人上火。IE和Firefox两种内核的浏览器不同的显示效果让人抓狂,就像同时给笨学生和聪明学生上课,既要让笨IE听明白,又不能让聪明的Firefox觉得不耐烦。
  学习CSS最好的办法果真是不断尝试。K2的CSS文件大得惊人,仍和其它主题很好兼容,得益于字段命名的独立。K2另一个强大之处在它无所不能的对外接口和自定义选项,这对于使用者是个好事,但对于修改主题的我来说就是个灾难。作者喜欢把各段功能切成模块分开放在不同PHP文件里,再引用或嵌套,有些功能定义完全看不懂还不知到哪找出处,幸好最后都弄明白了。
  这次修改WordPress主题,最大的体会是:能用CSS解决问题的地方尽量用CSS,能用PHP代码解决问题的地方尽量用PHP代码。下手之前最好想好用哪种方法,弄反了效率会很低而且很难做出来。另一个体会是DIV加CSS的网页组织方式高效而科学,在这点上我不认同自恋的腾讯网站重构工程师TwinsenLiang的观点
  用BSP的人点几下就能换个主题,WordPress也不难顶多稍微调试一下,无奈吹毛求疵乃我人生一大悲哀,硬要自作孽,看教程查手册改样式表,半夜两眼放光读代码。一切痛苦只能怪自己太菜,上次完全不懂CSS也敢修改默认主题,真勇敢。但付出就有进步,我觉得以后写简历也许可以加一句“了解网页编程的PHP和CSS语言”。
  过程是艰苦的,成功的欣慰让人充实,也许这就是独立的最大乐趣吧。专心做一件事情的感觉真好。

一切重新开始

  两个多月前一个燥热的下午,做出建立独立博客的决定令自己都吃惊,因为我什么都不懂。
  最开始是买域名,淘宝上各种域名托管商代理多得让人看花眼。接下来买空间,广泛比较,选择了梦游科技的64位LINUX虚拟主机,语言环境PHP数据库MySQL全兼容WordPress,机房在上海电信,电信和铁通的用户访问会比较快。
  因为有了Google这个世界容易了许多,后来的DNS解析、A记录指向、程序安装一切顺利。
  WordPress安装好后得先确定主题。WordPress是开源软件,上千个主题看下来头都大了,可在我的审美里真正比得过默认主题的没几个,最终用了默认主题。
  数据转移是个非常麻烦枯燥和耗时的工作。MSN Space的标准简直可以用“自大加恐怖”来形容,我痛下决心决定手工复制粘贴,首先把Space上的文章复制到专门的文本编辑器Notepad++里,把所有格式去除,再把文字粘贴到WordPress里,再在WordPress的文本编辑器里编辑好缩进对齐和日期分类等相关信息。WordPress的文本编辑器可以用一个字来形容:“烂!”。
  再接下来是汉化主题了。首先要学习PHP语言和WordPress架构,好在和以前学过的VB和Web课程有许多共通之处,知识总是有用的,后悔当初再认真点学就好了。修改核心代码的工作是枯燥而快乐的,程序用白屏拒绝你犯下的任何一个小错误,白屏看多了,修改调试成功后正确的显示令人格外喜悦充实。汉化过程中Google由可爱变为可憎,经常找不到解决方案或者找到的解决方案有人说东有人说西,还是问人实在。其间得到了许多人的帮助,特别是阅微堂的Zhang-Zi和WordPress中文论坛的版主Chada,谢谢你们耐心地回答我的菜鸟问题。如果你是完美主义者,用英文版再自己汉化比用官方中文版好,因为语言包无法照顾到每个细节,比如说日历,先月后年的顺序还是不符合中国人习惯的,另外中文版汉化也不彻底,我汉化时工作量主要在general-template.php上,里面中文版有许多东西是不汉化的。
  ICP备案几天就给我批下来了,不像其他人说的要一个月,快得难以置信。建站期间看了许许多多网站,工业和信息化部的网站真是我见过的最难看最粗糙的网站之一,呵呵,政府网站都这样吗?
  最后是找插件、找图片空间、测试速度和修补W3C标准。开始用巴巴变的免费空间,很不稳定,还是改用了又拍的收费空间,速度和稳定性非常好,也很便宜。
  修修补补,把网站做好了。自己的地方就是好,没广告,不用受博客服务提供商的气。就是有点麻烦,出什么事都得自己弄,但收拾利落了也挺省心的,舒坦。把Space关了一个多月,目的是让搜索引擎把关于Space的所有收录K掉,结果是Google全部K干净了,百度没变化,看来要给百度写信才行。以后Space算是彻底废止了。
  这两个半月里,有太多的心绪写不下来。时常在凌晨两点看着一千多行的代码时问自己,你是在努力忘记什么吗?
  生活总要重新开始。无意中在WordPress官方主页看到页面右下角的一行字:”Code is Poetry”,我的心明亮起来,我需要的正是这种态度去工作去生活,去拥抱这个世界。
  搬了寝室,搬了博客,一切就像是新的一样。哦,不,一切就是新的。