{"id":15192915,"url":"https://github.com/graphqlapi/graphql-api-for-wp","last_synced_at":"2026-01-14T00:37:09.859Z","repository":{"id":38849475,"uuid":"238424216","full_name":"GraphQLAPI/graphql-api-for-wp","owner":"GraphQLAPI","description":"[READ ONLY] GraphQL API for WordPress","archived":true,"fork":false,"pushed_at":"2023-05-05T08:01:38.000Z","size":108865,"stargazers_count":148,"open_issues_count":183,"forks_count":5,"subscribers_count":10,"default_branch":"master","last_synced_at":"2024-09-28T22:01:15.407Z","etag":null,"topics":["api","api-server","graphql","graphql-server","php","plugin","wordpress"],"latest_commit_sha":null,"homepage":"https://graphql-api.com","language":"PHP","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GraphQLAPI.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"leoloso"}},"created_at":"2020-02-05T10:31:01.000Z","updated_at":"2024-03-08T20:30:23.000Z","dependencies_parsed_at":"2024-09-18T19:05:03.259Z","dependency_job_id":"62b7cf68-d001-4c49-9263-0079738010af","html_url":"https://github.com/GraphQLAPI/graphql-api-for-wp","commit_stats":{"total_commits":3400,"total_committers":5,"mean_commits":680.0,"dds":"0.21676470588235297","last_synced_commit":"2d43ccde6bd441c370384e18b200e17447debcc4"},"previous_names":[],"tags_count":85,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GraphQLAPI%2Fgraphql-api-for-wp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GraphQLAPI%2Fgraphql-api-for-wp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GraphQLAPI%2Fgraphql-api-for-wp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GraphQLAPI%2Fgraphql-api-for-wp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GraphQLAPI","download_url":"https://codeload.github.com/GraphQLAPI/graphql-api-for-wp/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":234957802,"owners_count":18913350,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","api-server","graphql","graphql-server","php","plugin","wordpress"],"created_at":"2024-09-27T22:00:59.670Z","updated_at":"2025-10-02T08:31:08.812Z","avatar_url":"https://github.com/GraphQLAPI.png","language":"PHP","funding_links":["https://github.com/sponsors/leoloso"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\u003cimg src=\"assets/img/graphql-api-logo-with-name.jpg\" width=\"450\" /\u003e\u003c/p\u003e\n\n# GraphQL API for WordPress\n\n\u003c!--\n[![Build Status][ico-travis]][link-travis]\n[![Quality Score][ico-code-quality]][link-code-quality]\n[![Software License][ico-license]](LICENSE.md) --\u003e\n\u003c!-- [![GitHub release][ico-release]][link-release] --\u003e\n\u003c!-- [![Github all releases][ico-downloads]][link-downloads] --\u003e\n\nTransform your WordPress site into a modern GraphQL server: [graphql-api.com](https://graphql-api.com).\n\n![The interactive schema visualizer](docs/images/interactive-schema.png)\n\nThis plugin is the implementation for WordPress of [GraphQL by PoP](https://graphql-by-pop.com/), a CMS-agnostic GraphQL server in PHP.\n\n\u003c!-- ## Why\n\nPlease read the author's [introduction to the GraphQL API for WordPress](https://leoloso.com/posts/introducing-the-graphql-api-for-wordpress/), which describes:\n\n- How does it compare with the existing solutions: WP REST API and WPGraphQL\n- An overview of all its features\n- Q\u0026A --\u003e\n\n\u003c!-- ## Requirements\n\n- WordPress 5.4 or above\n- PHP 8.1+ for development\n- PHP 7.1+ for production --\u003e\n\n## Installing the plugin (for production)\n\n👀 Instructions: [Installing the GraphQL API for WordPress plugin](https://github.com/leoloso/PoP/blob/master/docs/installing-graphql-api-for-wordpress.md).\n\n## Development\n\n\u003c!-- The source code is hosted on the [`leoloso/PoP` monorepo](https://github.com/leoloso/PoP), under [`GraphQLAPIForWP/plugins/graphql-api-for-wp`](https://github.com/leoloso/PoP/tree/master/layers/GraphQLAPIForWP/plugins/graphql-api-for-wp). --\u003e\n\n👀 Instructions: [Setting-up the development environment](https://github.com/leoloso/PoP/blob/master/docs/development-environment.md).\n\n### Supported PHP features\n\nCheck the list of [Supported PHP features](https://github.com/leoloso/PoP/blob/master/docs/supported-php-features.md)\n\n### Gutenberg JS builds\n\nCompiled JavaScript code (such as all files under a block's `build/` folder) is added to the repo, but only as compiled for production, i.e. after running `npm run build`.\n\nCode compiled for development, i.e. after running `npm start`, cannot be commited/pushed to the repo.\n\n\u003c!-- ### Building static sites\n\nThe GraphQL API for WordPress provides non-restrictive default settings, which simplify the configuration for building \"static\" sites.\n\nThis is how the restrictive and non-restrictive default behaviors compare:\n\n| Feature | Restrictive behavior | Non-restrictive behavior |\n| --- | --- | --- |\n| Single endpoint | Disabled | Enabled |\n| “Sensitive” data fields | Not added to the schema | Added to the schema |\n| Settings from `wp_options` | Only a few predefined options are queryable | All options are queryable |\n| Meta (posts, users, comments, taxonomies) | No keys are queryable | All keys are queryable |\n| Max limit to query entities (posts, users, etc) | Limited | Unlimited |\n| Environment Fields | No environment variables or PHP constants are queryable | All environment variables and PHP constants are queryable |\n| Send HTTP Request Fields | No URL can be requested | All URLs can be requested |\n\nIn development, to enable restrictive defaults, execute:\n\n```bash\ncomposer enable-restrictive-defaults\n```\n\nOn a site in production, set in `wp-config.php`:\n\n```php\ndefine( 'GRAPHQL_API_SETTINGS_OPTION_ENABLE_RESTRICTIVE_DEFAULT_BEHAVIOR', true );\n```\n\nOr define this same key/value as an environment variable. --\u003e\n\n\u003c!-- ### CMS-agnosticism\n\nEven though this plugin is already the implementation for WordPress, it is recommended to develop components following the [CMS-agnostic method employed by GraphQL by PoP](https://graphql-by-pop.com/docs/architecture/cms-agnosticism.html), so that they can benefit from architectural optimizations and future developments.\n\nIn particular, support for serverless PHP (a feature which is [on the roadmap](https://graphql-by-pop.com/docs/roadmap/serverless-wordpress.html)) may require to decouple the codebase from WordPress.\n\nThis method requires the code for the component to be divided into 2 separate packages:\n\n- A CMS-agnostic package, containing the business code and generic contracts, but without using any WordPress code (eg: [posts](https://github.com/PoPSchema/posts))\n- A CMS-specific package, containing the implementation of the contracts for WordPress (eg: [posts-wp](https://github.com/PoPSchema/posts-wp)) --\u003e\n\n## Modules\n\nGraphQL API is extensible, and ships with the following modules (organized by category):\n\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\u003cth\u003eModule\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\n\u003ctr\u003e\u003cth colspan=\"2\"\u003e\u003cbr/\u003eEndpoint\u003c/th\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/modules/single-endpoint/en.md\"\u003eSingle Endpoint\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eExpose the single GraphQL endpoint under \u003ccode\u003e/graphql/\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/modules/persisted-queries/en.md\"\u003ePersisted Queries\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eExpose predefined responses through a custom URL, akin to using GraphQL queries to publish REST endpoints\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/modules/custom-endpoints/en.md\"\u003eCustom Endpoints\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eExpose different subsets of the schema for different targets, such as users (clients, employees, etc), applications (website, mobile app, etc), context (weekday, weekend, etc), and others\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/modules/api-hierarchy/en.md\"\u003eAPI Hierarchy\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eCreate a hierarchy of API endpoints extending from other endpoints, and inheriting their properties\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003cth colspan=\"2\"\u003e\u003cbr/\u003eSchema Configuration\u003c/th\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/modules/schema-configuration/en.md\"\u003eSchema Configuration\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eCustomize the schema accessible to different Custom Endpoints and Persisted Queries, by applying a custom configuration (involving namespacing, access control, cache control, and others) to the grand schema\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/modules/schema-namespacing/en.md\"\u003eSchema Namespacing\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eAutomatically namespace types with a vendor/project name, to avoid naming collisions\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/modules/nested-mutations/en.md\"\u003eNested Mutations\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eExecute mutations from any type in the schema, not only from the root\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/modules/public-private-schema/en.md\"\u003ePublic/Private Schema\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eEnable to communicate the existence of some field from the schema to certain users only (private mode) or to everyone (public mode). If disabled, fields are always available to everyone (public mode)\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003cth colspan=\"2\"\u003e\u003cbr/\u003eUser Interface\u003c/th\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/modules/excerpt-as-description/en.md\"\u003eExcerpt as Description\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eProvide a description of the different entities (Custom Endpoints, Persisted Queries, and others) through their excerpt\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003cth colspan=\"2\"\u003e\u003cbr/\u003eClients\u003c/th\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/modules/graphiql-for-single-endpoint/en.md\"\u003eGraphiQL for Single Endpoint\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eMake a public GraphiQL client available under \u003ccode\u003e/graphiql/\u003c/code\u003e, to execute queries against the single endpoint. It requires pretty permalinks enabled\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/modules/interactive-schema-for-single-endpoint/en.md\"\u003eInteractive Schema for Single Endpoint\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eMake a public Interactive Schema client available under \u003ccode\u003e/schema/\u003c/code\u003e, to visualize the schema accessible through the single endpoint. It requires pretty permalinks enabled\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/modules/graphiql-for-custom-endpoints/en.md\"\u003eGraphiQL for Custom Endpoints\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eEnable custom endpoints to be attached their own GraphiQL client, to execute queries against them\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/modules/interactive-schema-for-custom-endpoints/en.md\"\u003eInteractive Schema for Custom Endpoints\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eEnable custom endpoints to be attached their own Interactive schema client, to visualize the custom schema subset\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/modules/graphiql-explorer/en.md\"\u003eGraphiQL Explorer\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eAdd the Explorer widget to the GraphiQL client, to simplify coding the query (by point-and-clicking on the fields)\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003cth colspan=\"2\"\u003e\u003cbr/\u003eSchema Type\u003c/th\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/modules/schema-expose-sensitive-data/en.md\"\u003eExpose Sensitive Data in the Schema\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eExpose “sensitive” data elements in the GraphQL schema (such as field \u003ccode\u003eRoot.roles\u003c/code\u003e, field arg \u003ccode\u003eRoot.posts(status:)\u003c/code\u003e, and others), which provide access to potentially private user data\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/modules/schema-self-fields/en.md\"\u003eSelf Fields\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eExpose \"self\" fields in the GraphQL schema (such as \u003ccode\u003ePost.self\u003c/code\u003e and \u003ccode\u003eUser.self\u003c/code\u003e), which can help give a particular shape to the GraphQL response\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/modules/schema-customposts/en.md\"\u003eSchema Custom Posts\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eQuery Custom Post Types\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSchema Posts\u003c/td\u003e\u003ctd\u003eQuery posts, through type \u003ccode\u003ePost\u003c/code\u003e added to the schema\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSchema Pages\u003c/td\u003e\u003ctd\u003eQuery pages, through type \u003ccode\u003ePage\u003c/code\u003e added to the schema\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSchema Users\u003c/td\u003e\u003ctd\u003eQuery users, through type \u003ccode\u003eUser\u003c/code\u003e added to the schema\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSchema User Roles\u003c/td\u003e\u003ctd\u003eQuery user roles, through type \u003ccode\u003eUserRole\u003c/code\u003e added to the schema\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSchema User Avatars\u003c/td\u003e\u003ctd\u003eQuery user avatars, through type \u003ccode\u003eUserAvatar\u003c/code\u003e added to the schema\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSchema Comments\u003c/td\u003e\u003ctd\u003eQuery comments, through type \u003ccode\u003eComment\u003c/code\u003e added to the schema\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSchema Tags\u003c/td\u003e\u003ctd\u003eBase functionality for all tags\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSchema Post Tags\u003c/td\u003e\u003ctd\u003eQuery post tags, through type \u003ccode\u003ePostTag\u003c/code\u003e added to the schema\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSchema Categories\u003c/td\u003e\u003ctd\u003eBase functionality for all categories\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSchema Post Categories\u003c/td\u003e\u003ctd\u003eQuery post categories, through type \u003ccode\u003ePostCategory\u003c/code\u003e added to the schema\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSchema Media\u003c/td\u003e\u003ctd\u003eQuery media elements, through type \u003ccode\u003eMedia\u003c/code\u003e added to the schema\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/modules/schema-custompost-meta/en.md\"\u003eSchema Custom Post Meta\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eAdd the \u003ccode\u003eoption\u003c/code\u003e field to custom posts, such as type \u003ccode\u003ePost\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/modules/schema-user-meta/en.md\"\u003eSchema User Meta\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eAdd the \u003ccode\u003eoption\u003c/code\u003e field to type \u003ccode\u003eUser\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/modules/schema-comment-meta/en.md\"\u003eSchema Comment Meta\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eAdd the \u003ccode\u003eoption\u003c/code\u003e field to type \u003ccode\u003eComment\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/modules/schema-taxonomy-meta/en.md\"\u003eSchema Taxonomy Meta\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eAdd the \u003ccode\u003eoption\u003c/code\u003e field to taxonomies, such as types \u003ccode\u003ePostTag\u003c/code\u003e and \u003ccode\u003ePostCategory\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSchema Menus\u003c/td\u003e\u003ctd\u003eQuery menus, through type \u003ccode\u003eMenu\u003c/code\u003e added to the schema\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/modules/schema-settings/en.md\"\u003eSchema Settings\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eFetch settings from the site\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/modules/mutations/en.md\"\u003eMutations\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eModify data by executing mutations\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"docs/modules/schema-user-state-mutations/en.md\"\u003eSchema User State Mutations\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eHave the user log-in, and be able to perform mutations\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSchema Custom Post Mutations\u003c/td\u003e\u003ctd\u003eBase functionality to mutate custom posts\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSchema Post Mutations\u003c/td\u003e\u003ctd\u003eExecute mutations on podyd\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSchema Custom Post Media Mutations\u003c/td\u003e\u003ctd\u003eExecute mutations concerning media items on custom posts\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSchema Post Media Mutations\u003c/td\u003e\u003ctd\u003eExecute mutations concerning media items on posts\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSchema Post Tag Mutations\u003c/td\u003e\u003ctd\u003eAdd tags to posts\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSchema Post Category Mutations\u003c/td\u003e\u003ctd\u003eAdd categories to posts\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSchema Comment Mutations\u003c/td\u003e\u003ctd\u003eCreate comments\u003c/td\u003e\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\n## Resources\n\n- [YouTube video: GraphQL API for WordPress demo](https://youtu.be/LnyNyT2RwwI)\n- [Making GraphQL Work In WordPress](https://www.smashingmagazine.com/2021/04/making-graphql-work-in-wordpress/)\n- [Rendering the WordPress philosophy in GraphQL](https://css-tricks.com/rendering-the-wordpress-philosophy-in-graphql/)\n- [Comparing the GraphQL API for WordPress vs WPGraphQL](https://graphql-api.com/blog/graphql-api-vs-wpgraphql-the-fight/)\n\n\u003cdetails\u003e\n\n\u003csummary\u003eArchitectural resources\u003c/summary\u003e\n\n### PHP Architecture\n\nArticles explaining how the plugin is \"downgraded\", using PHP 8.1 for development but deployable to PHP 7.1 for production:\n\n1. [Transpiling PHP code from 8.0 to 7.x via Rector](https://blog.logrocket.com/transpiling-php-code-from-8-0-to-7-x-via-rector/)\n2. [Coding in PHP 7.4 and deploying to 7.1 via Rector and GitHub Actions](https://blog.logrocket.com/coding-in-php-7-4-and-deploying-to-7-1-via-rector-and-github-actions/)\n3. [Tips for transpiling code from PHP 8.0 down to 7.1](https://blog.logrocket.com/tips-transpiling-code-from-php-8-0-to-7-1/)\n4. [Including both PHP 7.1 and 8.0 code in the same plugin … or not?](https://blog.logrocket.com/including-php-7-1-and-8-0-code-same-plugin-or-not/)\n\nService container implementation:\n\n- [Building extensible PHP apps with Symfony DI](https://blog.logrocket.com/building-extensible-php-apps-with-symfony-di/)\n\nExplanation of how the codebase is split into granular packages, to enable CMS-agnosticism:\n\n1. [Abstracting WordPress Code To Reuse With Other CMSs: Concepts (Part 1)](https://www.smashingmagazine.com/2019/11/abstracting-wordpress-code-cms-concepts/)\n2. [Abstracting WordPress Code To Reuse With Other CMSs: Implementation (Part 2)](https://www.smashingmagazine.com/2019/11/abstracting-wordpress-code-reuse-with-other-cms-implementation/)\n\nDescription of how the plugin is scoped:\n\n- [GraphQL API for WordPress is now scoped, thanks to PHP-Scoper!](https://graphql-api.com/blog/graphql-api-for-wp-is-now-scoped-thanks-to-php-scoper/)\n\n### GraphQL by PoP documentation\n\nGraphQL API for WordPress is powered by the CMS-agnostic GraphQL server [GraphQL by PoP](https://graphql-by-pop.com).\n\nTechnical information on how the GraphQL server works:\n\n- [GraphQL by PoP documentation](https://graphql-by-pop.com/docs/getting-started/intro.html).\n\nDescription of how a GraphQL server using server-side components works:\n\n- [Implementing a GraphQL server with components in PHP](https://www.wpkube.com/implementing-graphql-server/)\n\nThese articles explain the concepts, design and implementation of GraphQL by PoP:\n\n1. [Designing a GraphQL server for optimal performance](https://blog.logrocket.com/designing-graphql-server-optimal-performance/)\n2. [Simplifying the GraphQL data model](https://blog.logrocket.com/simplifying-the-graphql-data-model/)\n3. [Schema-first vs code-first development in GraphQL](https://blog.logrocket.com/code-first-vs-schema-first-development-graphql/)\n4. [Speeding-up changes to the GraphQL schema](https://blog.logrocket.com/speeding-up-changes-to-the-graphql-schema/)\n5. [Versioning fields in GraphQL](https://blog.logrocket.com/versioning-fields-graphql/)\n6. [GraphQL directives are underrated](https://blog.logrocket.com/graphql-directives-are-underrated/)\n7. [Treating GraphQL directives as middleware](https://blog.logrocket.com/treating-graphql-directives-as-middleware/) \n8. [Creating an @export GraphQL directive](https://blog.logrocket.com/creating-an-export-graphql-directive/)\n9. [Adding directives to the schema in code-first GraphQL servers](https://blog.logrocket.com/adding-directives-schema-code-first-graphql-servers/)\n10. [Coding a GraphQL server in JavaScript vs. WordPress](https://blog.logrocket.com/coding-a-graphql-server-in-javascript-vs-wordpress/)\n11. [Supporting opt-in nested mutations in GraphQL](https://blog.logrocket.com/supporting-opt-in-nested-mutations-in-graphql/)\n12. [HTTP caching in GraphQL](https://blog.logrocket.com/http-caching-graphql/)\n\n### Gutenberg\n\nThese articles explain the integration with Gutenberg (the WordPress editor).\n\n1. [Adding a Custom Welcome Guide to the WordPress Block Editor](https://css-tricks.com/adding-a-custom-welcome-guide-to-the-wordpress-block-editor/)\n2. [Using Markdown and Localization in the WordPress Block Editor](https://css-tricks.com/using-markdown-and-localization-in-the-wordpress-block-editor/)\n\n\u003c/details\u003e\n\n## Standards\n\n[PSR-1](https://www.php-fig.org/psr/psr-1), [PSR-4](https://www.php-fig.org/psr/psr-4) and [PSR-12](https://www.php-fig.org/psr/psr-12).\n\nTo check the coding standards via [PHP CodeSniffer](https://github.com/squizlabs/PHP_CodeSniffer), run:\n\n``` bash\ncomposer check-style\n```\n\nTo automatically fix issues, run:\n\n``` bash\ncomposer fix-style\n```\n\n## Release notes\n\n- [1.0](docs/release-notes/1.0/en.md)\n- **[0.10](docs/release-notes/0.10/en.md)** (current)\n- [0.9](docs/release-notes/0.9/en.md)\n- [0.8](docs/release-notes/0.8/en.md)\n- [0.7](docs/release-notes/0.7/en.md)\n- [0.6](docs/release-notes/0.6/en.md)\n\n## Change log\n\nPlease see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently.\n\n## Testing\n\nTo execute [PHPUnit](https://phpunit.de/), run:\n\n``` bash\ncomposer test\n```\n\n## Static Analysis\n\nTo execute [PHPStan](https://github.com/phpstan/phpstan), run:\n\n``` bash\ncomposer analyse\n```\n\n## Downgrading code\n\nTo visualize how [Rector](https://github.com/rectorphp/rector) will downgrade the code to PHP 7.1:\n\n```bash\ncomposer preview-code-downgrade\n```\n\n## Report issues\n\nTo report a bug or request a new feature please do it on the [PoP monorepo issue tracker](https://github.com/leoloso/PoP/issues).\n\n## Contributing\n\nWe welcome contributions for this package on the [PoP monorepo](https://github.com/leoloso/PoP) (where the source code for this package is hosted).\n\nPlease see [CONTRIBUTING](CONTRIBUTING.md) and [CODE_OF_CONDUCT](CODE_OF_CONDUCT.md) for details.\n\n## Security\n\nIf you discover any security related issues, please email leo@getpop.org instead of using the issue tracker.\n\n## Credits\n\n- [Leonardo Losoviz][link-author]\n\n## License\n\nGPLv2 or later. Please see [License File](LICENSE.md) for more information.\n\n[ico-license]: https://img.shields.io/badge/license-GPL%20(%3E%3D%202)-brightgreen.svg?style=flat-square\n[ico-travis]: https://img.shields.io/travis/GraphQLAPI/graphql-api-for-wp/master.svg?style=flat-square\n[ico-scrutinizer]: https://img.shields.io/scrutinizer/coverage/g/GraphQLAPI/graphql-api-for-wp.svg?style=flat-square\n[ico-code-quality]: https://img.shields.io/scrutinizer/g/GraphQLAPI/graphql-api-for-wp.svg?style=flat-square\n[ico-release]: https://img.shields.io/github/release/GraphQLAPI/graphql-api-for-wp.svg\n[ico-downloads]: https://img.shields.io/github/downloads/GraphQLAPI/graphql-api-for-wp/total.svg\n\n[link-travis]: https://travis-ci.com/github/GraphQLAPI/graphql-api-for-wp\n[link-scrutinizer]: https://scrutinizer-ci.com/g/GraphQLAPI/graphql-api-for-wp/code-structure\n[link-code-quality]: https://scrutinizer-ci.com/g/GraphQLAPI/graphql-api-for-wp\n[link-downloads]: https://GitHub.com/GraphQLAPI/graphql-api-for-wp/releases/\n[link-release]: https://GitHub.com/GraphQLAPI/graphql-api-for-wp/releases/\n[link-downloads]: https://GitHub.com/GraphQLAPI/graphql-api-for-wp/releases/\n[link-contributors]: ../../../../../../contributors\n[link-author]: https://github.com/leoloso\n\n[latest-release-url]: https://github.com/leoloso/PoP/releases/latest/download/graphql-api.zip\n\n\n\u003c!--\n\n## Composer merge plugin\n\nAdd into `composer.json`:\n\n```json\n{\n    \"require-dev\": {\n        \"wikimedia/composer-merge-plugin\": \"dev-feature/composer-v2\"\n    },\n    \"repositories\": [\n        {\n            \"type\": \"vcs\",\n            \"url\": \"https://github.com/mcaskill/composer-merge-plugin.git\"\n        }\n    ],\n    \"extra\": {\n        \"merge-plugin\": {\n            \"include\": [\n                \"composer.local.json\"\n            ],\n            \"recurse\": true,\n            \"replace\": false,\n            \"ignore-duplicates\": false,\n            \"merge-dev\": true,\n            \"merge-extra\": false,\n            \"merge-extra-deep\": false,\n            \"merge-scripts\": false\n        }\n    }\n}\n```\n\nAdd into .gitignore:\n\n```\ncomposer.local.json\n```\n\n--\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgraphqlapi%2Fgraphql-api-for-wp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgraphqlapi%2Fgraphql-api-for-wp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgraphqlapi%2Fgraphql-api-for-wp/lists"}