文章目录[隐藏]
网络传媒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,
