count_users() WP 3.0.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
(число) (з версії 4.9)
ID сайту, для мультисайт режиму.


Типово: null

Приклади

1

#1 Що виводить функція

print_r(count_users());

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

#2 Приклад виведення запису про кількість користувачів у розрізі їх ролей:

$result = count_users();

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

echo sprintf( 'На сайті користувачів - %s, серед яких: %s.',
	$result['total_users'], implode( ', ', $roles )
);

В результаті ми отримаємо такий напис:

На сайті користувачів – 2, серед яких: administrator (1), subscriber (1).

нотатки

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

список змін

З версії 3.0.0Введено.
З версії 4.4.0Число користувачів, які не використовуються, є тепер включені в один елемент.
З версії 4.9.0$site_id parameter був added to support multisite.

Код count_users() WP 6.0.2

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

	// Initialize.
	if ( ! $site_id ) {
		$site_id = get_current_blog_id();
	}

	/**
	 * Filters 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 Зміна до відновлення instead. Default null to continue with the query.
	 * @param string $strategy Optional. Комп'ютерна стратегія використовує, коли counting the users.
	 * Accepts either 'time' or 'memory'. Default 'time'.
	 * @param int|null $site_id Optional. Site ID до 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 до 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;
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *