我正在尝试向插件添加Gutenberg支持,该插件使用一个名为_meta_restrict
, 同时保持与经典编辑器的背面兼容性。我取得了一些进步,但我现在陷入困境,需要一些帮助。
这是我用来在经典编辑器中注册和保存元字段值的相关代码:
function register_meta_field() {
register_post_meta( \'custom_post_type\', \'_meta_restrict\', array(
\'show_in_rest\' => true,
\'single\' => true,
\'type\' => \'boolean\',
\'auth_callback\' => function() {
return current_user_can( \'edit_posts\' );
}
) );
}
add_action( \'init\', \'register_meta_field\' );
function add_custom_meta_boxes() {
add_meta_box(
\'custom-meta-box\',
\'Options\',
\'custom_meta_box_callback\',
\'custom_post_type\',
\'side\',
\'low\',
array(
\'__block_editor_compatible_meta_box\' => false,
\'__back_compat_meta_box\' => true,
)
);
}
add_action( \'add_meta_boxes\', \'add_custom_meta_boxes\' );
function save_custom_post_type( $post_id ) {
// verify nonce
if ( isset( $_POST[\'metabox_nonce\'] ) && !wp_verify_nonce( $_POST[\'metabox_nonce\'], basename( __FILE__ ) ) ) {
return $post_id;
}
// is autosave?
if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) {
return $post_id;
}
// check permissions
if ( isset( $_POST[\'post_type\'] ) ) {
if ( \'page\' == $_POST[\'post_type\'] ) {
if ( !current_user_can( \'edit_page\', $post_id ) ) {
return $post_id;
}
} elseif ( !current_user_can( \'edit_post\', $post_id ) ) {
return $post_id;
}
}
// save meta field
$meta_restrict = isset( $_POST[\'meta_restrict\'] ) ? $_POST[\'meta_restrict\'] : \'\';
update_post_meta( $post_id, \'_meta_restrict\', $meta_restrict );
}
add_action( \'save_post\', \'save_custom_post_type\' );
在块编辑器中,我添加了
ToggleControl
到
PluginDocumentSettingPanel
为了管理我的
_meta_restrict
元字段。这是我想到的代码:
let RestrictControl = ({ restrict, onUpdateRestrict }) => (
<ToggleControl
label={ \'Restrict viewing?\' }
help={ restrict ? \'Viewing is restricted.\' : \'Viewing is not restricted.\' }
checked={ restrict }
onChange={ restrict => onUpdateRestrict( restrict ) }
/>
);
RestrictControl = compose( [
withSelect( ( select ) => {
return {
restrict: select( \'core/editor\' ).getEditedPostAttribute( \'meta\' )[\'_meta_restrict\']
};
} ),
withDispatch( ( dispatch ) => {
return {
onUpdateRestrict: ( value ) => {
dispatch( \'core/editor\' ).editPost({ meta: { _meta_restrict: value } })
}
}
} ),
] )( RestrictControl );
此代码工作正常。问题是,在元字段值通过
rest_insert_{$this->post_type}
, 经典编辑器
save_post
操作也被激发,因此元字段被空值覆盖,因为
$_POST[\'meta_restrict\']
在块编辑器中不可用。如果我评论我的
save_custom_post_type
函数,该值成功保存在块编辑器中,但我需要提供与经典编辑器的向后兼容性。
我该怎么做?为什么save_post
尽管__block_editor_compatible_meta_box
设置为false,并且__back_compat_meta_box
是否设置为true?在块编辑器中工作时,是否可以禁用它的运行?
任何帮助都将不胜感激。