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

如何在PHP中访问Gutenberg自定义Redux Store的数据?

在PHP中获取Gutenberg自定义Redux Store的CSS数据并保存文件

Redux Store是前端内存中的状态容器,无法直接被PHP后端读取,必须通过前端数据传递到后端的方式实现需求。以下是两种实用方案,适用于不同场景:


方案一:通过Post Meta同步数据(适合与文章绑定的区块)

将Redux中的CSS数据同步到文章的自定义Meta字段,PHP通过读取Meta字段获取数据。

1. 注册可REST访问的Post Meta字段

在主题functions.php或自定义插件中添加:

function register_custom_css_meta() {
    register_post_meta(
        'post', // 替换为你的目标文章类型(如自定义文章类型)
        '_custom_block_css',
        array(
            'show_in_rest' => true,
            'type' => 'string',
            'single' => true,
            'sanitize_callback' => 'sanitize_textarea_field',
            'auth_callback' => function() {
                return current_user_can('edit_posts');
            }
        )
    );
}
add_action('init', 'register_custom_css_meta');

2. 前端同步Redux数据到Post Meta

在区块的Edit组件中监听Store变化,自动同步到文章Meta:

import { select, dispatch } from '@wordpress/data';
import { useEffect } from '@wordpress/element';

function Edit(props) {
    useEffect(() => {
        // 监听CSS值变化并同步到Meta
        const unsubscribe = select('mystore/css').subscribe(() => {
            const cssValue = select('mystore/css').getCss();
            dispatch('core/editor').editPost({
                meta: {
                    _custom_block_css: cssValue
                }
            });
        });

        return unsubscribe;
    }, []);

    // 区块其他编辑逻辑...
}

3. PHP读取Meta并保存文件

在文章保存时触发文件写入:

function save_custom_css_to_file($post_id) {
    // 跳过自动保存和修订版本
    if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) return;
    // 验证用户权限
    if (!current_user_can('edit_post', $post_id)) return;

    // 获取Meta中的CSS数据
    $css_data = get_post_meta($post_id, '_custom_block_css', true);
    if (empty($css_data)) return;

    // 写入文件(确保目录可写)
    $save_path = get_stylesheet_directory() . '/custom-block-output.css';
    file_put_contents($save_path, $css_data);
}
add_action('save_post', 'save_custom_css_to_file');

方案二:通过AJAX直接提交数据(适合独立于文章的场景)

直接通过AJAX请求将Redux中的CSS数据发送到PHP后端,触发文件保存。

1. 注册AJAX动作与安全验证

在PHP中配置AJAX回调并传递验证Nonce:

function enqueue_block_assets() {
    wp_enqueue_script(
        'custom-block-ajax-script',
        get_template_directory_uri() . '/js/custom-block.js',
        array('wp-blocks', 'wp-data', 'wp-ajax'),
        filemtime(get_template_directory() . '/js/custom-block.js'),
        true
    );

    // 传递AJAX配置到前端
    wp_localize_script('custom-block-ajax-script', 'BlockAjaxData', array(
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('save_css_nonce')
    ));
}
add_action('enqueue_block_assets', 'enqueue_block_assets');

// AJAX回调函数
function handle_save_css_request() {
    // 验证Nonce
    if (!wp_verify_nonce($_POST['nonce'], 'save_css_nonce')) {
        wp_send_json_error('无效的验证信息');
    }
    // 验证权限
    if (!current_user_can('edit_posts')) {
        wp_send_json_error('权限不足');
    }

    // 处理CSS数据
    $css_data = sanitize_textarea_field($_POST['css_data']);
    if (empty($css_data)) {
        wp_send_json_error('CSS数据为空');
    }

    // 写入文件
    $save_path = get_stylesheet_directory() . '/custom-block-output.css';
    $write_result = file_put_contents($save_path, $css_data);

    $write_result ? wp_send_json_success('CSS保存成功') : wp_send_json_error('文件写入失败');
}
add_action('wp_ajax_save_custom_css', 'handle_save_css_request');
// 若允许未登录用户提交,添加此行:
// add_action('wp_ajax_nopriv_save_custom_css', 'handle_save_css_request');

2. 前端触发AJAX提交

在区块中添加保存按钮或自动触发逻辑:

import { select } from '@wordpress/data';

// 提交CSS到后端的函数
function submitCssToServer() {
    const cssValue = select('mystore/css').getCss();
    
    wp.ajax.send('save_custom_css', {
        data: {
            nonce: BlockAjaxData.nonce,
            css_data: cssValue
        },
        success: (res) => console.log(res),
        error: (err) => console.error(err)
    });
}

// 示例:添加保存按钮
function Edit(props) {
    return (
        <div className="custom-block-editor">
            {/* 区块编辑内容 */}
            <button onClick={submitCssToServer}>保存CSS到服务器</button>
        </div>
    );
}

关键注意事项

  • 权限验证:两种方案都必须添加用户权限校验和Nonce验证,防止恶意请求。
  • 目录权限:确保PHP有目标文件目录的写入权限,可通过chmod命令调整目录权限。
  • 数据过滤:使用sanitize_textarea_field等函数过滤输入,避免XSS或恶意代码注入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:40:31