Функция COUNT_USERS() в WordPress: справка и примеры использования

Функция COUNT_USERS() в WordPress

Функция count_users() позволяет подсчитать количество пользователей с различными ролями в WordPress. Данная функция полезна для администраторов сайтов, которые хотят знать, сколько пользователей зарегистрировано на их сайте и к каким ролям они принадлежат.

Основные сведения

Функция count_users() имеет некоторые предположения:

  • Нет дублирующихся или "сиротских" значений мета-данных.
  • Имена ролей уникальны.

Для обработки значительного количества пользователей можно использовать два разных подхода:

  • Если выбрать стратегию time, функция будет медленной при больших объемах данных.
  • Если выбрать стратегию memory, это потребует большего объема памяти.

Примеры времени выполнения

  • Используя стратегию time: 0.0375981 секунды на 1 исполнение (очень медленно).
  • Используя стратегию memory: 50000 исполнений займут 1750.27 секунд (очень медленно).

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

Функция возвращает массив с количеством пользователей, который содержит:

  • total_users: общее количество пользователей.
  • avail_roles: массив, в котором указано количество пользователей по ролям.

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

Вот как вы можете использовать функцию:

count_users( $strategy, $site_id );
  • $strategy (строка): Стратегия вычисления. Значения могут быть 'time' или 'memory'. Значение по умолчанию: 'time'.
  • $site_id (int|null): ID сайта, для которого нужно подсчитать пользователей. Значение по умолчанию: текущий сайт.

Примеры

Пример 1: Подсчет пользователей

$result = count_users();

$roles = [];
foreach( $result['avail_roles'] as $role => $count ){
    $roles[] = "{$role} ({$count})";
}

echo sprintf( 'Всего пользователей на сайте: %s, включая: %s.', 
    $result['total_users'], implode( ', ', $roles )
);

Результат: "Всего пользователей на сайте: 2, включая: администратор (1), подписчик (1)."

Пример 2: Вывод результата

print_r( count_users() );

Вывод:

Array (
    [total_users] => 474
    [avail_roles] => Array (
        [administrator] => 1
        [subscriber] => 473
        [none] => 0
    )
)

Заметки

  • Функция использует глобальный объект базы данных WordPress $wpdb для выполнения запросов к базе данных.

Изменения

  • С версии 3.0.0: Функция была введена.
  • С версии 4.4.0: Количество пользователей без роли теперь включено в элемент none.
  • С версии 4.9.0: Параметр $site_id был добавлен для поддержки мультисайтов.

Код функции

Вот код функции count_users():


function count_users( $strategy = 'time', $site_id = null ) {
global $wpdb;

// Инициализация.
if ( ! $site_id ) {
    $site_id = get_current_blog_id();
}

$pre = apply_filters( 'pre_count_users', null, $strategy, $site_id );

if ( null !== $pre ) {
    return $pre;
}

$blog_prefix = $wpdb->get_blog_prefix( $site_id );
$result      = array();

if ( 'time' === $strategy ) {
    if ( is_multisite() && get_current_blog_id() !== $site_id ) {
        switch_to_blog( $site_id );
        $avail_roles = wp_roles()->get_names();
        restore_current_blog();
    } else {
        $avail_roles = wp_roles()->get_names();
    }

    // Строим запрос, который потребляет много CPU.
    $select_count = array();
    foreach ( $avail_roles as $this_role => $name ) {
        $select_count[] = $wpdb->prepare( 'COUNT(NULLIF(meta_value LIKE %s, false))', '%' . $wpdb->esc_like( '"' . $this_role . '"' ) . '%' );
    }
    $select_count[] = "COUNT(NULLIF(meta_value = 'a:0:{}', false))";
    $select_count   = implode( ', ', $select_count );

    // Запускаем запрос.
    $row = $wpdb->get_row(
        "
        SELECT {$select_count}, COUNT(*)
        FROM {$wpdb->usermeta}
        INNER JOIN {$wpdb->users} ON user_id = ID
        WHERE meta_key = '{$blog_prefix}capabilities'
    ",
        ARRAY_N
    );

    // Обрабатываем результаты.
    $col         = 0;
    $role_counts = array();
    foreach ( $avail_roles as $this_role => $name ) {
        $count = (int) $row[ $col++ ];
        if ( $count > 0 ) {
            $role_counts[ $this_role ] = $count;
        }
    }

    $role_counts['none'] = (int) $row[ $col++ ];
    $total_users = (int) $row[ $col ];

    $result['total_users'] = $total_users;
    $result['avail_roles'] =& $role_counts;
} else {
    $avail_roles = array(
        'none' => 0,
    );

    $users_of_blog = $wpdb->get_col(
        "
        SELECT meta_value
        FROM {$wpdb->usermeta}
        INNER JOIN {$wpdb->users} ON user_id = ID
        WHERE meta_key = '{$blog_prefix}capabilities'
    "
    );

    foreach ( $users_of_blog as $caps_meta ) {
        $b_roles = maybe_unserialize( $caps_meta );
        if ( ! is_array( $b_roles ) ) {
            continue;
        }
        if ( empty( $b_roles ) ) {
            ++$avail_roles['none'];
        }
        foreach ( $b_roles as $b_role => $val ) {
            if ( isset( $avail_roles[ $b_role ] ) ) {
                ++$avail_roles[ $b_role ];
            } else {
                $avail_roles[ $b_role ] = 1;
            }
        }
    }

    $result['total_users'] = count( $users_of_blog );
    $result['avail_roles'] =& $avail_roles;
}

return $result;

}

Заключение

Функция count_users() в WordPress — это мощный инструмент для администраторов, позволяющий легко подсчитывать количество пользователей и их роли. Понимание этой функции может помочь улучшить управление пользователями на вашем сайте.

Leave a Reply

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