count_users() WP 3.0
Считает общее количество пользователей, разделяя их по ролям (администраторы, подписчики).
1 раз — 0.0375981 сек (тормоз) | 50000 раз — 1750.27 сек (тормоз) | PHP 7.3.12, WP 5.4
Возвращает
Массив. Данные о количестве пользователей. Массив такого вида:
Array(
[total_users] => 2
[avail_roles] => Array(
[administrator] => 1
[subscriber] => 1
)
)
Использование
$counts = count_users( $strategy );
- $strategy(строка)
- Может быть:
time
или memory
.
По умолчанию: 'time'
- $site_id(число) (c версии 4.9)
- ID сайта, для мультисайт режима.
По умолчанию: null
Примеры
#1. Пример, вывода записи о количестве пользователей в разрезе их ролей:
$result = count_users();
echo 'На сайте пользователей - '. $result['total_users'] . ', среди которых: ';
foreach( $result['avail_roles'] as $role => $count ){
echo ( ++$i > 1 ? ', ' : ' ' ) . $role .' - '. $count;
}
echo '.';
В результате мы получит такую надпись:
На сайте пользователей - 2, среди которых: administrator - 1, subscriber - 1.
#2 Что выводит функция
print_r( count_users() );
/*
Array (
[total_users] => 474
[avail_roles] => Array (
[administrator] => 1
[subscriber] => 473
[none] => 0
)
)
*/
Заметки
- Global. wpdb. $wpdb WordPress database abstraction object.
Список изменений
С версии 3.0.0 |
Введена. |
С версии 4.4.0 |
The number of users with no role is now included in the none element. |
С версии 4.9.0 |
The $site_id parameter was added to support multisite. |
Код count_users() count users
WP 5.6.2
<?php
function count_users( $strategy = 'time', $site_id = null ) {
global $wpdb;
// Initialize.
if ( ! $site_id ) {
$site_id = get_current_blog_id();
}
/**
* Filters the user count before queries are run.
*
* Return a non-null value to cause count_users() to return early.
*
* @since 5.1.0
*
* @param null|string $result The value to return instead. Default null to continue with the query.
* @param string $strategy Optional. The computational strategy to use when counting the users.
* Accepts either 'time' or 'memory'. Default 'time'.
* @param int|null $site_id Optional. The site ID to count users for. Defaults to the current site.
*/
$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();
}
// Build a CPU-intensive query that will return concise information.
$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 );
// Add the meta_value index to the selection list, then run the query.
$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
);
// Run the previous loop again to associate results with role names.
$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++ ];
// Get the meta_value index from the end of the result set.
$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;
}
Cвязанные функции