WordPress 评论分页的一个 bug 与解决办法

Nov 26th, 2008 Add Comment

该问题已经在 WordPress 2.7 正式版中被修复!

最近我在为 WordPress 2.7 的评论分页制作一个 AJAX 翻页的增强型插件 (基本完成了, 效果可以看这个页面: Plugin Demo). 在测试插件的过程中, 又发现 WordPress 2.7 beta3 的一个 bug. 嵌套回复和评论翻页作为新功能出现多一些 bug 是很正常的, 再说这还是测试版呢. 但这个 bug 很低级, 而且会让留言者感到莫名其妙.

这是个怎样的一个 bug 呢? 举个例子吧...

如: 现在文章有 17 条 comments, 3 条 pings, 每 5 条评论分一页 (为了理解方便, 这里忽略嵌套回复), 显示最新的一页评论, 并且已经将 comments 和 pings 分开处理了.

根据小学 3 年级的除法公式, 17/5 = 3...2. 也就是说文章评论的当前页面是 3, 有 2 条评论. 当某人向文章提交一条新的评论, 那么应该还是在第 3 页, 并且评论显示 2 条.

但很遗憾, 结果不是这样的. WordPress 会为你转跳到第 4 页, 显示 0 条评论. 为什么呢? 因为你还有 3 条 pings. 再用无敌除法公式算一下, (17+3+1)/5 = 4...1. 所以给你转跳到第 4 页. 而由于其中 3 条 pings 不显示, 1 - 3 = -2, 所以该页面显示 0 条评论. 也就是说, WordPress 在提交评论后, 计算页数是以 comments 和 pings 作为评论总数计算的, 如果 comments 和 pings 不分开是完全没问题的; 但分开处理, 并且有 pings 存在的时候, 问题就发生了.

怎么办? 先来找到出问题的处理方法吧...

首先, 发表评论会调用 wp-comments-post.php 进行检测, 更新数据和转跳. 在文件里, 我们可以发现 get_comment_link($comment_id), 它就是获取转跳链接的方法.

跟踪到 wp-includes/comment-template.php, 原来评论页面链接是靠一个评论页面编号定位的, 而获取这个编号的是 get_page_of_comment( $comment->comment_ID ) 这个方法.

再跟进去 wp-includes/comment.php, 里面有一段查询评论长度的 SQL 语句. 嗯, 就是它, 它没有考虑到只显示 comments 的情况.

怎么修改? 我的方法是很暴力的...

如果你确定自己使用的主题已经将 comments 和 pings 分开处理了. 请将那一句修改为:

$oldercoms = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_parent = 0 AND comment_date_gmt < '%s' AND comment_type != 'pingback' AND comment_type != 'trackback'", $comment->comment_post_ID, $comment->comment_date_gmt ) );

够野蛮吧! 反正还没正式版, 先凑合着用着吧. 要怎么改才算完美还是留给 WordPress 的工程师考虑吧, 我们拭目以待.

声明: 本文采用 BY-NC-SA 协议进行授权. 转载请注明转自: WordPress 评论分页的一个 bug 与解决办法

  1. http://1.gravatar.com/avatar/3c4cc2232a4e7d6a1150239669ccc2e1?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    博主喜欢折腾,而且有研究精神

  2. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    fauxliu :

    好东西哦。官方怎么不考虑此问题,笨笨的分页功能

    这个已经在 2.7 正式版中被修复了.

  3. http://0.gravatar.com/avatar/68d91e68d672bdd4491d14b42f69bf8b?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    好东西哦。官方怎么不考虑此问题,笨笨的分页功能

  4. http://0.gravatar.com/avatar/8bc5a10d6cd90aec2d2e24b53042856f?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @yinheli
    :???: 我一直使用IE呀

  5. http://0.gravatar.com/avatar/e232702dd57b5a01ffb87d63cabd83f7?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @mg12
    :lol: 哈哈.IE的标准让人火大!

  6. http://0.gravatar.com/avatar/cfa8c77c6fcdbce4d0b3351f9f71f09e?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    HK :我等待正式版!

    期待

  7. http://0.gravatar.com/avatar/cfa8c77c6fcdbce4d0b3351f9f71f09e?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  8. http://0.gravatar.com/avatar/cfa8c77c6fcdbce4d0b3351f9f71f09e?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  9. http://0.gravatar.com/avatar/8bc5a10d6cd90aec2d2e24b53042856f?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    我等待正式版!

  10. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @leo
    我不兼容 IE8.
    IE3, IE4, IE5, IE5.5, IE6, IE7, IE8 都不同标准, 我全兼容就不用活了.

  11. http://0.gravatar.com/avatar/8dd45065ab78945a6d9a9fd17744d2fe?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    为什么我装mg12的主题会出现字体都变成粗体的问题呢?而且在IE8下严重变形 郁闷啊 只好把装了

  12. http://1.gravatar.com/avatar/bbb99c856872bdf1bd23790198834431?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  13. http://0.gravatar.com/avatar/8406d089bc81b664a2610b8d214c1428?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    不错,我第一时间用mg12的主题

  14. http://0.gravatar.com/avatar/cac09312cf28f029ec0dc308f644f15a?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    还没出正式版呢?官方也许会修复滴,呵呵

  15. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    但我觉得这个解决比较困难...

  16. http://0.gravatar.com/avatar/401b6aa08d03f959bc41a4f33e4fea6c?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    2.7...因为上次数据库升级失败回滚...暂时对这个版本只能奢望...

  17. http://0.gravatar.com/avatar/8cdfc1269a72d0c1a126afe00ad6ba1f?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    我也等正式版再更新吧。。

  18. http://0.gravatar.com/avatar/e232702dd57b5a01ffb87d63cabd83f7?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    呵呵.还有这个问题呢.我只装了个demo版的用来玩.等出了正式版的在更新.嗯.学习了
    对了,记得您以前有个ctrl+enter回复的.怎么取消了 :mad: