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

wp.blockEditor.RichText multiline属性弃用后,如何实现无序列表?

替代弃用的RichText multiline属性实现无序列表

问题背景

收到如下警告:

wp.blockEditor.RichText 的 multiline 属性自版本6.1起已被弃用,将在6.3版本中移除。请使用嵌套区块(InnerBlocks)替代。

原代码片段:

el( RichText, {
    tagName: 'ul',
    multiline: 'li',
    placeholder: i18n.__(
        'Enter a list of price options…',
        'simplified-menu'
    ),
    value: attributes.price_list,
    onChange: function( value ) {
        props.setAttributes( { price_list: value } );
    },
    className: 'price_list',
} )

解决方案:用InnerBlocks实现

要替代multiline的列表功能,需要拆分出列表项子区块,再在主区块中用InnerBlocks管理这些子项,具体实现如下:

1. 注册列表项子区块

先创建一个仅用于编辑单条列表项的自定义子区块:

wp.blocks.registerBlockType('simplified-menu/price-list-item', {
    title: i18n.__('Price List Item', 'simplified-menu'),
    parent: ['simplified-menu/price-list'], // 限定只能作为主区块的子项
    icon: 'list-view',
    attributes: {
        content: {
            type: 'string',
            source: 'html',
            selector: 'li'
        }
    },
    edit: ({ attributes, setAttributes }) => {
        return el(RichText, {
            tagName: 'li',
            placeholder: i18n.__('Enter price option…', 'simplified-menu'),
            value: attributes.content,
            onChange: (value) => setAttributes({ content: value })
        });
    },
    save: ({ attributes }) => {
        return el('li', {}, attributes.content);
    }
});

2. 修改主区块使用InnerBlocks

把原代码中的RichText替换为InnerBlocks,限定仅允许添加上面注册的列表项子区块:

// 主区块的edit逻辑
edit: ({ className }) => {
    const ALLOWED_BLOCKS = ['simplified-menu/price-list-item'];
    return el('div', { className }, [
        el('h3', {}, i18n.__('Price Options', 'simplified-menu')),
        el(wp.blockEditor.InnerBlocks, {
            allowedBlocks: ALLOWED_BLOCKS,
            template: [
                ['simplified-menu/price-list-item'] // 默认生成一个空列表项
            ]
        })
    ]);
},

// 主区块的save逻辑
save: ({ className }) => {
    return el('ul', { className: 'price_list' },
        el(wp.blockEditor.InnerBlocks.Content, {})
    );
}

3. 旧数据迁移(可选)

如果之前用price_list属性存储了旧的列表HTML内容,可添加迁移逻辑将旧数据转换为子区块格式:

migrations: {
    // 根据你的区块版本调整版本号
    2: (attributes) => {
        if (!attributes.price_list) return attributes;
        // 解析旧ul/li内容,生成子区块数组
        const parser = new DOMParser();
        const doc = parser.parseFromString(attributes.price_list, 'text/html');
        const items = Array.from(doc.querySelectorAll('li')).map(li => ({
            blockName: 'simplified-menu/price-list-item',
            attributes: { content: li.innerHTML }
        }));
        return {
            ...attributes,
            innerBlocks: items,
            price_list: undefined // 移除旧属性
        };
    }
}

这种实现完全符合Block Editor的最新规范,同时保留了原有的列表编辑体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 22:40:39