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 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 
<?php

namespace WPGraphQL\Type\TermObject\Mutation;

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

class TermObjectUpdate {

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

    /**
     * Defines the update 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 ] ) ) :

            $mutation_name = 'Update' . 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 post type being updated
                'description'         => sprintf( esc_html__( 'Updates %1$s objects', 'wp-graphql' ), $taxonomy->graphql_single_name ),
                'inputFields'         => self::input_fields( $taxonomy ),
                'outputFields'        => [
                    $taxonomy->graphql_single_name => [
                        'type'    => Types::term_object( $taxonomy->name ),
                        'resolve' => function( $payload ) use ( $taxonomy ) {
                            return get_term( $payload['term_id'], $taxonomy->name );
                        },
                    ],
                ],
                'mutateAndGetPayload' => function( $input ) use ( $taxonomy, $mutation_name ) {

                    /**
                     * Get the ID parts
                     */
                    $id_parts      = ! empty( $input['id'] ) ? Relay::fromGlobalId( $input['id'] ) : null;

                    /**
                     * Ensure the type for the Global ID matches the type being mutated
                     */
                    if ( empty( $id_parts['type'] ) || $taxonomy->name !== $id_parts['type'] ) {
                        // Translators: The placeholder is the name of the taxonomy for the term being edited
                        throw new UserError( sprintf( __( 'The ID passed is not for a %1$s object', 'wp-graphql' ), $taxonomy->graphql_single_name ) );
                    }

                    /**
                     * Get the existing term
                     */
                    $existing_term = get_term( absint( $id_parts['id'] ), $taxonomy->name );

                    /**
                     * If there was an error getting the existing term, return the error message
                     */
                    if ( is_wp_error( $existing_term ) ) {
                        $error_message = $existing_term->get_error_message();
                        if ( ! empty( $error_message ) ) {
                            throw new UserError( esc_html( $error_message ) );
                        } else {
                            // Translators: The placeholder is the name of the taxonomy for the term being deleted
                            throw new UserError( sprintf( __( 'The %1$s failed to update', 'wp-graphql' ), $taxonomy->name ) );
                        }
                    }

                    /**
                     * Ensure the user has permission to edit terms
                     */
                    if ( ! current_user_can( 'edit_term', $existing_term->term_id ) ) {
                        // Translators: The placeholder is the name of the taxonomy for the term being deleted
                        throw new UserError( sprintf( __( 'You do not have permission to update %1$s', 'wp-graphql' ), $taxonomy->graphql_plural_name ) );
                    }

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

                    if ( ! empty( $args ) ) {

                        /**
                         * Update the term
                         */
                        $update = wp_update_term( $existing_term->term_id, $taxonomy->name, wp_slash( (array) $args ) );

                        /**
                         * Respond with any errors
                         */
                        if ( is_wp_error( $update ) ) {
                            // Translators: the placeholder is the name of the taxonomy
                            throw new UserError( sprintf( __( 'The %1$s failed to update', 'wp-graphql' ), $taxonomy->name ) );
                        }
                    }

                    /**
                     * Fires an action when a term is updated via a GraphQL Mutation
                     *
                     * @param int $term_id The ID of the term object that was mutated
                     * @param array $args The args used to update the term
                     * @param string $mutation_name The name of the mutation being performed (create, update, delete, etc)
                     */
                    do_action( "graphql_update_{$taxonomy->name}", $existing_term->term_id, $args, $mutation_name );

                    /**
                     * Return the payload
                     */
                    return [
                        'term_id' => $existing_term->term_id,
                    ];

                },
            ] );

        endif; // End if().

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

    }

    /**
     * Add the id as an optional field for update 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::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 ),
                ],
                'id' => [
                    'type' => Types::non_null( Types::id() ),
                    // Translators: The placeholder is the taxonomy of the term being updated
                    'description' => sprintf( __( 'The ID of the %1$s object to update', 'wp-graphql' ), $taxonomy->graphql_single_name ),
                ],
            ],
            TermObjectMutation::input_fields( $taxonomy )
        );

    }

}
API documentation generated by ApiGen