首页 / 应用软件 / 实战教程,在网站中添加用户生成内容管理与审核系统

实战教程,在网站中添加用户生成内容管理与审核系统

实战教程:在WordPress网站中添加用户生成内容管理与审核系统

引言:用户生成内容的价值与挑战

在当今互联网环境中,用户生成内容(User-Generated Content, UGC)已成为网站互动性和价值的重要组成部分。从电商网站的产品评价、社交媒体平台的用户分享,到知识社区的问答讨论,UGC不仅丰富了网站内容,还增强了用户参与感和社区凝聚力。然而,UGC管理也带来了诸多挑战:垃圾信息泛滥、不当内容传播、版权问题以及内容质量参差不齐等。

对于WordPress网站管理员而言,构建一个高效、安全的UGC管理与审核系统至关重要。本教程将深入探讨如何通过WordPress代码二次开发,实现一个完整的用户生成内容管理与审核系统,同时集成常用互联网小工具功能,提升网站互动性和管理效率。

第一部分:系统架构设计与规划

1.1 用户生成内容类型分析

在开始开发前,我们需要明确网站需要管理的UGC类型:

  1. 评论系统:文章评论、产品评价
  2. 用户提交内容:文章投稿、图片上传、视频分享
  3. 社区互动:论坛帖子、问答内容
  4. 用户资料:个人简介、头像、联系方式

1.2 系统功能需求规划

一个完整的UGC管理系统应包含以下核心功能:

  1. 内容提交接口:用户友好的内容提交表单
  2. 审核工作流:多级审核机制与状态管理
  3. 垃圾过滤:自动识别与过滤垃圾内容
  4. 用户信誉系统:基于用户行为的信任评分
  5. 通知系统:审核状态通知与用户提醒
  6. 管理后台:高效的内容审核与管理界面
  7. 数据分析:UGC数据统计与报告

1.3 技术架构设计

我们将采用以下技术架构:

  • 前端:HTML5、CSS3、JavaScript(jQuery/AJAX)
  • 后端:PHP(WordPress核心API)
  • 数据库:MySQL(WordPress数据库结构)
  • 安全机制:Nonce验证、权限检查、数据过滤

第二部分:基础环境搭建与配置

2.1 创建自定义插件

首先,我们需要创建一个独立的WordPress插件来管理所有UGC功能:

<?php
/**
 * Plugin Name: UGC管理与审核系统
 * Plugin URI: https://yourwebsite.com/
 * Description: 用户生成内容管理与审核系统
 * Version: 1.0.0
 * Author: 您的名称
 * License: GPL v2 or later
 */

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

// 定义插件常量
define('UGC_PLUGIN_PATH', plugin_dir_path(__FILE__));
define('UGC_PLUGIN_URL', plugin_dir_url(__FILE__));
define('UGC_VERSION', '1.0.0');

// 初始化插件
function ugc_system_init() {
    // 检查WordPress版本
    if (version_compare(get_bloginfo('version'), '5.0', '<')) {
        wp_die('本插件需要WordPress 5.0或更高版本');
    }
    
    // 加载核心功能
    require_once UGC_PLUGIN_PATH . 'includes/core-functions.php';
    require_once UGC_PLUGIN_PATH . 'includes/submission-handler.php';
    require_once UGC_PLUGIN_PATH . 'includes/moderation-system.php';
    require_once UGC_PLUGIN_PATH . 'includes/admin-interface.php';
    
    // 国际化支持
    load_plugin_textdomain('ugc-system', false, dirname(plugin_basename(__FILE__)) . '/languages');
}
add_action('plugins_loaded', 'ugc_system_init');

2.2 创建数据库表结构

我们需要扩展WordPress数据库来存储UGC相关数据:

// 在activation hook中创建数据库表
function ugc_create_database_tables() {
    global $wpdb;
    
    $charset_collate = $wpdb->get_charset_collate();
    $table_name = $wpdb->prefix . 'ugc_submissions';
    
    $sql = "CREATE TABLE IF NOT EXISTS $table_name (
        id bigint(20) NOT NULL AUTO_INCREMENT,
        user_id bigint(20) NOT NULL,
        content_type varchar(50) NOT NULL,
        title varchar(255),
        content longtext NOT NULL,
        status varchar(20) DEFAULT 'pending',
        moderation_notes text,
        moderated_by bigint(20),
        moderated_at datetime,
        created_at datetime DEFAULT CURRENT_TIMESTAMP,
        updated_at datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        metadata text,
        PRIMARY KEY (id),
        KEY user_id (user_id),
        KEY status (status),
        KEY content_type (content_type)
    ) $charset_collate;";
    
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
    
    // 创建审核日志表
    $log_table = $wpdb->prefix . 'ugc_moderation_logs';
    $sql_log = "CREATE TABLE IF NOT EXISTS $log_table (
        id bigint(20) NOT NULL AUTO_INCREMENT,
        submission_id bigint(20) NOT NULL,
        moderator_id bigint(20) NOT NULL,
        action varchar(50) NOT NULL,
        notes text,
        created_at datetime DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY (id),
        KEY submission_id (submission_id),
        KEY moderator_id (moderator_id)
    ) $charset_collate;";
    
    dbDelta($sql_log);
}
register_activation_hook(__FILE__, 'ugc_create_database_tables');

第三部分:用户内容提交系统开发

3.1 创建内容提交表单

设计一个用户友好的内容提交界面:

// 短代码生成内容提交表单
function ugc_submission_form_shortcode($atts) {
    // 只有登录用户才能提交内容
    if (!is_user_logged_in()) {
        return '<div class="ugc-login-required">请<a href="' . wp_login_url(get_permalink()) . '">登录</a>后提交内容</div>';
    }
    
    $atts = shortcode_atts(array(
        'type' => 'article',
        'category' => '',
        'max_length' => 5000
    ), $atts);
    
    ob_start();
    ?>
    <div class="ugc-submission-form-container">
        <form id="ugc-submission-form" class="ugc-form" method="post" enctype="multipart/form-data">
            <?php wp_nonce_field('ugc_submission_action', 'ugc_submission_nonce'); ?>
            <input type="hidden" name="ugc_content_type" value="<?php echo esc_attr($atts['type']); ?>">
            
            <div class="form-group">
                <label for="ugc-title">标题 *</label>
                <input type="text" id="ugc-title" name="ugc_title" required 
                       maxlength="200" placeholder="请输入内容标题">
            </div>
            
            <div class="form-group">
                <label for="ugc-content">内容 *</label>
                <textarea id="ugc-content" name="ugc_content" rows="10" 
                          required maxlength="<?php echo esc_attr($atts['max_length']); ?>"
                          placeholder="请输入详细内容..."></textarea>
                <div class="char-count">
                    <span id="char-counter">0</span>/<?php echo esc_attr($atts['max_length']); ?> 字符
                </div>
            </div>
            
            <div class="form-group">
                <label for="ugc-category">分类</label>
                <select id="ugc-category" name="ugc_category">
                    <option value="">选择分类</option>
                    <?php
                    $categories = get_categories(array('hide_empty' => false));
                    foreach ($categories as $category) {
                        echo '<option value="' . esc_attr($category->term_id) . '">' . 
                             esc_html($category->name) . '</option>';
                    }
                    ?>
                </select>
            </div>
            
            <div class="form-group">
                <label for="ugc-tags">标签</label>
                <input type="text" id="ugc-tags" name="ugc_tags" 
                       placeholder="用逗号分隔多个标签">
            </div>
            
            <div class="form-group">
                <label for="ugc-attachments">附件</label>
                <input type="file" id="ugc-attachments" name="ugc_attachments[]" 
                       multiple accept="image/*,.pdf,.doc,.docx">
                <p class="help-text">支持图片、PDF、Word文档,单个文件不超过5MB</p>
            </div>
            
            <div class="form-group">
                <label>
                    <input type="checkbox" name="ugc_terms" required>
                    我同意<a href="<?php echo get_permalink(get_page_by_path('terms')); ?>" target="_blank">服务条款</a>
                </label>
            </div>
            
            <div class="form-submit">
                <button type="submit" class="ugc-submit-btn">提交内容</button>
                <div class="form-feedback" id="form-feedback"></div>
            </div>
        </form>
    </div>
    
    <script>
    jQuery(document).ready(function($) {
        // 字符计数
        $('#ugc-content').on('input', function() {
            var length = $(this).val().length;
            $('#char-counter').text(length);
        });
        
        // AJAX表单提交
        $('#ugc-submission-form').on('submit', function(e) {
            e.preventDefault();
            
            var formData = new FormData(this);
            var submitBtn = $(this).find('.ugc-submit-btn');
            
            submitBtn.prop('disabled', true).text('提交中...');
            $('#form-feedback').removeClass('success error').html('');
            
            $.ajax({
                url: '<?php echo admin_url('admin-ajax.php'); ?>',
                type: 'POST',
                data: formData,
                processData: false,
                contentType: false,
                success: function(response) {
                    if (response.success) {
                        $('#form-feedback').addClass('success').html(response.data.message);
                        $('#ugc-submission-form')[0].reset();
                        $('#char-counter').text('0');
                    } else {
                        $('#form-feedback').addClass('error').html(response.data);
                    }
                    submitBtn.prop('disabled', false).text('提交内容');
                },
                error: function() {
                    $('#form-feedback').addClass('error').html('提交失败,请稍后重试');
                    submitBtn.prop('disabled', false).text('提交内容');
                }
            });
        });
    });
    </script>
    <?php
    
    // 添加样式
    wp_enqueue_style('ugc-frontend-style', UGC_PLUGIN_URL . 'assets/css/frontend.css');
    wp_enqueue_script('ugc-frontend-script', UGC_PLUGIN_URL . 'assets/js/frontend.js', 
                      array('jquery'), UGC_VERSION, true);
    
    return ob_get_clean();
}
add_shortcode('ugc_submission_form', 'ugc_submission_form_shortcode');

3.2 内容提交处理逻辑

// 处理AJAX内容提交
function handle_ugc_submission() {
    // 验证nonce
    if (!isset($_POST['ugc_submission_nonce']) || 
        !wp_verify_nonce($_POST['ugc_submission_nonce'], 'ugc_submission_action')) {
        wp_die('安全验证失败');
    }
    
    // 验证用户权限
    if (!is_user_logged_in()) {
        wp_die('请先登录');
    }
    
    $user_id = get_current_user_id();
    $content_type = sanitize_text_field($_POST['ugc_content_type']);
    $title = sanitize_text_field($_POST['ugc_title']);
    $content = wp_kses_post($_POST['ugc_content']);
    $category = intval($_POST['ugc_category']);
    $tags = sanitize_text_field($_POST['ugc_tags']);
    
    // 基础验证
    if (empty($title) || empty($content)) {
        wp_send_json_error('标题和内容不能为空');
    }
    
    // 检查用户提交频率限制
    if (!check_submission_rate_limit($user_id)) {
        wp_send_json_error('提交过于频繁,请稍后再试');
    }
    
    // 垃圾内容检测
    if (detect_spam_content($title . ' ' . $content)) {
        wp_send_json_error('内容疑似垃圾信息,请修改后重新提交');
    }
    
    global $wpdb;
    $table_name = $wpdb->prefix . 'ugc_submissions';
    
    // 准备元数据
    $metadata = array(
        'category_id' => $category,
        'tags' => $tags,
        'attachments' => array()
    );
    
    // 处理文件上传
    if (!empty($_FILES['ugc_attachments'])) {
        $attachments = handle_file_uploads($_FILES['ugc_attachments'], $user_id);
        if (is_wp_error($attachments)) {
            wp_send_json_error($attachments->get_error_message());
        }
        $metadata['attachments'] = $attachments;
    }
    
    // 插入提交记录
    $result = $wpdb->insert(
        $table_name,
        array(
            'user_id' => $user_id,
            'content_type' => $content_type,
            'title' => $title,
            'content' => $content,
            'status' => 'pending',
            'metadata' => serialize($metadata),
            'created_at' => current_time('mysql')
        ),
        array('%d', '%s', '%s', '%s', '%s', '%s', '%s')
    );
    
    if ($result) {
        $submission_id = $wpdb->insert_id;
        
        // 发送通知邮件给管理员
        send_moderation_notification($submission_id);
        
        // 记录用户活动
        update_user_submission_stats($user_id);
        
        wp_send_json_success(array(
            'message' => '内容提交成功,等待审核',
            'submission_id' => $submission_id
        ));
    } else {
        wp_send_json_error('提交失败,请稍后重试');
    }
}
add_action('wp_ajax_ugc_submit_content', 'handle_ugc_submission');
add_action('wp_ajax_nopriv_ugc_submit_content', 'handle_ugc_submission');

// 文件上传处理函数
function handle_file_uploads($files, $user_id) {
    require_once(ABSPATH . 'wp-admin/includes/file.php');
    require_once(ABSPATH . 'wp-admin/includes/image.php');
    require_once(ABSPATH . 'wp-admin/includes/media.php');
    
    $attachments = array();
    $upload_dir = wp_upload_dir();
    $ugc_dir = $upload_dir['basedir'] . '/ugc-uploads/' . $user_id . '/' . date('Y/m');
    
    // 创建目录
    if (!file_exists($ugc_dir)) {
        wp_mkdir_p($ugc_dir);
    }
    
    $file_count = count($files['name']);
    
    for ($i = 0; $i < $file_count; $i++) {
        // 检查文件大小(5MB限制)
        if ($files['size'][$i] > 5 * 1024 * 1024) {
            continue; // 跳过过大文件
        }
        
        // 检查文件类型
        $file_type = wp_check_filetype($files['name'][$i]);
        $allowed_types = array('jpg', 'jpeg', 'png', 'gif', 'pdf', 'doc', 'docx');
        
        if (!in_array($file_type['ext'], $allowed_types)) {
            continue; // 跳过不允许的文件类型
        }
        
        // 生成唯一文件名
        $filename = wp_unique_filename($ugc_dir, $files['name'][$i]);
        $filepath = $ugc_dir . '/' . $filename;
        
        // 移动文件
        if (move_uploaded_file($files['tmp_name'][$i], $filepath)) {
            $attachments[] = array(
                'name' => $files['name'][$i],
                'path' => str_replace($upload_dir['basedir'], '', $filepath),
                'type' => $file_type['type'],
                'size' => $files['size'][$i]
            );
        }
    }
    
    return $attachments;
}

第四部分:智能审核系统开发

4.1 多级审核工作流设计

// 审核状态管理类
class UGC_Moderation_Workflow {
    private $statuses = array(
        'pending' => array(
            'name' => '待审核',
            'actions' => array('approve', 'reject', 'request_revision')
        ),
        'under_review' => array(
            'name' => '审核中',
            'actions' => array('approve', 'reject', 'request_revision')
        ),
        'approved' => array(
            'name' => '已通过',
            'actions' => array('unpublish', 'delete')
        ),
        'rejected' => array(
            'name' => '已拒绝',
            'actions' => array('restore', 'delete')
        ),
        'needs_revision' => array(
            'name' => '需要修改',
            'actions' => array('approve', 'reject')
        ),
        'published' => array(
            'name' => '已发布',
            'actions' => array('unpublish', 'delete')
        )
    );
    
    // 获取下一个可用状态
    public function get_next_status($current_status, $action) {
        $transitions = array(
            'pending' => array(
                'approve' => 'approved',
                'reject' => 'rejected',
                'request_revision' => 'needs_revision'
            ),
            'needs_revision' => array(
                'approve' => 'approved',
                'reject' => 'rejected'
            ),
            'approved' => array(
                'publish' => 'published',
                'unpublish' => 'pending',
                'delete' => 'deleted'
            ),
            'rejected' => array(
                'restore' => 'pending',
                'delete' => 'deleted'
            ),
            'published' => array(
                'unpublish' => 'approved',
                'delete' => 'deleted'
            )
        );
        
        return isset($transitions[$current_status][$action]) 
               ? $transitions[$current_status][$action] 
               : $current_status;
    }
    
    // 执行审核操作
    public function moderate_submission($submission_id, $action, $moderator_id, $notes = '') {
        global $wpdb;
        
        $table_name = $wpdb->prefix . 'ugc_submissions';
        $log_table = $wpdb->prefix . 'ugc_moderation_logs';
        
        // 获取当前状态
        $current_status = $wpdb->get_var($wpdb->prepare(
            "SELECT status FROM $table_name WHERE id = %d", $submission_id
        ));
        
        if (!$current_status) {
            return new WP_Error('not_found', '提交内容不存在');
        }
        
        // 验证操作是否允许
        if (!in_array($action, $this->statuses[$current_status]['actions'])) {
            return new WP_Error('invalid_action', '当前状态下不允许此操作');
        }
        
        // 获取新状态
        $new_status = $this->get_next_status($current_status, $action);
        
        // 开始事务
        $wpdb->query('START TRANSACTION');
        
        try {
            // 更新提交状态
            $update_result = $wpdb->update(
                $table_name,
                array(
                    'status' => $new_status,
                    'moderated_by' => $moderator_id,
                    'moderated_at' => current_time('mysql'),
                    'moderation_notes' => $notes
                ),
                array('id' => $submission_id),
                array('%s', '%d', '%s', '%s'),
                array('%d')
            );
            
            if (!$update_result) {
                throw new Exception('更新状态失败');
            }
            
            // 记录审核日志
            $log_result = $wpdb->insert(
                $log_table,
                array(
                    'submission_id' => $submission_id,
                    'moderator_id' => $moderator_id,
                    'action' => $action,
                    'notes' => $notes
                ),
                array('%d', '%d', '%s', '%s')
            );
            
            if (!$log_result) {
                throw new Exception('记录日志失败');
            }
            
            // 如果状态变为已发布,创建正式内容
            if ($new_status === 'published') {
                $this->publish_submission($submission_id);
            }
            
            // 发送通知给用户
            $this->send_status_notification($submission_id, $new_status, $notes);
            
            $wpdb->query('COMMIT');
            
            return array(
                'success' => true,
                'new_status' => $new_status,
                'message' => '审核操作成功'
            );
            
        } catch (Exception $e) {
            $wpdb->query('ROLLBACK');
            return new WP_Error('transaction_failed', $e->getMessage());
        }
    }
    
    // 发布提交内容
    private function publish_submission($submission_id) {
        global $wpdb;
        
        $table_name = $wpdb->prefix . 'ugc_submissions';
        $submission = $wpdb->get_row($wpdb->prepare(
            "SELECT * FROM $table_name WHERE id = %d", $submission_id
        ));
        
        if (!$submission) {
            return false;
        }
        
        $metadata = unserialize($submission->metadata);
        
        // 创建WordPress文章
        $post_data = array(
            'post_title'   => $submission->title,
            'post_content' => $submission->content,
            'post_status'  => 'publish',
            'post_author'  => $submission->user_id,
            'post_type'    => 'post'
        );
        
        if (!empty($metadata['category_id'])) {
            $post_data['post_category'] = array($metadata['category_id']);
        }
        
        $post_id = wp_insert_post($post_data);
        
        if ($post_id && !empty($metadata['tags'])) {
            wp_set_post_tags($post_id, $metadata['tags']);
        }
        
        // 更新提交记录中的文章ID
        $wpdb->update(
            $table_name,
            array('published_post_id' => $post_id),
            array('id' => $submission_id),
            array('%d'),
            array('%d')
        );
        
        return $post_id;
    }
    
    // 发送状态通知
    private function send_status_notification($submission_id, $status, $notes = '') {
        global $wpdb;
        
        $table_name = $wpdb->prefix . 'ugc_submissions';
        $submission = $wpdb->get_row($wpdb->prepare(
            "SELECT user_id, title FROM $table_name WHERE id = %d", $submission_id
        ));
        
        if (!$submission) {
            return false;
        }
        
        $user = get_user_by('id', $submission->user_id);
        if (!$user) {
            return false;
        }
        
        $status_names = array(
            'approved' => '已通过',
            'rejected' => '已拒绝',
            'published' => '已发布',
            'needs_revision' => '需要修改'
        );
        
        $subject = sprintf('您的投稿"%s"状态已更新', $submission->title);
        $message = sprintf(
            "您好 %s,nn您的投稿《%s》状态已更新为:%snn",
            $user->display_name,
            $submission->title,
            $status_names[$status] ?? $status
        );
        
        if (!empty($notes)) {
            $message .= "审核备注:n" . $notes . "nn";
        }
        
        $message .= "您可以登录网站查看详情。nn";
        $message .= get_bloginfo('name');
        
        wp_mail($user->user_email, $subject, $message);
        
        return true;
    }
}

4.2 智能垃圾内容检测

// 垃圾内容检测系统
class UGC_Spam_Detection {
    private $spam_keywords = array();
    private $spam_patterns = array();
    
    public function __construct() {
        // 加载垃圾关键词库
        $this->load_spam_keywords();
        $this->load_spam_patterns();
    }
    
    // 检测内容是否为垃圾
    public function detect($content, $author_id = 0) {
        $score = 0;
        $reasons = array();
        
        // 1. 关键词检测
        $keyword_score = $this->check_keywords($content);
        if ($keyword_score > 0) {
            $score += $keyword_score;
            $reasons[] = '包含垃圾关键词';
        }
        
        // 2. 链接检测
        $link_score = $this->check_links($content);
        if ($link_score > 0) {
            $score += $link_score;
            $reasons[] = '包含可疑链接';
        }
        
        // 3. 重复内容检测
        $duplicate_score = $this->check_duplicate($content);
        if ($duplicate_score > 0) {
            $score += $duplicate_score;
            $reasons[] = '疑似重复内容';
        }
        
        // 4. 用户行为分析
        if ($author_id > 0) {
            $user_score = $this->check_user_behavior($author_id);
            if ($user_score > 0) {
                $score += $user_score;
                $reasons[] = '用户行为可疑';
            }
        }
        
        // 5. 模式匹配
        $pattern_score = $this->check_patterns($content);
        if ($pattern_score > 0) {
            $score += $pattern_score;
            $reasons[] = '匹配垃圾内容模式';
        }
        
        return array(
            'score' => $score,
            'is_spam' => $score >= 5, // 阈值设为5分
            'reasons' => $reasons,
            'details' => array(
                'keyword_score' => $keyword_score,
                'link_score' => $link_score,
                'duplicate_score' => $duplicate_score,
                'user_score' => $user_score ?? 0,
                'pattern_score' => $pattern_score
            )
        );
    }
    
    // 关键词检测
    private function check_keywords($content) {
        $score = 0;
        $content_lower = strtolower($content);
        
        foreach ($this->spam_keywords as $keyword => $weight) {
            if (strpos($content_lower, $keyword) !== false) {
                $score += $weight;
            }
        }
        
        return min($score, 3); // 最高3分
    }
    
    // 链接检测
    private function check_links($content) {
        $score = 0;
        
        // 提取所有链接
        preg_match_all('/https?://[^s]+/', $content, $matches);
        $links = $matches[0] ?? array();
        
        if (count($links) > 3) {
            $score += 2; // 链接过多
        }
        
        // 检查可疑域名
        $suspicious_domains = array('.ru', '.cn', '.xyz', '.top', '.club');
        foreach ($links as $link) {
            foreach ($suspicious_domains as $domain) {
                if (strpos($link, $domain) !== false) {
                    $score += 1;
                    break;
                }
            }
        }
        
        return min($score, 3);
    }
    
    // 重复内容检测
    private function check_duplicate($content) {
        global $wpdb;
        
        // 计算内容哈希
        $content_hash = md5(trim($content));
        
        // 检查最近24小时内的重复内容
        $table_name = $wpdb->prefix . 'ugc_submissions';
        $one_day_ago = date('Y-m-d H:i:s', strtotime('-24 hours'));
        
        $count = $wpdb->get_var($wpdb->prepare(
            "SELECT COUNT(*) FROM $table_name 
             WHERE MD5(content) = %s 
             AND created_at > %s",
            $content_hash,
            $one_day_ago
        ));
        
        return $count > 0 ? 2 : 0;
    }
    
    // 用户行为分析
    private function check_user_behavior($user_id) {
        global $wpdb;
        
        $score = 0;
        $table_name = $wpdb->prefix . 'ugc_submissions';
        
        // 检查用户提交频率
        $one_hour_ago = date('Y-m-d H:i:s', strtotime('-1 hour'));
        $recent_submissions = $wpdb->get_var($wpdb->prepare(
            "SELECT COUNT(*) FROM $table_name 
             WHERE user_id = %d 
             AND created_at > %s",
            $user_id,
            $one_hour_ago
        ));
        
        if ($recent_submissions > 5) {
            $score += 2; // 1小时内提交超过5次
        }
        
        // 检查用户被拒绝率
        $total_submissions = $wpdb->get_var($wpdb->prepare(
            "SELECT COUNT(*) FROM $table_name WHERE user_id = %d",
            $user_id
        ));
        
        if ($total_submissions > 0) {
            $rejected_count = $wpdb->get_var($wpdb->prepare(
                "SELECT COUNT(*) FROM $table_name 
                 WHERE user_id = %d AND status = 'rejected'",
                $user_id
            ));
            
            $rejection_rate = $rejected_count / $total_submissions;
            if ($rejection_rate > 0.5) {
                $score += 2; // 拒绝率超过50%
            }
        }
        
        return min($score, 3);
    }
    
    // 模式匹配检测
    private function check_patterns($content) {
        $score = 0;
        
        foreach ($this->spam_patterns as $pattern => $weight) {
            if (preg_match($pattern, $content)) {
                $score += $weight;
            }
        }
        
        return min($score, 2);
    }
    
    // 加载垃圾关键词
    private function load_spam_keywords() {
        // 可以从文件或数据库加载
        $this->spam_keywords = array(
            'viagra' => 2,
            'casino' => 2,
            'loan' => 1,
            'mortgage' => 1,
            'click here' => 1,
            'buy now' => 1,
            'discount' => 1,
            'free' => 1,
            'win' => 1,
            'prize' => 1,
            // 添加更多关键词...
        );
    }
    
    // 加载垃圾模式
    private function load_spam_patterns() {
        $this->spam_patterns = array(
            '/[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,}/i' => 1, // 邮箱地址
            '/bd{3}[-.]?d{3}[-.]?d{4}b/' => 1, // 电话号码
            '/bd{4}[- ]?d{4}[- ]?d{4}[- ]?d{4}b/' => 2, // 信用卡号
            '/http:///' => 1, // HTTP链接(非HTTPS)
        );
    }
}

第五部分:管理后台界面开发

5.1 审核管理页面

// 创建审核管理后台页面
class UGC_Admin_Interface {
    
    public function __construct() {
        add_action('admin_menu', array($this, 'add_admin_menu'));
        add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'));
        add_action('wp_ajax_ugc_bulk_action', array($this, 'handle_bulk_action'));
    }
    
    // 添加管理菜单
    public function add_admin_menu() {
        add_menu_page(
            'UGC管理',
            'UGC管理',
            'manage_options',
            'ugc-management',
            array($this, 'render_main_page'),
            'dashicons-admin-comments',
            30
        );
        
        add_submenu_page(
            'ugc-management',
            '内容审核',
            '内容审核',
            'manage_options',
            'ugc-moderation',
            array($this, 'render_moderation_page')
        );
        
        add_submenu_page(
            'ugc-management',
            '审核日志',
            '审核日志',
            'manage_options',
            'ugc-logs',
            array($this, 'render_logs_page')
        );
        
        add_submenu_page(
            'ugc-management',
            '垃圾检测',
            '垃圾检测',
            'manage_options',
            'ugc-spam',
            array($this, 'render_spam_page')
        );
        
        add_submenu_page(
            'ugc-management',
            '用户信誉',
            '用户信誉',
            'manage_options',
            'ugc-reputation',
            array($this, 'render_reputation_page')
        );
    }
    
    // 渲染审核页面
    public function render_moderation_page() {
        global $wpdb;
        
        $table_name = $wpdb->prefix . 'ugc_submissions';
        
        // 获取筛选参数
        $status = isset($_GET['status']) ? sanitize_text_field($_GET['status']) : 'pending';
        $type = isset($_GET['type']) ? sanitize_text_field($_GET['type']) : '';
        $page = isset($_GET['paged']) ? intval($_GET['paged']) : 1;
        $per_page = 20;
        $offset = ($page - 1) * $per_page;
        
        // 构建查询
        $where = array('1=1');
        $params = array();
        
        if ($status) {
            $where[] = 'status = %s';
            $params[] = $status;
        }
        
        if ($type) {
            $where[] = 'content_type = %s';
            $params[] = $type;
        }
        
        $where_clause = implode(' AND ', $where);
        
        // 获取总数
        $count_query = "SELECT COUNT(*) FROM $table_name WHERE $where_clause";
        if ($params) {
            $count_query = $wpdb->prepare($count_query, $params);
        }
        $total_items = $wpdb->get_var($count_query);
        
        // 获取数据
        $data_query = "SELECT * FROM $table_name WHERE $where_clause 
                       ORDER BY created_at DESC LIMIT %d OFFSET %d";
        $params[] = $per_page;
        $params[] = $offset;
        
        $submissions = $wpdb->get_results($wpdb->prepare($data_query, $params));
        
        ?>
        <div class="wrap">
            <h1 class="wp-heading-inline">内容审核</h1>
            
            <!-- 筛选器 -->
            <div class="ugc-filters">
                <form method="get" action="">
                    <input type="hidden" name="page" value="ugc-moderation">
                    
                    <select name="status" onchange="this.form.submit()">
                        <option value="">所有状态</option>
                        <?php
                        $statuses = array(
                            'pending' => '待审核',
                            'under_review' => '审核中',
本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/5122.html

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

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