WordPress不允许同一用户在同一篇文章发布内容重复的评论,可以防止用户错误的点击提交按钮多次,防止没耐心等待审核的用户提交多次评论,也能防止一部分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!》
有没有办法实现每个用户只允许评论一次?
如果是登录用户,把评论次数写进user meta,每次在用户发表评论前检查一下即可。
想问一个问题:虽然可以重复回复,但我想控制回复时间间隔如何设置,就是连续回复必须经过1分钟或其他时间才能回复第二条评论?
不错,拿走…
要。完。全一。样。才。会被。禁。止。啊。
你打这么多句号干啥,wordpress默认的就是完全一样才禁止啊,防止不小心点了两次提交按钮
呵呵,敏感词习惯了。。
要完全一样才会被禁止啊。
测试下
我来测试下