首页 / 应用软件 / WordPress 插件开发教程,集成网站实时翻译与多语言聊天工具

WordPress 插件开发教程,集成网站实时翻译与多语言聊天工具

WordPress插件开发教程:集成网站实时翻译与多语言聊天工具

引言:WordPress插件开发的无限可能

在当今全球化的互联网环境中,多语言支持和实时互动功能已成为网站提升用户体验的关键要素。WordPress作为全球最流行的内容管理系统,其强大的插件架构为开发者提供了无限的可能性。本教程将深入探讨如何通过WordPress插件开发,集成网站实时翻译与多语言聊天工具,实现常用互联网小工具功能。

WordPress插件开发不仅仅是简单的功能添加,更是对现有系统进行二次开发,创造独特价值的过程。通过本教程,您将学习到如何从零开始构建一个功能全面的插件,将实时翻译和聊天工具无缝集成到您的WordPress网站中,从而提升网站的国际化水平和用户互动体验。

第一章:WordPress插件开发基础

1.1 WordPress插件架构概述

WordPress插件系统基于PHP语言构建,采用事件驱动的钩子(Hooks)机制。插件通过动作(Actions)和过滤器(Filters)与WordPress核心进行交互,这种设计模式使得开发者可以在不修改核心代码的情况下扩展功能。

每个WordPress插件至少需要一个主文件,其中包含插件头部信息,用于向WordPress系统标识插件:

<?php
/**
 * Plugin Name: 多语言实时工具套件
 * Plugin URI: https://yourwebsite.com/multilingual-tools
 * Description: 集成实时翻译与多语言聊天功能的WordPress插件
 * Version: 1.0.0
 * Author: 您的名字
 * License: GPL v2 or later
 * Text Domain: multilingual-tools
 */

1.2 开发环境搭建

在开始插件开发前,需要搭建合适的开发环境:

  1. 本地开发环境:推荐使用XAMPP、MAMP或Local by Flywheel
  2. 代码编辑器:VS Code、PHPStorm或Sublime Text
  3. 调试工具:安装Query Monitor、Debug Bar等调试插件
  4. 版本控制:使用Git进行代码版本管理

1.3 插件文件结构规划

合理的文件结构是插件可维护性的基础:

multilingual-tools/
├── multilingual-tools.php          # 主插件文件
├── includes/                       # 核心功能文件
│   ├── class-translation-engine.php
│   ├── class-chat-system.php
│   └── class-admin-settings.php
├── assets/                         # 静态资源
│   ├── css/
│   ├── js/
│   └── images/
├── languages/                      # 国际化文件
├── templates/                      # 前端模板
└── vendor/                         # 第三方库

第二章:实时翻译引擎集成

2.1 翻译API选择与比较

集成实时翻译功能首先需要选择合适的翻译API。目前市场上有多种选择:

  1. Google Cloud Translation API:准确度高,支持100多种语言
  2. Microsoft Azure Translator:企业级解决方案,稳定性好
  3. DeepL API:欧洲语言翻译质量优秀
  4. 百度翻译API:中文相关翻译效果较好

本教程将以Google Cloud Translation API为例,但代码设计将保持灵活性,便于切换不同服务商。

2.2 翻译功能类设计

创建一个翻译引擎类,封装所有翻译相关功能:

class MLT_Translation_Engine {
    private $api_key;
    private $api_endpoint = 'https://translation.googleapis.com/language/translate/v2';
    
    public function __construct($api_key) {
        $this->api_key = $api_key;
    }
    
    /**
     * 检测文本语言
     */
    public function detect_language($text) {
        $response = wp_remote_post($this->api_endpoint . '/detect', [
            'body' => [
                'q' => $text,
                'key' => $this->api_key
            ]
        ]);
        
        if (is_wp_error($response)) {
            return false;
        }
        
        $body = json_decode(wp_remote_retrieve_body($response), true);
        
        return isset($body['data']['detections'][0][0]['language']) 
            ? $body['data']['detections'][0][0]['language'] 
            : false;
    }
    
    /**
     * 执行翻译
     */
    public function translate($text, $target_language, $source_language = null) {
        $args = [
            'q' => $text,
            'target' => $target_language,
            'key' => $this->api_key
        ];
        
        if ($source_language) {
            $args['source'] = $source_language;
        }
        
        $response = wp_remote_post($this->api_endpoint, [
            'body' => $args
        ]);
        
        if (is_wp_error($response)) {
            return $text; // 翻译失败时返回原文
        }
        
        $body = json_decode(wp_remote_retrieve_body($response), true);
        
        return isset($body['data']['translations'][0]['translatedText']) 
            ? $body['data']['translations'][0]['translatedText'] 
            : $text;
    }
    
    /**
     * 批量翻译
     */
    public function translate_batch($texts, $target_language, $source_language = null) {
        $results = [];
        
        // 免费API通常有频率限制,这里添加延迟避免超限
        foreach ($texts as $index => $text) {
            $results[$index] = $this->translate($text, $target_language, $source_language);
            
            // 每翻译5个文本暂停1秒
            if ($index % 5 === 0 && $index > 0) {
                sleep(1);
            }
        }
        
        return $results;
    }
}

2.3 前端翻译界面实现

在前端添加翻译控件,让用户可以选择翻译页面内容:

class MLT_Frontend_Translator {
    public function __construct() {
        add_action('wp_footer', [$this, 'add_translation_widget']);
        add_action('wp_enqueue_scripts', [$this, 'enqueue_scripts']);
        add_action('wp_ajax_mlt_translate_content', [$this, 'ajax_translate_content']);
        add_action('wp_ajax_nopriv_mlt_translate_content', [$this, 'ajax_translate_content']);
    }
    
    public function enqueue_scripts() {
        wp_enqueue_style(
            'mlt-frontend-style',
            plugin_dir_url(__FILE__) . '../assets/css/frontend.css',
            [],
            '1.0.0'
        );
        
        wp_enqueue_script(
            'mlt-frontend-script',
            plugin_dir_url(__FILE__) . '../assets/js/frontend.js',
            ['jquery'],
            '1.0.0',
            true
        );
        
        wp_localize_script('mlt-frontend-script', 'mlt_ajax', [
            'ajax_url' => admin_url('admin-ajax.php'),
            'nonce' => wp_create_nonce('mlt_translate_nonce')
        ]);
    }
    
    public function add_translation_widget() {
        if (!is_singular()) return;
        
        $languages = [
            'en' => 'English',
            'es' => 'Español',
            'fr' => 'Français',
            'de' => 'Deutsch',
            'zh-CN' => '中文(简体)',
            'ja' => '日本語'
        ];
        
        include plugin_dir_path(__FILE__) . '../templates/translation-widget.php';
    }
    
    public function ajax_translate_content() {
        // 验证nonce
        if (!wp_verify_nonce($_POST['nonce'], 'mlt_translate_nonce')) {
            wp_die('安全验证失败');
        }
        
        $post_id = intval($_POST['post_id']);
        $target_lang = sanitize_text_field($_POST['target_lang']);
        
        $post = get_post($post_id);
        
        if (!$post) {
            wp_send_json_error('文章不存在');
        }
        
        // 获取翻译引擎实例
        $api_key = get_option('mlt_google_api_key');
        $translator = new MLT_Translation_Engine($api_key);
        
        // 翻译标题和内容
        $translated_title = $translator->translate($post->post_title, $target_lang);
        $translated_content = $translator->translate($post->post_content, $target_lang);
        
        wp_send_json_success([
            'title' => $translated_title,
            'content' => apply_filters('the_content', $translated_content)
        ]);
    }
}

第三章:多语言聊天系统开发

3.1 聊天系统架构设计

多语言聊天系统需要处理实时通信、消息存储和语言转换。我们将采用以下架构:

  1. 前端界面:使用WebSocket或AJAX轮询实现实时通信
  2. 消息处理:PHP处理消息接收、存储和转发
  3. 数据库设计:创建自定义表存储聊天记录
  4. 翻译集成:在消息发送/接收时自动翻译

3.2 数据库设计与消息存储

创建聊天消息数据库表:

class MLT_Chat_Database {
    public static function create_tables() {
        global $wpdb;
        
        $charset_collate = $wpdb->get_charset_collate();
        $table_name = $wpdb->prefix . 'mlt_chat_messages';
        
        $sql = "CREATE TABLE IF NOT EXISTS $table_name (
            id bigint(20) NOT NULL AUTO_INCREMENT,
            session_id varchar(100) NOT NULL,
            sender_id bigint(20) DEFAULT 0,
            sender_type enum('user','admin') DEFAULT 'user',
            message_text text NOT NULL,
            original_language varchar(10) DEFAULT '',
            target_language varchar(10) DEFAULT '',
            translated_text text,
            is_translated tinyint(1) DEFAULT 0,
            timestamp datetime DEFAULT CURRENT_TIMESTAMP,
            PRIMARY KEY (id),
            KEY session_id (session_id),
            KEY timestamp (timestamp)
        ) $charset_collate;";
        
        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($sql);
    }
    
    public static function save_message($data) {
        global $wpdb;
        $table_name = $wpdb->prefix . 'mlt_chat_messages';
        
        return $wpdb->insert($table_name, $data);
    }
    
    public static function get_chat_history($session_id, $limit = 50) {
        global $wpdb;
        $table_name = $wpdb->prefix . 'mlt_chat_messages';
        
        return $wpdb->get_results($wpdb->prepare(
            "SELECT * FROM $table_name 
            WHERE session_id = %s 
            ORDER BY timestamp ASC 
            LIMIT %d",
            $session_id, $limit
        ));
    }
}

3.3 实时通信实现

使用AJAX轮询实现实时聊天功能(为简化示例,生产环境建议使用WebSocket):

class MLT_Chat_System {
    private $translation_engine;
    
    public function __construct() {
        $api_key = get_option('mlt_google_api_key');
        $this->translation_engine = new MLT_Translation_Engine($api_key);
        
        add_action('wp_ajax_mlt_send_message', [$this, 'handle_send_message']);
        add_action('wp_ajax_nopriv_mlt_send_message', [$this, 'handle_send_message']);
        add_action('wp_ajax_mlt_get_messages', [$this, 'handle_get_messages']);
        add_action('wp_ajax_nopriv_mlt_get_messages', [$this, 'handle_get_messages']);
    }
    
    public function handle_send_message() {
        // 验证nonce和安全检查
        if (!wp_verify_nonce($_POST['nonce'], 'mlt_chat_nonce')) {
            wp_send_json_error('安全验证失败');
        }
        
        $session_id = sanitize_text_field($_POST['session_id']);
        $message = sanitize_textarea_field($_POST['message']);
        $user_lang = sanitize_text_field($_POST['user_lang']);
        $target_lang = sanitize_text_field($_POST['target_lang']);
        
        // 检测消息语言
        $detected_lang = $this->translation_engine->detect_language($message);
        
        // 如果需要翻译,则翻译消息
        $translated_message = $message;
        if ($detected_lang && $detected_lang !== $target_lang) {
            $translated_message = $this->translation_engine->translate(
                $message, 
                $target_lang, 
                $detected_lang
            );
        }
        
        // 保存消息到数据库
        $message_id = MLT_Chat_Database::save_message([
            'session_id' => $session_id,
            'sender_type' => 'user',
            'message_text' => $message,
            'original_language' => $detected_lang,
            'target_language' => $target_lang,
            'translated_text' => $translated_message,
            'is_translated' => ($detected_lang !== $target_lang) ? 1 : 0
        ]);
        
        if ($message_id) {
            // 这里可以添加通知管理员新消息的逻辑
            
            wp_send_json_success([
                'message_id' => $message_id,
                'translated_message' => $translated_message,
                'timestamp' => current_time('mysql')
            ]);
        } else {
            wp_send_json_error('消息发送失败');
        }
    }
    
    public function handle_get_messages() {
        $session_id = sanitize_text_field($_POST['session_id']);
        $last_message_id = intval($_POST['last_message_id']);
        
        global $wpdb;
        $table_name = $wpdb->prefix . 'mlt_chat_messages';
        
        // 获取新消息
        $new_messages = $wpdb->get_results($wpdb->prepare(
            "SELECT * FROM $table_name 
            WHERE session_id = %s AND id > %d 
            ORDER BY timestamp ASC",
            $session_id, $last_message_id
        ));
        
        wp_send_json_success([
            'messages' => $new_messages,
            'count' => count($new_messages)
        ]);
    }
}

3.4 前端聊天界面

创建美观的聊天界面:

<!-- templates/chat-widget.php -->
<div id="mlt-chat-widget" class="mlt-chat-container">
    <div class="mlt-chat-header">
        <h3>多语言在线客服</h3>
        <div class="mlt-language-selector">
            <select id="mlt-chat-language">
                <option value="auto">自动检测</option>
                <option value="zh-CN">中文</option>
                <option value="en">English</option>
                <option value="es">Español</option>
                <option value="fr">Français</option>
                <option value="de">Deutsch</option>
                <option value="ja">日本語</option>
            </select>
        </div>
        <button class="mlt-chat-close">&times;</button>
    </div>
    
    <div class="mlt-chat-messages">
        <!-- 消息将在这里动态加载 -->
        <div class="mlt-welcome-message">
            <p>您好!我是多语言客服助手。请选择您的语言开始聊天。</p>
        </div>
    </div>
    
    <div class="mlt-chat-input-area">
        <textarea 
            id="mlt-chat-input" 
            placeholder="输入消息... (按Enter发送,Shift+Enter换行)"
            rows="2"
        ></textarea>
        <button id="mlt-send-button">发送</button>
    </div>
</div>

<button id="mlt-chat-toggle" class="mlt-chat-toggle-button">
    <span class="mlt-chat-icon">💬</span>
    <span class="mlt-chat-label">在线聊天</span>
</button>

第四章:管理后台与设置界面

4.1 插件设置页面

创建完整的插件设置页面,让管理员可以配置API密钥和其他选项:

class MLT_Admin_Settings {
    public function __construct() {
        add_action('admin_menu', [$this, 'add_admin_menu']);
        add_action('admin_init', [$this, 'register_settings']);
        add_action('admin_enqueue_scripts', [$this, 'enqueue_admin_scripts']);
    }
    
    public function add_admin_menu() {
        add_menu_page(
            '多语言工具设置',
            '多语言工具',
            'manage_options',
            'mlt-settings',
            [$this, 'render_settings_page'],
            'dashicons-translation',
            80
        );
        
        add_submenu_page(
            'mlt-settings',
            '聊天记录',
            '聊天记录',
            'manage_options',
            'mlt-chat-logs',
            [$this, 'render_chat_logs_page']
        );
        
        add_submenu_page(
            'mlt-settings',
            '翻译统计',
            '翻译统计',
            'manage_options',
            'mlt-translation-stats',
            [$this, 'render_stats_page']
        );
    }
    
    public function register_settings() {
        register_setting('mlt_settings_group', 'mlt_google_api_key');
        register_setting('mlt_settings_group', 'mlt_default_language');
        register_setting('mlt_settings_group', 'mlt_chat_enabled');
        register_setting('mlt_settings_group', 'mlt_translation_enabled');
        register_setting('mlt_settings_group', 'mlt_supported_languages');
        
        add_settings_section(
            'mlt_api_section',
            'API设置',
            [$this, 'render_api_section'],
            'mlt-settings'
        );
        
        add_settings_field(
            'mlt_google_api_key',
            'Google翻译API密钥',
            [$this, 'render_api_key_field'],
            'mlt-settings',
            'mlt_api_section'
        );
        

4.2 设置字段与选项

    public function render_api_section() {
        echo '<p>配置翻译和聊天功能所需的API密钥和基本设置。</p>';
    }
    
    public function render_api_key_field() {
        $api_key = get_option('mlt_google_api_key', '');
        echo '<input type="password" id="mlt_google_api_key" 
              name="mlt_google_api_key" value="' . esc_attr($api_key) . '" 
              class="regular-text" />
              <p class="description">获取Google Cloud Translation API密钥:<a href="https://cloud.google.com/translate/docs/setup" target="_blank">点击这里</a></p>';
    }
    
    public function render_settings_page() {
        if (!current_user_can('manage_options')) {
            return;
        }
        
        // 检查API密钥是否有效
        $api_key = get_option('mlt_google_api_key');
        $api_status = $this->check_api_status($api_key);
        ?>
        <div class="wrap">
            <h1><?php echo esc_html(get_admin_page_title()); ?></h1>
            
            <?php if ($api_status['valid'] === false): ?>
            <div class="notice notice-error">
                <p><?php echo esc_html($api_status['message']); ?></p>
            </div>
            <?php endif; ?>
            
            <form action="options.php" method="post">
                <?php
                settings_fields('mlt_settings_group');
                do_settings_sections('mlt-settings');
                submit_button('保存设置');
                ?>
            </form>
            
            <div class="mlt-settings-extra">
                <h2>功能测试</h2>
                <div class="mlt-test-area">
                    <h3>翻译功能测试</h3>
                    <textarea id="mlt-test-text" rows="3" class="large-text" placeholder="输入要测试翻译的文本..."></textarea>
                    <select id="mlt-test-target-lang">
                        <option value="en">英语</option>
                        <option value="es">西班牙语</option>
                        <option value="fr">法语</option>
                        <option value="zh-CN">中文</option>
                    </select>
                    <button id="mlt-test-translate" class="button button-secondary">测试翻译</button>
                    <div id="mlt-test-result" class="mlt-test-result"></div>
                </div>
            </div>
        </div>
        <?php
    }
    
    private function check_api_status($api_key) {
        if (empty($api_key)) {
            return ['valid' => false, 'message' => 'API密钥未设置'];
        }
        
        // 简单的API测试
        $test_url = 'https://translation.googleapis.com/language/translate/v2/languages?key=' . $api_key;
        $response = wp_remote_get($test_url);
        
        if (is_wp_error($response)) {
            return ['valid' => false, 'message' => '网络连接错误: ' . $response->get_error_message()];
        }
        
        $status_code = wp_remote_retrieve_response_code($response);
        
        if ($status_code === 200) {
            return ['valid' => true, 'message' => 'API连接正常'];
        } elseif ($status_code === 403) {
            return ['valid' => false, 'message' => 'API密钥无效或未启用翻译API服务'];
        } else {
            return ['valid' => false, 'message' => 'API连接失败,状态码: ' . $status_code];
        }
    }
    
    public function render_chat_logs_page() {
        if (!current_user_can('manage_options')) {
            return;
        }
        
        global $wpdb;
        $table_name = $wpdb->prefix . 'mlt_chat_messages';
        
        // 分页参数
        $per_page = 20;
        $current_page = isset($_GET['paged']) ? max(1, intval($_GET['paged'])) : 1;
        $offset = ($current_page - 1) * $per_page;
        
        // 获取聊天会话列表
        $sessions = $wpdb->get_results(
            "SELECT session_id, COUNT(*) as message_count, 
            MIN(timestamp) as start_time, MAX(timestamp) as end_time
            FROM $table_name 
            GROUP BY session_id 
            ORDER BY end_time DESC 
            LIMIT $offset, $per_page"
        );
        
        $total_sessions = $wpdb->get_var("SELECT COUNT(DISTINCT session_id) FROM $table_name");
        $total_pages = ceil($total_sessions / $per_page);
        ?>
        <div class="wrap">
            <h1>聊天记录管理</h1>
            
            <table class="wp-list-table widefat fixed striped">
                <thead>
                    <tr>
                        <th>会话ID</th>
                        <th>消息数量</th>
                        <th>开始时间</th>
                        <th>最后活动</th>
                        <th>操作</th>
                    </tr>
                </thead>
                <tbody>
                    <?php if (empty($sessions)): ?>
                    <tr>
                        <td colspan="5">暂无聊天记录</td>
                    </tr>
                    <?php else: ?>
                    <?php foreach ($sessions as $session): ?>
                    <tr>
                        <td><?php echo esc_html($session->session_id); ?></td>
                        <td><?php echo intval($session->message_count); ?></td>
                        <td><?php echo esc_html($session->start_time); ?></td>
                        <td><?php echo esc_html($session->end_time); ?></td>
                        <td>
                            <a href="#" class="button button-small view-chat-details" 
                               data-session="<?php echo esc_attr($session->session_id); ?>">
                               查看详情
                            </a>
                            <a href="<?php echo wp_nonce_url(
                                admin_url('admin.php?page=mlt-chat-logs&action=delete_session&session_id=' . $session->session_id),
                                'delete_chat_session'
                            ); ?>" class="button button-small button-link-delete" 
                               onclick="return confirm('确定删除此会话的所有记录吗?')">
                               删除
                            </a>
                        </td>
                    </tr>
                    <?php endforeach; ?>
                    <?php endif; ?>
                </tbody>
            </table>
            
            <?php if ($total_pages > 1): ?>
            <div class="tablenav bottom">
                <div class="tablenav-pages">
                    <?php
                    echo paginate_links([
                        'base' => add_query_arg('paged', '%#%'),
                        'format' => '',
                        'prev_text' => '&laquo;',
                        'next_text' => '&raquo;',
                        'total' => $total_pages,
                        'current' => $current_page
                    ]);
                    ?>
                </div>
            </div>
            <?php endif; ?>
            
            <!-- 聊天详情模态框 -->
            <div id="mlt-chat-details-modal" class="mlt-modal" style="display:none;">
                <div class="mlt-modal-content">
                    <div class="mlt-modal-header">
                        <h3>聊天详情 - <span id="modal-session-id"></span></h3>
                        <span class="mlt-modal-close">&times;</span>
                    </div>
                    <div class="mlt-modal-body">
                        <div id="mlt-chat-details-content"></div>
                    </div>
                </div>
            </div>
        </div>
        <?php
    }
}

第五章:高级功能与优化

5.1 缓存机制实现

为了减少API调用次数和提高性能,实现翻译缓存:

class MLT_Translation_Cache {
    private $cache_group = 'mlt_translations';
    private $cache_expiry = WEEK_IN_SECONDS; // 缓存一周
    
    public function get_cached_translation($text, $target_lang, $source_lang = null) {
        $cache_key = $this->generate_cache_key($text, $target_lang, $source_lang);
        $cached = wp_cache_get($cache_key, $this->cache_group);
        
        if ($cached !== false) {
            return $cached;
        }
        
        // 检查数据库缓存
        global $wpdb;
        $table_name = $wpdb->prefix . 'mlt_translation_cache';
        
        $result = $wpdb->get_row($wpdb->prepare(
            "SELECT translated_text FROM $table_name 
            WHERE original_text_hash = %s 
            AND target_language = %s 
            AND (source_language = %s OR source_language IS NULL)
            AND expiry_time > NOW()",
            md5($text),
            $target_lang,
            $source_lang
        ));
        
        if ($result) {
            wp_cache_set($cache_key, $result->translated_text, $this->cache_group, $this->cache_expiry);
            return $result->translated_text;
        }
        
        return false;
    }
    
    public function cache_translation($text, $translated_text, $target_lang, $source_lang = null) {
        $cache_key = $this->generate_cache_key($text, $target_lang, $source_lang);
        
        // 设置内存缓存
        wp_cache_set($cache_key, $translated_text, $this->cache_group, $this->cache_expiry);
        
        // 存储到数据库
        global $wpdb;
        $table_name = $wpdb->prefix . 'mlt_translation_cache';
        
        $wpdb->replace($table_name, [
            'original_text_hash' => md5($text),
            'original_text' => $text,
            'translated_text' => $translated_text,
            'source_language' => $source_lang,
            'target_language' => $target_lang,
            'expiry_time' => date('Y-m-d H:i:s', time() + $this->cache_expiry),
            'created_at' => current_time('mysql')
        ]);
    }
    
    private function generate_cache_key($text, $target_lang, $source_lang) {
        return 'trans_' . md5($text . $target_lang . $source_lang);
    }
    
    public static function create_cache_table() {
        global $wpdb;
        
        $charset_collate = $wpdb->get_charset_collate();
        $table_name = $wpdb->prefix . 'mlt_translation_cache';
        
        $sql = "CREATE TABLE IF NOT EXISTS $table_name (
            id bigint(20) NOT NULL AUTO_INCREMENT,
            original_text_hash varchar(32) NOT NULL,
            original_text text NOT NULL,
            translated_text text NOT NULL,
            source_language varchar(10),
            target_language varchar(10) NOT NULL,
            expiry_time datetime NOT NULL,
            created_at datetime DEFAULT CURRENT_TIMESTAMP,
            PRIMARY KEY (id),
            UNIQUE KEY text_hash_lang (original_text_hash, target_language, source_language),
            KEY expiry_time (expiry_time)
        ) $charset_collate;";
        
        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($sql);
    }
}

5.2 性能优化与异步处理

对于大量翻译请求,使用异步处理避免阻塞:

class MLT_Async_Processor {
    private $queue_table;
    
    public function __construct() {
        global $wpdb;
        $this->queue_table = $wpdb->prefix . 'mlt_async_queue';
        
        add_action('mlt_process_queue', [$this, 'process_queue']);
        add_action('wp_ajax_nopriv_mlt_async_translate', [$this, 'handle_async_translate']);
    }
    
    public function add_translation_job($data) {
        global $wpdb;
        
        return $wpdb->insert($this->queue_table, [
            'job_type' => 'translation',
            'job_data' => json_encode($data),
            'status' => 'pending',
            'created_at' => current_time('mysql')
        ]);
    }
    
    public function process_queue() {
        global $wpdb;
        
        // 获取待处理的任务
        $jobs = $wpdb->get_results(
            "SELECT * FROM {$this->queue_table} 
            WHERE status = 'pending' 
            ORDER BY created_at ASC 
            LIMIT 10"
        );
        
        foreach ($jobs as $job) {
            $this->process_job($job);
        }
    }
    
    private function process_job($job) {
        global $wpdb;
        
        $job_data = json_decode($job->job_data, true);
        
        try {
            // 更新状态为处理中
            $wpdb->update(
                $this->queue_table,
                ['status' => 'processing'],
                ['id' => $job->id]
            );
            
            // 执行翻译
            $api_key = get_option('mlt_google_api_key');
            $translator = new MLT_Translation_Engine($api_key);
            
            $result = $translator->translate(
                $job_data['text'],
                $job_data['target_lang'],
                $job_data['source_lang'] ?? null
            );
            
            // 更新状态为完成
            $wpdb->update(
                $this->queue_table,
                [
                    'status' => 'completed',
                    'result_data' => json_encode(['translated_text' => $result]),
                    'completed_at' => current_time('mysql')
                ],
                ['id' => $job->id]
            );
            
        } catch (Exception $e) {
            $wpdb->update(
                $this->queue_table,
                [
                    'status' => 'failed',
                    'error_message' => $e->getMessage(),
                    'completed_at' => current_time('mysql')
                ],
                ['id' => $job->id]
            );
        }
    }
    
    public static function create_queue_table() {
        global $wpdb;
        
        $charset_collate = $wpdb->get_charset_collate();
        $table_name = $wpdb->prefix . 'mlt_async_queue';
        
        $sql = "CREATE TABLE IF NOT EXISTS $table_name (
            id bigint(20) NOT NULL AUTO_INCREMENT,
            job_type varchar(50) NOT NULL,
            job_data text NOT NULL,
            status varchar(20) DEFAULT 'pending',
            result_data text,
            error_message text,
            created_at datetime DEFAULT CURRENT_TIMESTAMP,
            completed_at datetime,
            PRIMARY KEY (id),
            KEY status (status),
            KEY job_type (job_type)
        ) $charset_collate;";
        
        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($sql);
    }
}

5.3 安全增强措施

class MLT_Security_Manager {
    public static function sanitize_chat_input($input) {
        // 移除危险标签但保留基本格式
        $allowed_tags = [
            'b' => [],
            'i' => [],
            'u' => [],
            'em' => [],
            'strong' => [],
            'br' => [],
            'p' => [],
            'span' => ['class' => []]
        ];
        
        $sanitized = wp_kses($input, $allowed_tags);
        
        // 限制长度
        if (strlen($sanitized) > 1000) {
            $sanitized = substr($sanitized, 0, 1000);
        }
        
        return $sanitized;
    }
    
    public static function validate_language_code($lang_code) {
        $supported_languages = [
            'en', 'es', 'fr', 'de', 'zh-CN', 'zh-TW', 'ja', 'ko', 
            'ru', 'ar', 'pt', 'it', 'nl', 'pl', 'tr', 'th', 'vi'
        ];
        
        return in_array($lang_code, $supported_languages) ? $lang_code : 'en';
    }
    
    public static function prevent_flood_attack($session_id, $limit = 10, $time_window = 60) {
        $transient_key = 'mlt_chat_flood_' . md5($session_id);
        $request_count = get_transient($transient_key);
        
        if ($request_count === false) {
            set_transient($transient_key, 1, $time_window);
            return true;
        }
        
        if ($request_count >= $limit) {
            return false;
        }
        
        set_transient($transient_key, $request_count + 1, $time_window);
        return true;
    }
    
    public static function encrypt_sensitive_data($data) {
        if (!extension_loaded('openssl')) {
            return $data; // 回退到基本编码
        }
        
        $method = 'AES-256-CBC';
        $key = defined('MLT_ENCRYPTION_KEY') ? MLT_ENCRYPTION_KEY : wp_salt();
        $iv_length = openssl_cipher_iv_length($method);
        $iv = openssl_random_pseudo_bytes($iv_length);
        
        $encrypted = openssl_encrypt($data, $method, $key, 0, $iv);
        return base64_encode($iv . $encrypted);
    }
}

第六章:插件部署与维护

6.1 插件激活与卸载处理

class MLT_Plugin_Manager {
    public static function activate() {
        // 创建数据库表
        MLT_Chat_Database::create_tables();
        MLT_Translation_Cache::create_cache_table();
        MLT_Async_Processor::create_queue_table();
        
        // 设置默认选项
        add_option('mlt_chat_enabled', '1');
        add_option('mlt_translation_enabled', '1');
        add_option('mlt_default_language', 'zh-CN');
        add_option('mlt_supported_languages', ['en', 'zh-CN', 'es', 'fr', 'de']);
        
        // 创建定时任务
        if (!wp_next_scheduled('mlt_process_queue')) {
            wp_schedule_event(time(), 'hourly', 'mlt_process_queue');
        }
        
        // 创建必要的目录
本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/5212.html

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

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