文章目录[隐藏]
一步步实现:为WordPress打造内嵌的在线代码片段管理与共享平台
引言:为什么WordPress需要代码片段管理平台?
在当今数字化时代,网站功能日益复杂,WordPress作为全球最流行的内容管理系统,承载着超过40%的网站。对于开发者、技术博主和在线教育者而言,经常需要在文章中嵌入代码片段,并与读者或团队成员共享。然而,WordPress默认的代码展示功能有限,缺乏统一的代码管理、版本控制和协作功能。
传统的代码展示方法存在诸多问题:使用简单的<pre>标签缺乏语法高亮;依赖第三方服务如GitHub Gist可能导致加载缓慢和隐私问题;手动管理代码片段效率低下且难以复用。因此,为WordPress打造一个内嵌的在线代码片段管理与共享平台,不仅能提升内容质量,还能增强用户互动和知识共享。
本文将详细介绍如何通过WordPress程序的二次开发,实现一个功能完整的代码片段管理与共享平台,同时集成常用互联网小工具功能,打造一站式的开发者工具集。
第一部分:项目规划与架构设计
1.1 需求分析与功能规划
在开始开发之前,我们需要明确平台的核心功能:
- 代码片段管理:创建、编辑、删除和分类代码片段
- 语法高亮支持:支持多种编程语言的语法高亮
- 版本控制:记录代码修改历史,支持版本回滚
- 共享与协作:公开/私有代码片段设置,协作编辑功能
- 嵌入展示:短代码或区块支持,方便在文章中嵌入代码
- 用户权限管理:不同用户角色的访问和编辑权限
- 常用工具集成:JSON格式化、代码压缩、加密解密等小工具
- 搜索与过滤:按语言、标签、日期等条件搜索代码片段
- 导入导出:支持从GitHub Gist等平台导入,导出为多种格式
- API接口:提供REST API供外部应用调用
1.2 技术栈选择与架构设计
基于WordPress的生态系统,我们选择以下技术方案:
- 核心框架:WordPress插件架构
- 前端技术:React.js(用于管理界面) + WordPress区块编辑器
- 语法高亮:Prism.js或Highlight.js
- 数据库设计:自定义数据库表 + WordPress元数据
- API设计:WordPress REST API扩展
- 缓存机制:Transients API + 对象缓存
- 安全措施:Nonce验证、能力检查、输入过滤
系统架构分为四个主要层次:
- 表示层:用户界面和区块编辑器集成
- 应用层:业务逻辑和API端点
- 数据层:数据库操作和缓存管理
- 集成层:第三方服务集成和工具功能
第二部分:数据库设计与插件初始化
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());
}
}
