代码中有两个主要问题:
那是什么restrict
在您的OptionsPanel
组成部分您在何处以及如何定义它?
两个onUpdateRestrict
和onUpdateSubscribe
不是函数,因此单击切换控件将导致JavaScript错误。
如果您能显示完整的代码,我可能可以帮助您修复代码。但是,我建议您尝试compose
package 要构建OptionsPanel
组件,因为这样做可以极大地帮助减少源代码,并使事情变得非常简单。
所以对于compose
程序包,步骤如下:
Note: I\'m using these two meta keys: restrict_viewing
and subscribe_to_news
, so be sure to change them to the correct ones. (即使用适当的元键。)
加载所有WordPress依赖项:
import { PluginDocumentSettingPanel } from \'@wordpress/edit-post\';
import { ToggleControl } from \'@wordpress/components\';
import { __ } from \'@wordpress/i18n\';
import { registerPlugin } from \'@wordpress/plugins\';
import { withSelect, withDispatch } from \'@wordpress/data\';
import { compose } from \'@wordpress/compose\';
创建主要组件,基本上只需呈现插件/侧栏面板和两个切换控件(
RestrictControl
&;
SubscribeControl
在问题中)。
function OptionsPanelComponent( {
// These props are passed by applyWithSelect(). (see step #3)
currentPostType, // current post type
restrictViewing, // current state of the meta restrict_viewing
subscribeToNews, // current state of the meta subscribe_to_news
// And these are passed by applyWithDispatch(). (see step #4)
onUpdateRestrict, // function which updates the meta restrict_viewing
onUpdateSubscribe, // function which updates the meta subscribe_to_news
} ) {
if ( \'custom_type\' !== currentPostType ) {
return null;
}
return (
<PluginDocumentSettingPanel
name="options"
title={ __( \'Options\' ) }
className="options-panel"
>
<ToggleControl
label={ __( \'Restrict viewing?\' ) }
checked={ restrictViewing }
onChange={ onUpdateRestrict }
/>
{ restrictViewing && (
<ToggleControl
label={ __( \'Add to newsletter?\' ) }
checked={ subscribeToNews }
onChange={ onUpdateSubscribe }
/>
) }
</PluginDocumentSettingPanel>
);
}
使用
wp.data.withSelect
从当前帖子(正在编辑)中“选择”/检索数据,并将数据传递给上述组件(
OptionsPanelComponent
).
注:该select
总是传递给函数select
相当于wp.data.select
.
const applyWithSelect = withSelect( ( select ) => {
const {
getEditedPostAttribute,
getCurrentPostType
} = select( \'core/editor\' );
const meta = getEditedPostAttribute( \'meta\' );
return {
currentPostType: getCurrentPostType(),
restrictViewing: meta.restrict_viewing,
subscribeToNews: meta.subscribe_to_news,
};
} );
使用
wp.data.withDispatch
定义更新post数据的函数,并在上面的步骤#2中将函数传递给组件(
OptionsPanelComponent
).
注:该dispatch
总是传递给函数dispatch
相当于wp.data.dispatch
.
const applyWithDispatch = withDispatch( ( dispatch ) => {
const { editPost } = dispatch( \'core/editor\' );
return {
onUpdateRestrict( restrict ) {
const meta = { restrict_viewing: restrict };
editPost( { meta } );
},
onUpdateSubscribe( subscribe ) {
const meta = { subscribe_to_news: subscribe };
editPost( { meta } );
},
};
} );
最后,使用
wp.compose.compose()
要“组合”或包装以上所有三个组件(可以使用
function
或
const
, 但它们确实是组件)。这个“组合”组件将作为
render
的回调
wp.plugins.registerPlugin
.
const OptionsPanel = compose(
applyWithSelect,
applyWithDispatch
)( OptionsPanelComponent );
registerPlugin( \'options-panel\', {
render: OptionsPanel,
} );
我用于测试目的的完整代码
您可以找到它
here, 或者您可以下载
the full plugin 我是基于
this example.
我已经试过了&;在WordPress 5.4.1上使用默认值进行了测试post
在这个答案前面提到的带有两个元键的帖子类型。
如果您不想使用compose()
, 那你可以试试this one. 但我补充这一点,只是因为我认为这对我自己将来会有用。:)