wp_delete_user()WP 2.0.0

Deletes a user. If desired, transfers posts and links to another user.

The metadata of the deleted user is also removed.

On the front end, requires the inclusion of the file:

require_once ABSPATH . 'wp-admin/includes/user.php';
  • delete_user - triggers BEFORE the user is deleted and their posts are deleted/reassigned.

  • deleted_user - triggers AFTER the user has been deleted and their posts have been deleted/reassigned.

Returns

true|false. true — successfully deleted. false — failed to delete.

Usage

wp_delete_user( $id, $reassign );
$id(integer) (required)
ID of the user to be deleted.
$reassign(integer)
ID of the user to whom all posts and links of the deleted user should be transferred.
If this parameter is not specified, all posts of the deleted user will also be deleted.
Default: null

Examples

0

#1 Delete user 2 and transfer all his posts to user 4

We will display a message about the deletion:

$id     = 2;
$new_id = 4;

$del = wp_delete_user( $id, $new_id );

if( $del ){
	echo "User $id was deleted! The author of all his posts become the user $new_id.";
}
else {
	echo "Failed to remove user. Maybe it doesn't exist.";
}
0

#2 Allow users to terminate their user accounts.

if ( is_user_logged_in() && ! empty( $_GET['DeleteMyAccount'] ) ) {
	add_action( 'init', 'wpdocs_remove_logged_in_user' );
}

/**
 * Remove the logged in user.
 */
function wpdocs_remove_logged_in_user() {
	// Verify that the user intended to take this action.
	if ( ! wp_verify_nonce( 'delete_account' ) ) {
		return;
	}

	require_once( ABSPATH.'wp-admin/includes/user.php' );
	$current_user = wp_get_current_user();
	wp_delete_user( $current_user->ID );
}
0

#3 Delete User based on some meta keys

/**
 * Delete User based on some meta keys
 * Check For Deletion Status if it is 1 then user is deleted
 */
$site_id     = 123;
$client_id   = 1;
$mem_id      = 2;

require_once ABSPATH.'wp-admin/includes/user.php';

// get single user based on multiple meta keys
$user = get_users( [
	'role'       => 'subscriber',
	'count_total'=> false,
	'number'     => 1,
	'meta_query' => array(
		array(
			'key'     => 'mb_client_id',
			'value'   => $client_id,
		),
		array(
			'key'     => 'mb_site_id',
			'value'   => $site_id,
		),
		array(
			'key'     => 'mb_membership_id',
			'value'   => $mem_id,
		)
	)
] );

$user = reset( $users );

// If user exists
if ( $user ) {

	$response = wp_delete_user( $user->ID );

	if ( $response == 1 ) {
		return array(
			'code'   => 'valid_data',
			'data'   => array(
				'status' => 200,
			)
		);
	}
	else {
		wp_die( "user_not_deleted" );
	}
}
else {
	wp_die( "user_not_deleted" );
}

Notes

  • Global. wpdb. $wpdb WordPress database abstraction object.

Changelog

Since 2.0.0 Introduced.

wp_delete_user() code WP 6.8.3

function wp_delete_user( $id, $reassign = null ) {
	global $wpdb;

	if ( ! is_numeric( $id ) ) {
		return false;
	}

	$id   = (int) $id;
	$user = new WP_User( $id );

	if ( ! $user->exists() ) {
		return false;
	}

	// Normalize $reassign to null or a user ID. 'novalue' was an older default.
	if ( 'novalue' === $reassign ) {
		$reassign = null;
	} elseif ( null !== $reassign ) {
		$reassign = (int) $reassign;
	}

	/**
	 * Fires immediately before a user is deleted from the site.
	 *
	 * Note that on a Multisite installation the user only gets removed from the site
	 * and does not get deleted from the database.
	 *
	 * @since 2.0.0
	 * @since 5.5.0 Added the `$user` parameter.
	 *
	 * @param int      $id       ID of the user to delete.
	 * @param int|null $reassign ID of the user to reassign posts and links to.
	 *                           Default null, for no reassignment.
	 * @param WP_User  $user     WP_User object of the user to delete.
	 */
	do_action( 'delete_user', $id, $reassign, $user );

	if ( null === $reassign ) {
		$post_types_to_delete = array();
		foreach ( get_post_types( array(), 'objects' ) as $post_type ) {
			if ( $post_type->delete_with_user ) {
				$post_types_to_delete[] = $post_type->name;
			} elseif ( null === $post_type->delete_with_user && post_type_supports( $post_type->name, 'author' ) ) {
				$post_types_to_delete[] = $post_type->name;
			}
		}

		/**
		 * Filters the list of post types to delete with a user.
		 *
		 * @since 3.4.0
		 *
		 * @param string[] $post_types_to_delete Array of post types to delete.
		 * @param int      $id                   User ID.
		 */
		$post_types_to_delete = apply_filters( 'post_types_to_delete_with_user', $post_types_to_delete, $id );
		$post_types_to_delete = implode( "', '", $post_types_to_delete );
		$post_ids             = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_author = %d AND post_type IN ('$post_types_to_delete')", $id ) );
		if ( $post_ids ) {
			foreach ( $post_ids as $post_id ) {
				wp_delete_post( $post_id );
			}
		}

		// Clean links.
		$link_ids = $wpdb->get_col( $wpdb->prepare( "SELECT link_id FROM $wpdb->links WHERE link_owner = %d", $id ) );

		if ( $link_ids ) {
			foreach ( $link_ids as $link_id ) {
				wp_delete_link( $link_id );
			}
		}
	} else {
		$post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_author = %d", $id ) );
		$wpdb->update( $wpdb->posts, array( 'post_author' => $reassign ), array( 'post_author' => $id ) );
		if ( ! empty( $post_ids ) ) {
			foreach ( $post_ids as $post_id ) {
				clean_post_cache( $post_id );
			}
		}
		$link_ids = $wpdb->get_col( $wpdb->prepare( "SELECT link_id FROM $wpdb->links WHERE link_owner = %d", $id ) );
		$wpdb->update( $wpdb->links, array( 'link_owner' => $reassign ), array( 'link_owner' => $id ) );
		if ( ! empty( $link_ids ) ) {
			foreach ( $link_ids as $link_id ) {
				clean_bookmark_cache( $link_id );
			}
		}
	}

	// FINALLY, delete user.
	if ( is_multisite() ) {
		remove_user_from_blog( $id, get_current_blog_id() );
	} else {
		$meta = $wpdb->get_col( $wpdb->prepare( "SELECT umeta_id FROM $wpdb->usermeta WHERE user_id = %d", $id ) );
		foreach ( $meta as $mid ) {
			delete_metadata_by_mid( 'user', $mid );
		}

		$wpdb->delete( $wpdb->users, array( 'ID' => $id ) );
	}

	clean_user_cache( $user );

	/**
	 * Fires immediately after a user is deleted from the site.
	 *
	 * Note that on a Multisite installation the user may not have been deleted from
	 * the database depending on whether `wp_delete_user()` or `wpmu_delete_user()`
	 * was called.
	 *
	 * @since 2.9.0
	 * @since 5.5.0 Added the `$user` parameter.
	 *
	 * @param int      $id       ID of the deleted user.
	 * @param int|null $reassign ID of the user to reassign posts and links to.
	 *                           Default null, for no reassignment.
	 * @param WP_User  $user     WP_User object of the deleted user.
	 */
	do_action( 'deleted_user', $id, $reassign, $user );

	return true;
}