diff options
Diffstat (limited to 'srcs/wordpress/wp-includes/user.php')
| -rw-r--r-- | srcs/wordpress/wp-includes/user.php | 3709 |
1 files changed, 0 insertions, 3709 deletions
diff --git a/srcs/wordpress/wp-includes/user.php b/srcs/wordpress/wp-includes/user.php deleted file mode 100644 index 505048e..0000000 --- a/srcs/wordpress/wp-includes/user.php +++ /dev/null @@ -1,3709 +0,0 @@ -<?php -/** - * Core User API - * - * @package WordPress - * @subpackage Users - */ - -/** - * Authenticates and logs a user in with 'remember' capability. - * - * The credentials is an array that has 'user_login', 'user_password', and - * 'remember' indices. If the credentials is not given, then the log in form - * will be assumed and used if set. - * - * The various authentication cookies will be set by this function and will be - * set for a longer period depending on if the 'remember' credential is set to - * true. - * - * Note: wp_signon() doesn't handle setting the current user. This means that if the - * function is called before the {@see 'init'} hook is fired, is_user_logged_in() will - * evaluate as false until that point. If is_user_logged_in() is needed in conjunction - * with wp_signon(), wp_set_current_user() should be called explicitly. - * - * @since 2.5.0 - * - * @global string $auth_secure_cookie - * - * @param array $credentials Optional. User info in order to sign on. - * @param string|bool $secure_cookie Optional. Whether to use secure cookie. - * @return WP_User|WP_Error WP_User on success, WP_Error on failure. - */ -function wp_signon( $credentials = array(), $secure_cookie = '' ) { - if ( empty( $credentials ) ) { - $credentials = array(); // Back-compat for plugins passing an empty string. - - if ( ! empty( $_POST['log'] ) ) { - $credentials['user_login'] = $_POST['log']; - } - if ( ! empty( $_POST['pwd'] ) ) { - $credentials['user_password'] = $_POST['pwd']; - } - if ( ! empty( $_POST['rememberme'] ) ) { - $credentials['remember'] = $_POST['rememberme']; - } - } - - if ( ! empty( $credentials['remember'] ) ) { - $credentials['remember'] = true; - } else { - $credentials['remember'] = false; - } - - /** - * Fires before the user is authenticated. - * - * The variables passed to the callbacks are passed by reference, - * and can be modified by callback functions. - * - * @since 1.5.1 - * - * @todo Decide whether to deprecate the wp_authenticate action. - * - * @param string $user_login Username (passed by reference). - * @param string $user_password User password (passed by reference). - */ - do_action_ref_array( 'wp_authenticate', array( &$credentials['user_login'], &$credentials['user_password'] ) ); - - if ( '' === $secure_cookie ) { - $secure_cookie = is_ssl(); - } - - /** - * Filters whether to use a secure sign-on cookie. - * - * @since 3.1.0 - * - * @param bool $secure_cookie Whether to use a secure sign-on cookie. - * @param array $credentials { - * Array of entered sign-on data. - * - * @type string $user_login Username. - * @type string $user_password Password entered. - * @type bool $remember Whether to 'remember' the user. Increases the time - * that the cookie will be kept. Default false. - * } - */ - $secure_cookie = apply_filters( 'secure_signon_cookie', $secure_cookie, $credentials ); - - global $auth_secure_cookie; // XXX ugly hack to pass this to wp_authenticate_cookie - $auth_secure_cookie = $secure_cookie; - - add_filter( 'authenticate', 'wp_authenticate_cookie', 30, 3 ); - - $user = wp_authenticate( $credentials['user_login'], $credentials['user_password'] ); - - if ( is_wp_error( $user ) ) { - return $user; - } - - wp_set_auth_cookie( $user->ID, $credentials['remember'], $secure_cookie ); - /** - * Fires after the user has successfully logged in. - * - * @since 1.5.0 - * - * @param string $user_login Username. - * @param WP_User $user WP_User object of the logged-in user. - */ - do_action( 'wp_login', $user->user_login, $user ); - return $user; -} - -/** - * Authenticate a user, confirming the username and password are valid. - * - * @since 2.8.0 - * - * @param WP_User|WP_Error|null $user WP_User or WP_Error object from a previous callback. Default null. - * @param string $username Username for authentication. - * @param string $password Password for authentication. - * @return WP_User|WP_Error WP_User on success, WP_Error on failure. - */ -function wp_authenticate_username_password( $user, $username, $password ) { - if ( $user instanceof WP_User ) { - return $user; - } - - if ( empty( $username ) || empty( $password ) ) { - if ( is_wp_error( $user ) ) { - return $user; - } - - $error = new WP_Error(); - - if ( empty( $username ) ) { - $error->add( 'empty_username', __( '<strong>ERROR</strong>: The username field is empty.' ) ); - } - - if ( empty( $password ) ) { - $error->add( 'empty_password', __( '<strong>ERROR</strong>: The password field is empty.' ) ); - } - - return $error; - } - - $user = get_user_by( 'login', $username ); - - if ( ! $user ) { - return new WP_Error( - 'invalid_username', - __( 'Unknown username. Check again or try your email address.' ) - ); - } - - /** - * Filters whether the given user can be authenticated with the provided $password. - * - * @since 2.5.0 - * - * @param WP_User|WP_Error $user WP_User or WP_Error object if a previous - * callback failed authentication. - * @param string $password Password to check against the user. - */ - $user = apply_filters( 'wp_authenticate_user', $user, $password ); - if ( is_wp_error( $user ) ) { - return $user; - } - - if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) { - return new WP_Error( - 'incorrect_password', - sprintf( - /* translators: %s: User name. */ - __( '<strong>ERROR</strong>: The password you entered for the username %s is incorrect.' ), - '<strong>' . $username . '</strong>' - ) . - ' <a href="' . wp_lostpassword_url() . '">' . - __( 'Lost your password?' ) . - '</a>' - ); - } - - return $user; -} - -/** - * Authenticates a user using the email and password. - * - * @since 4.5.0 - * - * @param WP_User|WP_Error|null $user WP_User or WP_Error object if a previous - * callback failed authentication. - * @param string $email Email address for authentication. - * @param string $password Password for authentication. - * @return WP_User|WP_Error WP_User on success, WP_Error on failure. - */ -function wp_authenticate_email_password( $user, $email, $password ) { - if ( $user instanceof WP_User ) { - return $user; - } - - if ( empty( $email ) || empty( $password ) ) { - if ( is_wp_error( $user ) ) { - return $user; - } - - $error = new WP_Error(); - - if ( empty( $email ) ) { - $error->add( 'empty_username', __( '<strong>ERROR</strong>: The email field is empty.' ) ); // Uses 'empty_username' for back-compat with wp_signon() - } - - if ( empty( $password ) ) { - $error->add( 'empty_password', __( '<strong>ERROR</strong>: The password field is empty.' ) ); - } - - return $error; - } - - if ( ! is_email( $email ) ) { - return $user; - } - - $user = get_user_by( 'email', $email ); - - if ( ! $user ) { - return new WP_Error( - 'invalid_email', - __( 'Unknown email address. Check again or try your username.' ) - ); - } - - /** This filter is documented in wp-includes/user.php */ - $user = apply_filters( 'wp_authenticate_user', $user, $password ); - - if ( is_wp_error( $user ) ) { - return $user; - } - - if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) { - return new WP_Error( - 'incorrect_password', - sprintf( - /* translators: %s: Email address. */ - __( '<strong>ERROR</strong>: The password you entered for the email address %s is incorrect.' ), - '<strong>' . $email . '</strong>' - ) . - ' <a href="' . wp_lostpassword_url() . '">' . - __( 'Lost your password?' ) . - '</a>' - ); - } - - return $user; -} - -/** - * Authenticate the user using the WordPress auth cookie. - * - * @since 2.8.0 - * - * @global string $auth_secure_cookie - * - * @param WP_User|WP_Error|null $user WP_User or WP_Error object from a previous callback. Default null. - * @param string $username Username. If not empty, cancels the cookie authentication. - * @param string $password Password. If not empty, cancels the cookie authentication. - * @return WP_User|WP_Error WP_User on success, WP_Error on failure. - */ -function wp_authenticate_cookie( $user, $username, $password ) { - if ( $user instanceof WP_User ) { - return $user; - } - - if ( empty( $username ) && empty( $password ) ) { - $user_id = wp_validate_auth_cookie(); - if ( $user_id ) { - return new WP_User( $user_id ); - } - - global $auth_secure_cookie; - - if ( $auth_secure_cookie ) { - $auth_cookie = SECURE_AUTH_COOKIE; - } else { - $auth_cookie = AUTH_COOKIE; - } - - if ( ! empty( $_COOKIE[ $auth_cookie ] ) ) { - return new WP_Error( 'expired_session', __( 'Please log in again.' ) ); - } - - // If the cookie is not set, be silent. - } - - return $user; -} - -/** - * For Multisite blogs, check if the authenticated user has been marked as a - * spammer, or if the user's primary blog has been marked as spam. - * - * @since 3.7.0 - * - * @param WP_User|WP_Error|null $user WP_User or WP_Error object from a previous callback. Default null. - * @return WP_User|WP_Error WP_User on success, WP_Error if the user is considered a spammer. - */ -function wp_authenticate_spam_check( $user ) { - if ( $user instanceof WP_User && is_multisite() ) { - /** - * Filters whether the user has been marked as a spammer. - * - * @since 3.7.0 - * - * @param bool $spammed Whether the user is considered a spammer. - * @param WP_User $user User to check against. - */ - $spammed = apply_filters( 'check_is_user_spammed', is_user_spammy( $user ), $user ); - - if ( $spammed ) { - return new WP_Error( 'spammer_account', __( '<strong>ERROR</strong>: Your account has been marked as a spammer.' ) ); - } - } - return $user; -} - -/** - * Validates the logged-in cookie. - * - * Checks the logged-in cookie if the previous auth cookie could not be - * validated and parsed. - * - * This is a callback for the {@see 'determine_current_user'} filter, rather than API. - * - * @since 3.9.0 - * - * @param int|bool $user_id The user ID (or false) as received from the - * determine_current_user filter. - * @return int|false User ID if validated, false otherwise. If a user ID from - * an earlier filter callback is received, that value is returned. - */ -function wp_validate_logged_in_cookie( $user_id ) { - if ( $user_id ) { - return $user_id; - } - - if ( is_blog_admin() || is_network_admin() || empty( $_COOKIE[ LOGGED_IN_COOKIE ] ) ) { - return false; - } - - return wp_validate_auth_cookie( $_COOKIE[ LOGGED_IN_COOKIE ], 'logged_in' ); -} - -/** - * Number of posts user has written. - * - * @since 3.0.0 - * @since 4.1.0 Added `$post_type` argument. - * @since 4.3.0 Added `$public_only` argument. Added the ability to pass an array - * of post types to `$post_type`. - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param int $userid User ID. - * @param array|string $post_type Optional. Single post type or array of post types to count the number of posts for. Default 'post'. - * @param bool $public_only Optional. Whether to only return counts for public posts. Default false. - * @return string Number of posts the user has written in this post type. - */ -function count_user_posts( $userid, $post_type = 'post', $public_only = false ) { - global $wpdb; - - $where = get_posts_by_author_sql( $post_type, true, $userid, $public_only ); - - $count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts $where" ); - - /** - * Filters the number of posts a user has written. - * - * @since 2.7.0 - * @since 4.1.0 Added `$post_type` argument. - * @since 4.3.1 Added `$public_only` argument. - * - * @param int $count The user's post count. - * @param int $userid User ID. - * @param string|array $post_type Single post type or array of post types to count the number of posts for. - * @param bool $public_only Whether to limit counted posts to public posts. - */ - return apply_filters( 'get_usernumposts', $count, $userid, $post_type, $public_only ); -} - -/** - * Number of posts written by a list of users. - * - * @since 3.0.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param array $users Array of user IDs. - * @param string|array $post_type Optional. Single post type or array of post types to check. Defaults to 'post'. - * @param bool $public_only Optional. Only return counts for public posts. Defaults to false. - * @return array Amount of posts each user has written. - */ -function count_many_users_posts( $users, $post_type = 'post', $public_only = false ) { - global $wpdb; - - $count = array(); - if ( empty( $users ) || ! is_array( $users ) ) { - return $count; - } - - $userlist = implode( ',', array_map( 'absint', $users ) ); - $where = get_posts_by_author_sql( $post_type, true, null, $public_only ); - - $result = $wpdb->get_results( "SELECT post_author, COUNT(*) FROM $wpdb->posts $where AND post_author IN ($userlist) GROUP BY post_author", ARRAY_N ); - foreach ( $result as $row ) { - $count[ $row[0] ] = $row[1]; - } - - foreach ( $users as $id ) { - if ( ! isset( $count[ $id ] ) ) { - $count[ $id ] = 0; - } - } - - return $count; -} - -// -// User option functions -// - -/** - * Get the current user's ID - * - * @since MU (3.0.0) - * - * @return int The current user's ID, or 0 if no user is logged in. - */ -function get_current_user_id() { - if ( ! function_exists( 'wp_get_current_user' ) ) { - return 0; - } - $user = wp_get_current_user(); - return ( isset( $user->ID ) ? (int) $user->ID : 0 ); -} - -/** - * Retrieve user option that can be either per Site or per Network. - * - * If the user ID is not given, then the current user will be used instead. If - * the user ID is given, then the user data will be retrieved. The filter for - * the result, will also pass the original option name and finally the user data - * object as the third parameter. - * - * The option will first check for the per site name and then the per Network name. - * - * @since 2.0.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param string $option User option name. - * @param int $user Optional. User ID. - * @param string $deprecated Use get_option() to check for an option in the options table. - * @return mixed User option value on success, false on failure. - */ -function get_user_option( $option, $user = 0, $deprecated = '' ) { - global $wpdb; - - if ( ! empty( $deprecated ) ) { - _deprecated_argument( __FUNCTION__, '3.0.0' ); - } - - if ( empty( $user ) ) { - $user = get_current_user_id(); - } - - $user = get_userdata( $user ); - if ( ! $user ) { - return false; - } - - $prefix = $wpdb->get_blog_prefix(); - if ( $user->has_prop( $prefix . $option ) ) { // Blog specific - $result = $user->get( $prefix . $option ); - } elseif ( $user->has_prop( $option ) ) { // User specific and cross-blog - $result = $user->get( $option ); - } else { - $result = false; - } - - /** - * Filters a specific user option value. - * - * The dynamic portion of the hook name, `$option`, refers to the user option name. - * - * @since 2.5.0 - * - * @param mixed $result Value for the user's option. - * @param string $option Name of the option being retrieved. - * @param WP_User $user WP_User object of the user whose option is being retrieved. - */ - return apply_filters( "get_user_option_{$option}", $result, $option, $user ); -} - -/** - * Update user option with global blog capability. - * - * User options are just like user metadata except that they have support for - * global blog options. If the 'global' parameter is false, which it is by default - * it will prepend the WordPress table prefix to the option name. - * - * Deletes the user option if $newvalue is empty. - * - * @since 2.0.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param int $user_id User ID. - * @param string $option_name User option name. - * @param mixed $newvalue User option value. - * @param bool $global Optional. Whether option name is global or blog specific. - * Default false (blog specific). - * @return int|bool User meta ID if the option didn't exist, true on successful update, - * false on failure. - */ -function update_user_option( $user_id, $option_name, $newvalue, $global = false ) { - global $wpdb; - - if ( ! $global ) { - $option_name = $wpdb->get_blog_prefix() . $option_name; - } - - return update_user_meta( $user_id, $option_name, $newvalue ); -} - -/** - * Delete user option with global blog capability. - * - * User options are just like user metadata except that they have support for - * global blog options. If the 'global' parameter is false, which it is by default - * it will prepend the WordPress table prefix to the option name. - * - * @since 3.0.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param int $user_id User ID - * @param string $option_name User option name. - * @param bool $global Optional. Whether option name is global or blog specific. - * Default false (blog specific). - * @return bool True on success, false on failure. - */ -function delete_user_option( $user_id, $option_name, $global = false ) { - global $wpdb; - - if ( ! $global ) { - $option_name = $wpdb->get_blog_prefix() . $option_name; - } - return delete_user_meta( $user_id, $option_name ); -} - -/** - * Retrieve list of users matching criteria. - * - * @since 3.1.0 - * - * @see WP_User_Query - * - * @param array $args Optional. Arguments to retrieve users. See WP_User_Query::prepare_query(). - * for more information on accepted arguments. - * @return array List of users. - */ -function get_users( $args = array() ) { - - $args = wp_parse_args( $args ); - $args['count_total'] = false; - - $user_search = new WP_User_Query( $args ); - - return (array) $user_search->get_results(); -} - -/** - * Get the sites a user belongs to. - * - * @since 3.0.0 - * @since 4.7.0 Converted to use `get_sites()`. - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param int $user_id User ID - * @param bool $all Whether to retrieve all sites, or only sites that are not - * marked as deleted, archived, or spam. - * @return array A list of the user's sites. An empty array if the user doesn't exist - * or belongs to no sites. - */ -function get_blogs_of_user( $user_id, $all = false ) { - global $wpdb; - - $user_id = (int) $user_id; - - // Logged out users can't have sites - if ( empty( $user_id ) ) { - return array(); - } - - /** - * Filters the list of a user's sites before it is populated. - * - * Passing a non-null value to the filter will effectively short circuit - * get_blogs_of_user(), returning that value instead. - * - * @since 4.6.0 - * - * @param null|array $sites An array of site objects of which the user is a member. - * @param int $user_id User ID. - * @param bool $all Whether the returned array should contain all sites, including - * those marked 'deleted', 'archived', or 'spam'. Default false. - */ - $sites = apply_filters( 'pre_get_blogs_of_user', null, $user_id, $all ); - - if ( null !== $sites ) { - return $sites; - } - - $keys = get_user_meta( $user_id ); - if ( empty( $keys ) ) { - return array(); - } - - if ( ! is_multisite() ) { - $site_id = get_current_blog_id(); - $sites = array( $site_id => new stdClass ); - $sites[ $site_id ]->userblog_id = $site_id; - $sites[ $site_id ]->blogname = get_option( 'blogname' ); - $sites[ $site_id ]->domain = ''; - $sites[ $site_id ]->path = ''; - $sites[ $site_id ]->site_id = 1; - $sites[ $site_id ]->siteurl = get_option( 'siteurl' ); - $sites[ $site_id ]->archived = 0; - $sites[ $site_id ]->spam = 0; - $sites[ $site_id ]->deleted = 0; - return $sites; - } - - $site_ids = array(); - - if ( isset( $keys[ $wpdb->base_prefix . 'capabilities' ] ) && defined( 'MULTISITE' ) ) { - $site_ids[] = 1; - unset( $keys[ $wpdb->base_prefix . 'capabilities' ] ); - } - - $keys = array_keys( $keys ); - - foreach ( $keys as $key ) { - if ( 'capabilities' !== substr( $key, -12 ) ) { - continue; - } - if ( $wpdb->base_prefix && 0 !== strpos( $key, $wpdb->base_prefix ) ) { - continue; - } - $site_id = str_replace( array( $wpdb->base_prefix, '_capabilities' ), '', $key ); - if ( ! is_numeric( $site_id ) ) { - continue; - } - - $site_ids[] = (int) $site_id; - } - - $sites = array(); - - if ( ! empty( $site_ids ) ) { - $args = array( - 'number' => '', - 'site__in' => $site_ids, - 'update_site_meta_cache' => false, - ); - if ( ! $all ) { - $args['archived'] = 0; - $args['spam'] = 0; - $args['deleted'] = 0; - } - - $_sites = get_sites( $args ); - - foreach ( $_sites as $site ) { - $sites[ $site->id ] = (object) array( - 'userblog_id' => $site->id, - 'blogname' => $site->blogname, - 'domain' => $site->domain, - 'path' => $site->path, - 'site_id' => $site->network_id, - 'siteurl' => $site->siteurl, - 'archived' => $site->archived, - 'mature' => $site->mature, - 'spam' => $site->spam, - 'deleted' => $site->deleted, - ); - } - } - - /** - * Filters the list of sites a user belongs to. - * - * @since MU (3.0.0) - * - * @param array $sites An array of site objects belonging to the user. - * @param int $user_id User ID. - * @param bool $all Whether the returned sites array should contain all sites, including - * those marked 'deleted', 'archived', or 'spam'. Default false. - */ - return apply_filters( 'get_blogs_of_user', $sites, $user_id, $all ); -} - -/** - * Find out whether a user is a member of a given blog. - * - * @since MU (3.0.0) - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param int $user_id Optional. The unique ID of the user. Defaults to the current user. - * @param int $blog_id Optional. ID of the blog to check. Defaults to the current site. - * @return bool - */ -function is_user_member_of_blog( $user_id = 0, $blog_id = 0 ) { - global $wpdb; - - $user_id = (int) $user_id; - $blog_id = (int) $blog_id; - - if ( empty( $user_id ) ) { - $user_id = get_current_user_id(); - } - - // Technically not needed, but does save calls to get_site and get_user_meta - // in the event that the function is called when a user isn't logged in - if ( empty( $user_id ) ) { - return false; - } else { - $user = get_userdata( $user_id ); - if ( ! $user instanceof WP_User ) { - return false; - } - } - - if ( ! is_multisite() ) { - return true; - } - - if ( empty( $blog_id ) ) { - $blog_id = get_current_blog_id(); - } - - $blog = get_site( $blog_id ); - - if ( ! $blog || ! isset( $blog->domain ) || $blog->archived || $blog->spam || $blog->deleted ) { - return false; - } - - $keys = get_user_meta( $user_id ); - if ( empty( $keys ) ) { - return false; - } - - // no underscore before capabilities in $base_capabilities_key - $base_capabilities_key = $wpdb->base_prefix . 'capabilities'; - $site_capabilities_key = $wpdb->base_prefix . $blog_id . '_capabilities'; - - if ( isset( $keys[ $base_capabilities_key ] ) && $blog_id == 1 ) { - return true; - } - - if ( isset( $keys[ $site_capabilities_key ] ) ) { - return true; - } - - return false; -} - -/** - * Adds meta data to a user. - * - * @since 3.0.0 - * - * @param int $user_id User ID. - * @param string $meta_key Metadata name. - * @param mixed $meta_value Metadata value. - * @param bool $unique Optional. Whether the same key should not be added. Default false. - * @return int|false Meta ID on success, false on failure. - */ -function add_user_meta( $user_id, $meta_key, $meta_value, $unique = false ) { - return add_metadata( 'user', $user_id, $meta_key, $meta_value, $unique ); -} - -/** - * Remove metadata matching criteria from a user. - * - * You can match based on the key, or key and value. Removing based on key and - * value, will keep from removing duplicate metadata with the same key. It also - * allows removing all metadata matching key, if needed. - * - * @since 3.0.0 - * @link https://developer.wordpress.org/reference/functions/delete_user_meta/ - * - * @param int $user_id User ID - * @param string $meta_key Metadata name. - * @param mixed $meta_value Optional. Metadata value. - * @return bool True on success, false on failure. - */ -function delete_user_meta( $user_id, $meta_key, $meta_value = '' ) { - return delete_metadata( 'user', $user_id, $meta_key, $meta_value ); -} - -/** - * Retrieve user meta field for a user. - * - * @since 3.0.0 - * @link https://developer.wordpress.org/reference/functions/get_user_meta/ - * - * @param int $user_id User ID. - * @param string $key Optional. The meta key to retrieve. By default, returns data for all keys. - * @param bool $single Whether to return a single value. - * @return mixed Will be an array if $single is false. Will be value of meta data field if $single is true. - */ -function get_user_meta( $user_id, $key = '', $single = false ) { - return get_metadata( 'user', $user_id, $key, $single ); -} - -/** - * Update user meta field based on user ID. - * - * Use the $prev_value parameter to differentiate between meta fields with the - * same key and user ID. - * - * If the meta field for the user does not exist, it will be added. - * - * @since 3.0.0 - * @link https://developer.wordpress.org/reference/functions/update_user_meta/ - * - * @param int $user_id User ID. - * @param string $meta_key Metadata key. - * @param mixed $meta_value Metadata value. - * @param mixed $prev_value Optional. Previous value to check before removing. - * @return int|bool Meta ID if the key didn't exist, true on successful update, false on failure. - */ -function update_user_meta( $user_id, $meta_key, $meta_value, $prev_value = '' ) { - return update_metadata( 'user', $user_id, $meta_key, $meta_value, $prev_value ); -} - -/** - * Count number of users who have each of the user roles. - * - * Assumes there are neither duplicated nor orphaned capabilities meta_values. - * Assumes role names are unique phrases. Same assumption made by WP_User_Query::prepare_query() - * Using $strategy = 'time' this is CPU-intensive and should handle around 10^7 users. - * Using $strategy = 'memory' this is memory-intensive and should handle around 10^5 users, but see WP Bug #12257. - * - * @since 3.0.0 - * @since 4.4.0 The number of users with no role is now included in the `none` element. - * @since 4.9.0 The `$site_id` parameter was added to support multisite. - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @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. - * @return array Includes a grand total and an array of counts indexed by role strings. - */ -function count_users( $strategy = 'time', $site_id = null ) { - global $wpdb; - - // Initialize - if ( ! $site_id ) { - $site_id = get_current_blog_id(); - } - - /** - * Filter 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 Default null. - * @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() && $site_id != get_current_blog_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; -} - -// -// Private helper functions -// - -/** - * Set up global user vars. - * - * Used by wp_set_current_user() for back compat. Might be deprecated in the future. - * - * @since 2.0.4 - * - * @global string $user_login The user username for logging in - * @global WP_User $userdata User data. - * @global int $user_level The level of the user - * @global int $user_ID The ID of the user - * @global string $user_email The email address of the user - * @global string $user_url The url in the user's profile - * @global string $user_identity The display name of the user - * - * @param int $for_user_id Optional. User ID to set up global data. Default 0. - */ -function setup_userdata( $for_user_id = 0 ) { - global $user_login, $userdata, $user_level, $user_ID, $user_email, $user_url, $user_identity; - - if ( ! $for_user_id ) { - $for_user_id = get_current_user_id(); - } - $user = get_userdata( $for_user_id ); - - if ( ! $user ) { - $user_ID = 0; - $user_level = 0; - $userdata = null; - $user_login = ''; - $user_email = ''; - $user_url = ''; - $user_identity = ''; - return; - } - - $user_ID = (int) $user->ID; - $user_level = (int) $user->user_level; - $userdata = $user; - $user_login = $user->user_login; - $user_email = $user->user_email; - $user_url = $user->user_url; - $user_identity = $user->display_name; -} - -/** - * Create dropdown HTML content of users. - * - * The content can either be displayed, which it is by default or retrieved by - * setting the 'echo' argument. The 'include' and 'exclude' arguments do not - * need to be used; all users will be displayed in that case. Only one can be - * used, either 'include' or 'exclude', but not both. - * - * The available arguments are as follows: - * - * @since 2.3.0 - * @since 4.5.0 Added the 'display_name_with_login' value for 'show'. - * @since 4.7.0 Added the `$role`, `$role__in`, and `$role__not_in` parameters. - * - * @param array|string $args { - * Optional. Array or string of arguments to generate a drop-down of users. - * See WP_User_Query::prepare_query() for additional available arguments. - * - * @type string $show_option_all Text to show as the drop-down default (all). - * Default empty. - * @type string $show_option_none Text to show as the drop-down default when no - * users were found. Default empty. - * @type int|string $option_none_value Value to use for $show_option_non when no users - * were found. Default -1. - * @type string $hide_if_only_one_author Whether to skip generating the drop-down - * if only one user was found. Default empty. - * @type string $orderby Field to order found users by. Accepts user fields. - * Default 'display_name'. - * @type string $order Whether to order users in ascending or descending - * order. Accepts 'ASC' (ascending) or 'DESC' (descending). - * Default 'ASC'. - * @type array|string $include Array or comma-separated list of user IDs to include. - * Default empty. - * @type array|string $exclude Array or comma-separated list of user IDs to exclude. - * Default empty. - * @type bool|int $multi Whether to skip the ID attribute on the 'select' element. - * Accepts 1|true or 0|false. Default 0|false. - * @type string $show User data to display. If the selected item is empty - * then the 'user_login' will be displayed in parentheses. - * Accepts any user field, or 'display_name_with_login' to show - * the display name with user_login in parentheses. - * Default 'display_name'. - * @type int|bool $echo Whether to echo or return the drop-down. Accepts 1|true (echo) - * or 0|false (return). Default 1|true. - * @type int $selected Which user ID should be selected. Default 0. - * @type bool $include_selected Whether to always include the selected user ID in the drop- - * down. Default false. - * @type string $name Name attribute of select element. Default 'user'. - * @type string $id ID attribute of the select element. Default is the value of $name. - * @type string $class Class attribute of the select element. Default empty. - * @type int $blog_id ID of blog (Multisite only). Default is ID of the current blog. - * @type string $who Which type of users to query. Accepts only an empty string or - * 'authors'. Default empty. - * @type str |
