You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WordPress中创建简易的XML/JSON导入导出工具?

如何在WordPress中构建简易的选项导入导出工具(支持XML/JSON)

嘿,我之前刚好做过类似的WordPress选项导入导出工具,其实核心就是利用WordPress自带的选项读写函数,再结合PHP的文件处理和格式转换能力就能搞定。下面是一套完整的实现方案,亲测好用,步骤清晰:

一、注册后台管理页面

首先我们需要在WordPress后台添加一个专门的工具页面,方便用户操作。可以把这段代码放到你的主题functions.php文件里,或者创建一个独立的插件文件(更推荐,避免主题更新丢失代码):

// 添加后台菜单
add_action('admin_menu', 'wp_option_import_export_menu');
function wp_option_import_export_menu() {
    add_options_page(
        '选项导入导出工具',
        '选项导入导出',
        'manage_options',
        'wp-option-import-export',
        'wp_option_import_export_page'
    );
}

// 渲染工具页面内容
function wp_option_import_export_page() {
    // 权限校验,确保只有管理员能访问
    if (!current_user_can('manage_options')) {
        wp_die(__('你没有权限访问此页面。'));
    }
    ?>
    <div class="wrap">
        <h1><?php echo esc_html(get_admin_page_title()); ?></h1>
        
        <!-- 导出功能区域 -->
        <div class="export-section" style="margin: 20px 0; padding: 20px; border: 1px solid #ccc; border-radius: 4px;">
            <h2>导出选项</h2>
            <p>选择要导出的WordPress选项,以及导出格式:</p>
            <form method="post" id="export-form">
                <?php wp_nonce_field('wp_option_export_nonce', 'export_nonce'); ?>
                <div>
                    <label>选择选项(可多选):</label>
                    <select name="export_options[]" multiple style="height: 150px; min-width: 300px;">
                        <!-- 这里可以手动添加你需要导出的选项键名 -->
                        <option value="blogname">站点名称</option>
                        <option value="blogdescription">站点描述</option>
                        <option value="permalink_structure">固定链接结构</option>
                        <option value="admin_email">管理员邮箱</option>
                        <!-- 可以根据需求继续添加更多选项,比如主题自定义选项、插件设置等 -->
                    </select>
                </div>
                <div style="margin: 10px 0;">
                    <label>导出格式:</label>
                    <select name="export_format">
                        <option value="json">JSON</option>
                        <option value="xml">XML</option>
                    </select>
                </div>
                <button type="submit" name="export_submit" class="button button-primary">导出文件</button>
            </form>
        </div>

        <!-- 导入功能区域 -->
        <div class="import-section" style="margin: 20px 0; padding: 20px; border: 1px solid #ccc; border-radius: 4px;">
            <h2>导入选项</h2>
            <p>上传之前导出的文件,将选项同步到当前站点:</p>
            <form method="post" enctype="multipart/form-data" id="import-form">
                <?php wp_nonce_field('wp_option_import_nonce', 'import_nonce'); ?>
                <div>
                    <label>选择导入文件:</label>
                    <input type="file" name="import_file" accept=".json,.xml" required>
                </div>
                <div style="margin: 10px 0;">
                    <button type="submit" name="import_submit" class="button button-primary">导入选项</button>
                </div>
            </form>
        </div>
    </div>

    <!-- 前端交互脚本 -->
    <script>
    jQuery(document).ready(function($) {
        // 导出表单校验:确保至少选择一个选项
        $('#export-form').submit(function() {
            if ($('select[name="export_options[]"] option:selected').length === 0) {
                alert('请至少选择一个要导出的选项');
                return false;
            }
        });

        // 导入文件格式校验
        $('input[name="import_file"]').change(function() {
            var file = this.files[0];
            var allowedExtensions = /(\.json|\.xml)$/i;
            if (!allowedExtensions.exec(file.name)) {
                alert('仅支持JSON或XML格式的文件,请重新选择');
                this.value = '';
                return false;
            }
        });
    });
    </script>
    <?php
}

二、实现导出功能逻辑

接下来添加导出的处理代码,当用户提交导出表单时,收集选中的选项数据,转换成指定格式并触发文件下载:

// 处理导出请求
add_action('admin_init', 'wp_handle_option_export');
function wp_handle_option_export() {
    // 校验表单提交和非ce安全验证
    if (isset($_POST['export_submit']) && check_admin_referer('wp_option_export_nonce', 'export_nonce')) {
        $selected_options = isset($_POST['export_options']) ? array_map('sanitize_text_field', $_POST['export_options']) : [];
        $export_format = isset($_POST['export_format']) ? sanitize_text_field($_POST['export_format']) : 'json';

        if (empty($selected_options)) {
            wp_die('请至少选择一个要导出的选项。');
        }

        // 收集选中的选项数据
        $export_data = [];
        foreach ($selected_options as $option_key) {
            $export_data[$option_key] = get_option($option_key);
        }

        // 生成带时间戳的文件名
        $filename = 'wp-options-export-' . date('Y-m-d-H-i-s') . '.' . $export_format;

        // 设置HTTP响应头,触发浏览器下载
        header('Content-Type: ' . ($export_format === 'json' ? 'application/json' : 'text/xml'));
        header('Content-Disposition: attachment; filename="' . $filename . '"');
        header('Pragma: no-cache');
        header('Expires: 0');

        // 根据格式输出内容
        if ($export_format === 'json') {
            echo json_encode($export_data, JSON_PRETTY_PRINT);
        } else {
            // 生成XML格式内容
            $xml = new SimpleXMLElement('<wp_options_export/>');
            foreach ($export_data as $key => $value) {
                $option = $xml->addChild('option');
                $option->addChild('key', $key);
                // 数组类型的选项转成JSON字符串存储,方便导入时解析
                $option->addChild('value', is_array($value) ? json_encode($value) : esc_html($value));
            }
            echo $xml->asXML();
        }
        exit; // 终止脚本,确保只输出导出内容
    }
}

三、实现导入功能逻辑

然后添加导入的处理代码,上传文件后解析内容,更新到当前站点的选项中:

// 处理导入请求
add_action('admin_init', 'wp_handle_option_import');
function wp_handle_option_import() {
    if (isset($_POST['import_submit']) && check_admin_referer('wp_option_import_nonce', 'import_nonce')) {
        // 校验文件上传是否成功
        if (!isset($_FILES['import_file']) || $_FILES['import_file']['error'] !== UPLOAD_ERR_OK) {
            wp_die('文件上传失败,请重试。');
        }

        $file = $_FILES['import_file'];
        $file_extension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));

        // 校验文件格式
        if (!in_array($file_extension, ['json', 'xml'])) {
            wp_die('仅支持JSON或XML格式的文件,请重新选择。');
        }

        // 读取文件内容
        $file_content = file_get_contents($file['tmp_name']);
        $import_data = [];

        // 解析JSON文件
        if ($file_extension === 'json') {
            $import_data = json_decode($file_content, true);
            if (json_last_error() !== JSON_ERROR_NONE) {
                wp_die('JSON文件格式错误,请确保文件是正常导出的。');
            }
        } else {
            // 解析XML文件
            $xml = simplexml_load_string($file_content);
            if (!$xml) {
                wp_die('XML文件格式错误,请确保文件是正常导出的。');
            }
            foreach ($xml->option as $option) {
                $key = (string)$option->key;
                $value = (string)$option->value;
                // 尝试解析之前存储的数组类型数据
                $decoded_value = json_decode($value, true);
                $import_data[$key] = json_last_error() === JSON_ERROR_NONE ? $decoded_value : $value;
            }
        }

        // 更新WordPress选项
        foreach ($import_data as $key => $value) {
            update_option($key, $value);
        }

        // 跳转回工具页面并显示成功提示
        wp_redirect(add_query_arg(['import_success' => '1'], admin_url('options-general.php?page=wp-option-import-export')));
        exit;
    }

    // 显示导入成功的通知
    if (isset($_GET['import_success']) && $_GET['import_success'] === '1') {
        add_action('admin_notices', function() {
            ?>
            <div class="notice notice-success is-dismissible">
                <p>选项导入成功!站点设置已更新。</p>
            </div>
            <?php
        });
    }
}

四、安全与扩展建议

安全注意事项

  • 一定要保留check_admin_referer的非ce验证,防止CSRF攻击
  • 对用户输入的选项键名使用sanitize_text_field处理,避免恶意输入
  • 导入时严格校验文件格式和内容,防止恶意文件注入

功能扩展方向

  • 动态加载所有WordPress选项,支持搜索和批量选择
  • 添加选项分组(比如主题选项、插件选项、系统选项)
  • 支持CSV格式的导入导出
  • 导入前添加预览步骤,显示即将更新的选项列表,让用户确认后再执行
  • 添加导出选项的备份功能,自动存储历史导出文件

内容的提问来源于stack exchange,提问作者Fahid Javid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:29:00