如何更新Gutenberg中数组类型的元字段

时间:2021-05-27 作者:leemon

在我为Gutenberg构建的插件中,我注册了一个名为_related_posts, 其中存储了一组帖子ID:

PHP:

function register_meta_fields() {
    register_post_meta( \'\', \'_related_posts\', array(
        \'show_in_rest\' => true,
        \'single\'       => true,
        \'type\'         => \'array\',
        \'show_in_rest\' => array(
            \'schema\' => array(
                \'type\'  => \'array\',
                \'items\' => array(
                    \'type\' => \'integer\',
                ),
            ),
        ),
        \'auth_callback\' => function() {
            return current_user_can( \'edit_posts\' );
        }
    ) );
}
我正在使用useEntityProp 钩子在JS中获取和设置此元字段:

JS:

const [ meta, setMeta ] = useEntityProp(
    \'postType\',
    \'post\',
    \'meta\'
);
我有一个onUpdateRelatedPosts() 当用户从列表中选择帖子时调用的函数:

JS:

function onUpdateRelatedPosts( post ) {
    setMeta( { ...meta, \'_related_posts\': [post.id] } );
}
此函数将post对象作为参数,并将其id存储在_related_posts meta字段,但我无法让它按我想要的方式工作。它不会在数组末尾附加id,而是用添加的id替换整个元字段。

我做错了什么?

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

执行此操作时:\'_related_posts\': [post.id], 您实际上覆盖了整个数组或元值,因此要将一个项附加到现有数组中,可以使用spread (...) syntax 像这样:\'_related_posts\': [ ...meta._related_posts, post.id ].

但是如果选定的帖子ID已经在当前的meta值中,您可能希望更新meta,即。

// Add the post (ID) if it\'s not already in the list.
if ( meta._related_posts.indexOf( post.id ) < 0 ) {
    setMeta( { ...meta, \'_related_posts\': [ ...meta._related_posts, post.id ] } );
}
不过,这只是一个建议(避免重复值)。

顺便说一句,对于不包含字母数字或下划线字符的属性名称(_), 不强制在引号中包含属性名称。以你为例,_related_posts: (与引用相反:\'_related_posts\':) 可以。:)