Gatsby:在具有自定义分类的自定义帖子类型上使用GraphQL查询

时间:2019-05-05 08:01:03

标签: wordpress graphql gatsby

我正在使用Gatsby向WordPress提供前端并使用GraphQL查询数据。

我有一个带有自定义帖子类型和自定义分类法的帖子。

但是,当我在CPT上进行查询时,我可以获取自定义分类法的编号,但是却不知道如何检索相应的名称。

以下是我的查询;

{
    wordpressWpPortfolio {
        title
        slug
        id
        portfolio_categories
    }
}

这就是返回的内容

{
    "data": {
        "wordpressWpPortfolio": {
            "title": "Test Portfolio 1",
            "slug": "test-portfolio-1",
            "id": "5caf7182-c9f5-53d9-94da-b49cfbdc6d7f",
            "portfolio_categories": [
                5
             ]
         }
     }
}

但是,我无法在GraphQL游乐场中选择其他字段。

以下是我的预期结果;

{
    "data": {
        "wordpressWpPortfolio": {
            "title": "Test Portfolio 1",
            "slug": "test-portfolio-1",
            "id": "5caf7182-c9f5-53d9-94da-b49cfbdc6d7f",
            "portfolio_categories": [
                "id":5,
                "name":"portfolio category name"
            ]
        }
    }
}

有什么办法可以“加入”其余的终点?

我在做什么错,我该如何解决?

2 个答案:

答案 0 :(得分:2)

您正在寻找的是自定义标准化器。

gatsby-source-wordpress页上有一个很好的例子,它实际上与您要执行的操作非常相似。

这是链接https://www.gatsbyjs.org/packages/gatsby-source-wordpress/#example-1

或者,如果您更熟悉WordPress,则可以使用register_rest_api()方法修改CPT rest API以返回类别ID和字段名称。

类似这样的东西:

register_rest_field(
// Custom Post Type name
'portfolio',
// name of field that appears in rest API
'portfolio_categories',
    array(
        'get_callback' => function( $data ) {
            $category_terms = wp_get_post_terms( $data['id'], 'portfolio_categories' );
            $portfolio_categories = array();
            foreach( $category_terms as $term ) {
                $portfolio_category_obj = new StdClass();
                $portfolio_category_obj->ID = $term->ID;
                $portfolio_category_obj->name = $term->name;
                array_push( $portfolio_categories, $portfolio_category_obj );
            }
            return $portfolio_categories;
        },
    )
);

这将在您的rest API中添加一个名为portfolio_categories的额外字段,该字段返回一个数组,以便您可以按预期使用GraphQL。

答案 1 :(得分:0)

您需要在查询中包括姓名:

{
    wordpressWpPortfolio {
       title
       slug
       id
       portfolio_categories {
          id
          name
       }
    }
}