司马东方 發表於 2023-6-19 00:00:00

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

<p>
之前有网友提出,在WordPress中有没有办法实现每篇文章只允许用户评论一次?</p>
<p>
暂不说这个需求有没有用,毕竟WordPress就是给有各种需求的人用的。这个功能实现起来也比较简单,只需每次用户发表的评论进数据库之前,从当前文章的所有评论中查找是否有相同的用户名或邮箱已经发表过评论,如果有就跳到错误页面即可。</p>
<p>
实现代码,放到当前主题的functions.php中即可(这里还增加了对IP的判断,更保险):</p>
<div>
<div>
<div id="highlighter_553693">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
<div>
2</div>
<div>
3</div>
<div>
4</div>
<div>
5</div>
<div>
6</div>
<div>
7</div>
<div>
8</div>
<div>
9</div>
<div>
10</div>
<div>
11</div>
<div>
12</div>
<div>
13</div>
<div>
14</div>
<div>
15</div>
<div>
16</div>
<div>
17</div>
<div>
18</div>
<div>
19</div>
<div>
20</div>
<div>
21</div>
<div>
22</div>
<div>
23</div>
</td>
<td>
<div>
<div>
<code>// 获取评论用户的ip,参考wp-includes/comment.php</code>
</div>
<div>
<code>function</code> <code>ludou_getIP() {</code>
</div>
<div>
<code> </code><code>$ip</code> <code>= </code><code>$_SERVER</code><code>[</code><code>'REMOTE_ADDR'</code><code>];</code>
</div>
<div>
<code> </code><code>$ip</code> <code>= preg_replace( </code><code>'/[^0-9a-fA-F:., ]/'</code><code>, </code><code>''</code><code>, </code><code>$ip</code> <code>);</code>
</div>
<div>
<code>  </code>
</div>
<div>
<code> </code><code>return</code> <code>$ip</code><code>;</code>
</div>
<div>
<code>}</code>
</div>
<div>
 </div>
<div>
<code>function</code> <code>ludou_only_one_comment( </code><code>$commentdata</code> <code>) {</code>
</div>
<div>
<code> </code><code>global</code> <code>$wpdb</code><code>;</code>
</div>
<div>
<code> </code><code>$currentUser</code> <code>= wp_get_current_user();</code>
</div>
<div>
<code> </code>
</div>
<div>
<code> </code><code>// 不限制管理员发表评论</code>
</div>
<div>
<code> </code><code>if</code><code>(</code><code>empty</code><code>(</code><code>$currentUser</code><code>-&gt;roles) || !in_array(</code><code>'administrator'</code><code>, </code><code>$currentUser</code><code>-&gt;roles)) {</code>
</div>
<div>
<code>  </code><code>$bool</code> <code>= </code><code>$wpdb</code><code>-&gt;get_var(</code><code>"SELECT comment_ID FROM $wpdb-&gt;comments WHERE comment_post_ID = "</code><code>.</code><code>$commentdata</code><code>[</code><code>'comment_post_ID'</code><code>].</code><code>" AND (comment_author = '"</code><code>.</code><code>$commentdata</code><code>['comment_author</code><code>']."'</code> <code>OR comment_author_email = </code><code>'".$commentdata['</code><code>comment_author_email</code><code>']."'</code> <code>OR comment_author_IP = </code><code>'".ludou_getIP()."'</code><code>) LIMIT 0, 1;");</code>
</div>
<div>
<code> </code>
</div>
<div>
<code>  </code><code>if</code><code>(</code><code>$bool</code><code>)</code>
</div>
<div>
<code>   </code><code>wp_die(</code><code>'本站每篇文章只允许评论一次。&lt;a href="'</code><code>.get_permalink(</code><code>$commentdata</code><code>[</code><code>'comment_post_ID'</code><code>]).</code><code>'"&gt;点此返回&lt;/a&gt;'</code><code>);</code>
</div>
<div>
<code> </code><code>}</code>
</div>
<div>
<code> </code>
</div>
<div>
<code> </code><code>return</code> <code>$commentdata</code><code>;</code>
</div>
<div>
<code>}</code>
</div>
<div>
<code>add_action( </code><code>'preprocess_comment'</code> <code>, </code><code>'ludou_only_one_comment'</code><code>, 20);</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div id="codetool">
<div>
<textarea></textarea>
</div>
</div>
</div>
<p>
 </p>
<p>
这里没有限制管理员的评论次数,那我们顺带着看一下判断用户是否为管理员的方法:</p>
<p>
<strong>判断指定id的用户是不是管理员</strong></p>
<p>
该需求实现起来非常简单,几行代码搞定,分享一下:</p>
<div>
<div>
<div id="highlighter_148016">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
<div>
2</div>
<div>
3</div>
<div>
4</div>
<div>
5</div>
<div>
6</div>
<div>
7</div>
</td>
<td>
<div>
<div>
<code>function</code> <code>ludou_is_administrator(</code><code>$user_id</code><code>) {</code>
</div>
<div>
<code> </code><code>$user</code> <code>= get_userdata(</code><code>$user_id</code><code>);</code>
</div>
<div>
<code> </code><code>if</code><code>(!</code><code>empty</code><code>(</code><code>$user</code><code>-&gt;roles) &amp;&amp; in_array(</code><code>'administrator'</code><code>, </code><code>$user</code><code>-&gt;roles))</code>
</div>
<div>
<code>  </code><code>return</code> <code>1; </code><code>// 是管理员</code>
</div>
<div>
<code> </code><code>else</code>
</div>
<div>
<code>  </code><code>return</code> <code>0; </code><code>// 非管理员</code>
</div>
<div>
<code>}</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div id="codetool">
<div>
<textarea></textarea>
</div>
</div>
</div>
<p>
<strong>判断当前登录用户是不是管理员</strong></p>
<p>
如果是判断当前登录用户是不是管理员,可以使用下面的函数:</p>
<div>
<div>
<div id="highlighter_517300">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
<div>
2</div>
<div>
3</div>
<div>
4</div>
<div>
5</div>
<div>
6</div>
<div>
7</div>
<div>
8</div>
<div>
9</div>
</td>
<td>
<div>
<div>
<code>function</code> <code>ludou_is_administrator() {</code>
</div>
<div>
<code> </code><code>// wp_get_current_user函数仅限在主题的functions.php中使用</code>
</div>
<div>
<code> </code><code>$currentUser</code> <code>= wp_get_current_user();</code>
</div>
<div>
 </div>
<div>
<code> </code><code>if</code><code>(!</code><code>empty</code><code>(</code><code>$currentUser</code><code>-&gt;roles) &amp;&amp; in_array(</code><code>'administrator'</code><code>, </code><code>$currentUser</code><code>-&gt;roles)) </code>
</div>
<div>
<code>  </code><code>return</code> <code>1; </code><code>// 是管理员</code>
</div>
<div>
<code> </code><code>else</code>
</div>
<div>
<code>  </code><code>return</code> <code>0; </code><code>// 非管理员</code>
</div>
<div>
<code>}</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div id="codetool">
<div>
<textarea></textarea>
</div>
</div>
</div>
頁: [1]
查看完整版本: WordPress中限制非管理员用户在文章后只能评论一次