在我为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替换整个元字段。
我做错了什么?
最合适的回答,由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\':
) 可以。:)