我在和古腾堡比赛,我有点困惑它应该如何保存给梅塔。这是我的自定义帖子和元数据:
add_action( \'init\', function() {
register_post_type( \'game\', [
\'label\' => \'Games\',
\'public\' => true,
\'supports\' => [ \'editor\', \'custom-fields\' ],
\'show_in_rest\' => true,
] );
register_meta( \'game\', \'logo\', [
\'single\' => true,
\'show_in_rest\' => true,
\'description\' => \'A meta key associated with a string meta value.\',
\'type\' => \'string\'
] );
} );
和我的Block JS文件:
( function( blocks, i18n, element ) {
var el = element.createElement;
var MediaUploadButton = wp.blocks.MediaUploadButton;
var BlockControls = wp.blocks.BlockControls;
blocks.registerBlockType( \'game-post/meta\', {
title: i18n.__( \'Game\' ),
description: i18n.__( \'Meta Box for Game\' ),
icon: \'businessman\',
category: \'common\',
attributes: {
logo: {
type: \'string\',
source: \'meta\',
meta: \'logo\'
}
},
edit: function(props) {
console.log(props.attributes);
var mediaURL = props.attributes.logo;
return el(\'div\', {
classname: mediaURL ? \'image-active\' : \'image-inactive\'
}, el(\'input\', {
defaultValue: mediaURL,
type: \'text\',
onChange: function(e) {
props.setAttributes({ logo: e.target.value });
}
}));
},
save: function(props) {
return el( \'img\', { src: props.attributes.logo } );
}
} );
} )(
window.wp.blocks,
window.wp.i18n,
window.wp.element,
);
我从
WP Gutenberg Handbook. 已创建属性等,但值为空,且未保存元字段。控制台登录编辑函数总是返回null,因为没有meta属性。我做错了什么?如果我将属性源更改为
attribute
, 该字段已正确保存。
SO网友:Alvaro
加载块并将其指定给块属性时,将读取元值。对块的更改将更新属性,当post保存时,值将保存到元。因此,据我所知,没有必要在registerBlockType
js函数。块仅保存到元,因此在前端不会渲染任何内容(与非元块不同)。
因此,在您的情况下:
add_action( \'init\', function() {
register_post_type( \'game\', [
\'label\' => \'Games\',
\'public\' => true,
\'supports\' => [ \'editor\', \'custom-fields\' ],
\'show_in_rest\' => true,
] );
register_post_meta( \'game\', \'logo\', [
\'single\' => true,
\'show_in_rest\' => true,
\'description\' => \'A meta key associated with a string meta value.\',
\'type\' => \'string\'
] );
} );
注意,我使用
register_post_meta
它包含在版本4.9.8中,允许使用帖子类型名称(本例中为“游戏”)。正如@LABCAT在另一个答案中注意到的,使用
register_meta
要求类型为“post”,即使对于自定义post类型也是如此。
然后在JavaScript文件中:
registerBlockType( \'game-post/meta\', {
//...
save: () => null,
});
我希望这有帮助。