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

Gutenberg编辑器自定义侧边栏添加ToggleControl报错求助

Gutenberg自定义侧边栏添加ToggleControl报错解决方案

问题核心

你遇到的报错是因为**registerPlugin注册的侧边栏插件,其render函数的props不包含attributes和setAttributes**——这两个属性是Gutenberg块(通过registerBlockType注册)的专属操作属性,插件侧边栏无法直接调用。

解决方案

根据你要控制的是「文章级设置」还是「选中块的属性」,分两种场景处理:

场景1:控制文章级自定义元字段

如果要设置的是全局文章的侧边栏显示状态,需要先在PHP中注册可REST访问的元字段,再通过core-data仓库读写:

第一步:PHP注册元字段(必须)

function register_show_sidebar_meta() {
    register_post_meta( 'page', 'show_sidebar', array(
        'show_in_rest' => true,
        'type' => 'boolean',
        'single' => true,
        'default' => true,
    ) );
}
add_action( 'init', 'register_show_sidebar_meta' );

第二步:修改JSX代码

import { registerPlugin } from "@wordpress/plugins";
import { PluginSidebar } from "@wordpress/edit-post";
import { __ } from "@wordpress/i18n";
import { PanelBody, ToggleControl } from '@wordpress/components';
import { useSelect, useDispatch } from '@wordpress/data';
import { store as coreStore } from '@wordpress/core-data';

registerPlugin( 'page-layout-plugin', {
    icon: 'smiley',
    render: () => {
        // 获取当前文章的元数据
        const showSidebar = useSelect( ( select ) => {
            return select( coreStore ).getEditedPostAttribute( 'meta' )?.show_sidebar ?? true;
        }, [] );

        // 获取更新元数据的方法
        const { editPost } = useDispatch( coreStore );

        return (
            <PluginSidebar 
                name="meta-page-settings" 
                title="Gutenberg Settings Sidebar"
            >
                <PanelBody title="侧边栏设置">
                    <ToggleControl
                        label={__('显示侧边栏?', 'starter')}
                        checked={showSidebar}
                        onChange={(val) => editPost({ meta: { show_sidebar: val } })}
                    />
                </PanelBody>
            </PluginSidebar>
        );
    }
} );

场景2:控制当前选中块的属性

如果要针对选中的块设置侧边栏状态,通过block-editor仓库操作块属性:

import { registerPlugin } from "@wordpress/plugins";
import { PluginSidebar } from "@wordpress/edit-post";
import { __ } from "@wordpress/i18n";
import { PanelBody, ToggleControl } from '@wordpress/components';
import { useSelect, useDispatch } from '@wordpress/data';
import { store as blockEditorStore } from '@wordpress/block-editor';

registerPlugin( 'page-layout-plugin', {
    icon: 'smiley',
    render: () => {
        // 获取当前选中块的ID
        const selectedBlockId = useSelect( ( select ) => {
            return select( blockEditorStore ).getSelectedBlockClientId();
        }, [] );

        // 获取选中块的目标属性
        const showSidebarAttribute = useSelect( ( select ) => {
            if ( !selectedBlockId ) return false;
            return select( blockEditorStore ).getBlockAttributes( selectedBlockId ).showSidebarAttribute ?? false;
        }, [ selectedBlockId ] );

        // 获取更新块属性的方法
        const { updateBlockAttributes } = useDispatch( blockEditorStore );

        return (
            <PluginSidebar 
                name="meta-page-settings" 
                title="Gutenberg Settings Sidebar"
            >
                <PanelBody title="块侧边栏设置">
                    { selectedBlockId ? (
                        <ToggleControl
                            label={__('显示侧边栏?', 'starter')}
                            checked={showSidebarAttribute}
                            onChange={(val) => updateBlockAttributes( selectedBlockId, { showSidebarAttribute: val } )}
                        />
                    ) : (
                        <p>请选中一个块进行设置</p>
                    ) }
                </PanelBody>
            </PluginSidebar>
        );
    }
} );

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:47:45