在 Gatsby 和 GraphQL 中的 wordpress 中过滤 ACF Post Object-field
Posted
技术标签:
【中文标题】在 Gatsby 和 GraphQL 中的 wordpress 中过滤 ACF Post Object-field【英文标题】:Filtering on an ACF Post Object-field in wordpress in Gatsby and GraphQL 【发布时间】:2021-10-27 22:59:51 【问题描述】:这是Querying wordpress with meta queries from Gatsby的后续问题
经过一些调试,我收集到,如果我错了,请纠正我,Gatsby on build 下载整个数据结构并缓存它。所以所有的 GraphQL 查询都是针对缓存执行的。这使得我尝试对 wordpress 进行的所有调整(例如 https://www.wpgraphql.com/2020/04/14/query-posts-based-on-advanced-custom-field-values-by-registering-a-custom-where-argument/)都毫无用处。我仅限于在 Gatsby 中对我的 GraphQL 查询使用 filter 参数。
考虑以下查询:
query Test
allWpPage(filter: pagesGeo: )
edges
node
pagesGeo
genericPage
... on WpPage
id
hreflangValue
在这种情况下,我想过滤 genericPage,但它不在 GraphiQL 查询测试器的可用过滤器列表中。
在 Wordpress 中,自定义字段 generic_page 是在高级自定义字段的帮助下定义的,它的字段类型为“发布对象”。如您所见,我可以很好地查询该字段,并且我可以很容易地在 Wordpress 中创建一个元查询来过滤该字段。它看起来像:
$query_args['meta_query'] = [
"relation" => "OR",
[
'key' => 'generic_page',
'value' => $postObjectId,
'compare' => '='
],
[
'key' => 'generic_page',
'value' => $postObjectId2,
'compare' => '='
],
];
有没有办法让我在 Gatsby 中的 genericPage 上进行过滤?
如果没有,是否有其他解决方案可供我提取我需要的数据?
【问题讨论】:
由于您将 ACF 用于字段,因此您将需要这个 - wpgraphql.com/acf。另外请注意,在编辑自定义字段时,不要忘记在 ACF 页面的最底部检查 Show in GraphQL。阅读本文了解更多信息 - ***.com/questions/63647590/… @MartinMirchev 感谢您的回答。我有插件,该字段显示在 GraphQL 中。从我的架构中可以看出,GenericPage 字段是可以选择的。但是,我无法对其进行过滤。可能是它没有被视为一个节点? 我认为你必须先注册参数。 wpgraphql.com/2020/04/14/… @MartinMirchev 如果您查看我的链接问题,您会发现 Gatsby 中限制了“where”过滤器。但是,据我所知,Gatsby 会在构建期间下载所有数据,然后在该缓存上运行 GraphQL 查询。因此,如果我在 Wordpress 中注册一个新的 where 参数,则不会影响 Gatsby 中的查询。如果你已经能够做到这一点,请提供一个代码示例,以便我可以尝试和模仿它。 【参考方案1】:经过一番调试,我收集了,如果我是,请纠正我 错了,盖茨比在构建时会下载整个数据结构和 缓存它。所以所有的 GraphQL 查询都是针对缓存执行的。
是的,没错。
而且我对 Gatsby 或 GraphQL 编码了解不多,但这就是我所做的,它对我来说效果很好:
我使用“WordPress 博客”启动器创建了一个 Gatsby 网站:https://github.com/gatsbyjs/gatsby-starter-wordpress-blog
然后在我的 WordPress 网站上,我安装了以下插件:ACF(免费版,v5.10.2)、WP Gatsby v1.1.3、WP GraphQL v1.6.4、“WPGraphQL for Advanced Custom Fields”v0.5.3 和(只是用于测试)WPGraphQL Meta Query v0.1.0
然后我创建了一个名为“Pages GEO”的 ACF 字段组:
在 GraphQL 元框中,我将“在 GraphQL 中显示”设置为“是”,然后设置“GraphQL 字段名称”到pagesGeo
(这是你用的,对吧?)
然后我创建了一个名为“通用页面”(generic_page
) 的 发布对象字段,然后将“在 GraphQL 中显示”设置为“是”
当然,我创建/编辑了一些页面(即帖子类型page
),然后为这些页面选择了一个“通用页面”。
所以关于这个:
在这种情况下,我想过滤 genericPage,但它不在列表中 GraphiQL 查询测试器中的可用过滤器。
我无法添加filter.pagesGeo.genericPage
,但我设法按该字段(即filter.genericPage
)进行过滤:
我注册了自己的自定义 WP GraphQL 字段,名为 genericPage
在我的主题 functions.php
中,我添加了:
add_action( 'graphql_register_types', function()
register_graphql_field( 'Page', 'genericPage', [
'type' => 'Integer',
'description' => 'generic_page meta value',
'resolve' => function( \WPGraphQL\Model\Post $post )
return (int) get_post_meta( $post->databaseId, 'generic_page', true );
] );
);
然后在 GraphiQL IDE(在 http://localhost:8000/__graphql)中,我运行了这个查询:
所以在上面的查询中,我通过generic_page
元数据过滤了帖子,其中我查询了元值(即帖子ID,或GraphQL 中的databaseId
)为2
的帖子或 82
.
我使用了in
比较器,但您可以使用任何其他适合您查询的比较器。见https://www.gatsbyjs.com/docs/query-filters/#supported-comparators
结果是:
如您所见,对于每个节点/帖子(在data.allWpPage.nodes
中),根genericPage
与pagesGeo.genericPage.databaseId
匹配。
附加说明
我使用了gatsby develop
命令(如果我没记错的话)重建缓存,但如有必要,可以手动清除缓存 — 参见https://www.gatsbyjs.com/docs/build-caching/#clearing-cache。
【讨论】:
这正是我正在寻找的解决方法,也是一个很好的解释性答案。两个竖起大拇指和赏金奖励。旁注:我使用的插件与您提到的插件相同。看起来你应该能够做一个“filter.pagesGeo.genericPage”,但某处有一个错误。我可能会使用gatsby-source-wordpress
-plugin 发布错误报告。谢谢你的帮助。以上是关于在 Gatsby 和 GraphQL 中的 wordpress 中过滤 ACF Post Object-field的主要内容,如果未能解决你的问题,请参考以下文章
Gatsby 源插件仅显示 GraphQL 中数组中的最后一项
在 Gatsby 中的 JSX 组件之外进行 graphql 查询