Parsed: 126777

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|array $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        $site_id  The site ID to count users for.
 */
  $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;
}