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

dispatch('core')返回null:WordPress自定义块添加实体报错求助

问题原因与解决方法

核心问题

你碰到的dispatch('core')返回null,本质是代码调用时机太早——WordPress的core数据存储还没完成初始化,就直接执行了addEntities操作。另外你代码里把import { dispatch } from '@wordpress/data'放在了代码中部,这不符合ES模块的规范(import必须放在文件最顶部)。

修复步骤

1. 统一调整import位置到文件顶部

所有import语句必须放在文件最开头,这是ES模块的强制要求:

import { registerBlockType } from '@wordpress/blocks';
import { dispatch } from '@wordpress/data';
import { addAction } from '@wordpress/hooks';

import './style.scss';

import Edit from './edit';
import metadata from './block.json';

2. 延迟调用addEntities,等待存储初始化完成

用WordPress的pluginsLoaded钩子确保core存储加载完成后再执行操作,同时加个判断避免再次出错:

addAction( 'pluginsLoaded', 'amilia/v1/add-entities', () => {
    const coreDispatch = dispatch( 'core' );
    if ( coreDispatch ) {
        coreDispatch.addEntities( [
            {
                name: 'programs',
                kind: 'amilia/v1',
                baseURL: 'amilia/v1/programs',
            },
        ] );
    }
} );

3. 完整修正后的src/index.js代码

import { registerBlockType } from '@wordpress/blocks';
import { dispatch } from '@wordpress/data';
import { addAction } from '@wordpress/hooks';

import './style.scss';

import Edit from './edit';
import metadata from './block.json';

registerBlockType( metadata.name, {
    edit: Edit,
} );

addAction( 'pluginsLoaded', 'amilia/v1/add-entities', () => {
    const coreDispatch = dispatch( 'core' );
    if ( coreDispatch ) {
        coreDispatch.addEntities( [
            {
                name: 'programs',
                kind: 'amilia/v1',
                baseURL: 'amilia/v1/programs',
            },
        ] );
    }
} );

可选方案:在Edit组件内调用(仅限区块关联实体)

如果这个实体只和当前区块相关,也可以把逻辑放到Edit.js组件里,用useEffect钩子确保组件挂载时存储已就绪:

// Edit.js
import { useEffect } from '@wordpress/element';
import { dispatch } from '@wordpress/data';

export default function Edit( props ) {
    useEffect( () => {
        const coreDispatch = dispatch( 'core' );
        if ( coreDispatch ) {
            coreDispatch.addEntities( [
                {
                    name: 'programs',
                    kind: 'amilia/v1',
                    baseURL: 'amilia/v1/programs',
                },
            ] );
        }
    }, [] );

    // 原有组件内容
    return (
        <div>
            {/* 区块编辑界面内容 */}
        </div>
    );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 13:07:36