古腾堡特色图像复选框-重新加载编辑页面时未正确设置复选框

时间:2019-12-23 作者:Hannah Smith

我跟踪了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\',
        )
    );
}

1 个回复
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,
            };
我还没有测试过这个,所以可能还有其他问题,但希望这能让你更进一步。祝你好运

相关推荐

列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在