需求:按照用户名、邮箱、文章ID或者网站自动同意用户发的评论。
这里需要用到Auto Approve Comments插件,下载地址:https://github.com/fedeandri/auto-approve-comments
但是此插件暂时仅支持名称、邮箱和网站的条件过滤评论,没法支持特定文章下的评论自动审批。
直接下载 http://www.xiaozhongpai.com/wp-content/uploads/2017/06/auto-approve-comments-master.zip
或者把插件里的文件auto-approve-comments.php内容替换为下列打开即可
<?php
/*
* Plugin Name: Auto Approve Comments
* Plugin URI: https://github.com/fedeandri/auto-approve-comments
* Description: Provides a quick way to auto approve new comments based on commenter email/name/url or username
* Version: 2.1
* Author: Federico Andrioli
* Author URI: https://it.linkedin.com/in/fedeandri
* GPLv2 or later
*
*/
defined( 'ABSPATH' ) or die();
if ( ! class_exists( 'AutoApproveComments' ) ) {
class AutoApproveComments
{
const VERSION = '2.1';
const DOMAIN_PATTERN = '/^([a-z0-9-]+\.)*[a-z0-9-]+\.[a-z]+$/';
const EMAIL_PATTERN = '/^[a-z0-9-._+]+@[a-z0-9-]+\.[a-z]+/';
const POST_PATTERN = '/post_([0-9].*)/';
public function __construct() {
add_action( 'admin_menu', array( &$this, 'plugin_init' ) );
add_action( 'admin_init', array( &$this, 'register_db_settings' ) );
add_action( 'wp_insert_comment', array( &$this, 'auto_approve_comments' ), 999, 2 );
add_action( 'admin_enqueue_scripts', array( &$this, 'enqueue_custom_admin_files') );
add_action( 'wp_ajax_aac_ajax_get_commenters_suggestions', array( &$this, 'aac_ajax_get_commenters_suggestions') );
add_action( 'wp_ajax_aac_ajax_get_usernames_suggestions', array( &$this, 'aac_ajax_get_usernames_suggestions') );
add_action( 'wp_ajax_aac_ajax_get_roles_suggestions', array( &$this, 'aac_ajax_get_roles_suggestions') );
//add_action( 'wp_ajax_aac_ajax_get_categories_suggestions', array( &$this, 'aac_ajax_get_categories_suggestions') );
//add_action( 'wp_ajax_aac_ajax_get_postspages_suggestions', array( &$this, 'aac_ajax_get_postspages_suggestions') );
add_action( 'wp_ajax_aac_ajax_save_configuration', array( &$this, 'aac_ajax_save_configuration' ) );
add_action( 'wp_ajax_aac_ajax_refresh_configuration', array( &$this, 'aac_ajax_refresh_configuration' ) );
}
public function plugin_init() {
add_comments_page(
'Auto Approve Comments',
'Auto Approve Comments',
'manage_options',
'auto-approve-comments',
array( &$this, 'add_settings_page' )
);
$this->plugin_update();
}
public function add_settings_page() {
if( !current_user_can('manage_options') ){
wp_die('You do not have sufficient permissions to access this page.');
}
require('views/settings-page.php');
}
public function register_db_settings() {
register_setting( 'auto-approve-comments-group', 'aac_plugin_version' );
register_setting( 'auto-approve-comments-group', 'aac_commenters_list' );
register_setting( 'auto-approve-comments-group', 'aac_usernames_list' );
register_setting( 'auto-approve-comments-group', 'aac_roles_list' );
//register_setting( 'auto-approve-comments-group', 'aac_categories_list' );
//register_setting( 'auto-approve-comments-group', 'aac_postspages_list' );
}
public function enqueue_custom_admin_files( $hook ) {
if ( 'comments_page_auto-approve-comments' != $hook ) {
return;
}
wp_enqueue_script( 'jquery' );
wp_enqueue_script( 'jquery-ui-autocomplete' );
wp_enqueue_script( 'auto-approve-comments-js', plugin_dir_url( __FILE__ ) . 'js/auto-approve-comments.js', array( 'jquery' ), '1.0.0', true );
wp_localize_script( 'auto-approve-comments-js', 'auto_approve_comments_ajax_params', array(
'ajaxurl' => admin_url( 'admin-ajax.php' )
));
wp_register_style( 'auto-approve-comments-css', plugin_dir_url( __FILE__ ) . 'css/auto-approve-comments.css', false, '1.0.0' );
wp_enqueue_style( 'auto-approve-comments-css' );
wp_enqueue_script( 'aac-ajax-commenters-suggestions-js', plugin_dir_url( __FILE__ ) . 'js/ajax-commenters-suggestions.js', array( 'jquery' ), '1.0.0', true );
wp_enqueue_script( 'aac-ajax-usernames-suggestions-js', plugin_dir_url( __FILE__ ) . 'js/ajax-usernames-suggestions.js', array( 'jquery' ), '1.0.0', true );
wp_enqueue_script( 'aac-ajax-roles-suggestions-js', plugin_dir_url( __FILE__ ) . 'js/ajax-roles-suggestions.js', array( 'jquery' ), '1.0.0', true );
//wp_enqueue_script( 'aac-ajax-categories-suggestions-js', plugin_dir_url( __FILE__ ) . 'js/ajax-categories-suggestions.js', array( 'jquery' ), '1.0.0', true );
//wp_enqueue_script( 'aac-ajax-postspages-suggestions-js', plugin_dir_url( __FILE__ ) . 'js/ajax-postspages-suggestions.js', array( 'jquery' ), '1.0.0', true );
wp_enqueue_script( 'aac-ajax-save-refresh-configuration-js', plugin_dir_url( __FILE__ ) . 'js/ajax-save-refresh-configuration.js', array( 'jquery' ), '1.0.0', true );
}
public function auto_approve_comments( $comment_id, $comment_object ) {
$comment = array();
$comment['comment_ID'] = $comment_id;
$comment['comment_author_email'] = strtolower($comment_object->comment_author_email);
$user_info = get_userdata( $comment_object->user_id );
/* ROLES */
if(
!$comment['comment_approved']
&& $user_info
&& $this->auto_approve_roles($user_info->roles) ) {
$comment['comment_approved'] = 1;
/* USERNAMES */
} elseif(
!$comment['comment_approved']
&& $user_info
&& $this->auto_approve_usernames($user_info->user_login) ) {
$comment['comment_approved'] = 1;
/* COMMENTERS */
} elseif (
!$comment['comment_approved']
&& $this->auto_approve_commenters($comment_object) ) {
$comment['comment_approved'] = 1;
}
wp_update_comment( $comment );
}
public function aac_ajax_get_commenters_suggestions() {
global $wpdb;
if( current_user_can( 'manage_options' ) ) {
$search = str_replace( "'", '', $wpdb->prepare( '%s', $_REQUEST['search'] ) );
$sql = "SELECT DISTINCT CONCAT_WS(', ', comment_author_email, comment_author, comment_author_url)
FROM {$wpdb->comments}
WHERE
comment_author_email LIKE '{$search}%' OR
comment_author LIKE '{$search}%' OR
comment_author_url LIKE '%{$search}%' OR
comment_post_ID = '{$search}'
ORDER BY
comment_author_email DESC, comment_author DESC, comment_author_url DESC , comment_post_ID DESC
LIMIT 10;";
$results = $wpdb->get_results( $sql, ARRAY_N );
$suggestions = array();
foreach ($results as $result) {
$suggestions[] = preg_replace('/http(s)?:\/\//i', '', trim( $result[0], ', ' ) );
}
if ( count($suggestions) < 1 ) {
$suggestions[] = 'no matches for "'.$search.'"';
}
wp_send_json( $suggestions );
}
exit();
}
public function aac_ajax_get_usernames_suggestions() {
global $wpdb;
if( current_user_can( 'manage_options' ) ) {
$search = str_replace( "'", '', $wpdb->prepare( '%s', $_REQUEST['search'] ) );
$sql = "SELECT user_login
FROM {$wpdb->users}
WHERE
user_login LIKE '{$search}%'
ORDER BY
user_login ASC
LIMIT 10;";
$results = $wpdb->get_results( $sql, ARRAY_N );
$suggestions = array();
foreach ($results as $result) {
$suggestions[] = $result[0];
}
if ( count($suggestions) < 1 ) {
$suggestions[] = 'no matches for "'.$search.'"';
}
wp_send_json( $suggestions );
}
exit();
}
public function aac_ajax_get_roles_suggestions() {
global $wpdb;
if( current_user_can( 'manage_options' ) ) {
$search = str_replace( "'", '', $_REQUEST['search'] );
$sql = "SELECT option_value
FROM {$wpdb->options}
WHERE
option_name = 'wp_user_roles'
LIMIT 1;";
$results = array_keys( unserialize( $wpdb->get_var($sql) ) );
$suggestions = array();
foreach ($results as $result) {
if (strpos($result, $search) !== false) {
$suggestions[] = $result;
}
}
if ( count($suggestions) < 1 ) {
$suggestions[] = 'no matches for "'.$search.'"';
}
wp_send_json( $suggestions );
}
exit();
}
public function aac_ajax_refresh_configuration() {
if( current_user_can( 'manage_options' ) ) {
$response['commenters'] = get_option('aac_commenters_list');
$response['usernames'] = get_option('aac_usernames_list');
$response['roles'] = get_option('aac_roles_list');
wp_send_json( $response );
}
exit();
}
public function aac_ajax_save_configuration () {
if( current_user_can( 'manage_options' ) && wp_verify_nonce( $_REQUEST['nonce'], 'aac-save-configuration-nonce' ) ) {
$response = array();
/* COMMENTERS */
$commenters_list = strtolower( trim( preg_replace('/\n+/', "\n", $_REQUEST['commenters'] ) ) );
$commenters_list = preg_replace( '/[ ]*,[ ]*/', ',', $commenters_list );
$commenters_list = preg_replace( '/(\w)[ ]+(\w)/', "$1 $2", $commenters_list );
$commenters_list = preg_replace( '/https?:\/\//', '', $commenters_list );
$commenters_list = preg_replace('/,\s/', "\n", $commenters_list );
$commenters_list = preg_replace('/,$/', '', $commenters_list );
$commenters = preg_split( '/\n+/', $commenters_list, -1, PREG_SPLIT_NO_EMPTY );
$commenters_clean = array();
foreach ( $commenters as $commenter ) {
if( preg_match( self::EMAIL_PATTERN, $commenter ) ){
$commenters_clean[trim( $commenter )] = true;
}
if( preg_match( self::POST_PATTERN, $commenter ) ){
$commenters_clean[ $commenter ] = true;
}
}
$commenters_list = implode( "\n", array_keys( $commenters_clean ) );
if (update_option( 'aac_commenters_list', $commenters_list ) ) {
$response['commenters_updated'] = true;
}
/* USERNAMES */
$usernames_list = strtolower( trim( preg_replace('/\s+/', "\n", $_REQUEST['usernames'] ) ) );
$usernames_list = preg_replace('/,/', '', $usernames_list );
$usernames_list = preg_split( '/\n+/', $usernames_list, -1, PREG_SPLIT_NO_EMPTY );
$usernames_list = self::userids_to_usernames( $usernames_list );
if (update_option( 'aac_usernames_list', $usernames_list ) ) {
$response['usernames_updated'] = true;
}
/* ROLES */
$roles_list = strtolower( trim( preg_replace('/\s+/', "\n", $_REQUEST['roles'] ) ) );
$roles_list = preg_replace('/,/', '', $roles_list );
$roles = preg_split( '/\n+/', $roles_list, -1, PREG_SPLIT_NO_EMPTY );
$roles_clean = array();
$roles_list = implode( "\n", $roles );
if ( update_option( 'aac_roles_list', $roles_list ) ) {
$response['roles_updated'] = true;
}
wp_send_json_success( $response );
}
exit();
}
private function get_commenters() {
$commenters = array();
$commenters_parsed = array();
$commenters = preg_split('/\n+/', get_option('aac_commenters_list'), -1, PREG_SPLIT_NO_EMPTY);
foreach ($commenters as $commenter) {
$features = preg_split('/,/', trim($commenter), -1, PREG_SPLIT_NO_EMPTY);
//
if(preg_match("/post_/", $features[0])){
$commenter = str_replace("post_", "", $commenter);
$commenters_parsed['post'] = $commenter;
return $commenters_parsed;
}
$commenters_parsed[$features[0]]['email'] = $features[0];
if(isset($features[1])) {
if(preg_match(self::DOMAIN_PATTERN,$features[1])) {
$commenters_parsed[$features[0]]['url'] = $features[1];
} else {
$commenters_parsed[$features[0]]['name'] = $features[1];
}
}
if(isset($features[2])) {
if(preg_match(self::DOMAIN_PATTERN,$features[2])) {
$commenters_parsed[$features[0]]['url'] = $features[2];
} else {
$commenters_parsed[$features[0]]['name'] = $features[2];
}
}
if( preg_match( self::POST_PATTERN, $commenter ) ){
}
}
return $commenters_parsed;
}
private function get_usernames() {
$usernames = array();
$usernames = preg_split('/\n+/', get_option('aac_usernames_list'), -1, PREG_SPLIT_NO_EMPTY);
return $usernames;
}
private function get_roles() {
$roles = array();
$roles = preg_split('/\n+/', get_option('aac_roles_list'), -1, PREG_SPLIT_NO_EMPTY);
return $roles;
}
public static function userids_to_usernames( $usernames_list ) {
$usernames_clean = array();
foreach ( $usernames_list as $username ) {
$username = trim( $username );
if ( preg_match('/^\d+$/', $username) ) {
//convert users ID to usernames
$user_info = get_userdata( $username );
$username = $user_info->user_login;
}
$usernames_clean[ $username ] = true;
}
$usernames_list = implode( "\n", array_keys( $usernames_clean ) );
return $usernames_list;
}
private function auto_approve_roles( $user_roles ) {
$user_is_allowed = false;
$roles_list = $this->get_roles();
foreach ( $user_roles as $user_role ) {
if ( in_array($user_role, $roles_list) ) {
$user_is_allowed = true;
break;
}
}
return $user_is_allowed;
}
private function auto_approve_usernames( $username ) {
$user_is_allowed = false;
$usernames_list = $this->get_usernames();
if ( in_array($username, $usernames_list) ) {
$user_is_allowed = true;
}
return $user_is_allowed;
}
private function auto_approve_commenters( $comment_object ) {
$commenter_approved = false;
$commenters_list = $this->get_commenters();
$email = strtolower($comment_object->comment_author_email);
$name = strtolower(trim($comment_object->comment_author));
$url = preg_replace('/https?:\/\//', '', strtolower(trim($comment_object->comment_author_url)));
if( isset($commenters_list[$email])
&& ( $commenters_list[$email]['name'] == $name || !$commenters_list[$email]['name'] )
&& ( $commenters_list[$email]['url'] == $url || !$commenters_list[$email]['url'] )
) {
$commenter_approved = true;
}
if(isset($commenters_list['post'])) {
$postId = $commenters_list['post'];
if($postId == $comment_object->comment_post_ID) {
$commenter_approved = true;
}
}
return $commenter_approved;
}
private function plugin_update() {
$current_plugin_version = get_option( 'aac_plugin_version' );
if ( $current_plugin_version != self::VERSION ) {
if ( $current_plugin_version == '1.2' ) {
$usernames_list = preg_split( '/\n+/', get_option( 'userid_list' ), -1, PREG_SPLIT_NO_EMPTY );
$usernames_list = $this->userids_to_usernames( $usernames_list );
update_option( 'aac_usernames_list', $usernames_list );
update_option( 'aac_commenters_list', get_option( 'commenters_list' ) );
update_option( 'aac_plugin_version', self::VERSION );
unregister_setting( 'auto-approve-comments-group', 'userid_list' );
unregister_setting( 'auto-approve-comments-group', 'commenters_list' );
delete_option( 'userid_list' );
delete_option( 'commenters_list' );
}
}
}
}
new AutoApproveComments;
}
使用说明:
邮箱,post_文章编号,名字,网站
事例:
比如想要ID为1的文章只对 example@example.com 的邮箱自动同意,那么填入example@example.com,post_1,注意post_是不能省略的且紧跟email后,另外email是必填的,其他参数可以选填。