因此,我创建了一个自定义端点,以检索我需要检索的一些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的一个问题,因为它请求并检索了帖子的所有属性,这使得当有大量帖子时,请求需要很长时间。
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\' }), []);