古登堡块显示编辑中的无效内容

时间:2021-06-15 作者:Raunak Gupta

My requirement: 我正在尝试创建一个简单的古腾堡积木,它将具有textarea 和adropdown. 一旦用户提供了详细信息,我想将其另存为shortcode 在DB中,但当用户来编辑块时,它应该在中显示内容textarea 和中的选定项目dropdown.

The issue 我得到的是,在创建时,一切都按预期进行,但当我开始编辑屏幕时,内容变得一团糟。此外,不会显示现有块的下拉列表。

下面是我在的帮助下编写的代码this &;this 文章

const {__} = wp.i18n;
const {RawHTML} = wp.element;
const {registerBlockType} = wp.blocks;
const {PanelBody, SelectControl, TextareaControl} = wp.components;
const {InspectorControls} = wp.editor;

const blockStyle = {
    backgroundColor: \'#900\',
    color: \'#fff\',
    padding: \'20px\',
};
const countries = [
    {label: __(\'Select a countries\', \'txtdomain\'), value: \'\'},
    {label: \'India\', value: \'IND\'},
    {label: \'United States of America\', value: \'USA\'},
    {label: \'Sri Lanka\', value: \'LKA\'}
];

registerBlockType(\'myplugin/example-01-block\', {
    title: \'My Plugin\',
    icon: \'editor-code\',
    category: \'common\',
    attributes: {
        content: {
            type: "string",
            source: "text",
            default: \'// Place your text here!\',
        },
        country: {
            type: "string",
            default: ""
        },
    },
    example: {},

    edit: (props) => {
        const {
            attributes: {content},
            setAttributes,
            className,
            country
        } = props;

        return (
                <div className={ className }>
                    <InspectorControls>
                        <PanelBody
                            title={ __(\'My Plugin Settings\', \'txtdomain\') }
                            >
                            <SelectControl
                                label={ __(\'Country\', \'txtdomain\') }
                                value={ country }
                                options={ countries }
                                onChange={ value => setAttributes({country: value}) }
                                />
                        </PanelBody>
                    </InspectorControls>
                
                    <TextareaControl
                        value={ content }
                        onChange={ value => setAttributes({content: value}) }
                        /> 
                </div>
                );
    },
    save: (props) => {
        const {
            attributes: {content, country}
        } = props;
        var myShortcode = \'[myshortcode country="\' + country + \'", text="\' + content + \'"]\';
        return (
                <div>
                    <RawHTML>{ myShortcode }</RawHTML>
                </div>
                );
    }
})
首次创建时When I add block

下次编辑创建的块时。When I come to edit screen

提前感谢您!

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

代码中的主要问题是以下部分,即将属性source设置为text 这意味着(保存块/帖子后),编辑器将从save 功能:

attributes: {
    content: {
        type: "string",
        source: "text", // this shouldn\'t be "text"
        default: \'// Place your text here!\',
    },
所以如果save 函数返回了包含HTML的元素<div>[myshortcode country="IND", text="Hello World!"]</div>, 然后,使用上述属性设置content 价值将是[myshortcode country="IND", text="Hello World!"] 这就解释了为什么会发生这种情况:

Block error preview

所以你应该省略source 属性,即不指定属性源,只让编辑器将属性值存储在块中comment delimiter.

代码中的其他问题wp.editor.InspectorControls 已弃用并使用wp.blockEditor.InspectorControls 相反So使用const { InspectorControls } = wp.blockEditor;.

在您的edit 作用country 应该是attributes 像这样:

const {
    attributes: {content, country}, // "country" belongs here
    setAttributes,
    className,
    country                         // NOT HERE, so remove this.
} = props;
, (逗号)在您的短代码中([myshortcode country="\' + country + \'", text=...), 所以你应该去掉那个逗号。

相关推荐

Shortcode not being executed

我将以下代码放在WP“init”回调中(或加载插件时)。add_shortcode(\'my_shortcode\', function($atts, $content =\'\') { die(); } ); if (!shortcode_exists(\'my_shortcode\')) die(); 在我的页面中,我放入“[my_shortcode]“”当我查看页面时,我得到“****”知道我的代码怎么了吗?更