首页 / 教程文章 / 网络传媒WordPress站点柔性内容合规审查插件开发教程

网络传媒WordPress站点柔性内容合规审查插件开发教程

网络传媒WordPress站点柔性内容合规审查插件开发教程

引言:为什么需要内容合规审查插件

在当今网络传媒环境中,内容合规性已成为网站运营的关键环节。WordPress作为全球最流行的内容管理系统,承载着大量媒体内容,但缺乏内置的内容审查机制。本教程将指导您开发一个柔性内容合规审查插件,既能自动检测敏感内容,又保留人工审核的灵活性,帮助网络传媒站点在遵守法规的同时保持内容多样性。

插件架构设计

1.1 插件基础结构

首先,我们创建插件的基本文件结构:

wp-content/plugins/
└── flexible-content-audit/
    ├── flexible-content-audit.php      # 主插件文件
    ├── includes/
    │   ├── class-audit-core.php        # 核心审查类
    │   ├── class-content-scanner.php   # 内容扫描器
    │   ├── class-admin-interface.php   # 管理界面
    │   └── class-audit-logger.php      # 日志记录器
    ├── assets/
    │   ├── css/
    │   │   └── admin-styles.css        # 管理界面样式
    │   └── js/
    │       └── admin-scripts.js        # 管理界面脚本
    └── languages/                      # 国际化文件

1.2 主插件文件初始化

<?php
/**
 * Plugin Name: 柔性内容合规审查插件
 * Plugin URI:  https://example.com/flexible-content-audit
 * Description: 为网络传媒WordPress站点提供柔性内容合规审查功能
 * Version:     1.0.0
 * Author:      您的名称
 * License:     GPL v2 or later
 * Text Domain: flexible-content-audit
 */

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

// 定义插件常量
define('FCA_PLUGIN_VERSION', '1.0.0');
define('FCA_PLUGIN_PATH', plugin_dir_path(__FILE__));
define('FCA_PLUGIN_URL', plugin_dir_url(__FILE__));

// 自动加载类文件
spl_autoload_register(function ($class_name) {
    if (strpos($class_name, 'FCA_') === 0) {
        $file = FCA_PLUGIN_PATH . 'includes/class-' . strtolower(str_replace('_', '-', $class_name)) . '.php';
        if (file_exists($file)) {
            require_once $file;
        }
    }
});

// 初始化插件
function fca_init_plugin() {
    // 检查WordPress版本
    if (version_compare(get_bloginfo('version'), '5.0', '<')) {
        add_action('admin_notices', function() {
            echo '<div class="notice notice-error"><p>';
            echo __('柔性内容合规审查插件需要WordPress 5.0或更高版本', 'flexible-content-audit');
            echo '</p></div>';
        });
        return;
    }
    
    // 实例化核心类
    $GLOBALS['flexible_content_audit'] = new FCA_Audit_Core();
}
add_action('plugins_loaded', 'fca_init_plugin');

// 插件激活钩子
register_activation_hook(__FILE__, 'fca_activate_plugin');
function fca_activate_plugin() {
    // 创建必要的数据库表
    fca_create_audit_tables();
    
    // 设置默认选项
    $default_options = array(
        'audit_mode' => 'flexible', // flexible, strict, manual
        'sensitive_keywords' => '敏感词1,敏感词2,违规词1',
        'auto_audit_post_types' => array('post', 'page'),
        'notification_email' => get_option('admin_email'),
        'audit_threshold' => 70, // 敏感度阈值(0-100)
    );
    
    add_option('fca_settings', $default_options);
}

// 创建审查记录表
function fca_create_audit_tables() {
    global $wpdb;
    $charset_collate = $wpdb->get_charset_collate();
    $table_name = $wpdb->prefix . 'fca_audit_logs';
    
    $sql = "CREATE TABLE IF NOT EXISTS $table_name (
        id bigint(20) NOT NULL AUTO_INCREMENT,
        post_id bigint(20) NOT NULL,
        audit_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
        audit_status varchar(20) NOT NULL, -- pending, approved, rejected, flagged
        sensitivity_score int(3) DEFAULT 0,
        matched_keywords text,
        auditor_id bigint(20),
        audit_notes 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);
}
?>

核心审查功能开发

2.1 内容扫描器类实现

<?php
/**
 * 内容扫描器类
 * 负责扫描文章内容中的敏感信息
 */
class FCA_Content_Scanner {
    
    private $sensitive_keywords = array();
    private $sensitivity_score = 0;
    private $matched_items = array();
    
    /**
     * 初始化扫描器
     * @param array $keywords 敏感关键词数组
     */
    public function __construct($keywords = array()) {
        $this->sensitive_keywords = $keywords;
    }
    
    /**
     * 扫描文章内容
     * @param string $content 文章内容
     * @param string $title 文章标题
     * @return array 扫描结果
     */
    public function scan_content($content, $title = '') {
        $this->sensitivity_score = 0;
        $this->matched_items = array();
        
        // 合并标题和内容进行扫描
        $full_text = $title . ' ' . $content;
        
        // 扫描敏感关键词
        $this->scan_keywords($full_text);
        
        // 扫描链接(可选扩展功能)
        $this->scan_links($content);
        
        // 扫描图片ALT文本(可选扩展功能)
        $this->scan_images($content);
        
        return array(
            'score' => $this->sensitivity_score,
            'matches' => $this->matched_items,
            'status' => $this->get_audit_status()
        );
    }
    
    /**
     * 扫描敏感关键词
     * @param string $text 待扫描文本
     */
    private function scan_keywords($text) {
        foreach ($this->sensitive_keywords as $keyword) {
            $keyword = trim($keyword);
            if (empty($keyword)) continue;
            
            // 使用正则表达式进行匹配(支持中文)
            $pattern = '/' . preg_quote($keyword, '/') . '/iu';
            if (preg_match_all($pattern, $text, $matches)) {
                $count = count($matches[0]);
                $this->sensitivity_score += $count * 10; // 每个匹配加10分
                
                $this->matched_items[] = array(
                    'type' => 'keyword',
                    'value' => $keyword,
                    'count' => $count,
                    'risk_level' => $this->get_keyword_risk_level($keyword)
                );
            }
        }
        
        // 限制分数在0-100之间
        $this->sensitivity_score = min(100, $this->sensitivity_score);
    }
    
    /**
     * 扫描外部链接
     * @param string $content 文章内容
     */
    private function scan_links($content) {
        // 使用DOM解析器提取所有链接
        if (class_exists('DOMDocument')) {
            $dom = new DOMDocument();
            @$dom->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'));
            
            $links = $dom->getElementsByTagName('a');
            foreach ($links as $link) {
                $href = $link->getAttribute('href');
                
                // 检查是否为外部链接
                if ($this->is_external_link($href)) {
                    $this->sensitivity_score += 5; // 外部链接加5分
                    $this->matched_items[] = array(
                        'type' => 'external_link',
                        'url' => $href,
                        'text' => $link->textContent
                    );
                }
            }
        }
    }
    
    /**
     * 判断是否为外部链接
     * @param string $url 链接地址
     * @return bool
     */
    private function is_external_link($url) {
        $site_url = site_url();
        $parsed_url = parse_url($url);
        $parsed_site = parse_url($site_url);
        
        if (!isset($parsed_url['host'])) {
            return false;
        }
        
        return $parsed_url['host'] !== $parsed_site['host'];
    }
    
    /**
     * 根据关键词获取风险等级
     * @param string $keyword 关键词
     * @return string 风险等级
     */
    private function get_keyword_risk_level($keyword) {
        // 这里可以扩展为从数据库或配置文件中读取风险等级
        $high_risk = array('违规词1', '违规词2');
        $medium_risk = array('敏感词1', '敏感词2');
        
        if (in_array($keyword, $high_risk)) {
            return 'high';
        } elseif (in_array($keyword, $medium_risk)) {
            return 'medium';
        } else {
            return 'low';
        }
    }
    
    /**
     * 获取审查状态建议
     * @return string 状态建议
     */
    private function get_audit_status() {
        if ($this->sensitivity_score >= 80) {
            return 'rejected'; // 建议拒绝
        } elseif ($this->sensitivity_score >= 50) {
            return 'flagged';  // 需要人工审核
        } else {
            return 'approved';  // 自动通过
        }
    }
}
?>

2.2 管理界面开发

<?php
/**
 * 管理界面类
 * 提供插件设置和内容审查界面
 */
class FCA_Admin_Interface {
    
    private $settings;
    
    public function __construct() {
        $this->settings = get_option('fca_settings', array());
        
        // 添加管理菜单
        add_action('admin_menu', array($this, 'add_admin_menu'));
        
        // 添加文章列表栏位
        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_metabox'));
        
        // 保存文章时触发审查
        add_action('save_post', array($this, 'audit_on_save'), 10, 3);
    }
    
    /**
     * 添加管理菜单
     */
    public function add_admin_menu() {
        // 主菜单
        add_menu_page(
            '内容合规审查',
            '内容审查',
            'manage_options',
            'fca-dashboard',
            array($this, 'display_dashboard'),
            'dashicons-shield',
            30
        );
        
        // 子菜单
        add_submenu_page(
            'fca-dashboard',
            '审查设置',
            '设置',
            'manage_options',
            'fca-settings',
            array($this, 'display_settings_page')
        );
        
        add_submenu_page(
            'fca-dashboard',
            '审查日志',
            '日志',
            'manage_options',
            'fca-logs',
            array($this, 'display_logs_page')
        );
    }
    
    /**
     * 显示仪表板页面
     */
    public function display_dashboard() {
        ?>
        <div class="wrap fca-dashboard">
            <h1><?php echo esc_html__('内容合规审查仪表板', 'flexible-content-audit'); ?></h1>
            
            <div class="fca-stats-container">
                <div class="fca-stat-box">
                    <h3>待审查文章</h3>
                    <p class="stat-number"><?php echo $this->get_pending_count(); ?></p>
                </div>
                <div class="fca-stat-box">
                    <h3>已通过文章</h3>
                    <p class="stat-number"><?php echo $this->get_approved_count(); ?></p>
                </div>
                <div class="fca-stat-box">
                    <h3>需修改文章</h3>
                    <p class="stat-number"><?php echo $this->get_flagged_count(); ?></p>
                </div>
            </div>
            
            <div class="fca-recent-audits">
                <h2>最近审查记录</h2>
                <?php $this->display_recent_audits(); ?>
            </div>
        </div>
        <?php
    }
    
    /**
     * 显示设置页面
     */
    public function display_settings_page() {
        // 处理表单提交
        if (isset($_POST['fca_settings_nonce']) && 
            wp_verify_nonce($_POST['fca_settings_nonce'], 'fca_save_settings')) {
            $this->save_settings();
        }
        
        $settings = $this->settings;
        ?>
        <div class="wrap">
            <h1><?php echo esc_html__('内容审查设置', 'flexible-content-audit'); ?></h1>
            
            <form method="post" action="">
                <?php wp_nonce_field('fca_save_settings', 'fca_settings_nonce'); ?>
                
                <table class="form-table">
                    <tr>
                        <th scope="row">
                            <label for="audit_mode">审查模式</label>
                        </th>
                        <td>
                            <select name="fca_settings[audit_mode]" id="audit_mode">
                                <option value="flexible" <?php selected($settings['audit_mode'], 'flexible'); ?>>
                                    柔性模式(自动+人工)
                                </option>
                                <option value="strict" <?php selected($settings['audit_mode'], 'strict'); ?>>
                                    严格模式(自动审查)
                                </option>
                                <option value="manual" <?php selected($settings['audit_mode'], 'manual'); ?>>
                                    人工模式
                                </option>
                            </select>
                            <p class="description">
                                柔性模式:系统自动审查并标记,最终由人工决定<br>
                                严格模式:系统自动决定是否通过<br>
                                人工模式:所有内容都需要人工审查
                            </p>
                        </td>
                    </tr>
                    
                    <tr>
                        <th scope="row">
                            <label for="sensitive_keywords">敏感关键词</label>
                        </th>
                        <td>
                            <textarea name="fca_settings[sensitive_keywords]" 
                                      id="sensitive_keywords" 
                                      rows="5" 
                                      class="large-text"><?php 
                                echo esc_textarea($settings['sensitive_keywords']); 
                            ?></textarea>
                            <p class="description">
                                每行一个关键词,或使用逗号分隔。支持中文关键词。
                            </p>
                        </td>
                    </tr>
                    
                    <tr>
                        <th scope="row">
                            <label>自动审查的文章类型</label>
                        </th>
                        <td>
                            <?php
                            $post_types = get_post_types(array('public' => true), 'objects');
                            foreach ($post_types as $post_type) {
                                $checked = in_array($post_type->name, 
                                    $settings['auto_audit_post_types'] ?? array()) ? 'checked' : '';
                                ?>
                                <label style="display: block; margin-bottom: 5px;">
                                    <input type="checkbox" 
                                           name="fca_settings[auto_audit_post_types][]" 
                                           value="<?php echo esc_attr($post_type->name); ?>"
                                           <?php echo $checked; ?>>
                                    <?php echo esc_html($post_type->label); ?>
                                </label>
                                <?php
                            }
                            ?>
                        </td>
                    </tr>
                    
                    <tr>
                        <th scope="row">
                            <label for="audit_threshold">敏感度阈值</label>
                        </th>
                        <td>
                            <input type="range" 
                                   name="fca_settings[audit_threshold]" 
                                   id="audit_threshold"
                                   min="0" max="100" 
                                   value="<?php echo esc_attr($settings['audit_threshold'] ?? 70); ?>">
                            <span id="threshold_value"><?php echo esc_html($settings['audit_threshold'] ?? 70); ?></span>%
                            <p class="description">
                                敏感度评分超过此阈值的内容将被标记为需要人工审核
                            </p>
                        </td>
                    </tr>
                </table>
                
                <?php submit_button('保存设置'); ?>
            </form>
        </div>
        
        <script>
        jQuery(document).ready(function($) {
            // 更新阈值显示
            $('#audit_threshold').on('input', function() {
                $('#threshold_value').text($(this).val());
            });
        });
        </script>
        <?php
    }
    
    /**
     * 保存设置
     */
    private function save_settings() {
        if (!current_user_can('manage_options')) {
            return;
        }
        
        $new_settings = array(
            'audit_mode' => sanitize_text_field($_POST['fca_settings']['audit_mode']),
            'sensitive_keywords' => sanitize_textarea_field($_POST['fca_settings']['sensitive_keywords']),
            'auto_audit_post_types' => array_map('sanitize_text_field', 
                $_POST['fca_settings']['auto_audit_post_types'] ?? array()),
            'audit_threshold' => intval($_POST['fca_settings']['audit_threshold']),
            'notification_email' => sanitize_email($this->settings['notification_email']),
        );
        
        update_option('fca_settings', $new_settings);
        = $new_settings;
    
    echo '<div class="notice notice-success"><p>设置已保存!</p></div>';
}

/**
 * 在文章列表添加审查状态列
 */
public function add_audit_status_column($columns) {
    $columns['audit_status'] = '审查状态';
    return $columns;
}

/**
 * 显示审查状态列内容
 */
public function display_audit_status_column($column, $post_id) {
    if ($column === 'audit_status') {
        global $wpdb;
        $table_name = $wpdb->prefix . 'fca_audit_logs';
        
        $latest_audit = $wpdb->get_row($wpdb->prepare(
            "SELECT audit_status, sensitivity_score FROM $table_name 
             WHERE post_id = %d ORDER BY audit_time DESC LIMIT 1",
            $post_id
        ));
        
        if ($latest_audit) {
            $status_labels = array(
                'pending' => '<span class="fca-status pending">待审查</span>',
                'approved' => '<span class="fca-status approved">已通过</span>',
                'rejected' => '<span class="fca-status rejected">未通过</span>',
                'flagged' => '<span class="fca-status flagged">需修改</span>'
            );
            
            $status = $latest_audit->audit_status;
            echo $status_labels[$status] ?? '<span class="fca-status unknown">未知</span>';
            
            if ($latest_audit->sensitivity_score > 0) {
                echo '<br><small>敏感度: ' . $latest_audit->sensitivity_score . '%</small>';
            }
        } else {
            echo '<span class="fca-status not-audited">未审查</span>';
        }
    }
}

/**
 * 添加文章编辑页面的审查元框
 */
public function add_audit_metabox() {
    $post_types = $this->settings['auto_audit_post_types'] ?? array('post');
    
    foreach ($post_types as $post_type) {
        add_meta_box(
            'fca_audit_metabox',
            '内容合规审查',
            array($this, 'render_audit_metabox'),
            $post_type,
            'side',
            'high'
        );
    }
}

/**
 * 渲染审查元框
 */
public function render_audit_metabox($post) {
    global $wpdb;
    $table_name = $wpdb->prefix . 'fca_audit_logs';
    
    // 获取最新的审查记录
    $audit_log = $wpdb->get_row($wpdb->prepare(
        "SELECT * FROM $table_name WHERE post_id = %d ORDER BY audit_time DESC LIMIT 1",
        $post->ID
    ));
    
    wp_nonce_field('fca_audit_action', 'fca_audit_nonce');
    ?>
    
    <div class="fca-audit-info">
        <?php if ($audit_log): ?>
            <p><strong>审查状态:</strong> 
                <?php echo $this->get_status_label($audit_log->audit_status); ?>
            </p>
            <p><strong>敏感度评分:</strong> 
                <span class="fca-score"><?php echo $audit_log->sensitivity_score; ?>%</span>
            </p>
            <p><strong>审查时间:</strong><br>
                <?php echo date('Y-m-d H:i', strtotime($audit_log->audit_time)); ?>
            </p>
            
            <?php if ($audit_log->matched_keywords): ?>
                <p><strong>匹配关键词:</strong><br>
                    <?php 
                    $keywords = maybe_unserialize($audit_log->matched_keywords);
                    if (is_array($keywords)) {
                        echo implode(', ', array_slice($keywords, 0, 3));
                        if (count($keywords) > 3) echo '...';
                    }
                    ?>
                </p>
            <?php endif; ?>
            
            <div class="fca-audit-actions">
                <button type="button" class="button button-small fca-rescan">
                    重新扫描
                </button>
                
                <?php if ($audit_log->audit_status === 'pending' || $audit_log->audit_status === 'flagged'): ?>
                    <button type="button" class="button button-primary button-small fca-approve">
                        通过审查
                    </button>
                    <button type="button" class="button button-small fca-reject">
                        拒绝发布
                    </button>
                <?php endif; ?>
            </div>
            
        <?php else: ?>
            <p>本文尚未进行合规审查。</p>
            <button type="button" class="button button-primary fca-scan-now">
                立即审查
            </button>
        <?php endif; ?>
    </div>
    
    <div id="fca-audit-result" style="display:none; margin-top:10px;"></div>
    
    <script>
    jQuery(document).ready(function($) {
        // 立即审查按钮
        $('.fca-scan-now').click(function() {
            scanContent(<?php echo $post->ID; ?>);
        });
        
        // 重新扫描按钮
        $('.fca-rescan').click(function() {
            scanContent(<?php echo $post->ID; ?>);
        });
        
        // 通过审查按钮
        $('.fca-approve').click(function() {
            updateAuditStatus(<?php echo $post->ID; ?>, 'approved');
        });
        
        // 拒绝发布按钮
        $('.fca-reject').click(function() {
            updateAuditStatus(<?php echo $post->ID; ?>, 'rejected');
        });
        
        function scanContent(postId) {
            $('#fca-audit-result').html('<p>正在扫描内容...</p>').show();
            
            $.post(ajaxurl, {
                action: 'fca_scan_content',
                post_id: postId,
                nonce: '<?php echo wp_create_nonce("fca_ajax_nonce"); ?>'
            }, function(response) {
                if (response.success) {
                    $('#fca-audit-result').html(
                        '<div class="notice notice-success"><p>' + 
                        response.data.message + '</p></div>'
                    );
                    setTimeout(function() {
                        location.reload();
                    }, 1500);
                } else {
                    $('#fca-audit-result').html(
                        '<div class="notice notice-error"><p>' + 
                        response.data + '</p></div>'
                    );
                }
            });
        }
        
        function updateAuditStatus(postId, status) {
            $.post(ajaxurl, {
                action: 'fca_update_status',
                post_id: postId,
                status: status,
                nonce: '<?php echo wp_create_nonce("fca_ajax_nonce"); ?>'
            }, function(response) {
                if (response.success) {
                    location.reload();
                } else {
                    alert('操作失败: ' + response.data);
                }
            });
        }
    });
    </script>
    <?php
}

/**
 * 获取状态标签
 */
private function get_status_label($status) {
    $labels = array(
        'pending' => '<span class="fca-status pending">待审查</span>',
        'approved' => '<span class="fca-status approved">已通过</span>',
        'rejected' => '<span class="fca-status rejected">未通过</span>',
        'flagged' => '<span class="fca-status flagged">需修改</span>'
    );
    
    return $labels[$status] ?? '<span class="fca-status unknown">未知</span>';
}

}
?>


## 3. 核心审查逻辑实现

### 3.1 核心审查类

<?php
/**

  • 核心审查类
  • 协调各个组件的工作
    */

class FCA_Audit_Core {


private $scanner;
private $settings;
private $logger;

public function __construct() {
    $this->settings = get_option('fca_settings', array());
    $this->logger = new FCA_Audit_Logger();
    
    // 初始化关键词数组
    $keywords = explode(',', $this->settings['sensitive_keywords'] ?? '');
    $keywords = array_map('trim', $keywords);
    $keywords = array_filter($keywords);
    
    $this->scanner = new FCA_Content_Scanner($keywords);
    
    // 初始化AJAX处理
    $this->init_ajax_handlers();
    
    // 初始化管理界面
    if (is_admin()) {
        new FCA_Admin_Interface();
    }
}

/**
 * 初始化AJAX处理器
 */
private function init_ajax_handlers() {
    add_action('wp_ajax_fca_scan_content', array($this, 'ajax_scan_content'));
    add_action('wp_ajax_fca_update_status', array($this, 'ajax_update_status'));
    add_action('wp_ajax_fca_get_audit_stats', array($this, 'ajax_get_audit_stats'));
}

/**
 * AJAX扫描内容
 */
public function ajax_scan_content() {
    check_ajax_referer('fca_ajax_nonce', 'nonce');
    
    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('文章不存在');
    }
    
    // 扫描内容
    $result = $this->scanner->scan_content($post->post_content, $post->post_title);
    
    // 记录审查结果
    $this->logger->log_audit(
        $post_id,
        $result['status'],
        $result['score'],
        $result['matches']
    );
    
    // 根据设置自动处理
    $this->auto_handle_audit($post_id, $result);
    
    wp_send_json_success(array(
        'message' => '内容审查完成。敏感度评分: ' . $result['score'] . '%',
        'result' => $result
    ));
}

/**
 * 自动处理审查结果
 */
private function auto_handle_audit($post_id, $result) {
    $mode = $this->settings['audit_mode'] ?? 'flexible';
    $threshold = $this->settings['audit_threshold'] ?? 70;
    
    switch ($mode) {
        case 'strict':
            // 严格模式:自动决定
            if ($result['score'] >= $threshold) {
                $this->logger->update_audit_status($post_id, 'rejected');
                $this->send_notification($post_id, 'rejected', $result);
            } else {
                $this->logger->update_audit_status($post_id, 'approved');
            }
            break;
            
        case 'flexible':
            // 柔性模式:标记需要人工审核的内容
            if ($result['score'] >= $threshold) {
                $this->logger->update_audit_status($post_id, 'flagged');
                $this->send_notification($post_id, 'flagged', $result);
            }
            break;
            
        case 'manual':
            // 人工模式:全部标记为待审查
            $this->logger->update_audit_status($post_id, 'pending');
            $this->send_notification($post_id, 'pending', $result);
            break;
    }
}

/**
 * 发送通知
 */
private function send_notification($post_id, $status, $result) {
    $email = $this->settings['notification_email'] ?? get_option('admin_email');
    $post = get_post($post_id);
    $author = get_userdata($post->post_author);
    
    $subject = sprintf('[内容审查] 文章 "%s" 需要处理', $post->post_title);
    
    $message = sprintf(
        "文章标题: %sn作者: %sn审查状态: %sn敏感度评分: %d%%nn文章链接: %sn管理链接: %snn匹配到的敏感内容:n",
        $post->post_title,
        $author->display_name,
        $this->get_status_text($status),
        $result['score'],
        get_permalink($post_id),
        admin_url('post.php?post=' . $post_id . '&action=edit')
    );
    
    foreach ($result['matches'] as $match) {
        $message .= sprintf("- %s: %s (出现%d次)n", 
            $match['type'], 
            $match['value'] ?? $match['url'] ?? '', 
            $match['count'] ?? 1
        );
    }
    
    wp_mail($email, $subject, $message);
}

/**
 * 获取状态文本
 */
private function get_status_text($status) {
    $texts = array(
        'pending' => '待审查',
        'approved' => '已通过',
        'rejected' => '未通过',
        'flagged' => '需修改'
    );
    
    return $texts[$status] ?? '未知状态';
}

}
?>


## 4. 日志记录器实现

<?php
/**

  • 审查日志记录器
    */

class FCA_Audit_Logger {


private $table_name;

public function __construct() {
    global $wpdb;
    $this->table_name = $wpdb->prefix . 'fca_audit_logs';
}

/**
 * 记录审查结果
 */
public function log_audit($post_id, $status, $score, $matches) {
    global $wpdb;
    
    $matched_keywords = array();
    foreach ($matches as $match) {
        if ($match['type'] === 'keyword') {
            $matched_keywords[] = $match['value'];
        }
    }
    
    $data = array(
        'post_id' => $post_id,
        'audit_status' => $status,
        'sensitivity_score' => $score,
        'matched_keywords' => maybe_serialize($matched_keywords),
        'auditor_id' => get_current_user_id(),
        'audit_time' => current_time('mysql')
    );
    
    $wpdb->insert($this->table_name, $data);
    
    // 更新文章元数据
    update_post_meta($post_id, '_fca_last_audit', $data);
    update_post_meta($post_id, '_fca_audit_status', $status);
}

/**
 * 更新审查状态
 */
public function update_audit_status($post_id, $status, $notes = '') {
    global $wpdb;
    
    $data = array(
        'audit_status' => $status,
        'auditor_id' => get_current_user_id(),
        'audit_notes' => $notes,
        'audit_time' => current_time('mysql')
    );
    
    $wpdb->update(
        $this->table_name,
        $data,
        array('post_id' => $post_id),
        array('%s', '%d', '%s', '%s'),
        array('%d')
    );
    
    update_post_meta($post_id, '_fca_audit_status', $status);
    
    // 如果文章被批准,更新文章状态
    if ($status === 'approved') {
        wp_update_post(array(
            'ID' => $post_id,
            'post_status' => 'publish'
        ));
    }
}

/**
 * 获取审查统计
 */
public function get_stats($period = 'all') {
    global $wpdb;
    
    $where = '';
    if ($period === 'today') {
        $where = " WHERE DATE(audit_time) = CURDATE()";
    } elseif ($period === 'week') {
        $where = " WHERE audit_time >= DATE_SUB(NOW(), INTERVAL 7 DAY)";
    } elseif ($period === 'month') {
        $where = " WHERE audit_time >= DATE_SUB(NOW(), INTERVAL 30 DAY)";
    }
    
    $query = "
        SELECT 
            audit_status,
            COUNT(*) as count,
            AVG(sensitivity_score) as avg_score
        FROM {$this->table_name}
        {$where}
        GROUP BY audit_status
    ";
    
    return $wpdb->get_results($query);
}

}
?>


## 5. 前端样式和脚本

### 5.1 管理界面样式 (admin-styles.css)

/ 审查状态标签 /
.fca-status {

display: inline-block;
padding: 3px 8px;
border-radius: 3px;
font-size: 12px;
font-weight: bold;

}

.fca-status.pending {

background: #f0ad4e;
color: #fff;

}

.fca-status.approved {

background: #5cb85c;
color: #fff;

}

.fca-status.rejected {

background: #d9534f;
color: #fff;

}

.fca-status.flagged {

background: #5bc0de;
color: #fff;

}

.fca-status.not-audited {

background: #777;
color: #fff;

}

/ 仪表板统计 /
.fca-stats-container {

display: flex;
gap: 20px;
margin: 20px 0;

}

.fca-stat-box {

flex: 1;
background: #fff;
border: 1px solid #ccd0d4;
border-radius: 4px;
padding: 20px;
text-align: center;

}

.fca-stat-box h3 {

margin: 0 0 10px 0;
color: #23282d;

}

.fca-stat-box .stat-number {

font-size: 36px;
font-weight: bold;
margin: 0;
color: #0073aa;

}

/ 审查元框 /
.fca-audit-info {

line-height: 1.6;

}

本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/5931.html

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

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