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
<?php
namespace WPGraphQL\Type\User\Mutation;
use GraphQL\Error\UserError;
use GraphQLRelay\Relay;
use WPGraphQL\Types;
class UserDelete {
private static $mutation;
public static function mutate() {
if ( empty( self::$mutation ) ) {
self::$mutation = Relay::mutationWithClientMutationId( [
'name' => 'DeleteUser',
'description' => __( 'Delete a user object', 'wp-graphql' ),
'inputFields' => [
'id' => [
'type' => Types::non_null( Types::id() ),
'description' => __( 'The ID of the user you want to delete', 'wp-graphql' ),
],
'reassignId' => [
'type' => Types::id(),
'description' => __( 'Reassign posts and links to new User ID.', 'wp-graphql' ),
]
],
'outputFields' => [
'deletedId' => [
'type' => Types::id(),
'description' => __( 'The ID of the user that you just deleted', 'wp-graphql' ),
'resolve' => function( $payload ) {
$deleted = (object) $payload['userObject'];
return ( ! empty( $deleted->ID ) ) ? Relay::toGlobalId( 'user', $deleted->ID ) : null;
}
],
'user' => [
'type' => Types::user(),
'description' => __( 'The user object for the user you are trying to delete', 'wp-graphql' ),
'resolve' => function( $payload ) {
$deleted = (object) $payload['userObject'];
return ( ! empty( $deleted ) ) ? $deleted : null;
}
]
],
'mutateAndGetPayload' => function( $input ) {
$id_parts = Relay::fromGlobalId( $input['id'] );
if ( ! current_user_can( 'delete_users' ) ) {
throw new UserError( __( 'Sorry, you are not allowed to delete users.', 'wp-graphql' ) );
}
$user_before_delete = get_user_by( 'id', absint( $id_parts['id'] ) );
if ( false === $user_before_delete ) {
throw new UserError( __( 'Could not find an existing user to delete', 'wp-graphql' ) );
}
$reassign_id_parts = ( ! empty( $input['reassignId'] ) ) ? Relay::fromGlobalId( $input['reassignId'] ) : null;
$reassign_id = ( ! empty( $reassign_id_parts ) ) ? absint( $reassign_id_parts['id'] ) : null;
if ( ! function_exists( 'wp_delete_user' ) ) {
require_once( ABSPATH . 'wp-admin/includes/user.php' );
}
if ( is_multisite() ) {
$deleted_user = wpmu_delete_user( absint( $id_parts['id'] ) );
} else {
$deleted_user = wp_delete_user( absint( $id_parts['id'] ), $reassign_id );
}
if ( true !== $deleted_user ) {
throw new UserError( __( 'Could not delete the user.', 'wp-grapgql' ) );
}
return [
'userObject' => $user_before_delete,
];
}
] );
}
return ( ! empty( self::$mutation ) ) ? self::$mutation : null;
}
}