Функция 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 — это мощный инструмент для администраторов, позволяющий легко подсчитывать количество пользователей и их роли. Понимание этой функции может помочь улучшить управление пользователями на вашем сайте.