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 
<?php

namespace WPGraphQL\Type\MediaItem\Mutation;

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

/**
 * Class MediaItemUpdate
 *
 * @package WPGraphQL\Type\PostObject\Mutation
 */
class MediaItemUpdate {

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

    /**
     * Defines the update mutation for MediaItems
     *
     * @param \WP_Post_Type $post_type_object
     *
     * @return array|mixed
     */
    public static function mutate( \WP_Post_Type $post_type_object ) {

        /**
         * Set the name of the mutation being performed
         */
        $mutation_name = 'UpdateMediaItem';

        self::$mutation['mediaItem'] = Relay::mutationWithClientMutationId([
            'name'                => esc_html( $mutation_name ),
            'description'         => __( 'Updates mediaItem objects', 'wp-graphql' ),
            'inputFields'         => self::input_fields( $post_type_object ),
            'outputFields'        => [
                'mediaItem' => [
                    'type'    => Types::post_object( $post_type_object->name ),
                    'resolve' => function( $payload ) {
                        return get_post( $payload['postObjectId'] );
                    },
                ],
            ],
            'mutateAndGetPayload' => function( $input ) use ( $post_type_object, $mutation_name ) {

                $id_parts      = ! empty( $input['id'] ) ? Relay::fromGlobalId( $input['id'] ) : null;
                $existing_media_item = get_post( absint( $id_parts['id'] ) );

                /**
                 * If there's no existing mediaItem, throw an exception
                 */
                if ( null === $existing_media_item ) {
                    throw new UserError( __( 'No mediaItem with that ID could be found to update', 'wp-graphql' ) );
                } else {
                    $author_id = $existing_media_item->post_author;
                }

                /**
                 * Stop now if the post isn't a mediaItem
                 */
                if ( $post_type_object->name !== $existing_media_item->post_type ) {
                    // translators: The placeholder is the ID of the mediaItem being edited
                    throw new UserError( sprintf( __( 'The id %1$d is not of the type mediaItem', 'wp-graphql' ), $id_parts['id'] ) );
                }

                /**
                 * Stop now if a user isn't allowed to edit mediaItems
                 */
                if ( ! current_user_can( $post_type_object->cap->edit_posts ) ) {
                    throw new UserError( __( 'Sorry, you are not allowed to update mediaItems', 'wp-graphql' ) );
                }

                /**
                 * If the mutation is setting the author to be someone other than the user making the request
                 * make sure they have permission to edit others posts
                 **/
                if ( ! empty( $input['authorId'] ) ) {
                    $author_id_parts = Relay::fromGlobalId( $input['authorId'] );
                    $author_id = $author_id_parts['id'];
                }

                /**
                 * Check to see if the existing_media_item author matches the current user,
                 * if not they need to be able to edit others posts to proceed
                 */
                if ( get_current_user_id() !== $author_id && ! current_user_can( $post_type_object->cap->edit_others_posts ) ) {
                    throw new UserError( __( 'Sorry, you are not allowed to update mediaItems as this user.', 'wp-graphql' ) );
                }

                /**
                 * insert the post object and get the ID
                 */
                $post_args = MediaItemMutation::prepare_media_item( $input, $post_type_object, $mutation_name, false );
                $post_args['ID'] = absint( $id_parts['id'] );
                $post_args['post_author'] = $author_id;

                /**
                 * Insert the post and retrieve the ID
                 *
                 * This will not fail as long as we have an ID in $post_args
                 * Thanks to the validation above we will always have the ID
                 */
                $post_id = wp_update_post( wp_slash( (array) $post_args ), true );

                /**
                 * This updates additional data not part of the posts table (postmeta, terms, other relations, etc)
                 *
                 * The input for the postObjectMutation will be passed, along with the $new_post_id for the
                 * postObject that was updated so that relations can be set, meta can be updated, etc.
                 */
                MediaItemMutation::update_additional_media_item_data( $post_id, $input, $post_type_object, $mutation_name );

                /**
                 * Return the payload
                 */
                return [
                    'postObjectId' => $post_id,
                ];

            },
        ]);

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

    }

    /**
     * Add the id as a nonNull field for update mutations
     *
     * @param \WP_Post_Type $post_type_object
     *
     * @return array
     */
    private static function input_fields( $post_type_object ) {

        /**
         * Update mutations require an ID to be passed
         */
        return array_merge(
            [
                'id' => [
                    'type'        => Types::non_null( Types::id() ),
                    // translators: the placeholder is the name of the type of post object being updated
                    'description' => sprintf( __( 'The ID of the %1$s object', 'wp-graphql' ), $post_type_object->graphql_single_name ),
                ],
            ],
            MediaItemMutation::input_fields( $post_type_object )
        );

    }

}
API documentation generated by ApiGen