首页 / 教程文章 / 网络传媒WordPress柔性内容智能审核与风控插件开发教程

网络传媒WordPress柔性内容智能审核与风控插件开发教程

网络传媒WordPress柔性内容智能审核与风控插件开发教程

概述

在当今网络传媒环境中,内容审核与风险控制已成为网站运营的关键环节。随着用户生成内容(UGC)的爆炸式增长,传统的人工审核方式已无法满足高效、准确的需求。本教程将指导您开发一款适用于WordPress的柔性内容智能审核与风控插件,帮助网络传媒平台实现自动化内容管理,平衡审核效率与用户体验。

插件架构设计

1.1 核心功能模块

我们的插件将包含以下核心模块:

  • 内容采集与预处理模块
  • 智能审核引擎模块
  • 风控规则管理系统
  • 审核结果处理模块
  • 数据统计与报表模块

1.2 数据库设计

首先,我们需要设计插件所需的数据库表结构:

/**
 * 创建插件所需数据库表
 * 这段代码应放在插件激活钩子中执行
 */
function wm_content_audit_create_tables() {
    global $wpdb;
    
    $charset_collate = $wpdb->get_charset_collate();
    $table_name = $wpdb->prefix . 'wm_audit_logs';
    
    // 审核日志表
    $sql = "CREATE TABLE IF NOT EXISTS $table_name (
        id bigint(20) NOT NULL AUTO_INCREMENT,
        post_id bigint(20) NOT NULL,
        content_type varchar(50) NOT NULL,
        audit_status varchar(20) NOT NULL,
        risk_score float DEFAULT 0,
        audit_time datetime DEFAULT CURRENT_TIMESTAMP,
        audit_result text,
        keywords_found text,
        PRIMARY KEY (id),
        KEY post_id (post_id),
        KEY audit_status (audit_status)
    ) $charset_collate;";
    
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
    
    // 风控规则表
    $rules_table = $wpdb->prefix . 'wm_risk_rules';
    $sql_rules = "CREATE TABLE IF NOT EXISTS $rules_table (
        rule_id bigint(20) NOT NULL AUTO_INCREMENT,
        rule_name varchar(100) NOT NULL,
        rule_type varchar(50) NOT NULL,
        rule_pattern text NOT NULL,
        risk_weight float DEFAULT 1.0,
        is_active tinyint(1) DEFAULT 1,
        created_at datetime DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY (rule_id)
    ) $charset_collate;";
    
    dbDelta($sql_rules);
}
register_activation_hook(__FILE__, 'wm_content_audit_create_tables');

智能审核引擎开发

2.1 内容预处理模块

/**
 * 内容预处理类
 * 负责对文章内容进行清洗和标准化处理
 */
class WM_Content_Preprocessor {
    
    /**
     * 清理HTML标签,保留必要格式
     * @param string $content 原始内容
     * @return string 清理后的内容
     */
    public function clean_content($content) {
        // 允许的HTML标签
        $allowed_tags = array(
            'p' => array(),
            'br' => array(),
            'strong' => array(),
            'em' => array(),
            'ul' => array(),
            'ol' => array(),
            'li' => array(),
            'a' => array('href', 'title')
        );
        
        // 清理HTML
        $cleaned = wp_kses($content, $allowed_tags);
        
        // 移除多余空白字符
        $cleaned = preg_replace('/s+/', ' ', $cleaned);
        
        // 转换特殊字符
        $cleaned = htmlspecialchars_decode($cleaned);
        
        return trim($cleaned);
    }
    
    /**
     * 提取文本关键词
     * @param string $content 文本内容
     * @return array 关键词数组
     */
    public function extract_keywords($content, $limit = 10) {
        // 移除停用词
        $stop_words = array('的', '了', '在', '是', '我', '有', '和', '就', '不', '人', '都', '一', '一个');
        $words = preg_split('/s+/', $content);
        
        // 过滤停用词并统计词频
        $word_count = array();
        foreach ($words as $word) {
            $word = trim($word);
            if (mb_strlen($word) > 1 && !in_array($word, $stop_words)) {
                if (!isset($word_count[$word])) {
                    $word_count[$word] = 0;
                }
                $word_count[$word]++;
            }
        }
        
        // 按词频排序并返回前N个关键词
        arsort($word_count);
        return array_slice(array_keys($word_count), 0, $limit);
    }
}

2.2 智能审核核心类

/**
 * 智能审核引擎
 * 集成多种审核策略和风控规则
 */
class WM_Intelligent_Audit_Engine {
    
    private $risk_rules = array();
    private $preprocessor;
    
    public function __construct() {
        $this->preprocessor = new WM_Content_Preprocessor();
        $this->load_risk_rules();
    }
    
    /**
     * 从数据库加载风控规则
     */
    private function load_risk_rules() {
        global $wpdb;
        $table_name = $wpdb->prefix . 'wm_risk_rules';
        
        $rules = $wpdb->get_results(
            "SELECT * FROM $table_name WHERE is_active = 1"
        );
        
        foreach ($rules as $rule) {
            $this->risk_rules[] = array(
                'type' => $rule->rule_type,
                'pattern' => $rule->rule_pattern,
                'weight' => floatval($rule->risk_weight)
            );
        }
    }
    
    /**
     * 执行内容审核
     * @param int $post_id 文章ID
     * @param string $content 文章内容
     * @param string $title 文章标题
     * @return array 审核结果
     */
    public function audit_content($post_id, $content, $title = '') {
        // 预处理内容
        $cleaned_content = $this->preprocessor->clean_content($content);
        
        // 初始化审核结果
        $audit_result = array(
            'post_id' => $post_id,
            'risk_score' => 0,
            'status' => 'pending',
            'violations' => array(),
            'keywords' => array(),
            'suggestions' => array()
        );
        
        // 提取关键词
        $audit_result['keywords'] = $this->preprocessor->extract_keywords($cleaned_content);
        
        // 执行文本风险检测
        $text_risk = $this->check_text_risk($cleaned_content, $title);
        $audit_result['risk_score'] += $text_risk['score'];
        $audit_result['violations'] = array_merge($audit_result['violations'], $text_risk['violations']);
        
        // 执行链接安全检测
        $link_risk = $this->check_link_security($cleaned_content);
        $audit_result['risk_score'] += $link_risk['score'];
        $audit_result['violations'] = array_merge($audit_result['violations'], $link_risk['violations']);
        
        // 确定最终审核状态
        $audit_result['status'] = $this->determine_audit_status($audit_result['risk_score']);
        
        // 生成修改建议
        $audit_result['suggestions'] = $this->generate_suggestions($audit_result);
        
        // 保存审核记录
        $this->save_audit_log($audit_result);
        
        return $audit_result;
    }
    
    /**
     * 文本风险检测
     */
    private function check_text_risk($content, $title) {
        $result = array('score' => 0, 'violations' => array());
        
        // 检测敏感词
        foreach ($this->risk_rules as $rule) {
            if ($rule['type'] === 'sensitive_word') {
                $pattern = '/' . preg_quote($rule['pattern'], '/') . '/iu';
                if (preg_match($pattern, $content) || preg_match($pattern, $title)) {
                    $result['score'] += $rule['weight'];
                    $result['violations'][] = array(
                        'type' => 'sensitive_word',
                        'rule' => $rule['pattern'],
                        'weight' => $rule['weight']
                    );
                }
            }
        }
        
        // 检测垃圾信息特征(如过多联系方式)
        $contact_patterns = array(
            '/(d{3,4}[-]?d{7,8})/',  // 电话号码
            '/([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,})/'  // 邮箱
        );
        
        $contact_count = 0;
        foreach ($contact_patterns as $pattern) {
            $contact_count += preg_match_all($pattern, $content, $matches);
        }
        
        if ($contact_count > 3) {
            $result['score'] += 2.0;
            $result['violations'][] = array(
                'type' => 'excessive_contacts',
                'count' => $contact_count,
                'weight' => 2.0
            );
        }
        
        return $result;
    }
    
    /**
     * 链接安全检测
     */
    private function check_link_security($content) {
        $result = array('score' => 0, 'violations' => array());
        
        // 提取所有链接
        preg_match_all('/<as+(?:[^>]*?s+)?href=(["'])(.*?)1/', $content, $matches);
        
        if (!empty($matches[2])) {
            $suspicious_domains = $this->get_suspicious_domains();
            
            foreach ($matches[2] as $url) {
                $domain = parse_url($url, PHP_URL_HOST);
                
                // 检查是否为可疑域名
                if ($domain && in_array($domain, $suspicious_domains)) {
                    $result['score'] += 1.5;
                    $result['violations'][] = array(
                        'type' => 'suspicious_link',
                        'url' => $url,
                        'domain' => $domain,
                        'weight' => 1.5
                    );
                }
                
                // 检查是否为短链接(可能隐藏真实地址)
                if (preg_match('/bit.ly|t.co|goo.gl|tinyurl/', $url)) {
                    $result['score'] += 1.0;
                    $result['violations'][] = array(
                        'type' => 'short_link',
                        'url' => $url,
                        'weight' => 1.0
                    );
                }
            }
        }
        
        return $result;
    }
    
    /**
     * 获取可疑域名列表
     */
    private function get_suspicious_domains() {
        // 这里可以从数据库或外部API获取可疑域名列表
        // 为简化示例,返回一个静态数组
        return array(
            'malicious-site.com',
            'spam-domain.net',
            'phishing-page.org'
        );
    }
    
    /**
     * 根据风险分数确定审核状态
     */
    private function determine_audit_status($risk_score) {
        if ($risk_score >= 5.0) {
            return 'rejected';  // 高风险,拒绝
        } elseif ($risk_score >= 2.0) {
            return 'manual_review';  // 中等风险,需要人工审核
        } else {
            return 'approved';  // 低风险,自动通过
        }
    }
    
    /**
     * 生成内容修改建议
     */
    private function generate_suggestions($audit_result) {
        $suggestions = array();
        
        if (!empty($audit_result['violations'])) {
            foreach ($audit_result['violations'] as $violation) {
                switch ($violation['type']) {
                    case 'sensitive_word':
                        $suggestions[] = "建议修改或删除敏感词:{$violation['rule']}";
                        break;
                    case 'excessive_contacts':
                        $suggestions[] = "文中包含{$violation['count']}处联系方式,建议保留不超过3处";
                        break;
                    case 'suspicious_link':
                        $suggestions[] = "可疑链接:{$violation['url']},建议移除或替换";
                        break;
                }
            }
        }
        
        return $suggestions;
    }
    
    /**
     * 保存审核日志
     */
    private function save_audit_log($audit_result) {
        global $wpdb;
        $table_name = $wpdb->prefix . 'wm_audit_logs';
        
        $wpdb->insert(
            $table_name,
            array(
                'post_id' => $audit_result['post_id'],
                'content_type' => 'post',
                'audit_status' => $audit_result['status'],
                'risk_score' => $audit_result['risk_score'],
                'audit_result' => json_encode($audit_result),
                'keywords_found' => implode(',', $audit_result['keywords'])
            ),
            array('%d', '%s', '%s', '%f', '%s', '%s')
        );
    }
}

插件集成与界面开发

3.1 WordPress钩子集成

/**
 * WordPress钩子集成
 * 将审核引擎集成到WordPress发布流程中
 */
class WM_Audit_Plugin_Integration {
    
    private $audit_engine;
    
    public function __construct() {
        $this->audit_engine = new WM_Intelligent_Audit_Engine();
        
        // 在文章保存时触发审核
        add_action('save_post', array($this, 'on_post_save'), 10, 3);
        
        // 在后台添加审核状态列
        add_filter('manage_posts_columns', array($this, 'add_audit_status_column'));
        add_action('manage_posts_custom_column', array($this, 'display_audit_status_column'), 10, 2);
        
        // 添加审核结果元框
        add_action('add_meta_boxes', array($this, 'add_audit_meta_box'));
    }
    
    /**
     * 文章保存时自动审核
     */
    public function on_post_save($post_id, $post, $update) {
        // 跳过自动保存、修订版本和非发布状态
        if (wp_is_post_autosave($post_id) || 
            wp_is_post_revision($post_id) || 
            $post->post_status !== 'publish') {
            return;
        }
        
        // 执行内容审核
        $audit_result = $this->audit_engine->audit_content(
            $post_id, 
            $post->post_content, 
            $post->post_title
        );
        
        // 根据审核结果处理文章状态
        $this->handle_post_status($post_id, $audit_result);
    }
    
    /**
     * 根据审核结果处理文章状态
     */
    private function handle_post_status($post_id, $audit_result) {
        switch ($audit_result['status']) {
            case 'rejected':
                // 高风险内容,自动转为草稿
                wp_update_post(array(
                    'ID' => $post_id,
                    'post_status' => 'draft'
                ));
                update_post_meta($post_id, '_wm_audit_message', '内容因高风险被自动转为草稿,请修改后重新提交。');
                break;
                
            case 'manual_review':
                // 中等风险,等待人工审核
                wp_update_post(array(
                    'ID' => $post_id,
                    'post_status' => 'pending'
                ));
                update_post_meta($post_id, '_wm_audit_message', '内容需要人工审核,请等待管理员处理。');
                break;
                
            case 'approved':
                // 低风险,自动发布
                update_post_meta($post_id, '_wm_audit_message', '内容审核通过,已自动发布。');
                break;
        }
        
        // 保存详细的审核结果
        update_post_meta($post_id, '_wm_audit_result', $audit_result);
    }
    
    /**
     * 在文章列表添加审核状态列
     */
    public function add_audit_status_column($columns) {
        $columns['audit_status'] = '审核状态';
        $columns['risk_score'] = '风险分数';
        return $columns;
    }
    
    /**
     * 显示审核状态列内容
     */
    public function display_audit_status_column($column, $post_id) {
        if ($column === 'audit_status') {
            $audit_result = get_post_meta($post_id, '_wm_audit_result', true);
            if ($audit_result) {
                $status_labels = array(
                    'approved' => '<span style="color:green;">✓ 已通过</span>',
                    'pending' => '<span style="color:orange;">⏳ 待审核</span>',
                    'manual_review' => '<span style="color:orange;">👁 需人工审核</span>',
                    'rejected' => '<span style="color:red;">✗ 已拒绝</span>'
                );
                
                $status = isset($audit_result['status']) ? $audit_result['status'] : 'pending';
                echo isset($status_labels[$status]) ? $status_labels[$status] : $status;
            } else {
                echo '<span style="color:gray;">未审核</span>';
            }
        }
        
        if ($column === 'risk_score') {
            $audit_result = get_post_meta($post_id, '_wm_audit_result', true);
            if ($audit_result && isset($audit_result['risk_score'])) {
                $score = floatval($audit_result['risk_score']);
                $color = $score < 2.0 ? 'green' : ($score < 5.0 ? 'orange' : 'red');
                echo "<span style='color:{$color}; font-weight:bold;'>{$score}</span>";
            } else {
                echo '<span style="color:gray;">-</span>';
            }
        }
    }
    
    /**
     * 添加审核结果元框
     */
    public function add_audit_meta_box() {
        add_meta_box(
            'wm_audit_results',
            '智能审核结果',
            array($this, 'render_audit_meta_box'),
            'post',
            'side',
            'high'
        );
    }
    
    /**
     * 渲染审核结果元框
     */
    public function render_audit_meta_box($post) {
        $audit_result = get_post_meta($post->ID, '_wm_audit_result', true);
        $audit_message = get_post_meta($post->ID, '_wm_audit_message', true);
        
        if ($audit_result) {
            echo '<div class="wm-audit-results">';
            
            // 显示审核状态
            $status_labels = array(
                'approved' => '<span class="dashicons dashicons-yes-alt" style="color:green;"></span> 审核通过',
                'pending' => '<span class="dashicons dashicons-clock" style="color:orange;"></span> 等待审核',
                'manual_review' => '<span class="dashicons dashicons-admin-users" style="color:orange;"></span> 需要人工审核',
                'rejected' => '<span class="dashicons dashicons-no" style="color:red;"></span> 审核拒绝'
            );
            
            $status = $audit_result['status'];
            echo '<p><strong>审核状态:</strong>' . 
                 (isset($status_labels[$status]) ? $status_labels[$status] : $status) . 
                 '</p>';
            
            // 显示风险分数
            $score = $audit_result['risk_score'];
            $score_class = $score < 2.0 ? 'low-risk' : ($score < 5.0 ? 'medium-risk' : 'high-risk');
            echo "<p><strong>风险分数:</strong><span class='{$score_class}'>{$score}</span></p>";
            
            // 显示违规项
            if (!empty($audit_result['violations'])) {
                echo '<p><strong>检测到的问题:</strong></p>';
                echo '<ul style="margin-left:20px;">';
                foreach ($audit_result['violations'] as $violation) {
                    echo '<li>' . htmlspecialchars($violation['type']) . 
                         ' (权重: ' . $violation['weight'] . ')</li>';
                }
                echo '</ul>';
            }
            
            // 显示修改建议
            if (!empty($audit_result['suggestions'])) {
                echo '<p><strong>修改建议:</strong></p>';
                echo '<ul style="margin-left:20px; color:#666;">';
                foreach ($audit_result['suggestions'] as $suggestion) {
                    echo '<li>' . htmlspecialchars($suggestion) . '</li>';
                }
                echo '</ul>';
            }
            
            // 显示审核消息
            if ($audit_message) {
                echo '<div class="notice notice-info inline"><p>' . 
                     htmlspecialchars($audit_message) . '</p></div>';
            }
            
            // 手动重新审核按钮
            echo '<hr>';
            echo '<button type="button" id="wm-reaudit-btn" class="button button-secondary" 
                    data-post-id="' . $post->ID . '">
                    <span class="dashicons dashicons-update"></span> 重新审核
                  </button>';
            echo '<span id="wm-reaudit-spinner" class="spinner" style="float:none;"></span>';
            
            echo '</div>';
            
            // 添加JavaScript处理重新审核
            $this->add_reaudit_script();
        } else {
            echo '<p>尚未进行内容审核。</p>';
            echo '<button type="button" id="wm-audit-btn" class="button button-primary" 
                    data-post-id="' . $post->ID . '">
                    <span class="dashicons dashicons-shield"></span> 立即审核
                  </button>';
        }
    }
    
    /**
     * 添加重新审核的JavaScript
     */
    private function add_reaudit_script() {
        ?>
        <script type="text/javascript">
        jQuery(document).ready(function($) {
            $('#wm-reaudit-btn, #wm-audit-btn').on('click', function() {
                var postId = $(this).data('post-id');
                var spinner = $('#wm-reaudit-spinner');
                
                spinner.addClass('is-active');
                
                $.ajax({
                    url: ajaxurl,
                    type: 'POST',
                    data: {
                        action: 'wm_reaudit_content',
                        post_id: postId,
                        nonce: '<?php echo wp_create_nonce("wm_audit_nonce"); ?>'
                    },
                    success: function(response) {
                        spinner.removeClass('is-active');
                        if (response.success) {
                            location.reload();
                        } else {
                            alert('重新审核失败:' + response.data);
                        }
                    },
                    error: function() {
                        spinner.removeClass('is-active');
                        alert('请求失败,请重试。');
                    }
                });
            });
        });
        </script>
        
        <style>
        .low-risk { color: green; font-weight: bold; }
        .medium-risk { color: orange; font-weight: bold; }
        .high-risk { color: red; font-weight: bold; }
        .wm-audit-results ul { margin-top: 5px; margin-bottom: 5px; }
        </style>
        <?php
    }
}

// 初始化插件集成
new WM_Audit_Plugin_Integration();

3.2 AJAX处理重新审核请求

/**
 * AJAX处理重新审核请求
 */
add_action('wp_ajax_wm_reaudit_content', 'wm_handle_reaudit_request');

function wm_handle_reaudit_request() {
    // 验证nonce
    if (!wp_verify_nonce($_POST['nonce'], 'wm_audit_nonce')) {
        wp_die('安全验证失败');
    }
    
    // 验证权限
    if (!current_user_can('edit_posts')) {
        wp_die('权限不足');
    }
    
    $post_id = intval($_POST['post_id']);
    $post = get_post($post_id);
    
    if (!$post) {
        wp_send_json_error('文章不存在');
    }
    
    // 执行重新审核
    $audit_engine = new WM_Intelligent_Audit_Engine();
    $audit_result = $audit_engine->audit_content(
        $post_id, 
        $post->post_content, 
        $post->post_title
    );
    
    // 更新文章状态
    $integration = new WM_Audit_Plugin_Integration();
    $integration->handle_post_status($post_id, $audit_result);
    
    wp_send_json_success('重新审核完成');
}

风控规则管理系统

4.1 规则管理界面

/**
 * 风控规则管理类
 * 提供后台界面管理风控规则
 */
class WM_Risk_Rule_Manager {
    
    public function __construct() {
        // 添加管理菜单
        add_action('admin_menu', array($this, 'add_admin_menu'));
        
        // 处理表单提交
        add_action('admin_post_wm_save_rule', array($this, 'save_rule'));
        add_action('admin_post_wm_delete_rule', array($this, 'delete_rule'));
    }
    
    /**
     * 添加管理菜单
     */
    public function add_admin_menu() {
        add_submenu_page(
            'tools.php',
            '内容风控规则',
            '内容风控',
            'manage_options',
            'wm-risk-rules',
            array($this, 'render_rules_page')
        );
    }
    
    /**
     * 渲染规则管理页面
     */
    public function render_rules_page() {
        global $wpdb;
        $table_name = $wpdb->prefix . 'wm_risk_rules';
        
        // 获取所有规则
        $rules = $wpdb->get_results("SELECT * FROM $table_name ORDER BY created_at DESC");
        
        ?>
        <div class="wrap">
            <h1>内容风控规则管理</h1>
            
            <!-- 添加新规则表单 -->
            <div class="card" style="margin-bottom: 20px;">
                <h2>添加新规则</h2>
                <form method="post" action="<?php echo admin_url('admin-post.php'); ?>">
                    <input type="hidden" name="action" value="wm_save_rule">
                    <?php wp_nonce_field('wm_save_rule_nonce'); ?>
                    
                    <table class="form-table">
                        <tr>
                            <th scope="row"><label for="rule_name">规则名称</label></th>
                            <td>
                                <input type="text" id="rule_name" name="rule_name" 
                                       class="regular-text" required>
                            </td>
                        </tr>
                        <tr>
                            <th scope="row"><label for="rule_type">规则类型</label></th>
                            <td>
                                <select id="rule_type" name="rule_type" required>
                                    <option value="sensitive_word">敏感词</option>
                                    <option value="spam_pattern">垃圾信息模式</option>
                                    <option value="link_blacklist">链接黑名单</option>
                                    <option value="custom_regex">自定义正则</option>
                                </select>
                            </td>
                        </tr>
                        <tr>
                            <th scope="row"><label for="rule_pattern">规则模式</label></th>
                            <td>
                                <textarea id="rule_pattern" name="rule_pattern" 
                                          rows="3" class="large-text" required
                                          placeholder="输入关键词或正则表达式"></textarea>
                                <p class="description">
                                    敏感词:直接输入关键词,多个用逗号分隔<br>
                                    正则表达式:使用PCRE格式,如 /赌博|赌场/i
                                </p>
                            </td>
                        </tr>
                        <tr>
                            <th scope="row"><label for="risk_weight">风险权重</label></th>
                            <td>
                                <input type="number" id="risk_weight" name="risk_weight" 
                                       step="0.1" min="0.1" max="10" value="1.0" required>
                                <p class="description">权重越高,匹配时风险分数增加越多</p>
                            </td>
                        </tr>
                        <tr>
                            <th scope="row"><label for="is_active">状态</label></th>
                            <td>
                                <label>
                                    <input type="checkbox" id="is_active" name="is_active" value="1" checked>
                                    启用此规则
                                </label>
                            </td>
                        </tr>
                    </table>
                    
                    <p class="submit">
                        <button type="submit" class="button button-primary">保存规则</button>
                    </p>
                </form>
            </div>
            
            <!-- 现有规则列表 -->
            <div class="card">
                <h2>现有规则</h2>
                <table class="wp-list-table widefat fixed striped">
                    <thead>
                        <tr>
                            <th>规则名称</th>
                            <th>类型</th>
                            <th>模式</th>
                            <th>权重</th>
                            <th>状态</th>
                            <th>创建时间</th>
                            <th>操作</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php if (empty($rules)): ?>
                            <tr>
                                <td colspan="7" style="text-align:center;">暂无规则</td>
                            </tr>
                        <?php else: ?>
                            <?php foreach ($rules as $rule): ?>
                            <tr>
                                <td><?php echo esc_html($rule->rule_name); ?></td>
                                <td><?php echo esc_html($rule->rule_type); ?></td>
                                <td>
                                    <code style="font-size:12px;">
                                        <?php echo esc_html(substr($rule->rule_pattern, 0, 50)); ?>
                                        <?php if (strlen($rule->rule_pattern) > 50): ?>...<?php endif; ?>
                                    </code>
                                </td>
                                <td><?php echo floatval($rule->risk_weight); ?></td>
                                <td>
                                    <?php if ($rule->is_active): ?>
                                        <span class="dashicons dashicons-yes" style="color:green;"></span> 启用
                                    <?php else: ?>
                                        <span class="dashicons dashicons-no" style="color:red;"></span> 禁用
                                    <?php endif; ?>
                                </td>
                                <td><?php echo date('Y-m-d H:i', strtotime($rule->created_at)); ?></td>
                                <td>
                                    <form method="post" action="<?php echo admin_url('admin-post.php'); ?>" 
                                          style="display:inline;">
                                        <input type="hidden" name="action" value="wm_delete_rule">
                                        <input type="hidden" name="rule_id" value="<?php echo $rule->rule_id; ?>">
                                        <?php wp_nonce_field('wm_delete_rule_nonce'); ?>
                                        <button type="submit" class="button-link button-link-delete" 
                                                onclick="return confirm('确定删除此规则?');">
                                            删除
                                        </button>
                                    </form>
                                </td>
                            </tr>
                            <?php endforeach; ?>
                        <?php endif; ?>
                    </tbody>
                </table>
            </div>
        </div>
        
        <style>
        .wm-rules-table th { font-weight: bold; }
        .wm-rules-table code { background: #f5f5f5; padding: 2px 4px; }
        </style>
        <?php
    }
    
    /**
     * 保存规则
     */
    public function save_rule() {
        // 验证nonce和权限
        if (!wp_verify_nonce($_POST['_wpnonce'], 'wm_save_rule_nonce') || 
            !current_user_can('manage_options')) {
            wp_die('权限不足');
        }
        
        global $wpdb;
        $table_name = $wpdb->prefix . 'wm_risk_rules';
        
        // 准备数据
        $data = array(
            'rule_name' => sanitize_text_field($_POST['rule_name']),
            'rule_type' => sanitize_text_field($_POST['rule_type']),
            'rule_pattern' => sanitize_textarea_field($_POST['rule_pattern']),
            'risk_weight' => floatval($_POST['risk_weight']),
            'is_active' => isset($_POST['is_active']) ? 1 : 0
        );
        
        // 插入数据库
        $result = $wpdb->insert($table_name, $data);
        
        if ($result) {
            $message = '规则添加成功';
        } else {
            $message = '规则添加失败:' . $wpdb->last_error;
        }
        
        // 重定向回规则页面
        wp_redirect(add_query_arg(
            array('page' => 'wm-risk-rules', 'message' => urlencode($message)),
            admin_url('tools.php')
        ));
        exit;
    }
    
    /**
     * 删除规则
     */
    public function delete_rule() {
        // 验证nonce和权限
        if (!wp_verify_nonce($_POST['_wpnonce'], 'wm_delete_rule_nonce') || 
            !current_user_can('manage_options')) {
            wp_die('权限不足');
        }
        
        global $wpdb;
        $table_name = $wpdb->prefix . 'wm_risk_rules';
        $rule_id = intval($_POST['rule_id']);
        
        // 删除规则
        $result = $wpdb->delete($table_name, array('rule_id' => $rule_id));
        
        if ($result) {
            $message = '规则删除成功';
        } else {
            $message = '规则删除失败';
        }
        
        // 重定向回规则页面
        wp_redirect(add_query_arg(
            array('page' => 'wm-risk-rules', 'message' => urlencode($message)),
            admin_url('tools.php')
        ));
        exit;
    }
}

// 初始化规则管理器
new WM_Risk_Rule_Manager();

数据统计与报表功能

5.1 审核统计仪表板

/**
 * 审核统计与报表类
 */
class WM_Audit_Statistics {
    
    public function __construct() {
        // 添加统计页面
        add_action('admin_menu', array($this, 'add_stats_menu'));
        
        // 添加仪表板小工具
        add_action('wp_dashboard_setup', array($this, 'add_dashboard_widget'));
    }
    
    /**
     * 添加统计菜单
     */
    public function add_stats_menu() {
        add_submenu_page(
            'tools.php',
            '内容审核统计',
            '审核统计',
            'manage_options',
            'wm-audit-stats',
            array($this, 'render_stats_page')
        );
    }
    
    /**
     * 渲染统计页面
     */
    public function render_stats_page() {
        global $wpdb;
        $logs_table = $wpdb->prefix . 'wm_audit_logs';
        
        // 获取统计周期(默认最近30天)
        $period = isset($_GET['period']) ? intval($_GET['period']) : 30;
        $start_date = date('Y-m-d', strtotime("-$period days"));
        
        // 基础统计
        $stats = $wpdb->get_row($wpdb->prepare(
            "SELECT 
                COUNT(*) as total,
                SUM(CASE WHEN audit_status = 'approved' THEN 1 ELSE 0 END) as approved,
                SUM(CASE WHEN audit_status = 'rejected' THEN 1 ELSE 0 END) as rejected,
本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/6443.html

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

工作时间:周一至周五,9:00-17:30,节假日休息
返回顶部