self::get_input_fields(), 'outputFields' => self::get_output_fields(), 'mutateAndGetPayload' => self::mutate_and_get_payload(), ] ); } /** * Defines the mutation input field configuration. * * @return array> */ public static function get_input_fields() { return array_merge( CommentCreate::get_input_fields(), [ 'id' => [ 'type' => [ 'non_null' => 'ID', ], 'description' => static function () { return __( 'The ID of the comment being updated.', 'wp-graphql' ); }, ], ] ); } /** * Defines the mutation output field configuration. * * @return array> */ public static function get_output_fields() { return CommentCreate::get_output_fields(); } /** * Defines the mutation data modification closure. * * @return callable(array$input,\WPGraphQL\AppContext $context,\GraphQL\Type\Definition\ResolveInfo $info):array */ public static function mutate_and_get_payload() { return static function ( $input, AppContext $context, ResolveInfo $info ) { // Get the database ID for the comment. $comment_id = ! empty( $input['id'] ) ? Utils::get_database_id_from_id( $input['id'] ) : null; // Get the args from the existing comment. $comment_args = ! empty( $comment_id ) ? get_comment( $comment_id, ARRAY_A ) : null; if ( empty( $comment_id ) || empty( $comment_args ) ) { throw new UserError( esc_html__( 'The Comment could not be updated', 'wp-graphql' ) ); } $user_id = $comment_args['user_id'] ?? null; $raw_comment_args = $comment_args; // Prevent comment updates by default. $not_allowed = true; // If the current user can moderate comments, allow. if ( current_user_can( 'moderate_comments' ) ) { $not_allowed = false; } else { // If the current user is the comment author, allow (but not for status changes). $current_user_id = absint( get_current_user_id() ); if ( 0 !== $current_user_id && absint( $user_id ) === $current_user_id ) { $not_allowed = false; } } if ( true === $not_allowed ) { throw new UserError( esc_html__( 'Sorry, you are not allowed to update this comment.', 'wp-graphql' ) ); } // Only users with moderate_comments may change moderation status (status/approved). $attempting_status_change = isset( $input['status'] ) || array_key_exists( 'approved', $input ); if ( $attempting_status_change && ! current_user_can( 'moderate_comments' ) ) { throw new UserError( esc_html__( 'Sorry, you are not allowed to change the moderation status of this comment.', 'wp-graphql' ) ); } /** * Map all of the args from GraphQL to WordPress friendly args array */ CommentMutation::prepare_comment_object( $input, $comment_args, 'update', true ); // If there are no changes between the existing comment and the incoming comment if ( $comment_args === $raw_comment_args ) { throw new UserError( esc_html__( 'No changes have been provided to the comment.', 'wp-graphql' ) ); } /** * Update comment * $success int 1 on success and 0 on fail */ $success = wp_update_comment( $comment_args, true ); /** * Throw an exception if the comment failed to be created */ if ( is_wp_error( $success ) ) { throw new UserError( esc_html( $success->get_error_message() ) ); } /** * This updates additional data not part of the comments table ( commentmeta, other relations, etc ) * * The input for the commentMutation will be passed, along with the $new_comment_id for the * comment that was created so that relations can be set, meta can be updated, etc. */ CommentMutation::update_additional_comment_data( $comment_id, $input, 'create', $context, $info ); /** * Return the comment object */ return [ 'id' => $comment_id, 'success' => (bool) $success, ]; }; } }