文章目录
-
- 在当今网络传媒环境中,内容审核与风险控制已成为网站运营的关键环节。随着用户生成内容(UGC)的爆炸式增长,传统的人工审核方式已无法满足高效、准确的需求。本教程将指导您开发一款适用于WordPress的柔性内容智能审核与风控插件,帮助网络传媒平台实现自动化内容管理,平衡审核效率与用户体验。
-
- 我们的插件将包含以下核心模块: 内容采集与预处理模块 智能审核引擎模块 风控规则管理系统 审核结果处理模块 数据统计与报表模块
- 首先,我们需要设计插件所需的数据库表结构: /** * 创建插件所需数据库表 * 这段代码应放在插件激活钩子中执行 */ 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');
-
- /** * 内容预处理类 * 负责对文章内容进行清洗和标准化处理 */ 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); } }
- /** * 智能审核引擎 * 集成多种审核策略和风控规则 */ 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') ); } }
-
- /** * 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();
- /** * 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('重新审核完成'); }
在当今网络传媒环境中,内容审核与风险控制已成为网站运营的关键环节。随着用户生成内容(UGC)的爆炸式增长,传统的人工审核方式已无法满足高效、准确的需求。本教程将指导您开发一款适用于WordPress的柔性内容智能审核与风控插件,帮助网络传媒平台实现自动化内容管理,平衡审核效率与用户体验。
我们的插件将包含以下核心模块:
- 内容采集与预处理模块
- 智能审核引擎模块
- 风控规则管理系统
- 审核结果处理模块
- 数据统计与报表模块
首先,我们需要设计插件所需的数据库表结构:
/**
* 创建插件所需数据库表
* 这段代码应放在插件激活钩子中执行
*/
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');
/**
* 内容预处理类
* 负责对文章内容进行清洗和标准化处理
*/
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);
}
}
/**
* 内容预处理类
* 负责对文章内容进行清洗和标准化处理
*/
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);
}
}
/**
* 智能审核引擎
* 集成多种审核策略和风控规则
*/
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')
);
}
}
/**
* 智能审核引擎
* 集成多种审核策略和风控规则
*/
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')
);
}
}
/**
* 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();
/**
* 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();
/**
* 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('重新审核完成');
}
/**
* 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('重新审核完成');
}
/**
* 风控规则管理类
* 提供后台界面管理风控规则
*/
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();
/**
* 风控规则管理类
* 提供后台界面管理风控规则
*/
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();
/**
* 审核统计与报表类
*/
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,
/**
* 审核统计与报表类
*/
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,


