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的用户就没这么幸运咯。

本文共有 21 条评论UTW导致搜索功能异常


  1. 1 Wady

    额,还没搜索过自己的日志所以不知道有这 BUG。那么不介意我把这个修正写进我那个 i18n 修正后的 ultimate-tag-warrior-actions.php 文件一起发布吧。

  2. 2 yskin

    嗯,好,但是要加我这篇文章的链接,嘿嘿。

  3. 3 ray1980

    之前还想问你的,我的BLOG搜索文章后只显示5篇文章,会不会也是这个引起的?

  4. 4 yskin

    不知道,应该于UTW无关。你截取SQL语句看看咯,或者一个一个禁用插件测试一下。

  5. 5 Dennys

    這問題之前就有人在討論區提過了, 不過目前是還沒被修正.
    http://www.neato.co.nz/forum/comments.php?DiscussionID=1560&page=1

    同個討論的後面也有提到對 wp-tags 的修正.

  6. 6 Wady

    只显示5篇的话……是不是搜索页面的分页代码失效?

  7. 7 Wady

    额……貌似问题没有解决。比如在你的 BLOG 上搜索 down 关键词。无法搜索到《网站down了24小时》一文

  8. 8 Wady

    根据你的文章修改后是正常了。不过你的博客上尚未正常哈。HOHO。

  9. 9 yskin

    没改,懒,等UTW更新,hoho

  10. 10 Wady

    我觉得作者的原意也许是想通过交集得到有日志关联的标签,然后同日志表进行左联。不过貌似 SQL 查询语句没有解析序列的优先度控制,就如 1+(3-2) 的算术式。

  11. 11 Filia.Tao

    原来是这个原因.
    我也碰到这个问题了.
    后来干脆把搜索框改成Google Customer Search 了.

  12. 12 underone

    我便是这么不幸呀!!

  13. 13 Wady

    被你这么一说我去 DOWN 了 WP 2.2 玩。发现虽然内置了标签,但没有诸如修改标签,删除标签的功能。恩……写个插件强化一下玩玩……

  14. 14 Wady

    对了,我架了个新站。原先的 myyu.net 要作为日记本了。我这个新站来做链接交换行不?

  15. 15 Wady

    人有点迷糊了- -忘记留新站的地址 wstyle.cn

  16. 16 yeahlang

    Yskin,我的也出问题了,搜索不了,我看你的搜索功能已经修复了,我改怎么弄才可以修复呢?
    请指教,谢谢!

  17. 17 yeahlang

    我的连英文都搜不到!

  18. 18 yeahlang

    已经搞定了!要感谢Wady

  19. 19 ruralmoon

    Really appreciate your research.
    I'm confused by this issue for a long time.
    It was fixed immediately by your solution.
    Thanks!

  1. 1 UTW 3.14159265 以及中文包
    Pingback2007-4-18 3:42 下午
  2. 2 RedLog » » Wordpress Tag Cloud 插件 — Ultimate Tag Warrior
    Pingback2007-5-12 1:39 下午

请留下您的评论: