WordPress 完美 AJAX 嵌套评论
上一篇关于 Ajax 评论的文章中有两个缺点,分别是“不能输出合适的样式”和“没有回复链接”。下午对博客进行技术维护,现已基本 OK 了(对于我来说)。
页面 js 代码请参考上篇文章,或者参见文章结尾的演示文件。
新增一个 comment-ajax.php
依然是需要把 WordPress 根目录下的 wp-comment-post.php 复制一份,另存为 comment-ajax.php , 存到根目录(还需在 js 中指定该文件绝对路径)。
干掉 comment-ajax.php 中的 第 84、85、87 行。把下面的代码复制到该文件末尾的 ?> 之前。
$comment_depth = 1; //为评论的 class 属性准备的 $tmp_c = $comment; while($tmp_c->comment_parent != 0){ $comment_depth++; $tmp_c = get_comment($tmp_c->comment_parent); }
接着,打开你的主题中的 comments.php 看一下。搜索 wp_list_comment ,找到 wp_list_comment() 或者类似 wp_list_comment('callback=lorz_list_comment') 这样的代码。如果参数中没有 callback 字样:请把下面的代码粘贴到 comment-ajax.php 中上段代码之后 的末尾, ?>之前后(感谢zwwooooo同学的提醒)。
<li <?php comment_class('',$comment_id,$comment_post_ID); ?> id="li-comment-<?php comment_ID() ?>" style="display:none"> <div id="comment-<?php comment_ID(); ?>"> <div class="comment-author vcard"> <?php echo get_avatar($comment,$size='32',$default='<path_to_url>' ); ?> <?php printf(__('<cite class="fn">%s</cite> <span class="says">says:</span>'), get_comment_author_link()) ?> </div> <?php if ($comment->comment_approved == '0') : ?> <p><em><?php _e('Your comment is awaiting moderation.') ?></em><p> <?php endif; ?> <div class="comment-meta commentmetadata"> <a href="<?php echo htmlspecialchars( get_comment_link( $comment->comment_ID ) ) ?>"> <?php printf(__('%1$s at %2$s'), get_comment_date(), get_comment_time()) ?></a> <?php edit_comment_link(__('(Edit)'),' ','') ?> </div> <?php comment_text() ?> <div class="reply"> <?php comment_reply_link( array( 'depth' => $comment_depth, 'max_depth' => get_option('thread_comments_depth') ), $comment_id,$comment_post_ID) ?> </div> </div> </li>
如果你的 comment.php 中 wp_list_comment 的函数中有 callback ,那么请打开主题下的 function.php (这种情况下没有这个文件就算是见鬼了)。找到与 callback 同名的函数,将其中的 <li>与之间</li> 的夹杂 php 代码的 html 部分复制过来。将其中两个函数 comment_class 和 comment_reply_link 的参数改成:
//…… comment_class('',$comment_id,$comment_post_ID); //…… comment_reply_link( array( 'depth' => $comment_depth, 'max_depth' => get_option('thread_comments_depth') ),$comment_id,$comment_post_ID) //……
实际就是改成与我给出的代码相似的样子。就是这些,再按照上篇文章中搞定 js 就 OK 了。
还可以更完美点儿?
很多人喜欢评论呈现隔条变色的样式,所以 WordPress 为每条评论都添加了 odd alt thread-odd thread-alt 或者 even thread-even 等 class 。现在唯一的瑕疵就是,comment-ajax.php 输出的都是 even、thread-even ……
由于不在主循环里,获取这些值就麻烦了。所以还是交给 js 处理吧。上篇文章中的 js 代码,修改 var $newc = $child_list.find('li:last'); 为:
var $newc = $child_list.find('li:last'); if($newc.prev().length){ var $c = $newc.prev(); if( $c.hasClass('even')){ $newc.removeClass('even').addClass('odd alt'); } if( $c.hasClass('thread-even')){ $newc.removeClass('thead-even').addClass('thread-odd thread-alt'); } }
- 本文贴出的代码,依旧与本博客所使用的不一样。
- 给出的 js 代码需要 jQuery 框架。
- 如果你还使用了其他框架,可能因命名空间问题导致 js 失效。
- js 代码不适用于所有主题,如发生页面错乱,请自行修改。
- 如果有人应用成功,别忘记通知我下~
完整的参考文件
该 php 文件修改自 WordPress 2.8 的 wp-comment-post.php ;
在 WordPress 2.8 + Default 下测试通过。
在 WordPress 2.8 中,生成的回复链接有误,没有相关 js 则不能工作,原因未知。
技术牛人啊!~WP的吗?
技术牛人啊!—— 不敢当
WP的吗? —— 是啊~
我测试一下,嘿嘿!
我再来测试一下
我是来测试的
测试
测试下回复
可为什么在IE下感觉那个数字 位置不对了
呵呵,我也早发现了。这个应该是我 CSS 没有处理好
我一直在考虑着要不要用 wp2.7 的评论功能,对嵌套的样式设计总是不满意,我喜欢整整齐齐的,不喜欢套来套去,哈哈。
另一个分页功能对我来说目前还用不着,评论不多啊!
只用 @ 来表示回复关系的话,让人看得发蒙。要是加上鼠标掠过 @ 即显示原评论,也很不错。
这个分页功能很难用,比方这个“鼠标掠过显示原评论”,本来用 js 从页面上复制即可,分页后得用 ajax 了
不错,我来试下!!呵呵!
至此已经有 8 条声明测试的评论了……
我也寫了一個, 不大一樣, 先試~
不錯!
再試~ 歡迎也到我站試試~
還有, 自己的評論不用”回覆”鏈接.
嘿嘿,万一自己想回复呢?比方换个马甲之后……
借个地儿,我测试一下。有个 bug 不知道搞定没有。
呵呵~ 評論框沒回去~
恩。我觉得,评论框也跟着消失了会让我很困惑
不过不管怎样,这篇还是收藏,说不准哪天我会用到呢!
测试评论
test~~~
。。都在GOOGLE READER 里看了,网站配色真漂亮。
嵌套评论就那么好吗。看很多人在问。
……我比较喜欢。原生支持,关系明确。
其实谈不上配色,我都是直接输入的颜色代码,根本不知道配不配的……
我相当喜欢你这不知道的配色。。。
留着留着。
逮到你了,话说你那儿该有个 ajax 评论哦。顺便问个问题,我这里的评论前面的 数字标号,在 IE 下怎么都出现在头像的位置上了?
所以,我收藏,收藏。那个似乎是因为list列表的问题之类的。我又要修改论文了,真是没心搞代码。但看了一下又看不出来。等我修改完再看看。-,-…
今天才把blog的主题支持原生嵌套了,来你这里学习原生嵌套ajax评论。
哈哈,不错
一直都是使用comment ajax评论嵌套,方便也好使~~
牛人 我先试试
可以直接嵌套不?
很哈皮是把~~
真他妈拽,你文章别删除哦,以后我研究研究。
试试 好像这个很完美
汗死 又看到了 来看看
Warning: file_get_contents(http://search.twitter.com/search.atom?q=from:ilorz&rpp=1) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 502 Bad Gateway in /home/lorzme/public_html/wp-content/themes/lorz/template-home.php on line 56
这是什么?还在测试,没稳定吧?
首页从 Twitter 抓取一推。Twitter 挂了,我这就废废了。
看来,应该试试从 Thread Twitter 这个插件抓取的数据里来读一条
Thanks for the useful info. It’s so interesting
测试看看
测试一下。
我今天试了下提示comments-ajax.php文件的这句语法错误:
<li
…
不知什么原因
是不是忘了开头:
function ajax_comment_output($comment, $args, $depth) {
$GLOBALS['comment'] = $comment; ?>
和结尾:
<?php
}
ajax_comment_output($comment,null,null);
这个,上篇文章里给写成了函数,而这篇没有。
写不写成函数都可以的,这里只要输出就成。
不写成函数会提示第一行开头那行函数错误
comment_class(”,$comment_id,$comment_post_ID)
恩,的确是……严重的描述失误。已经修改
应该不会吧?是这一行?
comment_class(”,$comment_id,$comment_post_ID)
折腾了好一下,没搞定。如果加上“还可以更完美点儿?”后面的情况就是:回复后真个回复框是灰色,要ctrl+f5重新载入才能恢复和看到新的评论。如果不加上“还可以更完美点儿?”后面的,那么就回复框能恢复,但新评论还是要刷新(f5就可以了)才能显示。不知是哪里搞错了还是我的模板问题
您能再根据演示文件折腾下吗?我看看……
明天再折腾一下看看
今天重新试了下,还是有问题:
FF和Chrome下直接发表评论后新评论老是跑到上面算下来第4个评论里面——不是嵌套样式。
IE6下又正常,但加载comments.js提示网页错误
嵌套回复倒是全部正常。
js修改的地方是这里:if($parent.attr(‘id’)==’content’){ //父元素若是main(与我模板有关)
这个应该没问题,我的主题comments的父元素就是content,不改就不会出现新评论
我的主题里是这样的:<ol class=”commentlist” id=”commentlist”>
而你的不是。 修改部分 js 代码试试
改了,还是一样,看来是我的模版问题了
直接发表评论是显示在最后一个嵌套回复的评论里面,所以还是js的问题。我不懂js所以只能麻烦你看看
嗯,好像搞定了,还是id问题
我把
if($parent.attr(‘id’)==’content’)
改为,
if($parent.attr(‘id’)==’commentlist’)
因为我的ol.commentlist的父级是#commentlist,纳闷,貌似comments写的不是很标准
不过ie6下加载js文件就提示网页错误,虽然不爽,但将就用着先吧
IE6 ? 莫非是找不到元素?删掉这行 var $loading = $(‘#loading’) 试试。
还是我,原来是我的comments.php没按标准定义id,折腾那么久。对了,你文章里还有一个书写错误,就是文件名comment-ajax.php应该改为comments-ajax.php,昨天就发现了但一直折腾忘了跟你说一声。
另:我能否把此文章相关内容转载到我博客?
无所谓标准不标准,都是主题的自由~但是 js 就不一定适用了,我是根据我主题来的。
改为 comments 更符合语义,但也无所谓了哈~
本文就是供折腾犯参考的,当然也欢迎折腾犯们转载
我是来试下这个行不行的。
正在搞这个东西,先测试下!
好像很完美的样子
我似乎来过……
欢迎欢迎~我怎么没印象捏~
想起来了,我从zwwooooo那边链接过来几次。当时还纳闷儿,怎么颜色是这个样子滴
-_- 颜色怎么了
WordPress2.8变成了87~90行了!
是啊。我记得我明明在文中提到啊,怎么没了……
这个网站给体验很好
就因为好,我订阅了,以后自己做的时候还望指教
等啥时候我会把我的评论部分的代码整成嵌套的了再来回看,我的评论部分的代码太旧了…
看你的博客 —— 就知道你是标准折腾犯!你的评论部分还不错
是在这里?
不行啊 看不懂 写得不清楚 像那个JS 不知道存什么名字
呃,看来的确需要提下。存为 comment-ajax.js,还要加载 jQuery 。例如:
测试下看看
第一条留言能完美的刷新出来么
Test!~
,但加载comments.js提示网页错误
嵌套回复倒是全部正常。
js修改的地方是这里:if($parent.attr(’id’)==’content’){ //父元素若是main(与我模板有关)
这个应该没问题,我的主题comments的父元素就是content,不改就不会出现新评论
回复
看看,以前做好的,现在又弄不上了。。
测试一下,看看效果如何
评论呈现隔条变色的样式,但我的不是嵌套评论的啊,我的是alt/even的样式,但ajax只呈现一种样式,请问博主js如何处理? php有什么好的方法实现?
我这也是 js 处理的。用 php 比较麻烦。文章末那段代码就可以的啊
在ishawn.net博客,ajax评论样式是可以隔条改变的…
//…….
if(!$(‘ol.commentlist’).length){
$respond.before(‘);
}
if($parent.attr(‘id’)==’content’){
$child_list = $(‘ol.commentlist’);
// ……..
我的不是这样的样式呀,而是
if (function_exists(‘wp_list_comments’))
wp_list_comments(‘type=comment&callback=ed_comments’);
else{
foreach ($comments as $comment){
if($comment->comment_type != ‘pingback’ && $comment->comment_type != ‘trackback’)
philna_comments($comment, null, null);
}
}
}else{
?>……..我不会用js处理,用什么js代码来实现啊!
你博客是?用的是 Yinheli 的主题?
滑动效果好呀!
测试一下。
用的是MG12的主题,上面的主题代码和我的主题差不多的,只不过我加上了一些功能而已!对了博主用这种主题AJAX留言JS是怎样写啊,不用JS判断留言,所以留言不会自动隔层分色的,是不是判断单复数样式的还是其它的?
根据新留言的上一条样式,来给新留言增加样式就可以了吧
我的 Ajax comments 發佈了, 請指教囉!
http://willin.atbhost.net/?p=1271
用quick comments有很多问题,来试试这个~~
我也是来测试的。
谢谢分享,我体验下了,呵呵
再来测试。
再来测试。…
需要看一看,可以的话再折腾。哦 对了。和AJAX评论插件有什么区别?
基于 WordPress 原生嵌套评论
测试
测试下
测试
测试下
test
啊?2.8不能用啊?白折腾了……
不是不能用,就是生成的回复链接有问题。这个问题也不影响正常使用,但如果浏览器禁用了 js ,就没办法回复评论了
非常不错,也试试这个功能!
测试一下看看。
不需要输入名字?
不错。。。。。。。
我也来试一下
我也来试一下
好酷啊
学习一下