mohiohio / graphql-wp
A GraphQL endpoint for WordPress
Installs: 2 002
Dependents: 0
Suggesters: 0
Security: 0
Stars: 304
Watchers: 15
Forks: 22
Open Issues: 3
Type:wordpress-muplugin
Requires
- php: >=7
- danielstjules/stringy: 2.4.0
- ivome/graphql-relay-php: 0.5.0
- mohiohio/wordpress-lib: 0.1.5
- ramsey/uuid: 4.0.1
- rbdwllr/reallysimplejwt: 3.0.2
- webonyx/graphql-php: 0.13.8
Requires (Dev)
- analog/analog: ^1.0
- php-stubs/wordpress-stubs: 5.4.0
This package is auto-updated.
Last update: 2024-10-17 09:44:28 UTC
README
A GraphQL endpoint for WordPress that's easy to customize.
This is a WordPress Plugin that exposes a GraphQL endpoint at /graphql.
Uses this excellent graphql-php library.
Supports Relay Connections.
Install
composer require mohiohio/graphql-wp
If your aren't familiar with using composer with WordPress I'd recommend using a setup like bedrock. Otherwise you will at the least need to require autoload.php for this to work.
Using
The best way to explore / develop with this is by visiting /graphiql
after installation. This will show you the endpoints and arguments that are available. Note this will only work if you are a logged in admin user.
wp_query
This is designed to follow WordPress' existing WP Query functions. So as a rule you can pass the same parameters as your can to WP Query*.
*In reality there are a lot of params you can pass to WP_Query, and I've only implemented the ones that I've needed so far. But adding more is trivial as the arguments are just passed directly to the get_posts function, so its just a matter of defining them in the schema.
query example { wp_query { posts(first: 10) { edges { node { title name terms(taxonomy: "category") { name slug } } } } } }
Will give you
{ "data": { "wp_query": { "posts": { "edges": [ { "node": { "title": "Dashboard", "name": "hello-world", "terms": [ { "name": "Uncategorized", "slug": "uncategorized" } ] } } ] } } } }
Post
And of course you can get an individual post
query example { wp_post(ID: 9) { title content status } }
Custom Fields
Any meta fields are available like so
query example { wp_post(ID: 9) { title foo: meta_value(key: "foo") bar: meta_value(key: "bar") } }
If you want to define your own resolver / type you can extend the field schema for a post type like so.
// There is a get_{post_type}_schema call available for each post type add_filter('graphql-wp/get_post_schema', function($schema) { $schema['fields'] = function() use ($schema) { // Note call to "parent" function here return $schema['fields']() + [ 'foo' => [ 'type' => Type::string(), 'resolve' => function($post) { return get_post_meta($post->ID, 'foo' ,true); } ], 'bar' => [ 'type' => Type::string(), 'resolve' => function($post) { return get_post_meta($post->ID, 'bar' ,true); } ] ]; }; return $schema; });
Custom Post Types
This is how you can add custom post types ( which have custom fields ) to a client specific plugin.
graphql-wp/get_post_types is a good hook for this.
Where $types
is a hash of the schema we are working with, so just add new items into this and you are good to go.
use GraphQL\Type\Definition\Type; use Mohiohio\GraphQLWP\Type\Definition\Post; use Mohiohio\GraphQLWP\Type\Definition\Attachment; class Foo extends Post { static function getDescription() { return "A custom post type example, for post type `foo`"; } static function getFieldSchema() { return parent::getFieldSchema() + [ 'website' => [ 'type' => Type::string(), 'resolve' => function($post) { return get_post_meta($post->ID,'website',true); }, ], 'image' => [ 'type' => Attachment::getInstance(), 'resolve' => function($post) { $attachment_id = get_post_meta($post->ID,'image',true); return $attachment_id ? get_post($attachment_id) : null; }, ] ]; } } add_filter('graphql-wp/schema-types', function($types){ return array_merge($types, [ Foo::getInstance() ]); });