Overview
  • Namespace
  • Class

Namespaces

  • WPGraphQL
    • Data
    • Type
      • Avatar
      • Comment
        • Connection
      • CommentAuthor
      • EditLock
      • Enum
      • MediaItem
        • Mutation
      • Plugin
        • Connection
      • PostObject
        • Connection
        • Mutation
      • PostType
      • Setting
      • Taxonomy
      • TermObject
        • Connection
        • Mutation
      • Theme
        • Connection
      • Union
      • User
        • Connection
        • Mutation
    • Utils

Classes

  • WPGraphQL\AppContext
  • WPGraphQL\Data\Config
  • WPGraphQL\Data\ConnectionResolver
  • WPGraphQL\Data\DataSource
  • WPGraphQL\Data\Loader
  • WPGraphQL\Router
  • WPGraphQL\Type\Avatar\AvatarType
  • WPGraphQL\Type\Comment\CommentQuery
  • WPGraphQL\Type\Comment\CommentType
  • WPGraphQL\Type\Comment\Connection\CommentConnectionArgs
  • WPGraphQL\Type\Comment\Connection\CommentConnectionDefinition
  • WPGraphQL\Type\Comment\Connection\CommentConnectionResolver
  • WPGraphQL\Type\CommentAuthor\CommentAuthorQuery
  • WPGraphQL\Type\CommentAuthor\CommentAuthorType
  • WPGraphQL\Type\EditLock\EditLockType
  • WPGraphQL\Type\Enum\MediaItemStatusEnumType
  • WPGraphQL\Type\Enum\MimeTypeEnumType
  • WPGraphQL\Type\Enum\PostObjectFieldFormatEnumType
  • WPGraphQL\Type\Enum\PostStatusEnumType
  • WPGraphQL\Type\Enum\PostTypeEnumType
  • WPGraphQL\Type\Enum\RelationEnumType
  • WPGraphQL\Type\Enum\TaxonomyEnumType
  • WPGraphQL\Type\MediaItem\MediaItemType
  • WPGraphQL\Type\MediaItem\Mutation\MediaItemCreate
  • WPGraphQL\Type\MediaItem\Mutation\MediaItemDelete
  • WPGraphQL\Type\MediaItem\Mutation\MediaItemMutation
  • WPGraphQL\Type\MediaItem\Mutation\MediaItemUpdate
  • WPGraphQL\Type\Plugin\Connection\PluginConnectionDefinition
  • WPGraphQL\Type\Plugin\Connection\PluginConnectionResolver
  • WPGraphQL\Type\Plugin\PluginQuery
  • WPGraphQL\Type\Plugin\PluginType
  • WPGraphQL\Type\PostObject\Connection\PostObjectConnectionArgs
  • WPGraphQL\Type\PostObject\Connection\PostObjectConnectionArgsDateQuery
  • WPGraphQL\Type\PostObject\Connection\PostObjectConnectionDefinition
  • WPGraphQL\Type\PostObject\Connection\PostObjectConnectionResolver
  • WPGraphQL\Type\PostObject\Mutation\PostObjectCreate
  • WPGraphQL\Type\PostObject\Mutation\PostObjectDelete
  • WPGraphQL\Type\PostObject\Mutation\PostObjectMutation
  • WPGraphQL\Type\PostObject\Mutation\PostObjectUpdate
  • WPGraphQL\Type\PostObject\Mutation\TermObjectDelete
  • WPGraphQL\Type\PostObject\PostObjectQuery
  • WPGraphQL\Type\PostObject\PostObjectType
  • WPGraphQL\Type\PostType\PostTypeType
  • WPGraphQL\Type\RootMutationType
  • WPGraphQL\Type\RootQueryType
  • WPGraphQL\Type\Setting\SettingQuery
  • WPGraphQL\Type\Setting\SettingType
  • WPGraphQL\Type\Taxonomy\TaxonomyType
  • WPGraphQL\Type\TermObject\Connection\TermObjectConnectionArgs
  • WPGraphQL\Type\TermObject\Connection\TermObjectConnectionDefinition
  • WPGraphQL\Type\TermObject\Connection\TermObjectConnectionResolver
  • WPGraphQL\Type\TermObject\Mutation\TermObjectCreate
  • WPGraphQL\Type\TermObject\Mutation\TermObjectMutation
  • WPGraphQL\Type\TermObject\Mutation\TermObjectUpdate
  • WPGraphQL\Type\TermObject\TermObjectQuery
  • WPGraphQL\Type\TermObject\TermObjectType
  • WPGraphQL\Type\Theme\Connection\ThemeConnectionDefinition
  • WPGraphQL\Type\Theme\Connection\ThemeConnectionResolver
  • WPGraphQL\Type\Theme\ThemeType
  • WPGraphQL\Type\Union\CommentAuthorUnionType
  • WPGraphQL\Type\Union\PostObjectUnionType
  • WPGraphQL\Type\Union\TermObjectUnionType
  • WPGraphQL\Type\User\Connection\UserConnectionArgs
  • WPGraphQL\Type\User\Connection\UserConnectionDefinition
  • WPGraphQL\Type\User\Connection\UserConnectionResolver
  • WPGraphQL\Type\User\Mutation\UserCreate
  • WPGraphQL\Type\User\Mutation\UserDelete
  • WPGraphQL\Type\User\Mutation\UserMutation
  • WPGraphQL\Type\User\Mutation\UserUpdate
  • WPGraphQL\Type\User\UserQuery
  • WPGraphQL\Type\User\UserType
  • WPGraphQL\Type\WPEnumType
  • WPGraphQL\Type\WPInputObjectType
  • WPGraphQL\Type\WPObjectType
  • WPGraphQL\Types
  • WPGraphQL\Utils\InstrumentSchema
  • WPGraphQL\WPSchema

Interfaces

  • WPGraphQL\Data\ConnectionResolverInterface
  1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 
<?php

namespace WPGraphQL\Type\TermObject\Mutation;

use GraphQL\Error\UserError;
use GraphQLRelay\Relay;
use WPGraphQL\Types;

class TermObjectCreate {

    /**
     * Holds the mutation field definition
     *
     * @var array $mutation
     */
    private static $mutation = [];

    /**
     * Defines the create mutation for TermObjects
     *
     * @param \WP_Taxonomy $taxonomy
     *
     * @return array|mixed
     */
    public static function mutate( \WP_Taxonomy $taxonomy ) {

        if ( ! empty( $taxonomy->graphql_single_name ) && empty( self::$mutation[ $taxonomy->graphql_single_name ] ) ) :

            /**
             * Set the name of the mutation being performed
             */
            $mutation_name = 'Create' . ucwords( $taxonomy->graphql_single_name );

            self::$mutation[ $taxonomy->graphql_single_name ] = Relay::mutationWithClientMutationId( [
                'name'                => esc_html( $mutation_name ),
                // translators: The placeholder is the name of the object type
                'description'         => sprintf( __( 'Create %1$s objects', 'wp-graphql' ), $taxonomy->name ),
                'inputFields'         => self::input_fields( $taxonomy ),
                'outputFields'        => [
                    $taxonomy->graphql_single_name => [
                        'type'    => Types::term_object( $taxonomy->name ),
                        // translators: Placeholder is the name of the taxonomy
                        'description' => sprintf( __( 'The created %s', 'wp-graphql' ), $taxonomy->name ),
                        'resolve' => function( $payload ) use ( $taxonomy ) {
                            return get_term( $payload['id'], $taxonomy->name );
                        },
                    ],
                ],
                'mutateAndGetPayload' => function( $input ) use ( $taxonomy, $mutation_name ) {

                    /**
                     * Ensure the user can edit_terms
                     */
                    if ( ! current_user_can( $taxonomy->cap->edit_terms ) ) {
                        // translators: the $taxonomy->graphql_plural_name placeholder is the name of the object being mutated
                        throw new UserError( sprintf( __( 'Sorry, you are not allowed to create %1$s', 'wp-graphql' ), $taxonomy->graphql_plural_name ) );
                    }

                    /**
                     * Prepare the object for insertion
                     */
                    $args = TermObjectMutation::prepare_object( $input, $taxonomy, $mutation_name );

                    /**
                     * Ensure a name was provided
                     */
                    if ( empty( $args['name'] ) ) {
                        // Translators: The placeholder is the name of the taxonomy of the term being mutated
                        throw new UserError( sprintf( __( 'A name is required to create a %1$s' ), $taxonomy->name ) );
                    }

                    /**
                     * Insert the term
                     */
                    $term = wp_insert_term( wp_slash( $args['name'] ), $taxonomy->name, wp_slash( (array) $args ) );

                    /**
                     * If it was an error, return the message as an exception
                     */
                    if ( is_wp_error( $term ) ) {
                        $error_message = $term->get_error_message();
                        if ( ! empty( $error_message ) ) {
                            throw new UserError( esc_html( $error_message ) );
                        } else {
                            throw new UserError( __( 'The object failed to update but no error was provided', 'wp-graphql' ) );
                        }
                    }

                    /**
                     * If the response to creating the term didn't respond with a term_id, throw an exception
                     */
                    if ( empty( $term['term_id'] ) ) {
                        throw new UserError( __( 'The object failed to create', 'wp-graphql' ) );
                    }

                    /**
                     * Fires after a single term is created or updated via a GraphQL mutation
                     *
                     * The dynamic portion of the hook name, `$taxonomy->name` refers to the taxonomy of the term being mutated
                     *
                     * @param int    $term_id       Inserted term object
                     * @param array  $args          The args used to insert the term
                     * @param string $mutation_name The name of the mutation being performed
                     */
                    do_action( "graphql_insert_{$taxonomy->name}", $term['term_id'], $args, $mutation_name );

                    return [
                        'id' => $term['term_id'],
                    ];

                },
            ] );

        endif; // End if().

        return ! empty( self::$mutation[ $taxonomy->graphql_single_name ] ) ? self::$mutation[ $taxonomy->graphql_single_name ] : null;
    }

    /**
     * Add the name as a nonNull field for create mutations
     *
     * @param \WP_Taxonomy $taxonomy
     *
     * @return array
     */
    private static function input_fields( $taxonomy ) {

        /**
         * Add name as a non_null field for term creation
         */
        return array_merge(
            [
                'name' => [
                    'type'        => Types::non_null( Types::string() ),
                    // Translators: The placeholder is the name of the taxonomy for the object being mutated
                    'description' => sprintf( __( 'The name of the %1$s object to mutate', 'wp-graphql' ), $taxonomy->name ),
                ],
            ],
            TermObjectMutation::input_fields( $taxonomy )
        );

    }

}
API documentation generated by ApiGen