我跟踪了a tutorial 获取一个复选框,该复选框显示在正在使用Gutenberg编辑的帖子的特征图像下。这是一个复选框,允许编辑器控制是否在单个帖子中显示特色图像。这是我第一次在React工作。
我的所有功能都如您所期望的那样工作-勾选框显示,您可以选中或取消选中它,它会保存ok(作为后期元数据)。
然而,问题是,刷新编辑后页面时,复选框没有正确勾选或取消勾选。它总是被取消勾选,即使元值为真,例如它应该被勾选。
我确信复选框设置已正确保存。在我的PHP主题模板中,我可以像您所期望的那样使用元数据。它就在那里,保存复选框和未选中框将为我提供获取post meta时所期望的值。
在编辑页面加载时,复选框的填写方式似乎有问题。
下面是我得到的javascript:
"use strict"
const el = wp.element.createElement;
const withState = wp.compose.withState;
const withSelect = wp.data.withSelect;
const withDispatch = wp.data.withDispatch;
wp.hooks.addFilter(
\'editor.PostFeaturedImage\',
\'extend-block/disable-featured-image-control\',
wrapPostFeaturedImage
);
function wrapPostFeaturedImage( OriginalComponent ) {
console.log(\'hello\');
return function( props ) {
return (
el(
wp.element.Fragment,
{},
el(
OriginalComponent,
props
),
el(
composedCheckBox
)
)
);
}
}
class CheckBoxCustom extends React.Component {
render() {
const {
meta,
updateDisableFeaturedImage,
} = this.props;
return (
el(
wp.components.CheckboxControl,
{
label: "Disable featured image",
help: "If checked, the featured image won\'t be shown to the reader for single blog posts.",
checked: meta.disable_featured_image,
onChange:
( value ) => {
this.setState( { isChecked: value } );
updateDisableFeaturedImage( value, meta );
}
}
)
)
}
}
const composedCheckBox = wp.compose.compose( [
withState( ( value ) => { isChecked: value } ),
withSelect( ( select ) => {
const currentMeta = select( \'core/editor\' ).getCurrentPostAttribute( \'meta\' );
const editedMeta = select( \'core/editor\' ).getEditedPostAttribute( \'meta\' );
return {
meta: { currentMeta, editedMeta },
};
} ),
withDispatch( ( dispatch ) => ( {
updateDisableFeaturedImage( value, meta ) {
meta = {
meta,
disable_featured_image: value,
};
dispatch( \'core/editor\' ).editPost( { meta } );
},
} ) ),
] )( CheckBoxCustom );
元数据设置如下:
function post_register_meta() {
register_meta(
\'post\',
\'disable_featured_image\',
array(
\'show_in_rest\' => true,
\'single\' => true,
\'type\' => \'boolean\',
)
);
}
SO网友:Paul Bunkham
我想问题可能是the spread operator 有几个地方失踪了。该行:
return {
meta: { currentMeta, editedMeta },
};
在中
withSelect
应为:
return {
meta: { ...currentMeta, ...editedMeta },
};
这使得
meta
对象是的副本
currentMeta
(具有所有相同的属性和值),但会使用
editedMeta
.
代码中混合了ES5和ES6语法,因此如果这不起作用,您可以通过执行以下操作来实现ES5的相同功能:
return {
meta: Object.assign( {}, currentMeta, editedMeta ),
};
也在
withDispatch
正在使用相同的技术更新
meta
对象,因此需要更改为:
updateDisableFeaturedImage( value, meta ) {
meta = {
...meta,
disable_featured_image: value,
};
我还没有测试过这个,所以可能还有其他问题,但希望这能让你更进一步。祝你好运