# WPGraphQL is a WordPress plugin that adds a /graphql endpoint to the WordPress site and defines a GraphQL Schema based on internal WordPress registries such as the post type, taxonomy and settings registries. It includes the Schema, resolvers and a model layer for determining access to objects before resolving them. It is extendable by using WordPress hooks and filters via the add_action and add_filter functions. It follows phpcs standards defined in .phpcs.xml.dist. It uses composer to manage external dependencies such as graphql-php. It includes user interfaces in the WordPress admin dashboard for plugin settings and the GraphiQL IDE for interacting with the GraphQL Schema and testing queries and mutations.

## Frameworks and Technologies
- framework: wordpress
- language: php
- package-manager: composer
- testing-framework: phpunit (codeception, wp-graphql-testcase)
- coding-standards: phpcs
- api: graphql

## Key Concepts
- concept: "GraphQL Schema": "The structure that defines the types, queries, and mutations available in the WPGraphQL API"
- concept: "WordPress Registries": "Internal WordPress systems that store information about post types, taxonomies, and settings"
- concept: "Resolvers": "Functions that determine how to fetch and return data for specific GraphQL fields"
- concept: "Model Layer": "Classes that handle access control and data preparation before resolution"
- concept: "GraphiQL IDE": "An interactive development environment for testing GraphQL queries"

## File Patterns
- pattern: "src/Admin/*.php": "WordPress admin interface implementations"
- pattern: "src/Connection/*.php": "Classes handling GraphQL connections and pagination"
- pattern: "src/Data/*.php": "Data manipulation and transformation classes"
- pattern: "src/Model/*.php": "Model classes that handle data access and authorization"
- pattern: "src/Mutation/*.php": "Classes defining GraphQL mutations"
- pattern: "src/Registry/*.php": "Classes for registering types and fields"
- pattern: "src/Server/*.php": "Validation Rules and other configuration for the GraphQL Server"
- pattern: "src/Type/*.php": "GraphQL type definitions"
- pattern: "src/Utils/*.php": "Utility classes and helper functions"
- pattern: "tests/**/*.php": "PHPUnit test files"
- pattern: "access-functions.php": "Global access functions"
- pattern: "docs/*.md": "User documentation for the plugin"
- pattern: "cli/*.php": "WP-CLI commands for interacting with WPGraphQL using WP-CLI"
- pattern: "phpstan/*.php": "Stubs for use with phpstan for static analysis"
- pattern: "packages/**/*.js": "JavaScript packages that make up the GraphiQL IDE"
- pattern: ".wordpress-org/": "Files used for building and deploying the plugin to WordPress.org"

## Dependencies
- dependency: "webonyx/graphql-php": "Core GraphQL PHP implementation"
- dependency: "ivome/graphql-relay-php": "Relay specification implementation"
- dependency: "phpunit/phpunit": "Testing framework"
- dependency: "squizlabs/php_codesniffer": "Code style checking"
- dependency: "phpstan/phpstan": "Static analysis tool"
- dependency: "wp-coding-standards/wpcs": "WordPress Coding Standards"

## Common Code Patterns
```php
// Registering a GraphQL Type
add_action( 'graphql_register_types', function( $type_registry ) {

    register_graphql_object_type( 'TypeName', [
        'fields' => [
            'fieldName' => [
                'type' => 'String',
                'resolve' => function($source, $args, $context, $info) {
                    // Resolution logic
                }
            ]
        ]
    ]);

});

// Registering a GraphQL Field
add_action( 'graphql_register_types', function( $type_registry ) {

    register_graphql_field( 'TypeName', 'FieldName', [
        'description' => __( 'Description of the field', 'your-textdomain' ),
        'type' => 'String',
        'resolve' => function() {
            // interact with the WordPress database, or even an external API or whatever.
            return 'value retrieved from WordPress, or elsewhere';
        }
    ]);

});
```

## Key Directories
- directory: "src/": "Core plugin source code"
- directory: "includes/": "Plugin includes and utilities"
- directory: "tests/": "Test files"
- directory: "docs/": "Documentation"
- directory: "languages/": "Translation files"
- directory: ".github/": "Files used for interacting with GitHub"
- directory ".wordpress-org/": "Files used for building and deploying the plugin to WordPress.org"
- directory "build/": "Contains the built assets for the GraphiQL IDE"
- directory "bin/": "Contains scripts used in CI"
- directory "docker/": "Contains configuration for running WPGraphQL in Docker"
- directory "img": "Contains images used in documentation"
- directory: "phpstan/": "PHPStan configuration and stubs"

## Important Files
- file: "wp-graphql.php": "Main plugin file"
- file: "composer.json": "Dependency management"
- file: ".phpcs.xml.dist": "PHP CodeSniffer configuration"
- file: "phpunit.xml.dist": "PHPUnit configuration"
- file: "access-functions.php": "Global access functions"
- file: "phpstan.neon.dist": "PHPStan configuration"
- file: "docker-compose.yml": "Docker environment configuration"
- file: ".wordpress-org/blueprints/blueprint.json": "Blueprint for running WPGraphQL in WordPress Playground, a WASM environment that runs WordPress fully in the browser"

## Debug Tools
- concept: "GraphQL Debug Mode": "Enable via WPGraphQL Settings or define('GRAPHQL_DEBUG', true)"
- concept: "Query Logs": "Logs the SQL queries to fulfil a graphql request. Requires Query Monitor to be active. Enabled via WPGraphQL Settings and available in GraphiQL when debug mode is enabled"
- concept: "Query Tracing": "Shows trace data for resolvers (i.e. timing for execution). Enabled via WPGraphQL Settings and available in GraphiQL when debug mode is enabled"