【问题标题】:Filtering on an ACF Post Object-field in wordpress in Gatsby and GraphQL在 Gatsby 和 GraphQL 中的 wordpress 中过滤 ACF Post Object-field
【发布时间】:2023-03-09 11:10:01
【问题描述】:

这是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。阅读本文了解更多信息 - stackoverflow.com/questions/63647590/…
  • @MartinMirchev 感谢您的回答。我有插件,该字段显示在 GraphQL 中。从我的架构中可以看出,GenericPage 字段是可以选择的。但是,我无法对其进行过滤。可能是它没有被视为一个节点?
  • 我认为你必须先注册参数。 wpgraphql.com/2020/04/14/…
  • @MartinMirchev 如果您查看我的链接问题,您会发现 Gatsby 中限制了“where”过滤器。但是,据我所知,Gatsby 会在构建期间下载所有数据,然后在该缓存上运行 GraphQL 查询。因此,如果我在 Wordpress 中注册一个新的 where 参数,则不会影响 Gatsby 中的查询。如果你已经能够做到这一点,请提供一个代码示例,以便我可以尝试和模仿它。

标签: wordpress graphql gatsby advanced-custom-fields


【解决方案1】:

经过一番调试,我收集了,如果我是,请纠正我 错了,盖茨比在构建时会下载整个数据结构和 缓存它。所以所有的 GraphQL 查询都是针对缓存执行的。

是的,没错。

而且我对 Gatsby 或 GraphQL 编码了解不多,但这就是我所做的,它对我来说效果很好:

  1. 我使用“WordPress 博客”启动器创建了一个 Gatsby 网站:https://github.com/gatsbyjs/gatsby-starter-wordpress-blog

  2. 然后在我的 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

  3. 然后我创建了一个名为“Pages GEO”的 ACF 字段组

    • GraphQL 元框中,我将“在 GraphQL 中显示”设置为“是”,然后设置“GraphQL 字段名称”到pagesGeo(这是你用的,对吧?)

    • 然后我创建了一个名为“通用页面”(generic_page) 的 发布对象字段,然后将“在 GraphQL 中显示”设置为“是”

  4. 当然,我创建/编辑了一些页面(即帖子类型page),然后为这些页面选择了一个“通用页面”。

所以关于这个:

在这种情况下,我想过滤 genericPage,但它不在列表中 GraphiQL 查询测试器中的可用过滤器。

我无法添加filter.pagesGeo.genericPage,但我设法按该字段(即filter.genericPage)进行过滤:

我注册了自己的自定义 WP GraphQL 字段,名为 genericPage

  1. 在我的主题 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 );
            }
        ] );
    });
    
  2. 然后在 GraphiQL IDE(在 http://localhost:8000/__graphql)中,我运行了这个查询:

    • 所以在上面的查询中,我通过generic_page 元数据过滤了帖子,其中我查询了元值(即帖子ID,或GraphQL 中的databaseId)为2 的帖子 82.

    • 我使用了in 比较器,但您可以使用任何其他适合您查询的比较器。见https://www.gatsbyjs.com/docs/query-filters/#supported-comparators

  3. 结果是:

    • 如您所见,对于每个节点/帖子(在data.allWpPage.nodes 中),根genericPagepagesGeo.genericPage.databaseId 匹配。

附加说明

我使用了gatsby develop 命令(如果我没记错的话)重建缓存,但如有必要,可以手动清除缓存 — 参见https://www.gatsbyjs.com/docs/build-caching/#clearing-cache

【讨论】:

  • 这正是我正在寻找的解决方法,也是一个很好的解释性答案。两个竖起大拇指和赏金奖励。旁注:我使用的插件与您提到的插件相同。看起来你应该能够做一个“filter.pagesGeo.genericPage”,但某处有一个错误。我可能会使用gatsby-source-wordpress-plugin 发布错误报告。谢谢你的帮助。
猜你喜欢
  • 2022-12-01
  • 1970-01-01
  • 2022-01-02
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
  • 2018-04-14
  • 2021-02-09
相关资源
最近更新 更多