首页 / 应用软件 / 一步步实现,为WordPress打造内嵌的在线代码片段管理与共享平台

一步步实现,为WordPress打造内嵌的在线代码片段管理与共享平台

一步步实现:为WordPress打造内嵌的在线代码片段管理与共享平台

引言:为什么WordPress需要代码片段管理平台?

在当今数字化时代,网站功能日益复杂,WordPress作为全球最流行的内容管理系统,承载着超过40%的网站。对于开发者、技术博主和在线教育者而言,经常需要在文章中嵌入代码片段,并与读者或团队成员共享。然而,WordPress默认的代码展示功能有限,缺乏统一的代码管理、版本控制和协作功能。

传统的代码展示方法存在诸多问题:使用简单的<pre>标签缺乏语法高亮;依赖第三方服务如GitHub Gist可能导致加载缓慢和隐私问题;手动管理代码片段效率低下且难以复用。因此,为WordPress打造一个内嵌的在线代码片段管理与共享平台,不仅能提升内容质量,还能增强用户互动和知识共享。

本文将详细介绍如何通过WordPress程序的二次开发,实现一个功能完整的代码片段管理与共享平台,同时集成常用互联网小工具功能,打造一站式的开发者工具集。

第一部分:项目规划与架构设计

1.1 需求分析与功能规划

在开始开发之前,我们需要明确平台的核心功能:

  1. 代码片段管理:创建、编辑、删除和分类代码片段
  2. 语法高亮支持:支持多种编程语言的语法高亮
  3. 版本控制:记录代码修改历史,支持版本回滚
  4. 共享与协作:公开/私有代码片段设置,协作编辑功能
  5. 嵌入展示:短代码或区块支持,方便在文章中嵌入代码
  6. 用户权限管理:不同用户角色的访问和编辑权限
  7. 常用工具集成:JSON格式化、代码压缩、加密解密等小工具
  8. 搜索与过滤:按语言、标签、日期等条件搜索代码片段
  9. 导入导出:支持从GitHub Gist等平台导入,导出为多种格式
  10. API接口:提供REST API供外部应用调用

1.2 技术栈选择与架构设计

基于WordPress的生态系统,我们选择以下技术方案:

  • 核心框架:WordPress插件架构
  • 前端技术:React.js(用于管理界面) + WordPress区块编辑器
  • 语法高亮:Prism.js或Highlight.js
  • 数据库设计:自定义数据库表 + WordPress元数据
  • API设计:WordPress REST API扩展
  • 缓存机制:Transients API + 对象缓存
  • 安全措施:Nonce验证、能力检查、输入过滤

系统架构分为四个主要层次:

  1. 表示层:用户界面和区块编辑器集成
  2. 应用层:业务逻辑和API端点
  3. 数据层:数据库操作和缓存管理
  4. 集成层:第三方服务集成和工具功能

第二部分:数据库设计与插件初始化

2.1 创建自定义数据库表

我们需要创建专门的数据库表来存储代码片段及其元数据:

// 在插件激活时创建数据库表
function code_snippets_platform_activate() {
    global $wpdb;
    $charset_collate = $wpdb->get_charset_collate();
    $table_name = $wpdb->prefix . 'code_snippets';
    
    $sql = "CREATE TABLE IF NOT EXISTS $table_name (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        title varchar(200) NOT NULL,
        description text,
        code longtext NOT NULL,
        language varchar(50) NOT NULL,
        author_id bigint(20) NOT NULL,
        status varchar(20) DEFAULT 'publish',
        visibility varchar(20) DEFAULT 'public',
        created_at datetime DEFAULT CURRENT_TIMESTAMP,
        updated_at datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        view_count int(11) DEFAULT 0,
        fork_count int(11) DEFAULT 0,
        parent_id mediumint(9) DEFAULT 0,
        version int(11) DEFAULT 1,
        PRIMARY KEY (id),
        KEY author_id (author_id),
        KEY language (language),
        KEY status (status)
    ) $charset_collate;";
    
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
    
    // 创建代码片段元数据表
    $meta_table_name = $wpdb->prefix . 'code_snippet_meta';
    $sql_meta = "CREATE TABLE IF NOT EXISTS $meta_table_name (
        meta_id bigint(20) NOT NULL AUTO_INCREMENT,
        snippet_id bigint(20) NOT NULL,
        meta_key varchar(255),
        meta_value longtext,
        PRIMARY KEY (meta_id),
        KEY snippet_id (snippet_id),
        KEY meta_key (meta_key)
    ) $charset_collate;";
    
    dbDelta($sql_meta);
    
    // 创建标签关系表
    $tags_table_name = $wpdb->prefix . 'code_snippet_tags';
    $sql_tags = "CREATE TABLE IF NOT EXISTS $tags_table_name (
        id bigint(20) NOT NULL AUTO_INCREMENT,
        snippet_id bigint(20) NOT NULL,
        tag varchar(100) NOT NULL,
        PRIMARY KEY (id),
        KEY snippet_id (snippet_id),
        KEY tag (tag)
    ) $charset_collate;";
    
    dbDelta($sql_tags);
}
register_activation_hook(__FILE__, 'code_snippets_platform_activate');

2.2 插件基础结构

创建插件主文件,初始化插件的基本结构:

<?php
/**
 * Plugin Name: WordPress代码片段管理与共享平台
 * Plugin URI: https://yourwebsite.com/code-snippets-platform
 * Description: 为WordPress打造的内嵌在线代码片段管理与共享平台,集成常用开发工具
 * Version: 1.0.0
 * Author: 你的名字
 * License: GPL v2 or later
 * Text Domain: code-snippets-platform
 */

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

// 定义插件常量
define('CSP_VERSION', '1.0.0');
define('CSP_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('CSP_PLUGIN_URL', plugin_dir_url(__FILE__));
define('CSP_PLUGIN_BASENAME', plugin_basename(__FILE__));

// 自动加载类文件
spl_autoload_register(function ($class) {
    $prefix = 'CSP_';
    $base_dir = CSP_PLUGIN_DIR . 'includes/';
    
    $len = strlen($prefix);
    if (strncmp($prefix, $class, $len) !== 0) {
        return;
    }
    
    $relative_class = substr($class, $len);
    $file = $base_dir . str_replace('_', '/', $relative_class) . '.php';
    
    if (file_exists($file)) {
        require $file;
    }
});

// 初始化插件
class Code_Snippets_Platform {
    
    private static $instance = null;
    
    public static function get_instance() {
        if (null === self::$instance) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    private function __construct() {
        $this->init_hooks();
    }
    
    private function init_hooks() {
        // 激活/停用钩子
        register_activation_hook(__FILE__, array($this, 'activate'));
        register_deactivation_hook(__FILE__, array($this, 'deactivate'));
        
        // 初始化
        add_action('plugins_loaded', array($this, 'init'));
        
        // 加载文本域
        add_action('init', array($this, 'load_textdomain'));
    }
    
    public function activate() {
        require_once CSP_PLUGIN_DIR . 'includes/class-activator.php';
        CSP_Activator::activate();
    }
    
    public function deactivate() {
        require_once CSP_PLUGIN_DIR . 'includes/class-deactivator.php';
        CSP_Deactivator::deactivate();
    }
    
    public function load_textdomain() {
        load_plugin_textdomain(
            'code-snippets-platform',
            false,
            dirname(CSP_PLUGIN_BASENAME) . '/languages'
        );
    }
    
    public function init() {
        // 加载管理器
        $this->load_managers();
        
        // 注册短代码
        $this->register_shortcodes();
        
        // 注册区块
        if (function_exists('register_block_type')) {
            add_action('init', array($this, 'register_blocks'));
        }
        
        // 注册REST API
        add_action('rest_api_init', array($this, 'register_rest_routes'));
    }
    
    private function load_managers() {
        require_once CSP_PLUGIN_DIR . 'includes/managers/class-snippet-manager.php';
        require_once CSP_PLUGIN_DIR . 'includes/managers/class-tool-manager.php';
        require_once CSP_PLUGIN_DIR . 'includes/managers/class-user-manager.php';
        
        new CSP_Snippet_Manager();
        new CSP_Tool_Manager();
        new CSP_User_Manager();
    }
    
    public function register_shortcodes() {
        require_once CSP_PLUGIN_DIR . 'includes/shortcodes/class-snippet-shortcode.php';
        new CSP_Snippet_Shortcode();
    }
    
    public function register_blocks() {
        require_once CSP_PLUGIN_DIR . 'includes/blocks/class-snippet-block.php';
        new CSP_Snippet_Block();
    }
    
    public function register_rest_routes() {
        require_once CSP_PLUGIN_DIR . 'includes/api/class-snippet-api.php';
        new CSP_Snippet_API();
    }
}

// 启动插件
Code_Snippets_Platform::get_instance();

第三部分:代码片段管理核心功能实现

3.1 代码片段管理器类

创建代码片段管理器,处理所有业务逻辑:

// includes/managers/class-snippet-manager.php
class CSP_Snippet_Manager {
    
    private $db;
    private $table_name;
    
    public function __construct() {
        global $wpdb;
        $this->db = $wpdb;
        $this->table_name = $wpdb->prefix . 'code_snippets';
        
        $this->init_hooks();
    }
    
    private function init_hooks() {
        // 管理页面
        add_action('admin_menu', array($this, 'add_admin_menu'));
        
        // 前端资源
        add_action('wp_enqueue_scripts', array($this, 'enqueue_frontend_assets'));
        add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_assets'));
        
        // AJAX处理
        add_action('wp_ajax_csp_save_snippet', array($this, 'ajax_save_snippet'));
        add_action('wp_ajax_nopriv_csp_get_snippet', array($this, 'ajax_get_snippet'));
        
        // 短代码支持
        add_shortcode('code_snippet', array($this, 'render_shortcode'));
    }
    
    public function add_admin_menu() {
        add_menu_page(
            __('代码片段平台', 'code-snippets-platform'),
            __('代码片段', 'code-snippets-platform'),
            'edit_posts',
            'code-snippets',
            array($this, 'render_admin_page'),
            'dashicons-editor-code',
            30
        );
        
        // 添加子菜单
        add_submenu_page(
            'code-snippets',
            __('所有代码片段', 'code-snippets-platform'),
            __('所有片段', 'code-snippets-platform'),
            'edit_posts',
            'code-snippets',
            array($this, 'render_admin_page')
        );
        
        add_submenu_page(
            'code-snippets',
            __('添加新代码片段', 'code-snippets-platform'),
            __('添加新片段', 'code-snippets-platform'),
            'edit_posts',
            'code-snippets-new',
            array($this, 'render_editor_page')
        );
        
        add_submenu_page(
            'code-snippets',
            __('开发工具', 'code-snippets-platform'),
            __('开发工具', 'code-snippets-platform'),
            'edit_posts',
            'code-snippets-tools',
            array($this, 'render_tools_page')
        );
    }
    
    public function render_admin_page() {
        // 加载React应用容器
        echo '<div id="csp-admin-app"></div>';
    }
    
    public function render_editor_page() {
        // 代码编辑器页面
        echo '<div id="csp-editor-app"></div>';
    }
    
    public function render_tools_page() {
        // 工具页面
        echo '<div id="csp-tools-app"></div>';
    }
    
    public function enqueue_admin_assets($hook) {
        if (strpos($hook, 'code-snippets') === false) {
            return;
        }
        
        // 加载React应用
        wp_enqueue_script(
            'csp-admin-app',
            CSP_PLUGIN_URL . 'assets/js/admin-app.js',
            array('wp-element', 'wp-api-fetch', 'wp-components'),
            CSP_VERSION,
            true
        );
        
        wp_enqueue_style(
            'csp-admin-style',
            CSP_PLUGIN_URL . 'assets/css/admin-style.css',
            array('wp-components'),
            CSP_VERSION
        );
        
        // 本地化脚本
        wp_localize_script('csp-admin-app', 'csp_admin_data', array(
            'api_url' => rest_url('csp/v1'),
            'nonce' => wp_create_nonce('wp_rest'),
            'current_user' => get_current_user_id(),
            'strings' => array(
                'save' => __('保存', 'code-snippets-platform'),
                'delete' => __('删除', 'code-snippets-platform'),
                'edit' => __('编辑', 'code-snippets-platform'),
                // 更多本地化字符串
            )
        ));
    }
    
    public function enqueue_frontend_assets() {
        // 语法高亮库
        wp_enqueue_script(
            'prism-js',
            'https://cdnjs.cloudflare.com/ajax/libs/prism/1.25.0/prism.min.js',
            array(),
            '1.25.0',
            true
        );
        
        wp_enqueue_style(
            'prism-css',
            'https://cdnjs.cloudflare.com/ajax/libs/prism/1.25.0/themes/prism-tomorrow.min.css',
            array(),
            '1.25.0'
        );
        
        // 添加更多语言支持
        wp_enqueue_script(
            'prism-language-extras',
            CSP_PLUGIN_URL . 'assets/js/prism-languages.js',
            array('prism-js'),
            CSP_VERSION,
            true
        );
        
        // 前端样式
        wp_enqueue_style(
            'csp-frontend-style',
            CSP_PLUGIN_URL . 'assets/css/frontend-style.css',
            array(),
            CSP_VERSION
        );
    }
    
    // 保存代码片段
    public function save_snippet($data) {
        $user_id = get_current_user_id();
        
        // 验证数据
        $title = sanitize_text_field($data['title']);
        $description = sanitize_textarea_field($data['description']);
        $code = wp_kses_post($data['code']); // 允许HTML但过滤危险内容
        $language = sanitize_text_field($data['language']);
        $tags = isset($data['tags']) ? array_map('sanitize_text_field', $data['tags']) : array();
        $visibility = in_array($data['visibility'], array('public', 'private', 'unlisted')) 
            ? $data['visibility'] : 'public';
        
        // 准备插入数据
        $snippet_data = array(
            'title' => $title,
            'description' => $description,
            'code' => $code,
            'language' => $language,
            'author_id' => $user_id,
            'visibility' => $visibility,
            'updated_at' => current_time('mysql')
        );
        
        // 如果是更新
        if (!empty($data['id'])) {
            $snippet_id = intval($data['id']);
            
            // 检查权限
            if (!$this->can_edit_snippet($snippet_id, $user_id)) {
                return new WP_Error('forbidden', __('您没有权限编辑此代码片段', 'code-snippets-platform'), array('status' => 403));
            }
            
            // 创建新版本
            $old_snippet = $this->get_snippet($snippet_id);
            $this->create_version($old_snippet);
            
            // 更新主记录
            $this->db->update(
                $this->table_name,
                $snippet_data,
                array('id' => $snippet_id)
            );
            
            // 更新标签
            $this->update_tags($snippet_id, $tags);
            
            return $snippet_id;
        } else {
            // 新代码片段
            $snippet_data['created_at'] = current_time('mysql');
            
            $this->db->insert(
                $this->table_name,
                $snippet_data
            );
            
            $snippet_id = $this->db->insert_id;
            
            // 保存标签
            $this->update_tags($snippet_id, $tags);
            
            return $snippet_id;
        }
    }
    
    // 获取代码片段
    public function get_snippet($id, $check_permissions = true) {
        $id = intval($id);
        $user_id = get_current_user_id();
        
        $snippet = $this->db->get_row(
            $this->db->prepare("SELECT * FROM {$this->table_name} WHERE id = %d", $id)
        );
        
        if (!$snippet) {
            return null;
        }
        
        // 检查权限
        if ($check_permissions && !$this->can_view_snippet($snippet, $user_id)) {
            return new WP_Error('forbidden', __('您没有权限查看此代码片段', 'code-snippets-platform'), array('status' => 403));
        }
        
        // 获取标签
        $snippet->tags = $this->get_snippet_tags($id);
        

3.2 代码片段展示与短代码实现

// includes/shortcodes/class-snippet-shortcode.php
class CSP_Snippet_Shortcode {
    
    public function __construct() {
        add_shortcode('code_snippet', array($this, 'render_shortcode'));
        add_shortcode('code_tool', array($this, 'render_tool_shortcode'));
    }
    
    public function render_shortcode($atts) {
        $atts = shortcode_atts(array(
            'id' => 0,
            'title' => '',
            'language' => '',
            'line_numbers' => true,
            'highlight' => '',
            'download' => false,
            'theme' => 'default'
        ), $atts, 'code_snippet');
        
        $snippet_id = intval($atts['id']);
        
        if ($snippet_id <= 0) {
            return '<div class="csp-error">' . __('无效的代码片段ID', 'code-snippets-platform') . '</div>';
        }
        
        // 获取代码片段
        $snippet_manager = new CSP_Snippet_Manager();
        $snippet = $snippet_manager->get_snippet($snippet_id);
        
        if (is_wp_error($snippet) || !$snippet) {
            return '<div class="csp-error">' . __('代码片段不存在或无权访问', 'code-snippets-platform') . '</div>';
        }
        
        // 构建输出
        $output = '<div class="csp-snippet-container" data-snippet-id="' . esc_attr($snippet_id) . '">';
        
        // 标题栏
        $output .= '<div class="csp-snippet-header">';
        $output .= '<div class="csp-snippet-meta">';
        $output .= '<span class="csp-language-badge">' . esc_html($snippet->language) . '</span>';
        $output .= '<span class="csp-author">' . sprintf(__('作者: %s', 'code-snippets-platform'), get_the_author_meta('display_name', $snippet->author_id)) . '</span>';
        $output .= '</div>';
        
        // 操作按钮
        $output .= '<div class="csp-snippet-actions">';
        if ($atts['download']) {
            $output .= '<button class="csp-btn csp-btn-download" data-snippet-id="' . esc_attr($snippet_id) . '">' . __('下载', 'code-snippets-platform') . '</button>';
        }
        $output .= '<button class="csp-btn csp-btn-copy" data-clipboard-target="#snippet-' . esc_attr($snippet_id) . '">' . __('复制', 'code-snippets-platform') . '</button>';
        $output .= '</div>';
        $output .= '</div>';
        
        // 代码区域
        $output .= '<div class="csp-snippet-code">';
        $output .= '<pre class="language-' . esc_attr($snippet->language) . ($atts['line_numbers'] ? ' line-numbers' : '') . '">';
        $output .= '<code id="snippet-' . esc_attr($snippet_id) . '">' . esc_html($snippet->code) . '</code>';
        $output .= '</pre>';
        $output .= '</div>';
        
        // 描述区域
        if (!empty($snippet->description)) {
            $output .= '<div class="csp-snippet-description">';
            $output .= wp_kses_post($snippet->description);
            $output .= '</div>';
        }
        
        $output .= '</div>';
        
        // 增加查看计数
        $this->increment_view_count($snippet_id);
        
        return $output;
    }
    
    private function increment_view_count($snippet_id) {
        global $wpdb;
        $table_name = $wpdb->prefix . 'code_snippets';
        
        $wpdb->query(
            $wpdb->prepare(
                "UPDATE {$table_name} SET view_count = view_count + 1 WHERE id = %d",
                $snippet_id
            )
        );
    }
    
    public function render_tool_shortcode($atts) {
        $atts = shortcode_atts(array(
            'tool' => 'json_formatter',
            'title' => '',
            'height' => '400px',
            'width' => '100%'
        ), $atts, 'code_tool');
        
        $tool = sanitize_text_field($atts['tool']);
        $title = sanitize_text_field($atts['title']);
        
        $available_tools = array(
            'json_formatter' => __('JSON格式化', 'code-snippets-platform'),
            'code_minifier' => __('代码压缩', 'code-snippets-platform'),
            'encryption' => __('加密解密', 'code-snippets-platform'),
            'base64' => __('Base64编码', 'code-snippets-platform'),
            'regex_tester' => __('正则表达式测试', 'code-snippets-platform')
        );
        
        if (!array_key_exists($tool, $available_tools)) {
            return '<div class="csp-error">' . __('无效的工具类型', 'code-snippets-platform') . '</div>';
        }
        
        $output = '<div class="csp-tool-container" data-tool="' . esc_attr($tool) . '">';
        
        if (!empty($title)) {
            $output .= '<h3 class="csp-tool-title">' . esc_html($title) . '</h3>';
        } else {
            $output .= '<h3 class="csp-tool-title">' . esc_html($available_tools[$tool]) . '</h3>';
        }
        
        $output .= '<div class="csp-tool-content" style="height: ' . esc_attr($atts['height']) . '; width: ' . esc_attr($atts['width']) . ';">';
        
        // 根据工具类型加载不同的界面
        switch ($tool) {
            case 'json_formatter':
                $output .= $this->render_json_formatter();
                break;
            case 'code_minifier':
                $output .= $this->render_code_minifier();
                break;
            case 'encryption':
                $output .= $this->render_encryption_tool();
                break;
            // 其他工具...
        }
        
        $output .= '</div>';
        $output .= '</div>';
        
        return $output;
    }
    
    private function render_json_formatter() {
        $output = '<div class="csp-json-formatter">';
        $output .= '<div class="csp-tool-row">';
        $output .= '<div class="csp-input-section">';
        $output .= '<label for="json-input">' . __('输入JSON:', 'code-snippets-platform') . '</label>';
        $output .= '<textarea id="json-input" class="csp-textarea" placeholder="{"key": "value"}"></textarea>';
        $output .= '</div>';
        $output .= '<div class="csp-output-section">';
        $output .= '<label for="json-output">' . __('格式化结果:', 'code-snippets-platform') . '</label>';
        $output .= '<pre id="json-output" class="csp-code-output"></pre>';
        $output .= '</div>';
        $output .= '</div>';
        $output .= '<div class="csp-tool-actions">';
        $output .= '<button class="csp-btn csp-btn-format">' . __('格式化', 'code-snippets-platform') . '</button>';
        $output .= '<button class="csp-btn csp-btn-minify">' . __('压缩', 'code-snippets-platform') . '</button>';
        $output .= '<button class="csp-btn csp-btn-validate">' . __('验证', 'code-snippets-platform') . '</button>';
        $output .= '<button class="csp-btn csp-btn-clear">' . __('清空', 'code-snippets-platform') . '</button>';
        $output .= '</div>';
        $output .= '</div>';
        
        return $output;
    }
}

第四部分:REST API设计与实现

4.1 代码片段API端点

// includes/api/class-snippet-api.php
class CSP_Snippet_API {
    
    public function __construct() {
        $this->register_routes();
    }
    
    private function register_routes() {
        register_rest_route('csp/v1', '/snippets', array(
            array(
                'methods' => WP_REST_Server::READABLE,
                'callback' => array($this, 'get_snippets'),
                'permission_callback' => array($this, 'get_snippets_permissions_check'),
                'args' => $this->get_collection_params()
            ),
            array(
                'methods' => WP_REST_Server::CREATABLE,
                'callback' => array($this, 'create_snippet'),
                'permission_callback' => array($this, 'create_snippet_permissions_check')
            )
        ));
        
        register_rest_route('csp/v1', '/snippets/(?P<id>d+)', array(
            array(
                'methods' => WP_REST_Server::READABLE,
                'callback' => array($this, 'get_snippet'),
                'permission_callback' => array($this, 'get_snippet_permissions_check')
            ),
            array(
                'methods' => WP_REST_Server::EDITABLE,
                'callback' => array($this, 'update_snippet'),
                'permission_callback' => array($this, 'update_snippet_permissions_check')
            ),
            array(
                'methods' => WP_REST_Server::DELETABLE,
                'callback' => array($this, 'delete_snippet'),
                'permission_callback' => array($this, 'delete_snippet_permissions_check')
            )
        ));
        
        register_rest_route('csp/v1', '/snippets/(?P<id>d+)/fork', array(
            array(
                'methods' => WP_REST_Server::CREATABLE,
                'callback' => array($this, 'fork_snippet'),
                'permission_callback' => array($this, 'fork_snippet_permissions_check')
            )
        ));
        
        register_rest_route('csp/v1', '/tools/(?P<tool>w+)', array(
            array(
                'methods' => WP_REST_Server::CREATABLE,
                'callback' => array($this, 'process_tool'),
                'permission_callback' => array($this, 'process_tool_permissions_check')
            )
        ));
    }
    
    public function get_snippets($request) {
        global $wpdb;
        
        $params = $request->get_params();
        $page = isset($params['page']) ? intval($params['page']) : 1;
        $per_page = isset($params['per_page']) ? intval($params['per_page']) : 20;
        $offset = ($page - 1) * $per_page;
        
        $user_id = get_current_user_id();
        $table_name = $wpdb->prefix . 'code_snippets';
        
        // 构建查询条件
        $where_conditions = array('1=1');
        $where_values = array();
        
        // 权限过滤
        if (!current_user_can('manage_options')) {
            $where_conditions[] = "(visibility = 'public' OR author_id = %d)";
            $where_values[] = $user_id;
        }
        
        // 语言过滤
        if (!empty($params['language'])) {
            $where_conditions[] = "language = %s";
            $where_values[] = sanitize_text_field($params['language']);
        }
        
        // 搜索
        if (!empty($params['search'])) {
            $search_term = '%' . $wpdb->esc_like(sanitize_text_field($params['search'])) . '%';
            $where_conditions[] = "(title LIKE %s OR description LIKE %s)";
            $where_values[] = $search_term;
            $where_values[] = $search_term;
        }
        
        // 作者过滤
        if (!empty($params['author'])) {
            $where_conditions[] = "author_id = %d";
            $where_values[] = intval($params['author']);
        }
        
        $where_clause = implode(' AND ', $where_conditions);
        
        // 获取总数
        $count_query = "SELECT COUNT(*) FROM {$table_name} WHERE {$where_clause}";
        if (!empty($where_values)) {
            $count_query = $wpdb->prepare($count_query, $where_values);
        }
        $total_items = $wpdb->get_var($count_query);
        
        // 获取数据
        $query = "SELECT * FROM {$table_name} WHERE {$where_clause} ORDER BY created_at DESC LIMIT %d OFFSET %d";
        $where_values[] = $per_page;
        $where_values[] = $offset;
        
        $query = $wpdb->prepare($query, $where_values);
        $snippets = $wpdb->get_results($query);
        
        // 获取标签
        foreach ($snippets as $snippet) {
            $snippet->tags = $this->get_snippet_tags($snippet->id);
        }
        
        $response = new WP_REST_Response($snippets);
        $response->header('X-WP-Total', (int) $total_items);
        $response->header('X-WP-TotalPages', ceil($total_items / $per_page));
        
        return $response;
    }
    
    public function get_snippet($request) {
        $snippet_id = intval($request['id']);
        $snippet_manager = new CSP_Snippet_Manager();
        
        $snippet = $snippet_manager->get_snippet($snippet_id);
        
        if (is_wp_error($snippet)) {
            return $snippet;
        }
        
        if (!$snippet) {
            return new WP_Error(
                'rest_snippet_not_found',
                __('代码片段不存在', 'code-snippets-platform'),
                array('status' => 404)
            );
        }
        
        return rest_ensure_response($snippet);
    }
    
    public function create_snippet($request) {
        $data = $request->get_json_params();
        
        if (empty($data['title']) || empty($data['code']) || empty($data['language'])) {
            return new WP_Error(
                'rest_invalid_data',
                __('标题、代码和语言是必填项', 'code-snippets-platform'),
                array('status' => 400)
            );
        }
        
        $snippet_manager = new CSP_Snippet_Manager();
        $snippet_id = $snippet_manager->save_snippet($data);
        
        if (is_wp_error($snippet_id)) {
            return $snippet_id;
        }
        
        $response = $this->get_snippet(new WP_REST_Request('GET', array('id' => $snippet_id)));
        
        if (is_wp_error($response)) {
            return $response;
        }
        
        $response->set_status(201);
        $response->header('Location', rest_url(sprintf('csp/v1/snippets/%d', $snippet_id)));
        
        return $response;
    }
    
    public function process_tool($request) {
        $tool = $request['tool'];
        $data = $request->get_json_params();
        
        switch ($tool) {
            case 'json_formatter':
                return $this->process_json_formatter($data);
            case 'code_minifier':
                return $this->process_code_minifier($data);
            case 'encryption':
                return $this->process_encryption($data);
            default:
                return new WP_Error(
                    'rest_tool_not_found',
                    __('工具不存在', 'code-snippets-platform'),
                    array('status' => 404)
                );
        }
    }
    
    private function process_json_formatter($data) {
        if (!isset($data['input']) || empty($data['input'])) {
            return new WP_Error(
                'rest_invalid_data',
                __('请输入JSON数据', 'code-snippets-platform'),
                array('status' => 400)
            );
        }
        
        $input = stripslashes($data['input']);
        $action = isset($data['action']) ? $data['action'] : 'format';
        
        try {
            $json = json_decode($input);
            
            if (json_last_error() !== JSON_ERROR_NONE) {
                throw new Exception(__('无效的JSON格式: ', 'code-snippets-platform') . json_last_error_msg());
            }
            
            $result = array();
            
            switch ($action) {
                case 'format':
                    $result['output'] = json_encode($json, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
                    $result['valid'] = true;
                    break;
                case 'minify':
                    $result['output'] = json_encode($json, JSON_UNESCAPED_UNICODE);
                    $result['valid'] = true;
                    break;
                case 'validate':
                    $result['valid'] = true;
                    $result['message'] = __('JSON格式正确', 'code-snippets-platform');
                    break;
            }
            
            return rest_ensure_response($result);
            
        } catch (Exception $e) {
            return new WP_Error(
                'rest_json_error',
                $e->getMessage(),
                array('status' => 400)
            );
        }
    }
    
    // 权限检查方法
    public function get_snippets_permissions_check($request) {
        return true; // 公开可读
    }
    
    public function create_snippet_permissions_check($request) {
        return is_user_logged_in();
    }
    
    public function get_snippet_permissions_check($request) {
        $snippet_id = intval($request['id']);
        $snippet_manager = new CSP_Snippet_Manager();
        $snippet = $snippet_manager->get_snippet($snippet_id, false);
        
        if (!$snippet) {
            return true;
        }
        
        return $snippet_manager->can_view_snippet($snippet, get_current_user_id());
    }
}

第五部分:前端React应用开发

5.1 代码片段编辑器组件

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

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

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