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>
);
}
})
首次创建时
下次编辑创建的块时。
提前感谢您!
最合适的回答,由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!"]
这就解释了为什么会发生这种情况:
所以你应该省略
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=...
), 所以你应该去掉那个逗号。