在 Gatsby 和 GraphQL 中的 wordpress 中过滤 ACF Post 对象字段

Bor*_*rje 4 wordpress advanced-custom-fields graphql gatsby

这是后续问题这是关于使用来自 Gatsby 的元查询查询 wordpress 的

经过一番调试后,我收集到了,如果我错了,请纠正我,Gatsby 在构建时会下载整个数据结构并缓存它。因此所有 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 查询使用过滤器参数。

考虑以下查询:

query Test {
  allWpPage(filter: {pagesGeo: {}}) {
    edges {
      node {
        pagesGeo {
          genericPage {
            ... on WpPage {
              id
            }
          }
          hreflangValue
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在本例中,我想在 genericPage 上进行过滤,但它不在 GraphiQL 查询测试器的可用过滤器列表中。

在 WordPress 中,自定义字段 generic_page 是在高级自定义字段的帮助下定义的,它的字段类型为“Post Object”。正如您所看到的,我能够很好地查询该字段,并且我可以轻松地在 Wordpress 中创建元查询来过滤该字段。它看起来像:

$query_args['meta_query'] = [
    "relation" => "OR",
    [
        'key' => 'generic_page',
        'value' => $postObjectId,
        'compare' => '='
    ],
    [
        'key' => 'generic_page',
        'value' => $postObjectId2,
        'compare' => '='
    ],
];
Run Code Online (Sandbox Code Playgroud)

有没有办法让我可以在 Gatsby 中过滤 genericPage?

如果没有,是否有其他解决方案可以帮助我提取所需的数据?

Sal*_* CJ 6

\n

经过我收集的一些调试后,如果我错了,请纠正我,Gatsby 在构建时会下载整个数据结构并缓存它。因此所有 GraphQL 查询都是针对缓存执行的。

\n
\n

对,那是正确的。

\n

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

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

    \n
  2. \n
  3. 然后在我的 WordPress 网站上,我安装了这些插件:ACF(免费版本,v5.10.2)、WP Gatsby v1.1.3、WP GraphQL v1.6.4、“WPGraphQL for Advanced Custom Fields”v0.5.3 和(仅用于测试) WPGraphQL 元查询 v0.1.0

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

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

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

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

    \n
  8. \n
\n

所以关于这一点:

\n
\n

在本例中,我想在 genericPage 上进行过滤,但它不在 GraphiQL 查询测试器的可用过滤器列表中。

\n
\n

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

\n

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

\n
    \n
  1. 在我的主题中functions.php,我添加了:

    \n\n
    add_action( \'graphql_register_types\', function() {\n    register_graphql_field( \'Page\', \'genericPage\', [\n        \'type\'        => \'Integer\',\n        \'description\' => \'generic_page meta value\',\n        \'resolve\'     => function( \\WPGraphQL\\Model\\Post $post ) {\n            return (int) get_post_meta( $post->databaseId, \'generic_page\', true );\n        }\n    ] );\n});\n
    Run Code Online (Sandbox Code Playgroud)\n
  2. \n
  3. 然后在 GraphiQL IDE(位于 http://localhost:8000/__graphql)中,我运行了以下查询:

    \n

    截屏

    \n
      \n
    • 因此,在上面的查询中,我按元过滤了帖子generic_page,其中查询了元值(即帖子 ID,或databaseId在 GraphQL 中)为2 或 的 82帖子。

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

      \n
    • \n
    \n
  4. \n
  5. 结果是:

    \n

    截图2

    \n
      \n
    • 正如您所看到的,对于每个节点/帖子(在 中data.allWpPage.nodes),根genericPagepagesGeo.genericPage.databaseId.
    • \n
    \n
  6. \n
\n

补充笔记

\n

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

\n