Функция WP_DELETE_USER() │ WP 2.0.0: удаление пользователя и переназначение сообщений

## Функция WP_DELETE_USER() │ WP 2.0.0

Функция WP_DELETE_USER() используется для удаления пользователя и, при необходимости, переназначения его сообщений и ссылок другому пользователю.

Обратите внимание: в установке Multisite пользователь удаляется только с текущего сайта, но ост��ется в базе данных.

Если параметр $reassign не указан, все сообщения пользователя будут удалены. Данная функция выполняет хук delete_user, который вызывается после переназначения сообщений или их удаления. Также будет удалена пользовательская метаинформация для этого пользователя.

### Хуки функции

- delete_user
- post_types_to_delete_with_user
- deleted_user

### Возвращаемое значение

Эта функция возвращает true или false. true означает, что пользователь успешно удален.

### Использование

```php
wp_delete_user( $id, $reassign );
  • $id (int) (обязательный) — ID пользователя.
  • $reassign (int) — ID нового пользователя для переназначения сообщений и ссылок.
    • По умолчанию: null.

Примеры

Пример 1: Удаление пользователя и перенос сообщений

Этот пример удаляет пользователя с ID 2 и переносит все его сообщения к пользователю с ID 4:

$id     = 2;
$new_id = 4;

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

if( $del ){
    echo "Пользователь $id был удален! Автором всех его сообщений стал пользователь $new_id.";
}
else {
    echo "Не удалось удалить пользователя. Возможно, он не существует.";
}

Пример 2: Позволяем пользователям удалять свои аккаунты

Этот код позволяет пользователям, которые вошли в систему, удалить свои аккаунты:

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

/**
 * Удаляет вошедшего пользователя.
 */
function wpdocs_remove_logged_in_user() {
    // Проверка, что пользователь действительно хочет выполнить это действие.
    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 );
}

Пример 3: Удаление пользователя на основе мета-ключей

Этот пример демонстрирует, как удалить пользователя на основе определенных мета-ключей:

$site_id     = 123;
$client_id   = 1;
$mem_id      = 2;

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

// Получаем пользователя на основе нескольких мета-ключей
$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( $user );

// Если пользователь найден
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" );
}

Заметки

  • Глобальная переменная: wpdb — объект абстракции базы данных WordPress.

Изменения

Функция была введена в версии 2.0.0.

Код функции WP_DELETE_USER()

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;
    }

    // Нормализуем $reassign до null или ID пользователя.
    if ( 'novalue' === $reassign ) {
        $reassign = null;
    } elseif ( null !== $reassign ) {
        $reassign = (int) $reassign;
    }

    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;
            }
        }

        $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 );
            }
        }

        // Удаление ссылок.
        $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 );
            }
        }
    }

    // Наконец, удаляем пользователя.
    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 );

    do_action( 'deleted_user', $id, $reassign, $user );

    return true;
}

Связанные функции

  • register_new_user()
  • wp_create_user()
  • wp_insert_user()
  • wp_new_user_notification()
  • wp_update_user()

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *