将复选框类型的元字段迁移到块编辑器时出现问题

时间:2020-05-07 作者:leemon

我正在尝试向插件添加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\' );
在块编辑器中,我添加了ToggleControlPluginDocumentSettingPanel 为了管理我的_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?在块编辑器中工作时,是否可以禁用它的运行?

任何帮助都将不胜感激。

1 个回复
最合适的回答,由SO网友:leemon 整理而成

我找到了罪犯。我不得不改变临时登记save_custom_post_type() 收件人:

if ( !isset( $_POST[\'metabox_nonce\'] ) || !wp_verify_nonce( $_POST[\'metabox_nonce\'], basename( __FILE__ ) ) ) {
    return $post_id;
}

相关推荐

在WordPress中包含Facebook Javascript SDK

我想在我的wordpress自定义主题中包含Facebook JavaScript SDK。我可以在标准的MVC应用程序或PHP网站上完成,但使用wordpress我不知道如何继续。通常使用enqueue 作用我想直接将其添加到<head> 我的标签header.php 文件,但我不确定这是否有效。我已经阅读了FB文档,他们建议使用插件,但如果我不想使用插件,最好的方法是什么?