如何在WordPress PHP中为GraphQL的深层嵌套项添加字段
嘿,我懂你现在的困扰——你已经能顺利给根级的cart类型添加自定义字段,但想把cartProductName放到更深的cart -> content -> nodes -> product -> node这个嵌套层级里对吧?咱们来一步步搞定这个问题。
核心问题:找对目标类型的名称
你之前的代码把字段注册到了cart类型上,所以它只会出现在根的cart节点下。而你要添加的位置是嵌套里的node对象,这个对象有自己的GraphQL类型名(比如WooCommerce+WPGraphQL环境下,这个类型通常是Product,也可能是SimpleProduct/VariableProduct这类更具体的类型)。
第一步必须先确认这个node对应的类型名,方法很简单:
- 打开WPGraphQL的Playground,执行下面的查询,拿到
__typename字段的值:
query GetCartProductTypeName { cart { content { nodes { ... on ProductItem { product { node { __typename } } } } } } }
返回结果里的__typename就是你要找的目标类型名,比如Product。
注册字段到目标类型
拿到类型名后,只需要把register_graphql_field的第一个参数改成这个类型名就行。比如如果类型是Product,代码如下:
register_graphql_field('Product', 'cartProductName', [ 'type' => 'String', 'description' => "Get product name for cart", 'resolve' => function ($productNode) { // 这里的$productNode就是嵌套层级里的Product对象 // 你可以根据需求获取数据,比如返回测试值,或者调用产品方法 // 比如WooCommerce产品可以用 $productNode->get_name() return "Banana!"; } ]);
测试效果
保存代码后,在Playground里执行查询验证:
query GetCartWithCustomField { cart { content { nodes { ... on ProductItem { product { node { name # 原有字段 cartProductName # 你的自定义字段 } } } } } } }
这样就能在cart -> content -> nodes -> product -> node下看到返回的Banana!了。
额外提示
如果你的node类型不是Product(比如是更细分的产品类型),只要把register_graphql_field的第一个参数换成查询到的__typename值就行。另外,如果需要这个字段只在购物车上下文生效,可以在resolve函数里通过$context参数判断当前请求的上下文,但一般来说直接注册到对应的产品类型上就足够满足需求啦。
内容的提问来源于stack exchange,提问作者Daniel Melin

