WordPress中限制非管理员用户在文章后只能评论一次


Posted in PHP onDecember 31, 2015

之前有网友提出,在WordPress中有没有办法实现每篇文章只允许用户评论一次?

暂不说这个需求有没有用,毕竟WordPress就是给有各种需求的人用的。这个功能实现起来也比较简单,只需每次用户发表的评论进数据库之前,从当前文章的所有评论中查找是否有相同的用户名或邮箱已经发表过评论,如果有就跳到错误页面即可。

实现代码,放到当前主题的functions.php中即可(这里还增加了对IP的判断,更保险):

// 获取评论用户的ip,参考wp-includes/comment.php
function ludou_getIP() {
 $ip = $_SERVER['REMOTE_ADDR'];
 $ip = preg_replace( '/[^0-9a-fA-F:., ]/', '', $ip );
  
 return $ip;
}

function ludou_only_one_comment( $commentdata ) {
 global $wpdb;
 $currentUser = wp_get_current_user();
 
 // 不限制管理员发表评论
 if(empty($currentUser->roles) || !in_array('administrator', $currentUser->roles)) {
  $bool = $wpdb->get_var("SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = ".$commentdata['comment_post_ID']." AND (comment_author = '".$commentdata['comment_author']."' OR comment_author_email = '".$commentdata['comment_author_email']."' OR comment_author_IP = '".ludou_getIP()."') LIMIT 0, 1;");
 
  if($bool)
   wp_die('本站每篇文章只允许评论一次。<a href="'.get_permalink($commentdata['comment_post_ID']).'">点此返回</a>');
 }
 
 return $commentdata;
}
add_action( 'preprocess_comment' , 'ludou_only_one_comment', 20);

这里没有限制管理员的评论次数,那我们顺带着看一下判断用户是否为管理员的方法:

判断指定id的用户是不是管理员

该需求实现起来非常简单,几行代码搞定,分享一下:

function ludou_is_administrator($user_id) {
 $user = get_userdata($user_id);
 if(!empty($user->roles) && in_array('administrator', $user->roles))
  return 1; // 是管理员
 else
  return 0; // 非管理员
}

判断当前登录用户是不是管理员

如果是判断当前登录用户是不是管理员,可以使用下面的函数:

function ludou_is_administrator() {
 // wp_get_current_user函数仅限在主题的functions.php中使用
 $currentUser = wp_get_current_user();

 if(!empty($currentUser->roles) && in_array('administrator', $currentUser->roles)) 
  return 1; // 是管理员
 else
  return 0; // 非管理员
}
PHP 相关文章推荐
PHP 日志缩略名的创建函数代码
May 26 PHP
PHP CURL获取返回值的方法
May 04 PHP
php socket实现的聊天室代码分享
Aug 16 PHP
浅析PHP中strlen和mb_strlen的区别
Aug 31 PHP
php获取当月最后一天函数分享
Feb 02 PHP
PHP中你应该知道的require()文件包含的正确用法
Jun 12 PHP
thinkphp验证码的实现(form、ajax实现验证)
Jul 28 PHP
浅谈ThinkPHP5.0版本和ThinkPHP3.2版本的区别
Jun 17 PHP
PHP接口继承及接口多继承原理与实现方法详解
Oct 18 PHP
thinkPHP5.0框架事务处理操作简单示例
Sep 07 PHP
PHP 命名空间和自动加载原理与用法实例分析
Apr 29 PHP
Laravel统一错误处理为JSON的方法介绍
Oct 18 PHP
php实现微信公众号主动推送消息
Dec 31 #PHP
php创建桌面快捷方式实现方法
Dec 31 #PHP
开启PHP的伪静态模式
Dec 31 #PHP
thinkphp多层MVC用法分析
Dec 30 #PHP
thinkphp命名空间用法实例详解
Dec 30 #PHP
详解PHP中的null合并运算符
Dec 30 #PHP
thinkPHP导出csv文件及用表格输出excel的方法
Dec 30 #PHP
You might like
索尼ICF-SW100收音机评测
2021/03/02 无线电
十天学会php之第六天
2006/10/09 PHP
10个值得深思的PHP面试题
2016/11/14 PHP
详解PHP数据压缩、加解密(pack, unpack)
2016/12/17 PHP
php实现文件与16进制相互转换的方法示例
2017/02/16 PHP
Nginx+php配置文件及原理解析
2020/12/09 PHP
jQuery页面滚动浮动层智能定位实例代码
2011/08/23 Javascript
js图片自动切换效果处理代码
2013/05/07 Javascript
判断一个对象是否为jquery对象的方法
2014/03/12 Javascript
chrome下jq width()方法取值为0的解决方法
2014/05/26 Javascript
Javascript中的getUTCHours()方法使用详解
2015/06/10 Javascript
JavaScript判断FileUpload控件上传文件类型
2015/09/28 Javascript
javascript嵌套函数和在函数内调用外部函数的区别分析
2016/01/31 Javascript
详解Nodejs之静态资源处理
2017/06/05 NodeJs
微信小程序获取循环元素id以及wx.login登录操作
2017/08/17 Javascript
详解vuex中mapState,mapGetters,mapMutations,mapActions的作用
2018/04/13 Javascript
vue-cli3添加模式配置多环境变量的方法
2019/06/05 Javascript
解决在layer.open中使用时间控件laydate失败的问题
2019/09/11 Javascript
JQuery样式与属性设置方法分析
2019/12/07 jQuery
jQuery实现可编辑的表格
2019/12/11 jQuery
[06:44]2018DOTA2亚洲邀请赛4.5 SOLO赛 MidOne vs Sumail
2018/04/06 DOTA
vc6编写python扩展的方法分享
2014/01/17 Python
pyqt5 键盘监听按下enter 就登陆的实例
2019/06/25 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
2019/10/30 Python
Python之Class&amp;Object用法详解
2019/12/25 Python
Python Websocket服务端通信的使用示例
2020/02/25 Python
keras的load_model实现加载含有参数的自定义模型
2020/06/22 Python
Python 存取npy格式数据实例
2020/07/01 Python
Html5中的桌面通知Notification的实现
2018/09/25 HTML / CSS
init进程的作用
2012/04/12 面试题
小区消防演习方案
2014/02/21 职场文书
消防安全责任书范本
2014/04/15 职场文书
奥运会口号
2014/06/13 职场文书
群众路线查摆问题及整改措施
2014/10/10 职场文书
婚礼领导致辞大全
2015/07/28 职场文书
总结Python使用过程中的bug
2021/06/18 Python