这是 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 进行过滤?如果没有,是否有任何替代解决方案可以提取我需要的数据?
最佳答案
After a bit debugging I've gathered, and please correct me if I'm wrong, that Gatsby on build downloads the entire data structure and caches it. So all the GraphQL queries are performed against the cache.
对,那是正确的。
我对 Gatsby 或 GraphQL 编码不太了解,但这就是我所做的并且对我来说效果很好:
pagesGeo
(这是你用的,对吗?)generic_page
),然后我将“在 GraphQL 中显示”设置为"is"page
),然后为这些页面选择了一个“通用页面”。所以关于这个:
In this case I want to filter on genericPage, but it's not in the list of available filters in the GraphiQL query tester.
我无法添加
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 );
}
] );
});
generic_page
过滤了帖子元,我在其中查询元值(即帖子 ID,或 GraphQL 中的 databaseId
)为 2
的帖子或 82
.in
比较器,但您可以使用适合您查询的任何其他比较器。见 https://www.gatsbyjs.com/docs/query-filters/#supported-comparatorsdata.allWpPage.nodes
中),根 genericPage
匹配 pagesGeo.genericPage.databaseId
. 补充说明
我用了
gatsby develop
命令(如果我没记错的话)重建缓存,但如有必要,可以手动清除缓存 — 参见 https://www.gatsbyjs.com/docs/build-caching/#clearing-cache .
关于wordpress - 在 Gatsby 和 GraphQL 的 wordpress 中过滤 ACF Post Object-field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68962977/