拒绝垃圾评论

前不久搭建了一个小站,一段时间后打开,发现有 180+ 条垃圾评论,快速查看发现与十年前的这些问题没有多大变化,今天就把14年放在 functions 文件的屏蔽垃圾评论代码进行修改,做成单文件插件,并增加了几个选项,以免主题更新被替换。

使用说明

在 wp-content/plugins 目录下创建一个 wpexp-lajipinglun.php 文件,将下方代码复制到文件里保存,然后在 WordPress 后台启用该插件。

可在 设置→拒绝垃圾评论 页面根据自己的需求进行简单设置。

一般只需要勾选第一个和最后一个即可,当然,你也可以根据自己的实际需求进行调整。如有问题或建议,请留言告知。

<?php
/**
 * Plugin Name: WPEXP - 拒绝垃圾评论
 * Plugin URI:  https://wpexp.cn/plugins/lajipinglun
 * Description: 阻止各种类型的垃圾评论,包括全英文、全数字、全中文、全日文和全阿拉伯语评论,提供后台设置界面,可灵活配置过滤规则。
 * Version:     1.0.0
 * Author:      WPEXP
 * Author URI:  https://wpexp.cn/
 * License:     GPLv2 or later
 * License URI: https://www.gnu.org/licenses/gpl-2.0.html
 */

// 防止直接访问文件
if (!defined('ABSPATH')) {
    exit;
}

// 定义插件常量
define('WPEXP_LAJIPINGLUN_VERSION', '1.0.0');

// 添加设置菜单
function wpexp_lajipinglun_add_settings_menu() {
    add_options_page(
        '拒绝垃圾评论设置', // 页面标题
        '拒绝垃圾评论',       // 菜单标题
        'manage_options',     // 访问权限
        'wpexp-lajipinglun',  // 菜单 slug
        'wpexp_lajipinglun_render_settings_page' // 回调函数
    );
}
add_action('admin_menu', 'wpexp_lajipinglun_add_settings_menu');

// 注册设置
function wpexp_lajipinglun_register_settings() {
    register_setting(
        'wpexp_lajipinglun_options_group', // 选项组名
        'wpexp_lajipinglun_options',         // 选项名
        'wpexp_lajipinglun_options_validate' // 验证回调函数
    );

    add_settings_section(
        'wpexp_lajipinglun_main_section', // 部分 ID
        '垃圾评论过滤设置',                 // 标题
        'wpexp_lajipinglun_section_text',   // 回调函数
        'wpexp-lajipinglun'                // 页面 slug
    );

    // 设置字段:评论要求(包含中文字符)
    add_settings_field(
        'wpexp_lajipinglun_enable_chinese', // 字段 ID
        '评论要求',                         // 标签文本
        'wpexp_lajipinglun_enable_chinese_callback', // 回调函数
        'wpexp-lajipinglun',              // 页面 slug
        'wpexp_lajipinglun_main_section', // 部分 ID
        [
            'label_for' => 'wpexp_lajipinglun_enable_chinese',
            'description' => '要求评论中必须包含中文字符'
        ]
    );

    // 设置字段:禁止全数字评论
    add_settings_field(
        'wpexp_lajipinglun_enable_numeric',
        '数字评论',
        'wpexp_lajipinglun_enable_numeric_callback',
        'wpexp-lajipinglun',
        'wpexp_lajipinglun_main_section',
        [
            'label_for' => 'wpexp_lajipinglun_enable_numeric',
            'description' => '禁止评论内容全部都是数字'
        ]
    );

    // 设置字段:禁止全英文评论
    add_settings_field(
        'wpexp_lajipinglun_enable_english',
        '英文评论',
        'wpexp_lajipinglun_enable_english_callback',
        'wpexp-lajipinglun',
        'wpexp_lajipinglun_main_section',
        [
            'label_for' => 'wpexp_lajipinglun_enable_english',
            'description' => '禁止评论内容全部都是英文'
        ]
    );

    // 设置字段:禁止全日文评论
    add_settings_field(
        'wpexp_lajipinglun_enable_japanese',
        '日文评论',
        'wpexp_lajipinglun_enable_japanese_callback',
        'wpexp-lajipinglun',
        'wpexp_lajipinglun_main_section',
        [
            'label_for' => 'wpexp_lajipinglun_enable_japanese',
            'description' => '禁止评论内容全部都是日文'
        ]
    );

    // 设置字段:禁止全阿拉伯语评论
    add_settings_field(
        'wpexp_lajipinglun_enable_arabic',
        '阿拉伯语评论',
        'wpexp_lajipinglun_enable_arabic_callback',
        'wpexp-lajipinglun',
        'wpexp_lajipinglun_main_section',
        [
            'label_for' => 'wpexp_lajipinglun_enable_arabic',
            'description' => '禁止评论内容全部都是阿拉伯语'
        ]
    );

    // 设置字段:禁止带有超链接和邮箱的评论
    add_settings_field(
        'wpexp_lajipinglun_enable_links_and_emails',
        '超链接和邮箱',
        'wpexp_lajipinglun_enable_links_and_emails_callback',
        'wpexp-lajipinglun',
        'wpexp_lajipinglun_main_section',
        [
            'label_for' => 'wpexp_lajipinglun_enable_links_and_emails',
            'description' => '禁止评论内容包含超链接或邮箱地址'
        ]
    );
}
add_action('admin_init', 'wpexp_lajipinglun_register_settings');

// 设置部分描述
function wpexp_lajipinglun_section_text() {
    echo '<p>选择需要启用的垃圾评论过滤规则:</p>';
}

// 验证设置
function wpexp_lajipinglun_options_validate($input) {
    $options = get_option('wpexp_lajipinglun_options');
    
    $options['enable_chinese'] = isset($input['enable_chinese']) ? 1 : 0;
    $options['enable_numeric'] = isset($input['enable_numeric']) ? 1 : 0;
    $options['enable_english'] = isset($input['enable_english']) ? 1 : 0;
    $options['enable_japanese'] = isset($input['enable_japanese']) ? 1 : 0;
    $options['enable_arabic'] = isset($input['enable_arabic']) ? 1 : 0;
    $options['enable_links_and_emails'] = isset($input['enable_links_and_emails']) ? 1 : 0;
    
    return $options;
}

// 设置字段回调函数:评论要求(包含中文字符)
function wpexp_lajipinglun_enable_chinese_callback($args) {
    $options = get_option('wpexp_lajipinglun_options');
    $checked = isset($options['enable_chinese']) && $options['enable_chinese'] ? 'checked' : '';
    echo "<label><input type='checkbox' id='wpexp_lajipinglun_enable_chinese' name='wpexp_lajipinglun_options[enable_chinese]' value='1' $checked /> {$args['description']}</label>";
}

// 设置字段回调函数:禁止全数字评论
function wpexp_lajipinglun_enable_numeric_callback($args) {
    $options = get_option('wpexp_lajipinglun_options');
    $checked = isset($options['enable_numeric']) && $options['enable_numeric'] ? 'checked' : '';
    echo "<label><input type='checkbox' id='wpexp_lajipinglun_enable_numeric' name='wpexp_lajipinglun_options[enable_numeric]' value='1' $checked /> {$args['description']}</label>";
}

// 设置字段回调函数:禁止全英文评论
function wpexp_lajipinglun_enable_english_callback($args) {
    $options = get_option('wpexp_lajipinglun_options');
    $checked = isset($options['enable_english']) && $options['enable_english'] ? 'checked' : '';
    echo "<label><input type='checkbox' id='wpexp_lajipinglun_enable_english' name='wpexp_lajipinglun_options[enable_english]' value='1' $checked /> {$args['description']}</label>";
}

// 设置字段回调函数:禁止全日文评论
function wpexp_lajipinglun_enable_japanese_callback($args) {
    $options = get_option('wpexp_lajipinglun_options');
    $checked = isset($options['enable_japanese']) && $options['enable_japanese'] ? 'checked' : '';
    echo "<label><input type='checkbox' id='wpexp_lajipinglun_enable_japanese' name='wpexp_lajipinglun_options[enable_japanese]' value='1' $checked /> {$args['description']}</label>";
}

// 设置字段回调函数:禁止全阿拉伯语评论
function wpexp_lajipinglun_enable_arabic_callback($args) {
    $options = get_option('wpexp_lajipinglun_options');
    $checked = isset($options['enable_arabic']) && $options['enable_arabic'] ? 'checked' : '';
    echo "<label><input type='checkbox' id='wpexp_lajipinglun_enable_arabic' name='wpexp_lajipinglun_options[enable_arabic]' value='1' $checked /> {$args['description']}</label>";
}

// 设置字段回调函数:禁止带有超链接和邮箱的评论
function wpexp_lajipinglun_enable_links_and_emails_callback($args) {
    $options = get_option('wpexp_lajipinglun_options');
    $checked = isset($options['enable_links_and_emails']) && $options['enable_links_and_emails'] ? 'checked' : '';
    echo "<label><input type='checkbox' id='wpexp_lajipinglun_enable_links_and_emails' name='wpexp_lajipinglun_options[enable_links_and_emails]' value='1' $checked /> {$args['description']}</label>";
}

// 设置页面渲染
function wpexp_lajipinglun_render_settings_page() {
    ?>
    <div class="wrap">
        <h1>拒绝垃圾评论设置</h1>
        <form method="post" action="options.php">
            <?php
            settings_fields('wpexp_lajipinglun_options_group'); // 输出安全字段
            do_settings_sections('wpexp-lajipinglun');           // 输出所有设置部分
            submit_button();                                    // 提交按钮
            ?>
        </form>
    </div>
    <?php
}

// 评论过滤函数
function wpexp_lajipinglun_comment_filter($comment_data) {
    $options = get_option('wpexp_lajipinglun_options');

    // 检查是否需要中文
    if (!empty($options['enable_chinese'])) {
        $chinese_pattern = '/[\x{4e00}-\x{9fa5}]/u'; // 匹配中文字符
        if (!preg_match($chinese_pattern, $comment_data['comment_content'])) {
            wp_die(
                '<p>写点汉字吧,博主外语很捉急!Please write some Chinese words!</p>' .
                '<p>' . __('提交失败,请确保您的评论中包含中文字符。') . '</p>',
                __('评论拦截'),
                ['response' => 403]
            );
        }
    }

    // 检查是否为全数字
    if (!empty($options['enable_numeric'])) {
        $numeric_pattern = '/^\d+$/u'; // 匹配全数字
        if (preg_match($numeric_pattern, $comment_data['comment_content'])) {
            wp_die(
                '<p>不要只输入数字,搞的跟加密一样,讲几句中文吧。</p>' .
                '<p>' . __('提交失败,请确保您的评论不只是数字。') . '</p>',
                __('评论拦截'),
                ['response' => 403]
            );
        }
    }

    // 检查是否为全英文
    if (!empty($options['enable_english'])) {
        $english_pattern = '/^[a-zA-Z\s]+$/u'; // 匹配全英文
        if (preg_match($english_pattern, $comment_data['comment_content'])) {
            wp_die(
                '<p>不要只输入英文,请添加一些中文或其他语言内容。</p>' .
                '<p>' . __('提交失败,请确保您的评论不只是英文。') . '</p>',
                __('评论拦截'),
                ['response' => 403]
            );
        }
    }

    // 检查是否为全日文
    if (!empty($options['enable_japanese'])) {
        $japanese_pattern = '/^[\x{3040}-\x{30ff}\x{31f0}-\x{31ff}\x{ff00}-\x{ffef}\x{4e00}-\x{9faf}]+$/u'; // 匹配日文字符
        if (preg_match($japanese_pattern, $comment_data['comment_content'])) {
            wp_die(
                '<p>不要使用日语!Don\'t use Japanese!日本語を使用しないでください!</p>' .
                '<p>' . __('提交失败,请勿使用纯日文评论。') . '</p>',
                __('评论拦截'),
                ['response' => 403]
            );
        }
    }

    // 检查是否为全阿拉伯语
    if (!empty($options['enable_arabic'])) {
        $arabic_pattern = '/^[\x{0600}-\x{06FF}]+$/u'; // 匹配阿拉伯语字符
        if (preg_match($arabic_pattern, $comment_data['comment_content'])) {
            wp_die(
                '<p>不要使用阿拉伯语!Please do not use Arabic!!من فضلك لا تستخدم اللغة العربية</p>' .
                '<p>' . __('提交失败,请勿使用纯阿拉伯语评论。') . '</p>',
                __('评论拦截'),
                ['response' => 403]
            );
        }
    }

    // 检查是否包含超链接或邮箱
    if (!empty($options['enable_links_and_emails'])) {
        $links_and_emails_pattern = '/(http:\/\/|https:\/\/|@)/i'; // 匹配超链接或邮箱
        if (preg_match($links_and_emails_pattern, $comment_data['comment_content'])) {
            wp_die(
                '<p>不要在评论中包含超链接或邮箱地址。</p>' .
                '<p>' . __('提交失败,请勿在评论中包含超链接或邮箱地址。') . '</p>',
                __('评论拦截'),
                ['response' => 403]
            );
        }
    }

    return $comment_data;
}
add_action('preprocess_comment', 'wpexp_lajipinglun_comment_filter');

发表评论