如何让WP主题同时支持嵌套评论与邮件回复
本着折腾到底不罢休的精神,又给博客做了个手术,这手术做的可不轻松,啃下了WP最艰难的部分。本次修改主要是为了支持嵌套回复,也是为了提高用户体验的一个重大举措吧,其实要纯粹的支持嵌套回复功能倒是简单,然而同时要正常使用ThinkAgain的Mail to Commenter插件来邮件回复的时候,问题就会随之而来了。昨晚折腾到半夜三点,终究是把问题给解决了。关键点在于如何让主题支持嵌套以及如何支持邮件回复。文章末尾有全套代码!
让WP主题支持嵌套回复
首先要解决的是让主题嵌套回复,WP2.7版本后就支持此功能,这里可以参考mg12的WordPress 嵌套回复一文。最简单的方法是使用Wordpress自带的wp_list_comments()来自动解决,然而由于wp自带的wp_list_comments()代码稍嫌臃肿且无法自定义,这时候就需要在模板的function.php文件中来自定义评论显示方法,并在comments.php 中利用wp_list_comments(‘callback=custom_comments’)来显示自定义评论。
在自定义的评论显示方法中,只需要添加如下代码即可:
1 | < ?php comment_reply_link(array_merge( $args, array('depth' => $depth, 'max_depth' => $args['max_depth']))) ?> |
之后在后台设置中允许嵌套回复就可以了。
让回复功能支持Mail to Commenter插件的邮件回复
以上已经介绍了如何让主题支持嵌套回复了,然而以上的方法无法进行自定义,因此也就无法添加邮件回复所需的触发函数,于是我们需要对以上的方法进行适当的修改,通过研究代码,可以看到“回复”的链接实际上有类似这样的代码:
1 | onclick="addComment.moveForm('comment-< ?php comment_ID() ?>','< ?php comment_ID() ?>', 'respond', '< ?php echo $post->ID; ?>');" |
其中的’comment-< ?php comment_ID() ?>‘会根据主题而不同例如WP自带的评论回复中该项就是’div-comment-’。而另外一个’respond‘可能会根据不同主题不同,没有过多研究,各位可以自己尝试下。www.yetlive.com
也就是说自定义的时候只要修改下此处就好了,其中还要注意到的一个问题就是判断支持几层嵌套,当嵌套层数超出了WP后台设置的深度时则需要做相应处理,研究了WP的comment-template.php代码后,可以得到如下的方法判断是否已经超出嵌套层数:
1 | if( $depth<get_option('thread_comments_depth')) |
有了这些基础之后,就需要再为此回复链接带上邮件回复触发机制,大家知道Mail to Commenter插件会识别回复中是否存在@user 或者@user:来自动回复邮件,那么就需要为链接上加上一点Javascript代码让其有此功能,我研究了inove的JS代码后,借用如下:
1 | RE_CON.reply('commentauthor-< ?php comment_ID() ?>','comment-< ?php comment_ID() ?>','comment'); |
然后需要在主题的头部调用外部JS文件,此JS文件中加入如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | (function() { function $(id) { return document.getElementById(id); } window['RE'] = {}; window['RE']['$'] = $; function reply(authorId, commentId, commentBox) { var author = RE.$(authorId).innerHTML; var insertStr = '<a href="#' + commentId + '">@'+ author.replace(/\t|\n|\r\n/g, "")+':</a> \n'; insertReply(insertStr, commentBox); } function insertReply(insertStr, commentBox) { if(RE.$(commentBox) && RE.$(commentBox).type == 'textarea') { field = RE.$(commentBox); } else { alert("The comment box does not exist!"); return false; } if (field.value.indexOf(insertStr) > -1) { alert("You've already appended this reply!"); return false; } if (field.value.replace(/\s|\t|\n/g, "") == '') { field.value = insertStr; } else { field.value = field.value.replace(/[\n]*$/g, "") + '\n\n' + insertStr; } } window['RE_CON'] = {}; window['RE_CON']['reply'] = reply; })(); |
之后,我们的嵌套回复于邮件回复功能就可以实现了。于是我最终的方法就如下了,也是本主题中用到的方法:
1 2 3 4 5 6 7 8 9 | < ?php if(!function_exists('mailtocommenter_button')) {comment_reply_link(array_merge( $args, array('reply_text' => 'Reply', 'depth' => $depth, 'max_depth' => $args['max_depth']))); } else if(function_exists('mailtocommenter_button')&& $depth<get_option('thread_comments_depth')) { ?> <a rel='nofollow' class='comment-reply-link' href="javascript:void(0);" onclick="addComment.moveForm('comment-<?php comment_ID() ?>','< ?php comment_ID() ?>', 'respond', '<?php echo $post->ID; ?>');RE_CON.reply('commentauthor-< ?php comment_ID() ?>','comment-< ?php comment_ID() ?>','comment'); "> < ?php _e('Reply'); ?> </a> < ?php } else { ?> <a rel='nofollow' class='comment-reply-link' href="javascript:void(0);" onclick="RE_CON.reply('commentauthor-< ?php comment_ID() ?>','comment-< ?php comment_ID() ?>','comment'); "> < ?php _e('Reply'); ?> </a> <?php }?> |
其实在本人的修改中添加了对是否存在邮件回复插件的判断,其实如果是自己用的话不判断也可以,为了方便大家的使用才做了这样的处理,至于说到JS文件,可以自己打开http://www.yetlive.com/wp-content/themes/simpleblue/js/common.js复制粘贴。

其实邮件通知用代码就可以完成了,没必要整个插件。
@秦大少:
怎么说用插件的话就不需要每次换主题的时候去修改很多东西,我完全是冲着点方便才用插件的
应有用,很详细,我也很认真地看了,但对我来说还是很难。还在折腾中呢···
@杜小白:
应该来说照着做下来就完全可以了的啊,没想到女生也折腾这个啊,真是稀有动物啊
@zp1214:
非常地感谢你啊!!你提点我的主题和INOVE的评论一样,让我顿悟,我的搜索有了方向!因为本人不是学计算机的,折腾死了。
而今天再重看了你的这篇日记两次,我终于懂怎么回事了,一直想着改PHP,要曾加调用哪些函数,原来是忽略了还有一个JS文件。我还在折腾,不过感觉有点头绪了。
一个星期内,我会把嵌套式回复和邮件回复的!到时欢迎你再来看!我想,我们是可以互相交流的!
@杜小白:
那你加油吧,到时候来看看。我也非计算机的呢
看来你很喜欢折腾阿,呵呵~
@记忆盒子:
反正闲的发慌了,就把主题完善下咯,过两天把Ajax评论载入功能也要折腾进来就好
我也有用mg12的评论插件~
@kaka:
看很多WP都用这个吧,个人以为用户体验比较好
不用插件就是可以实现
用Willian大师的
@皓辰:
恩,看到了。只是如果每次换主题都要去折腾一下就不方便了,用插件的好处就是方便换主题
还没用过。。
@飞猪:
邮件回复没用过吗?用上吧,要不用户都不知道什么时候被回复了的
我用上了···
@二十六公斤:
对大家有用就是最好的回报了
我用的主题有嵌套评论,不用这么麻烦了~
@浩儿:
难道你没看明白这主题是我自己制作的么?所以才会麻烦些呢
这招不错,收藏下
@leesum:
有用就好
我是来测试的,看你弄得怎么样,嵌套可以不变的吧,直接安装个回复邮件通知插件
@wulinfo:
Ajax评论还没弄呢,没这么多时间折腾。我装的Mail to Commenter插件的自带一个回复按钮,与嵌套回复用到的按钮需要把代码组合一下才能实现两个功能呢
[...] 前几天把邮件回复于嵌套回复的功能合并了,同时也留下了过几天把Ajax评论功能添加进主题的大话,然而最近又再思考,博客的评论到底应不应该要呢?这里写下自己的想法,也请各位看到本日志的朋友给我点意见。 [...]
我要努力地啃啃学习方法。
@ian,lukas: 最好的办法是去啃wp-include里面的模板
这个是不错,可惜是代码,我有点搞不懂
@投资生涯: 把上面的代码拷贝过去应该就没问题的
推荐一个插件吧。。这个方法能够无限嵌套么?
个人还是比较喜欢简单点的评论模式~
@9ray宝贝: 简单有简单的好处,但是不直观了
呵呵 我用的WP Thread Comment 就不用这么折腾了
@我勒个去: 各人有各人喜好
[...] 最后一个需要解决的问题是关于邮件回复的,如果用了嵌套式评论,依然想使用Mail to commenter这个插件的话(Mail to commenter发邮件是根据有无@,而用了嵌套后有些评论是没有@的,当然你也可以全都保留@,这样嵌套就失去意义了),可以参照《如何让WP主题同时支持嵌套评论与邮件回复》,这个办法和我要解决的问题最相像,但我却没能全看懂。 [...]