WordPress 评论的 @ 回复

Oct 30th, 2008 Add Comment

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

参数, 信息来源

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

生成链接代码

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

/**
 * @ 回复
 * @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);
}

追加到评论输入框

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

/**
 * 追加到输入框
 * @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.

<!-- 评论者名字 -->
<?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() 是评论的编号.

<!-- 所有评论 -->
<ol>
	<?php foreach ($comments as $comment) : ?>
		<!-- 评论 -->
		<li id="comment-<?php comment_ID() ?>">
			<!-- 评论内容 -->
		</li>
	<?php endforeach; ?>
</ol>

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

<!-- 评论输入框 -->
<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');" 这段就是调用 @ 回复的代码.

<!-- 回复按钮 -->
<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. http://1.gravatar.com/avatar/32455efe08e31f67f2878464f4293f3b?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    ranmofang :
    Your comment is awaiting moderation.

    ranmofang :

    ranmofang :
    紧紧测试下引用

    引用

    再引用

    哇 这样引用几次就要审核了,这样长篇的评论,很占地方,要有字数限制

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

    ranmofang :

    ranmofang :
    紧紧测试下引用

    引用

    再引用

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

    ranmofang :
    紧紧测试下引用

    引用

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

    紧紧测试下引用

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

    @红茶
    嗯, 我做的时候 Chrome 还没流行起来, 所以没有考虑. 回头我看看, 谢谢啊.

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

    非常给力的功能,自己的blog已经用上,有个小BUG,chrome下面的焦点有点问题,有空可以修复下!

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

    @阿龙
    我让他热身对手犯规第三方个

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

    可靠吗所有浏览器都支持吗

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

    @写历聆 是这样吗?这个作用是什么

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

    我试一下看看~~~~

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

    难道是微博的@

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

    @ping
    看看效果

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

    呵呵,看得不是很懂!当作学习

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

    火恋の神父 :那个CLASS=“children”是怎么添加到里面的哦!

    测试看下效果。

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

    @Magician

    @rllivz
    OK,测试成功。

Comment pages
  1. Loading...