WordPress 评论的 @ 回复

难度:

所谓 @ 回复, 就是在评论者名字前添加 '@' 标记, 不涉及评论内容的, 生成带链接的代码并追加到评论输入框中.
我不喜欢那种结构复杂的, 难以维护的嵌套回复, 而是经常使用 @ 回复. 为此我写了个 JavaScript 脚本, 其中包括了这部分的处理.

参数, 信息来源

评论者 ID (为了取得评论者的名字)
评论 ID (因为点击 '@评论者名字' 后需要转跳到这个评论)
评论输入框 ID (代码需要追加到指定 ID 的输入框)

生成链接代码

为什么链接后方有一个空格和换行符号? 都是为了防止评论者名字和后面的内容贴在一块.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
 * @ 回复
 * @param authorId		评论者 ID
 * @param commentId		评论 ID
 * @param commentBox	评论输入框 ID
 */
function reply(authorId, commentId, commentBox) {
	// 评论者名字
	var author = document.getElementById(authorId).innerHTML;
	// 拼接成 '@评论者名字' 链接
	var insertStr = '<a href="#' + commentId + '">@' + author.replace(/\t|\n/g, "") + '</a> \n';
 
	// 追加到评论输入框
	appendReply(insertStr, commentBox);
}

追加到评论输入框

为什么选择追加, 而不是插入? 人们习惯一个挨一个地进行回复的.
为什么检验重复回复? 我想一般人不会在一个问题上分几段回复, 所以有这么一个检测, 提示一下用户, 以免出现冗余回复.

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
32
/**
 * 追加到输入框
 * @param insertStr		追加字符串
 * @param commentBox	评论输入框 ID
 */
function appendReply(insertStr, commentBox) {
	// 如果指定的输入框存在, 将它设为目标区域
	if(document.getElementById(commentBox) && document.getElementById(commentBox).type == 'textarea') {
		field = document.getElementById(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;
	}
 
	// 聚焦评论输入框
	field.focus();
}

使用脚本

前面是关于脚本处理的原理和说明, 这就说说要怎么使用吧.

评论者 ID
这个比较麻烦, 得判断评论者 URL 是否存在, 如果存在则在链接上添加评论者 ID, 否则在外层 span 上添加评论者 ID.
为什么不用 comment_author_link() 直接获显示评论者名字 (有 URL 的带有链接) 呢? 我们需要从指定 ID 的元素中获取评论者的名字, 所以必须在评论者名字的外层定义评论者 ID.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- 评论者名字 -->
<?php if (get_comment_author_url()) : ?>
	<a id="commentauthor-<?php comment_ID() ?>" href="<?php comment_author_url() ?>">
<?php else : ?>
	<span id="commentauthor-<?php comment_ID() ?>">
<?php endif; ?>
 
<?php comment_author() ?>
 
<?php if(get_comment_author_url()) : ?>
	</a>
<?php else : ?>
	</span>
<?php endif; ?>

评论 ID
一般主题都有添加的, comment_ID() 是评论的编号.

1
2
3
4
5
6
7
8
9
<!-- 所有评论 -->
<ol>
	<?php foreach ($comments as $comment) : ?>
		<!-- 评论 -->
		<li id="comment-<?php comment_ID() ?>">
			<!-- 评论内容 -->
		</li>
	<?php endforeach; ?>
</ol>

评论输入框 ID
comment 是评论输入框的 ID, 这几乎已经成为 WordPress 主题开发者无言的约定了.

1
2
<!-- 评论输入框 -->
<textarea name="comment" id="comment" tabindex="4" rows="8" cols="50"></textarea>

回复按钮
调用前面讨论的 JavaScript 脚本, 完成 @ 回复处理.
href="javascript:void(0);" 是链接调用 JavaScript 空处理. 为什么不干脆撤掉 href 属性呢? 如果 a 标签没有 href 属性, 当鼠标悬停在链接上, 你将无法看到 "手指" 指针.
onclick="reply('commentauthor-', 'comment-', 'comment');" 这段就是调用 @ 回复的代码.

1
2
<!-- 回复按钮 -->
<a href="javascript:void(0);" onclick="reply('commentauthor-<?php comment_ID() ?>', 'comment-<?php comment_ID() ?>', 'comment');"><?php _e('Reply'); ?></a>

后续

最近有些网友提问如何实现那个回复功能, 我觉得可以抽出来讲讲, 所以写下此文.
回复按钮就这么回事, 很简单吧. 其实引用的实现也是大同小异, 有兴趣的朋友可以自己摸索一下, 也可以留言讨论.

声明: 本文采用 BY-NC-SA 协议进行授权. 转载请注明转自: WordPress 评论的 @ 回复
  1. Magician | #51
    Aug 31st, 2009 at 20:37

    进来学习下。

    如果采用非嵌套方式,那么评论调用reply函数会不把父评论的ID写进数据库。
    我想问一下如何像普通回复评论那样把父评论的ID也写进数据库?
    这样的话切换到嵌套方式也就可以显示嵌套效果了。

    另外如果采用嵌套方式,怎样将@Author评论链接也写进去?
    这样的话假如采用非嵌套方式了也很容易找到父评论。

    总的说来想让其更通用点,对于以后的兼容性和发展应该还是有好处的。

  2. 小刘 | #52
    Sep 5th, 2009 at 13:20

    不错,我来学习了!

  3. ccor | #53
    Sep 9th, 2009 at 18:02

    @小刘 试试看

  4. SEVEN | #54
    Sep 16th, 2009 at 00:41

    很棒的功能,可是看不太懂,不知道要怎麼弄!= =

  5. John | #55
    Oct 12th, 2009 at 15:51

    这个回复功能很好。但如何使得回复的内容让评论者能收到邮件呢?

  6. Justice | #56
    Oct 12th, 2009 at 16:49

    @John
    用Mail to Commenter这个插件

  7. John | #57
    Oct 12th, 2009 at 17:08

    @Justice 谢谢Justice。终于下载了这个插件使用。
    但使用上似乎还有一些问题,评论者还是收不到邮件。

  8. Justice | #58
    Oct 12th, 2009 at 17:39

    @John
    如果你是参照这篇来做的话,要在上面第一段代码第11行最后的'</a> \n'改成' </a> \n'。(多加开头那个空格)

  9. Stinky17 | #59
    Oct 23rd, 2009 at 00:56

    Children creating language: How Nicaraguan sign language acquired a spatial grammar. ,

  10. JXL35 | #60
    Oct 23rd, 2009 at 21:55

    My choice has been single phase synchronous gearmotors, which have served well. ,

  11. bob | #61
    Oct 25th, 2009 at 09:49

    学习了。好文章。

  12. John | #62
    Nov 6th, 2009 at 08:28

    这几段PHP代码有点难懂

  13. kane | #63
    Nov 6th, 2009 at 08:31

    Mail to Commenter这个插件装了之后好像收不到邮件了

  14. 510博客 | #64
    Nov 9th, 2009 at 23:24

    我正查找相关文章,查到这来了!感谢啊!

  15. 风花絮 | #65
    Nov 20th, 2009 at 02:31

    说真的,没看懂怎么用!

  16. 试一试 | #66
    Nov 26th, 2009 at 10:28

    @风花絮
    这样么?

  17. 铝镁锰板 | #67
    Dec 4th, 2009 at 10:19

    我加了代码之后出错了

  18. QiQiBoY | #68
    Dec 13th, 2009 at 18:46

    我嵌套回复,用jQuery实现了,直接操作系统生成的回复按钮。。

  19. Eric | #69
    Dec 26th, 2009 at 23:13

    @QiQiBoY
    这个如何实现

  20. QiQiBoY | #70
    Dec 26th, 2009 at 23:19

    @Eric 这是我自己的(参照默认模板的嵌套格式),你要使用要参照自己的文章模型改一下。。。
    $(".reply").click(function() {
    var url = $(this).parent().parent().attr("id");
    var info = $(this).siblings(".comment-author").children(".fn").text();
    $("textarea[name='comment']").val("《a href='" + "#" + url + "' title='" + info + "'》@ " + info + " 《/a》: ")
    });
    //取消回复时清空回复框
    $("#cancel-comment-reply a").click(function() {
    $("textarea[name='comment']").val("")
    });

  21. a | #71
    Dec 29th, 2009 at 15:34

    QiQiBoY :
    @Eric 这是我自己的(参照默认模板的嵌套格式),你要使用要参照自己的文章模型改一下。。。
    $(".reply").click(function() {
    var url = $(this).parent().parent().attr("id");
    var info = $(this).siblings(".comment-author").children(".fn").text();
    $("textarea[name='comment']").val("《a href='" + "#" + url + "' title='" + info + "'》@ " + info + " 《/a》: ")
    });
    //取消回复时清空回复框
    $("#cancel-comment-reply a").click(function() {
    $("textarea[name='comment']").val("")
    });

  22. jarod | #72
    Jan 12th, 2010 at 00:00

    @小刘
    测试一下

  23. 柚子 | #73
    Jan 13th, 2010 at 13:57

    你好,请问代码是添加到哪个部分里面?style.CSS?

  24. 一直长大 | #74
    Jan 17th, 2010 at 19:43

    不错,讲得很详细。
    要把一个人的评论右下角的“reply”和“quote”改为中文的“回复”和“引用”怎么修改?

  25. lee | #75
    Feb 12th, 2010 at 16:40

    请问怎样获取#楼,而不是ID名?

  26. 印第安小狮 | #76
    Feb 13th, 2010 at 16:20

    刚发现嵌套格式的有点乱 所以就取消了 没想到没回复一功能了... 这个正需要!

  27. 离心泵 | #77
    Mar 4th, 2010 at 21:39

    代码有点复杂

Comment pages
1 2 781
  1. iNove和Mail To Commenter的纠结 | BoBoSkY
    Nov 28th, 2008 at 23:32
  2. 修改網誌分類及回覆的習慣性 « MUKI space*
    Jan 7th, 2009 at 16:32
  3. 小木屋 » 移花接木实现inove主题的留言功能
    Jul 31st, 2009 at 01:48
  4. My IM and IS » Blog Archive » 移花接木实现inove主题的留言功能
    Jul 31st, 2009 at 01:50

Twitter Email feed
RSS feed