aboutsummaryrefslogtreecommitdiff
path: root/srcs/wordpress/wp-includes/user.php
diff options
context:
space:
mode:
Diffstat (limited to 'srcs/wordpress/wp-includes/user.php')
-rw-r--r--srcs/wordpress/wp-includes/user.php3709
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