在 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 中,我添加了:

    代码基于here。
    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 中),根genericPagepagesGeo.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的主要内容,如果未能解决你的问题,请参考以下文章

单个 GraphQL 查询中的多个源 (Gatsby)

Gatsby 源插件仅显示 GraphQL 中数组中的最后一项

在 Gatsby 中的 JSX 组件之外进行 graphql 查询

在 Gatsby 和 GraphQL 中的 wordpress 中过滤 ACF Post Object-field

GraphQL 中的复杂查询变量(通过 Gatsby)

来自 markdown 帖子的 Gatsby 图像未从 graphql 查询中显示