如何在Gutenberg中正确添加自定义实体

时间:2021-01-06 作者:Camilo

因此,我创建了一个自定义端点,以检索我需要检索的一些post数据,这些数据是我正在为一些自定义Gutenberg块构建的功能所需的。阅读后this answer 我开始自己实现它。但我对如何或何时添加自定义实体有疑问。到目前为止,我一直在添加带有自定义挂钩的自定义实体editor.BlockEdit. 下面是它的外观:

import {addFilter} from \'@wordpress/hooks\';
import {dispatch, select} from \'@wordpress/data\';

addFilter(\'editor.BlockEdit\', \'CustomGutenberg/customEntities\', ((BlockEdit) => (props) => {
  registerCustomEntities();
  // (...)
  return <BlockEdit {...props} />;
}));

const registerCustomEntities = () => {
  const {getEntitiesByKind} = select(\'core\');
  const namespace = \'custom/v1\';

  if (getEntitiesByKind(namespace).length === 0) {
    dispatch(\'core\').addEntities([
      {
        label: \'Custom Posts\',
        name: \'posts\',
        kind: namespace,
        baseURL: namespace + \'/posts\'
      }
    ]);
  }
}
它工作得很好,但我必须检查该实体是否已添加到顶部的if语句中,这一事实让我觉得我可能没有使用正确的挂钩/过滤器/函数来注册自定义实体。这就是为什么我想得到更多的信息addEntities 就我而言,函数没有正确记录。

Further context: Why do I need a custom endpoint to begin with?

我开发古腾堡积木已经有一段时间了,有时我遇到一个需求,我需要一个给定CPT的所有现有帖子的列表。所以我使用getEntityRecords来获取该列表,但通常我只需要每个帖子ID和原始标题。但是后来我遇到了getEntityRecords的一个问题,因为它请求并检索了帖子的所有属性,这使得当有大量帖子时,请求需要很长时间。

1 个回复
SO网友:Lovor

在被问到这个问题很久之后,我就偶然发现了这个问题,但为了所有搜索如何使用这个确实缺乏文档的函数的读者,我的答案如下:

不要在过滤器中使用添加剂。这与PHP后端中的逻辑不同。将其放入BlockEdit 过滤器确实会在注册每个块时产生调用它的问题,因此您必须使用您在代码中加入的这种解决方法。

只需在向block(通常是index.js)注册的主脚本中调用它,也可以在edit中调用它。js(如果块有单独的文件可供编辑)。重要的是在编辑功能或任何WordPress React元素之外调用它,因为这将导致与您遇到的问题相同的问题,因为调用太晚和/或重复调用。

另外,如果你看看getEntityRecords, 您将看到它有第四个参数(实际上是第三个,因为您在调用它时不提供状态)query, 您可以使用它仅获取所需的字段,而无需构建自定义REST端点。

在WordPress的全局REST参数中,有一个_fields 应该在该调用中用作对象属性的参数,如下所示(这是编辑函数内部的调用):

const postTitlesList = useSelect(select => select(\'core\').getEntityRecords(\'postType\', \'post\', { [\'_fields\']: \'id,title\' }), []);