WpGraphQL: Creating Extensions - Having Issues

733 Views Asked by At

Maybe I'm in over my head but I'm trying to create an extension for WpGraphQL to just gather the YITH WooCommerce Product Add-Ons info for each product but I've gotten to the point of banging my head against the desk in frustration. Is there a fairly easy way to just output the array into nodes? The following is what I have so far, currently I'm only getting one product with a set ID (later, hopefully it will get the one associated with that query). I can get a simple string output but I can't get it to output the array into nodes? What am I doing wrong? I commented out ideas I had for an output but it just usually results in an error or null. I do see the graphql_debug working and outputting $fields as an array though? Thanks!

register_graphql_object_type('MyNewType', [
        'description' => __('Describe the Type and what it represents', 'replace-me'),
        'fields' => [
            'nodes' => [
                'type' => 'String',
                'description' => __('Describe what this field should be used for', 'replace-me'),

                'fields' => [
                    'form_type' => [
                        'type' => 'String',
                        'description' => __('Describe what this field should be used for', 'replace-me'),
                    ],
                ],
            ],
        ],
    ]);

    register_graphql_field(
        'Product',
        'YITH_fields',
        [
            'type' =>  'MyNewType',
            'description' => __('Example field added to the Post Type', 'replace-with-your-textdomain'),
            'resolve' => function (\WPGraphQL\Model\Post $post) {
                global $wpdb;
                $sql = "SELECT wp_live_yith_wapo_types.type, wp_live_yith_wapo_types.options FROM wp_live_yith_wapo_groups JOIN wp_live_yith_wapo_types on wp_live_yith_wapo_groups.id = wp_live_yith_wapo_types.group_id WHERE FIND_IN_SET(13, products_id)";
                $results = $wpdb->get_results($sql);
                if ($results) {
                    $array = array('nodes');
                    //$array = array();
                    foreach ($results as $result) {
                        $type = array('form_type' => $result->type);
                        $options =  maybe_unserialize($result->options);
                        $result = array_merge($type, $options);
                        $array[] = $result;
                    }
                    //$array = wp_json_encode($array);
                    $fields = !empty($array) ? $array : null;
                } else {
                    $fields = null;
                }
                graphql_debug($fields, ['type' => 'ARGS_BREAKPOINT']);

                //return $fields['nodes'];
                return $fields;
            }

        ]
    );
1

There are 1 best solutions below

1
On

Probably it's good enough to return an array of Info 'records' (without embedding into nodes subfield - it would require some, own 'InfoList' type def.), then you need a type for single Info, like:

    register_graphql_object_type('MyInfoItem', [
        'description' => __('Describe the Type and what it represents', 'replace-me'),
        'fields' => [
            'form_type' => [
                'type' => 'String',
                'description' => __('Describe what this field should be used for', 'replace-me'),
            ],
            // options field - list of some scalar or custom type 
            'options' => [
                'type' => [ 'list_of' => 'String' ],
                'description' => __('Describe what this field should be used for', 'replace-me'),
            ],

        ],
    ]);

extend Product with:

register_graphql_field(
    'Product',
    'YITH_fields',
    [
        'type'  => [ 'list_of' => 'MyInfoItem' ],
        'description' => __('Example field added to the Post Type', 'replace-with-your-textdomain'),
        'resolve' => function (\WPGraphQL\Model\Post $post) {
             // ... 
             return [
                 ['form_type' => 'some_value'],
                 [
                     'form_type' => 'other_value',
                     'options' => ['opt_1', 'opt_2'],
                 ],
             ];

Any, not trivial data 'nesting level' requires a separate type definition.

For more complex options 'records' you need to register another type - e.g. ids required for optional option selection.

If you don't want to explicitely express these [unknown/dynamic] structures, you can use custom JSON scalar type.