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

标签 wordpress graphql gatsby advanced-custom-fields

这是 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 编码不太了解,但这就是我所做的并且对我来说效果很好:
  • 我使用“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 元查询 v0.1.0
  • 然后我创建了一个 ACF 现场组命名为“页面GEO”:
  • GraphQL 元框 ,我将“在 GraphQL 中显示”设置为"is",然后将“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 ,我补充说:
  • 该代码基于 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)中,我运行了这个查询:
    Screenshot
  • 所以在上面的查询中,我通过 generic_page 过滤了帖子元,我在其中查询元值(即帖子 ID,或 GraphQL 中的 databaseId)为 2 的帖子或 82 .
  • 我使用了 in比较器,但您可以使用适合您查询的任何其他比较器。见 https://www.gatsbyjs.com/docs/query-filters/#supported-comparators

  • 结果是:
    Screenshot 2
  • 如您所见,对于每个节点/帖子(在 data.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/

    相关文章:

    php - 导航位置固定在滚动 wordpress 上

    meteor - Apollo/GraphIQL 显示 "Apollo Server supports only POST requests"?

    javascript - Gatsby GraphQL 自定义日期格式字符串

    xml - 如果文件名中缺少 '.xml' 后缀,为什么 Chrome 会尝试下载/保存从 localhost 上的 gatsby 提供的 xml 文件,而不是在浏览器中显示?

    html - 如何在 wordpress 中更改 anchor 和菜单分隔符类中的按钮颜色

    html - 如何从我的帖子页面隐藏日期部分?

    graphql - 如何使用Graphql动态更新一张表中的多行

    twitter-bootstrap - 可以使用 React-bootstrap 进行 PurgeCSS 吗?

    html - 粘性 header 始终可见?

    javascript - 为什么在 api 工作正常时使用片段上的 apollo 客户端查询会给我一个空对象?