用最恶毒的语言形容 IE

2007719.jpg
借用一下 istef 的图片,看了 istef 的这篇文章后,我真是想大呼:真他娘的过瘾,实在是跟我心有戚戚,IE 的问题折磨了多少有志网页制作青年的心啊。拿我来说,我写这个 blog 以来换过几次主题了,每次的原因几乎都是在 IE 下显示不正常,换其它浏览器,Opera, Firefox, 甚至毛病一堆的 Safari for Windows 显示出来的效果都是一致的——就是 IE 不行!我水平又比较菜,不能像高手一样做一些 CSS hacks 来纠正 IE 下千奇百怪的问题,所以每次只好换主题了事。新主题拿回来又不可能一点也不做修改,一修改往往又回到上一个问题,在 IE 下显示出来就是他娘的支离破碎!

其实 IE7 还好点,但 IE6 就真的是 wholly crap 了。因为我的电脑上没有装 IE6,所以我直到今天才发现一个问题,我的 blog 在 IE6 下居然 sidebar 会被挤到页面的下面,原位置整个空白一片!我到今天才发现这个问题的原因是,不论在 Firefox 下还是 Opera 下甚至在 IE7 下显示都是正常的。

我其实有心不改正这个问题,但无奈用 IE6 及以下版本的访客还是占很大比例的 (55%),看来我早晚还得向 IE 屈服,但原谅我,我会用最恶毒的语言咒骂 IE。

柠檬对我说过:“IE 是人类历史上最糟糕的发明之一”,我深以为然。

Tags: , ,

WP 2.1 和 ELA 的兼容性问题

看来 WordPress 2.1 真是个 trouble maker,和 Extended Live Archive 又发现兼容性问题,鉴于用 ELA 的人还挺多的,我拿来说说。估计他们官方又会跑出来说“是你们插件作者的错,不是我们的错”了,嘿嘿。

症状:如果你注意到的话,在 WP 2.1 中,ELA 会把新建立的页面当成文章显示出来。

那么为什么会出现这种情况呢?因为 WP 2.1 把数据库结构作了调整,以前区分文章和页面是用 post_status 这个 field 的值。如果是 post_status = ‘publish’ 那就是文章,如果 post_status = ‘static’ 那说明这是页面。而到了 WP 2.1 上,页面的 post_status 也变成 ‘publish’ 了,区分文章还是页面用 post_type 判断,post_type = ‘post’ 为文章,post_type = ‘page’ 为页面。可 ELA 不知道这点啊,它还是按老方法来判断,当然会造成误判了。

修补

  1. /plugins/af-extended-live-archive/af-extended-live-archive-include.php
  2. 寻找 post_status = ‘publish’
  3. 替换为 post_type = ‘post’ AND post_status = ‘publish’

注意找到 p.post_status = ‘publish’ 这种,替换后应为 p.post_type = ‘post’ AND p.post_status = ‘publish’,而不是 p.post_type = ‘post’ AND post_status = ‘publish’。

除了上面说的问题,我以前也曾指出过如果想把任意页面设置成首页,你需要关闭 ELA,否则无效

升级 WP 2.1 后会遇到总总问题,如果不是特别需要新的功能,不妨先缓缓,等各种问题都解决了后再升级不迟。

更新:附上我改好的 af-extended-live-archive-include.php 文件,需要的朋友可以下载,把扩展名改成 .php 后直接覆盖原文件。点此下载 (适用版本:R18)

Tags: , , ,

WP 2.1 和 UTW 的兼容性问题

这个问题对用 UTW 和 WordPress 2.1 的同学们来说,比较严重。

也许有人已经发现了,当你升到 WordPress 2.1 后,只要有人在你的帖子上留言,或是发 Trackback 或是 Pingback 的时候,帖子的 Tag 就会消失(是被删掉,事实上)。说原因前我先贴一下修补 (via),然后有兴趣的同学再慢慢看原因。

打开 /wp-content/plugins/UltimateTagWarrior/ultimate-tag-warrior-actions.php
在大概第 862 行你会看到:

// Save changes to tags
add_action('publish_post', array('UltimateTagWarriorActions','ultimate_save_tags'));
add_action('edit_post', array('UltimateTagWarriorActions','ultimate_save_tags'));
add_action('save_post', array('UltimateTagWarriorActions','ultimate_save_tags'));
add_action('wp_insert_post', array('UltimateTagWarriorActions','ultimate_save_tags'));

把这些代码注解掉,换上:
// Save changes to tags
add_action('save_post', array('UltimateTagWarriorActions','ultimate_save_tags'));
if($wp_db_version < 3308 ) { // if lesser than WP 2.0
add_action('publish_post', array('UltimateTagWarriorActions','ultimate_save_tags'));
add_action('edit_post', array('UltimateTagWarriorActions','ultimate_save_tags'));
add_action('wp_insert_post', array('UltimateTagWarriorActions','ultimate_save_tags'));
}

这就把问题解决了。

问题的原因 Mark 在他的 Blog 上做了解释。其实这个问题并不单是 WordPress 2.1 的原因,其实在更早的版本这个问题就是潜在存在的,不过是在 2.1 版上被带了出来。也并不单是 UTW 受影响,还有一些比如 Jerome's Keywords 等等往 Custom Field (自定义域?) 里写数据的插件都可能受到影响。Mark 的说明细节部分我就不重复了,有兴趣的人可以去看。简单来说我理解成:这不是我们的问题,这是插件作者的问题,你们对 WP 的机制理解的不够,你们犯下这样这样的错误,你们需要如此如此才行。:wink:

通俗来说,插件作者编写插件让插件自动监视编辑文章的表格,如果是空的,插件就认为文章已经被删除,于是也会把自己在这篇文章的 post_meta 数据删除,这就是为什么 UTW 的 tag 会不见,因为被它自己删除了。但在 2.1 中,edit_post 并不是一定要在写文章或编辑文章时才会调用的,也不是一定要是注册用户的动作才能引发调用的。比如说留言就能引发 edit_post 被调用,这个时候,插件监视到的是一个空的 edit_post,它认为这篇文章已经被删除了,它就非常“智能”地清空了自己留在 post_meta 里的数据。

我用到的往 Custom Field 里写数据的插件包括 UTW, ArticlePostviews,检查了一下,好像除了 UTW 其余两个都没事。大家也可以检查一下自己的插件,如果发现 Custom Field 里面的数据被抹除,可以联系插件作者请修改一下。

更新:看来留言的时候不一定有事,但当你审核留言时,同意后,该留言对应的文章 Tag 会被删掉。虽然审核留言的时候不多,但还是打一下后面的补丁以防万一吧。

再更新:最新的 3.14159265 版的 UTW 宣称解决了上述问题。

Tags: , ,