【发布时间】:2020-05-03 20:44:45
【问题描述】:
我有一个 React + Gatsby JS 项目,该项目通过其无头 API 从 Wordpress 站点检索数据。我是盖茨比的新手。
我网站上的每个页面都由块组成,而块又由字段组成。我正在使用 ACF 来构建这些。
我目前能够使用以下 GraphQL 查询检索每个页面和该页面中的块列表:
query ($id: String!) {
currentPage: wordpressPage(id: {eq: $id}) {
title
acf {
page_blocks {
block_type {
acf_fc_layout
}
}
}
}
}
这将返回 ID 为 f4c4f4a7-ba0d-55b1-8877-16f543c22b80 的页面的以下数据
{
"data": {
"wordpressPage": {
"id": "f4c4f4a7-ba0d-55b1-8877-16f543c22b80",
"acf": {
"page_blocks": [
{
"block_type": [
{
"acf_fc_layout": "page_title_and_text"
},
{
"acf_fc_layout": "two_column_media_and_text"
}
]
}
]
}
}
}
}
这些块在afc_fc_layout 旁边。 page_title_and_text 和 two_column_media_and_text 都是该页面中的页面块。
现在,我认为下一步是为每个块制作一个 React 组件,将每个块的自定义字段数据传递给该组件。如果页面没有块,那么我就不需要检索该块的字段,对吗?
最初我以为我会从我的 React 组件运行另一个查询,请求该特定块的字段。但是我意识到我不能真正将变量(页面 ID)添加到我的组件中的静态查询中,每个 Gatsby docs,所以我将无法查询该特定页面的字段。如果我错了,请纠正我。
我相信我必须从我在这里向您展示的主要查询中检索我需要的那些字段,但是当并非所有页面都将要查询时,必须查询网站上每个可能的自定义字段似乎绝对是疯狂的有相同的块。
理想情况下会有某种语法,例如
...
acf {
page_blocks {
block_type {
acf_fc_layout
if (acf_fc_layout eq page_title_and_text) {
title
text
}
if (acf_fc_layout eq two_column_media_and_text) {
media
text
}
}
}
}
...
然后我会将这些字段传递给它们对应的 React 组件。
解决这个问题的正确方法是什么?
注意:我目前能够从 API 检索字段以呈现块。我更想知道我的 graphQL 查询是否可以为我过滤掉数据,或者是否有一种方法可以自定义 WP 端点以向我显示由页面上实际存在的块过滤的字段数据。
例如:站点在块 4、3、2、10、12、15.... 中查询数据,即使页面只有块 2。
我担心将来想要添加块的开发人员每次都必须重写查询,从而损害网站的可扩展性和潜在性能。
【问题讨论】:
标签: graphql advanced-custom-fields gatsby wordpress-rest-api