WordPress 评论分页的一个 bug 与解决办法
该问题已经在 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 的工程师考虑吧, 我们拭目以待.
博主喜欢折腾,而且有研究精神
这个已经在 2.7 正式版中被修复了.
好东西哦。官方怎么不考虑此问题,笨笨的分页功能
@yinheli
我一直使用IE呀
@mg12
哈哈.IE的标准让人火大!
期待
@leo
上来看看
很有道理的
我等待正式版!
@leo
我不兼容 IE8.
IE3, IE4, IE5, IE5.5, IE6, IE7, IE8 都不同标准, 我全兼容就不用活了.
为什么我装mg12的主题会出现字体都变成粗体的问题呢?而且在IE8下严重变形 郁闷啊 只好把装了
果然很暴力。
不错,我第一时间用mg12的主题
还没出正式版呢?官方也许会修复滴,呵呵
但我觉得这个解决比较困难...
2.7...因为上次数据库升级失败回滚...暂时对这个版本只能奢望...
我也等正式版再更新吧。。
呵呵.还有这个问题呢.我只装了个demo版的用来玩.等出了正式版的在更新.嗯.学习了
对了,记得您以前有个ctrl+enter回复的.怎么取消了