WP笔记

WordPress去除重复评论的限制

duplicateWordPress不允许同一用户在同一篇文章发布内容重复的评论,可以防止用户错误的点击提交按钮多次,防止没耐心等待审核的用户提交多次评论,也能防止一部分spam评论。但有时候我们真的很需要写重复的评论,怎么办!

 

重复的评论,有时我真的需要

其实我并不知道WordPress不允许重复评论,直到我写了一篇文章叫做《如何注册Pinterest》,注册Pinterest需要邀请链接,所以有些朋友就会留言让我给他们发,我发送完成会回复一下,这下问题来了,第一次说“已发送”,没问题。回复另一个留言时说“已发送”,诊断为重复链接,wp_die()!

于是,我搜肠刮肚,寻找“已发送”这三个字的同义词,当同义词用尽后,又开始写一堆无关紧要的废话。终于,我连废话都写不出来了。我只想说,我是管理员,我的博客我最大,为嘛不让我随便说。

去除重复评论限制的方法

检测WordPress重复评论的函数是wp_allow_comment(),代码不难懂

if ( $wpdb->get_var($dupe) ) {
	do_action( 'comment_duplicate_trigger', $commentdata );
	if ( defined('DOING_AJAX') )
		die( __('Duplicate comment detected; it looks as though you’ve already said that!') );

	wp_die( __('Duplicate comment detected; it looks as though you’ve already said that!') );
}

虽然提供了一个action:comment_duplicate_trigger,但我无法通过一个action为函数提供返回值,所以用这个action不能改变运行结果。

网上提到的方法基本都是,直接注释掉上面那段代码,我不是很喜欢。一来,这要修改核心文件;二来,我并不希望所有用户都能发重复评论,只想给自己一点特权。

用google搜索了半天,终于发现一个我满意的方法,代码来自Stranger Studio,原文链接请看本文结尾。

方法的思路:

  • 审核评论之前,给评论添加随机字符串,这里用md5(time()),这样就不会被定为重复评论
  • 审核通过并存储后,更新评论,去掉随机字符串

非常聪明的想法!代码如下,加到functions.php中或者做成插件均可

function enable_duplicate_comments_preprocess_comment($comment_data)
{
	//add some random content to comment to keep dupe checker from finding it
	$random = md5(time());	
	$comment_data['comment_content'] .= "disabledupes{" . $random . "}disabledupes";	
 
	return $comment_data;
}
add_filter('preprocess_comment', 'enable_duplicate_comments_preprocess_comment');
 
function enable_duplicate_comments_comment_post($comment_id)
{
	global $wpdb;
 
	//remove the random content
	$comment_content = $wpdb->get_var("SELECT comment_content FROM $wpdb->comments WHERE comment_ID = '$comment_id' LIMIT 1");	
	$comment_content = preg_replace("/disabledupes\{.*\}disabledupes/", "", $comment_content);
	$wpdb->query("UPDATE $wpdb->comments SET comment_content = '" . $wpdb->escape($comment_content) . "' WHERE comment_ID = '$comment_id' LIMIT 1");
 
	/*
		add your own dupe checker here if you want
	*/
}
add_action('comment_post', 'enable_duplicate_comments_comment_post');

用上面的代码,可以允许所有人重复评论。

如果只允许管理员评论,可以这样干(functions.php中)

if( current_user_can('administrator') ) {
	add_filter('preprocess_comment', 'enable_duplicate_comments_preprocess_comment');
	add_action('comment_post', 'enable_duplicate_comments_comment_post');
}


function enable_duplicate_comments_preprocess_comment($comment_data)
{
	//add some random content to comment to keep dupe checker from finding it
	$random = md5(time());	
	$comment_data['comment_content'] .= "disabledupes{" . $random . "}disabledupes";	
 
	return $comment_data;
}

 
function enable_duplicate_comments_comment_post($comment_id)
{
	global $wpdb;
 
	//remove the random content
	$comment_content = $wpdb->get_var("SELECT comment_content FROM $wpdb->comments WHERE comment_ID = '$comment_id' LIMIT 1");	
	$comment_content = preg_replace("/disabledupes\{.*\}disabledupes/", "", $comment_content);
	$wpdb->query("UPDATE $wpdb->comments SET comment_content = '" . $wpdb->escape($comment_content) . "' WHERE comment_ID = '$comment_id' LIMIT 1");
 
	/*
		add your own dupe checker here if you want
	*/
}

参考文章

Duplicate comment detected; it looks as though you’ve already said that!

10条评论

    1. 如果是登录用户,把评论次数写进user meta,每次在用户发表评论前检查一下即可。

  1. 想问一个问题:虽然可以重复回复,但我想控制回复时间间隔如何设置,就是连续回复必须经过1分钟或其他时间才能回复第二条评论?

    1. 你打这么多句号干啥,wordpress默认的就是完全一样才禁止啊,防止不小心点了两次提交按钮

评论已关闭。