From 0f06334e11c795afbeae51e5d0bb113f5f519193 Mon Sep 17 00:00:00 2001 From: ryan Date: Wed, 24 Aug 2011 19:32:59 +0000 Subject: [PATCH] Introduce metadata_exists(), WP_User::get_data_by(), WP_User::get(), WP_User::has_prop(). Don't fill user objects with meta. Eliminate data duplication in cache and memory. Props scribu. see #15458 git-svn-id: http://svn.automattic.com/wordpress/trunk@18597 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- .../includes/class-wp-users-list-table.php | 2 +- wp-admin/includes/user.php | 11 +- wp-includes/capabilities.php | 155 +++++++++++++--- wp-includes/deprecated.php | 74 +++++++- wp-includes/meta.php | 78 ++++---- wp-includes/pluggable.php | 125 +++++-------- wp-includes/user.php | 173 ++---------------- 7 files changed, 314 insertions(+), 304 deletions(-) diff --git a/wp-admin/includes/class-wp-users-list-table.php b/wp-admin/includes/class-wp-users-list-table.php index de22748be..13bdeb4ac 100644 --- a/wp-admin/includes/class-wp-users-list-table.php +++ b/wp-admin/includes/class-wp-users-list-table.php @@ -219,7 +219,7 @@ class WP_Users_List_Table extends WP_List_Table { if ( !( is_object( $user_object ) && is_a( $user_object, 'WP_User' ) ) ) $user_object = new WP_User( (int) $user_object ); - $user_object = sanitize_user_object( $user_object, 'display' ); + $user_object->filter = 'display'; $email = $user_object->user_email; if ( $this->is_site_users ) diff --git a/wp-admin/includes/user.php b/wp-admin/includes/user.php index 758c065a6..5d513b9d6 100644 --- a/wp-admin/includes/user.php +++ b/wp-admin/includes/user.php @@ -226,16 +226,7 @@ function get_editable_roles() { function get_user_to_edit( $user_id ) { $user = new WP_User( $user_id ); - $user_contactmethods = _wp_get_user_contactmethods( $user ); - foreach ($user_contactmethods as $method => $name) { - if ( empty( $user->{$method} ) ) - $user->{$method} = ''; - } - - if ( empty($user->description) ) - $user->description = ''; - - $user = sanitize_user_object($user, 'edit'); + $user->filter = 'edit'; return $user; } diff --git a/wp-includes/capabilities.php b/wp-includes/capabilities.php index ae2dc2a5c..013e561f9 100644 --- a/wp-includes/capabilities.php +++ b/wp-includes/capabilities.php @@ -420,42 +420,109 @@ class WP_User { */ var $filter = null; + private static $back_compat_keys = array( + 'user_firstname' => 'first_name', + 'user_lastname' => 'last_name', + 'user_description' => 'description' + ); + /** - * Constructor - Sets up the object properties. + * Constructor * - * Retrieves the userdata and then assigns all of the data keys to direct - * properties of the object. Calls {@link WP_User::_init_caps()} after - * setting up the object's user data properties. + * Retrieves the userdata and passes it to {@link WP_User::init()}. * * @since 2.0.0 * @access public * - * @param int|string $id User's ID or username - * @param int $name Optional. User's username + * @param int|string $id User's ID + * @param string $name Optional. User's username * @param int $blog_id Optional Blog ID, defaults to current blog. * @return WP_User */ - function __construct( $id, $name = '', $blog_id = '' ) { - if ( empty( $id ) && empty( $name ) ) - return; - + function __construct( $id = 0, $name = '', $blog_id = '' ) { if ( ! is_numeric( $id ) ) { $name = $id; $id = 0; } - if ( ! empty( $id ) ) - $this->data = get_userdata( $id ); + if ( $id ) + $data = self::get_data_by( 'id', $id ); else - $this->data = get_user_by('login', $name ); + $data = self::get_data_by( 'login', $name ); - if ( empty( $this->data->ID ) ) - return; + if ( $data ) + $this->init( $data, $blog_id ); + } + + /** + * Sets up object properties, including capabilities. + * + * @param object $data User DB row object + * @param int $blog_id Optional. The blog id to initialize for + */ + function init( $data, $blog_id = '' ) { + $this->data = $data; + $this->ID = (int) $data->ID; - $this->ID = $this->data->ID; $this->for_blog( $blog_id ); } + /** + * Return only the main user fields + * + * @since 3.3.0 + * + * @param string $field The field to query against: 'id', 'slug', 'email' or 'login' + * @param string|int $value The field value + */ + static function get_data_by( $field, $value ) { + global $wpdb; + + if ( 'id' == $field ) + $value = absint( $value ); + else + $value = trim( $value ); + + if ( !$value ) + return false; + + switch ( $field ) { + case 'id': + $user_id = $value; + $db_field = 'ID'; + break; + case 'slug': + $user_id = wp_cache_get($value, 'userslugs'); + $db_field = 'user_nicename'; + break; + case 'email': + $user_id = wp_cache_get($value, 'useremail'); + $db_field = 'user_email'; + break; + case 'login': + $value = sanitize_user( $value ); + $user_id = wp_cache_get($value, 'userlogins'); + $db_field = 'user_login'; + break; + default: + return false; + } + + if ( false !== $user_id ) { + if ( $user = wp_cache_get( $user_id, 'users' ) ) + return $user; + } + + if ( !$user = $wpdb->get_row( $wpdb->prepare( + "SELECT * FROM $wpdb->users WHERE $db_field = %s", $value + ) ) ) + return false; + + update_user_caches( $user ); + + return $user; + } + /** * Magic method for checking the existance of a certain custom field * @@ -466,7 +533,14 @@ class WP_User { _deprecated_argument( 'WP_User->id', '2.1', __( 'Use WP_User->ID instead.' ) ); $key = 'ID'; } - return isset( $this->data->$key ); + + if ( isset( $this->data->$key ) ) + return true; + + if ( isset( self::$back_compat_keys[ $key ] ) ) + $key = self::$back_compat_keys[ $key ]; + + return metadata_exists( 'user', $this->ID, $key ); } /** @@ -480,7 +554,19 @@ class WP_User { return $this->ID; } - return $this->data->$key; + if ( isset( $this->data->$key ) ) { + $value = $this->data->$key; + } else { + if ( isset( self::$back_compat_keys[ $key ] ) ) + $key = self::$back_compat_keys[ $key ]; + $value = get_user_meta( $this->ID, $key, true ); + } + + if ( $this->filter ) { + $value = sanitize_user_field( $key, $value, $this->ID, $this->filter ); + } + + return $value; } /** @@ -498,6 +584,32 @@ class WP_User { $this->data->$key = $value; } + /** + * Retrieve the value of a property or meta key. + * + * Retrieves from the users and usermeta table. + * + * @since 3.3.0 + * + * @param string $key Property + */ + function get( $key ) { + return $this->__get( $key ); + } + + /** + * Determine whether a property or meta key is set + * + * Consults the users and usermeta tables. + * + * @since 3.3.0 + * + * @param string $key Property + */ + function has_prop( $key ) { + return $this->__isset( $key ); + } + /** * Set up capability object properties. * @@ -519,7 +631,8 @@ class WP_User { else $this->cap_key = $cap_key; - $this->caps = &$this->data->{$this->cap_key}; + $this->caps = get_user_meta( $this->ID, $this->cap_key, true ); + if ( ! is_array( $this->caps ) ) $this->caps = array(); @@ -662,7 +775,7 @@ class WP_User { */ function update_user_level_from_caps() { global $wpdb; - $this->user_level = array_reduce( array_keys( $this->allcaps ), array( &$this, 'level_reduction' ), 0 ); + $this->user_level = array_reduce( array_keys( $this->allcaps ), array( $this, 'level_reduction' ), 0 ); update_user_meta( $this->ID, $wpdb->prefix . 'user_level', $this->user_level ); } @@ -1066,7 +1179,7 @@ function current_user_can( $capability ) { $args = array_slice( func_get_args(), 1 ); $args = array_merge( array( $capability ), $args ); - return call_user_func_array( array( &$current_user, 'has_cap' ), $args ); + return call_user_func_array( array( $current_user, 'has_cap' ), $args ); } /** diff --git a/wp-includes/deprecated.php b/wp-includes/deprecated.php index 8313a3f13..df1f03e77 100644 --- a/wp-includes/deprecated.php +++ b/wp-includes/deprecated.php @@ -2627,13 +2627,13 @@ function wp_timezone_supported() { */ function wp_default_editor() { _deprecated_function( __FUNCTION__, '3.3' ); - + global $wp_editor; if ( !is_a($wp_editor, 'WP_Editor') ) { require_once( ABSPATH . WPINC . '/class-wp-editor.php' ); $wp_editor = new WP_Editor; } - + return $wp_editor->wp_default_editor(); } @@ -2641,7 +2641,7 @@ function wp_default_editor() { * Display editor: TinyMCE, HTML, or both. * * @since 2.1.0 - * @deprecated 3.3 + * @deprecated 3.3 * * @param string $content Textarea content. * @param string $id Optional, default is 'content'. HTML ID attribute value. @@ -2650,8 +2650,74 @@ function wp_default_editor() { * @param int $tab_index Optional, not used */ function the_editor($content, $id = 'content', $prev_id = 'title', $media_buttons = true, $tab_index = 2, $extended = true) { - + wp_editor( $content, $id, array( 'media_buttons' => $media_buttons ) ); return; } +/** + * Perform the query to get the $metavalues array(s) needed by _fill_user and _fill_many_users + * + * @since 3.0.0 + * @param array $ids User ID numbers list. + * @return array of arrays. The array is indexed by user_id, containing $metavalues object arrays. + */ +function get_user_metavalues($ids) { + _deprecated_function( __FUNCTION__, '3.3' ); + + $objects = array(); + + $ids = array_map('intval', $ids); + foreach ( $ids as $id ) + $objects[$id] = array(); + + $metas = update_meta_cache('user', $ids); + + foreach ( $metas as $id => $meta ) { + foreach ( $meta as $key => $metavalues ) { + foreach ( $metavalues as $value ) { + $objects[$id][] = (object)array( 'user_id' => $id, 'meta_key' => $key, 'meta_value' => $value); + } + } + } + + return $objects; +} + +/** + * Sanitize every user field. + * + * If the context is 'raw', then the user object or array will get minimal santization of the int fields. + * + * @since 2.3.0 + * @deprecated 3.3.0 + * @uses sanitize_user_field() Used to sanitize the fields. + * + * @param object|array $user The User Object or Array + * @param string $context Optional, default is 'display'. How to sanitize user fields. + * @return object|array The now sanitized User Object or Array (will be the same type as $user) + */ +function sanitize_user_object($user, $context = 'display') { + _deprecated_function( __FUNCTION__, '3.3' ); + + if ( is_object($user) ) { + if ( !isset($user->ID) ) + $user->ID = 0; + if ( !is_a( $user, 'WP_User' ) ) { + $vars = get_object_vars($user); + foreach ( array_keys($vars) as $field ) { + if ( is_string($user->$field) || is_numeric($user->$field) ) + $user->$field = sanitize_user_field($field, $user->$field, $user->ID, $context); + } + } + $user->filter = $context; + } else { + if ( !isset($user['ID']) ) + $user['ID'] = 0; + foreach ( array_keys($user) as $field ) + $user[$field] = sanitize_user_field($field, $user[$field], $user['ID'], $context); + $user['filter'] = $context; + } + + return $user; +} diff --git a/wp-includes/meta.php b/wp-includes/meta.php index 5031ba761..9bf362b11 100644 --- a/wp-includes/meta.php +++ b/wp-includes/meta.php @@ -73,9 +73,6 @@ function add_metadata($meta_type, $object_id, $meta_key, $meta_value, $unique = $mid = (int) $wpdb->insert_id; wp_cache_delete($object_id, $meta_type . '_meta'); - // users cache stores usermeta that must be cleared. - if ( 'user' == $meta_type ) - clean_user_cache($object_id); do_action( "added_{$meta_type}_meta", $mid, $object_id, $meta_key, $_meta_value ); @@ -149,21 +146,18 @@ function update_metadata($meta_type, $object_id, $meta_key, $meta_value, $prev_v } do_action( "update_{$meta_type}_meta", $meta_id, $object_id, $meta_key, $_meta_value ); - + if ( 'post' == $meta_type ) - do_action( 'update_postmeta', $meta_id, $object_id, $meta_key, $meta_value ); + do_action( 'update_postmeta', $meta_id, $object_id, $meta_key, $meta_value ); $wpdb->update( $table, $data, $where ); wp_cache_delete($object_id, $meta_type . '_meta'); - // users cache stores usermeta that must be cleared. - if ( 'user' == $meta_type ) - clean_user_cache($object_id); do_action( "updated_{$meta_type}_meta", $meta_id, $object_id, $meta_key, $_meta_value ); - + if ( 'post' == $meta_type ) - do_action( 'updated_postmeta', $meta_id, $object_id, $meta_key, $meta_value ); + do_action( 'updated_postmeta', $meta_id, $object_id, $meta_key, $meta_value ); return true; } @@ -210,7 +204,7 @@ function delete_metadata($meta_type, $object_id, $meta_key, $meta_value = '', $d $_meta_value = $meta_value; $meta_value = maybe_serialize( $meta_value ); - + $query = $wpdb->prepare( "SELECT $id_column FROM $table WHERE meta_key = %s", $meta_key ); if ( !$delete_all ) @@ -227,7 +221,7 @@ function delete_metadata($meta_type, $object_id, $meta_key, $meta_value = '', $d $object_ids = $wpdb->get_col( $wpdb->prepare( "SELECT $type_column FROM $table WHERE meta_key = %s", $meta_key ) ); do_action( "delete_{$meta_type}_meta", $meta_ids, $object_id, $meta_key, $_meta_value ); - + if ( 'post' == $meta_type ) do_action( 'delete_postmeta', $meta_ids ); @@ -246,12 +240,8 @@ function delete_metadata($meta_type, $object_id, $meta_key, $meta_value = '', $d wp_cache_delete($object_id, $meta_type . '_meta'); } - // users cache stores usermeta that must be cleared. - if ( 'user' == $meta_type ) - clean_user_cache($object_id); - do_action( "deleted_{$meta_type}_meta", $meta_ids, $object_id, $meta_key, $_meta_value ); - + if ( 'post' == $meta_type ) do_action( 'deleted_postmeta', $meta_ids ); @@ -309,6 +299,40 @@ function get_metadata($meta_type, $object_id, $meta_key = '', $single = false) { return array(); } +/** + * Determine if a meta key is set for a given object + * + * @since 3.3.0 + * + * @param string $meta_type Type of object metadata is for (e.g., comment, post, or user) + * @param int $object_id ID of the object metadata is for + * @param string $meta_key Metadata key. + * @return boolean true of the key is set, false if not. + */ +function metadata_exists( $meta_type, $object_id, $meta_key ) { + if ( ! $meta_type ) + return false; + + if ( ! $object_id = absint( $object_id ) ) + return false; + + $check = apply_filters( "get_{$meta_type}_metadata", null, $object_id, $meta_key, true ); + if ( null !== $check ) + return true; + + $meta_cache = wp_cache_get( $object_id, $meta_type . '_meta' ); + + if ( !$meta_cache ) { + $meta_cache = update_meta_cache( $meta_type, array( $object_id ) ); + $meta_cache = $meta_cache[$object_id]; + } + + if ( isset( $meta_cache[ $meta_key ] ) ) + return true; + + return false; +} + /** * Get meta data by meta ID * @@ -406,16 +430,12 @@ function update_metadata_by_mid( $meta_type, $meta_id, $meta_value, $meta_key = if ( 'post' == $meta_type ) do_action( 'update_postmeta', $meta_id, $object_id, $meta_key, $meta_value ); - + // Run the update query, all fields in $data are %s, $where is a %d. $result = (bool) $wpdb->update( $table, $data, $where, '%s', '%d' ); // Clear the caches. wp_cache_delete($object_id, $meta_type . '_meta'); - - // Users cache stores usermeta that must be cleared. - if ( 'user' == $meta_type ) - clean_user_cache($object_id); do_action( "updated_{$meta_type}_meta", $meta_id, $object_id, $meta_key, $_meta_value ); @@ -424,7 +444,7 @@ function update_metadata_by_mid( $meta_type, $meta_id, $meta_value, $meta_key = return $result; } - + // And if the meta was not found. return false; } @@ -443,7 +463,7 @@ function update_metadata_by_mid( $meta_type, $meta_id, $meta_value, $meta_key = */ function delete_metadata_by_mid( $meta_type, $meta_id ) { global $wpdb; - + // Make sure everything is valid. if ( ! $meta_type ) return false; @@ -453,7 +473,7 @@ function delete_metadata_by_mid( $meta_type, $meta_id ) { if ( ! $table = _get_meta_table( $meta_type ) ) return false; - + // object and id columns $column = esc_sql($meta_type . '_id'); $id_column = 'user' == $meta_type ? 'umeta_id' : 'meta_id'; @@ -473,10 +493,6 @@ function delete_metadata_by_mid( $meta_type, $meta_id ) { // Clear the caches. wp_cache_delete($object_id, $meta_type . '_meta'); - // Users cache stores usermeta that must be cleared. - if ( 'user' == $meta_type ) - clean_user_cache($object_id); - do_action( "deleted_{$meta_type}_meta", (array) $meta_id, $object_id, $meta->meta_key, $meta->meta_value ); if ( 'post' == $meta_type ) @@ -485,7 +501,7 @@ function delete_metadata_by_mid( $meta_type, $meta_id ) { return $result; } - + // Meta id was not found. return false; } @@ -818,7 +834,7 @@ function sanitize_meta( $meta_key, $meta_value, $meta_type ) { /** * Register meta key - * + * * @since 3.3.0 * * @param string $meta_type Type of meta diff --git a/wp-includes/pluggable.php b/wp-includes/pluggable.php index 8b895306a..7c2b607c4 100644 --- a/wp-includes/pluggable.php +++ b/wp-includes/pluggable.php @@ -98,61 +98,10 @@ if ( !function_exists('get_userdata') ) : * @since 0.71 * * @param int $user_id User ID - * @return bool|object False on failure, User DB row object + * @return bool|object False on failure, WP_User object on success */ function get_userdata( $user_id ) { - global $wpdb; - - if ( ! is_numeric( $user_id ) ) - return false; - - $user_id = absint( $user_id ); - if ( ! $user_id ) - return false; - - $user = wp_cache_get( $user_id, 'users' ); - - if ( $user ) - return $user; - - if ( ! $user = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->users WHERE ID = %d LIMIT 1", $user_id ) ) ) - return false; - - _fill_user( $user ); - - return $user; -} -endif; - -if ( !function_exists('cache_users') ) : -/** - * Retrieve info for user lists to prevent multiple queries by get_userdata() - * - * @since 3.0.0 - * - * @param array $users User ID numbers list - */ -function cache_users( $users ) { - global $wpdb; - - $clean = array(); - foreach($users as $id) { - $id = (int) $id; - if (wp_cache_get($id, 'users')) { - // seems to be cached already - } else { - $clean[] = $id; - } - } - - if ( 0 == count($clean) ) - return; - - $list = implode(',', $clean); - - $results = $wpdb->get_results("SELECT * FROM $wpdb->users WHERE ID IN ($list)"); - - _fill_many_users($results); + return get_user_by( 'id', $user_id ); } endif; @@ -164,44 +113,56 @@ if ( !function_exists('get_user_by') ) : * * @param string $field The field to retrieve the user with. id | slug | email | login * @param int|string $value A value for $field. A user ID, slug, email address, or login name. - * @return bool|object False on failure, User DB row object + * @return bool|object False on failure, WP_User object on success */ -function get_user_by($field, $value) { - global $wpdb; +function get_user_by( $field, $value ) { + $userdata = WP_User::get_data_by( $field, $value ); - switch ($field) { - case 'id': - return get_userdata($value); - break; - case 'slug': - $user_id = wp_cache_get($value, 'userslugs'); - $field = 'user_nicename'; - break; - case 'email': - $user_id = wp_cache_get($value, 'useremail'); - $field = 'user_email'; - break; - case 'login': - $value = sanitize_user( $value ); - $user_id = wp_cache_get($value, 'userlogins'); - $field = 'user_login'; - break; - default: - return false; - } - - if ( false !== $user_id ) - return get_userdata($user_id); - - if ( !$user = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->users WHERE $field = %s", $value) ) ) + if ( !$userdata ) return false; - _fill_user($user); + $user = new WP_User; + $user->init( $userdata ); return $user; } endif; +if ( !function_exists('cache_users') ) : +/** + * Retrieve info for user lists to prevent multiple queries by get_userdata() + * + * @since 3.0.0 + * + * @param array $user_ids User ID numbers list + */ +function cache_users( $user_ids ) { + global $wpdb; + + $clean = array(); + foreach ( $user_ids as $id ) { + $id = (int) $id; + if ( !wp_cache_get( $id, 'users' ) ) { + $clean[] = $id; + } + } + + if ( empty( $clean ) ) + return; + + $list = implode( ',', $clean ); + + $users = $wpdb->get_results( "SELECT * FROM $wpdb->users WHERE ID IN ($list)" ); + + $ids = array(); + foreach ( $users as $user ) { + update_user_caches( $user ); + $ids[] = $user->ID; + } + update_meta_cache( 'user', $ids ); +} +endif; + if ( !function_exists( 'wp_mail' ) ) : /** * Send mail, similar to PHP's mail diff --git a/wp-includes/user.php b/wp-includes/user.php index 0583cc533..baf3b16da 100644 --- a/wp-includes/user.php +++ b/wp-includes/user.php @@ -254,20 +254,18 @@ function get_user_option( $option, $user = 0, $deprecated = '' ) { if ( !empty( $deprecated ) ) _deprecated_argument( __FUNCTION__, '3.0' ); - if ( empty($user) ) { + if ( empty( $user ) ) $user = wp_get_current_user(); - $user = $user->ID; - } + else + $user = new WP_User( $user ); - $user = get_userdata($user); + if ( ! isset( $user->ID ) ) + return false; - // Keys used as object vars cannot have dashes. - $key = str_replace('-', '', $option); - - if ( isset( $user->{$wpdb->prefix . $key} ) ) // Blog specific - $result = $user->{$wpdb->prefix . $key}; - elseif ( isset( $user->{$key} ) ) // User specific and cross-blog - $result = $user->{$key}; + if ( $user->has_prop( $wpdb->prefix . $option ) ) // Blog specific + $result = $user->get( $wpdb->prefix . $option ); + elseif ( $user->has_prop( $option ) ) // User specific and cross-blog + $result = $user->get( $option ); else $result = false; @@ -680,13 +678,13 @@ function get_blogs_of_user( $id, $all = false ) { } if ( false === $blogs ) { - $user = get_userdata( (int) $id ); - if ( !$user ) + $userkeys = array_keys( get_user_meta( (int) $id ) ); + if ( empty( $userkeys ) ) return false; $blogs = $match = array(); - $prefix_length = strlen($wpdb->base_prefix); - foreach ( (array) $user as $key => $value ) { + $prefix_length = strlen( $wpdb->base_prefix ); + foreach ( $userkeys as $key ) { if ( $prefix_length && substr($key, 0, $prefix_length) != $wpdb->base_prefix ) continue; if ( substr($key, -12, 12) != 'capabilities' ) @@ -793,7 +791,7 @@ function delete_user_meta($user_id, $meta_key, $meta_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) { +function get_user_meta($user_id, $key = '', $single = false) { return get_metadata('user', $user_id, $key, $single); } @@ -1042,141 +1040,6 @@ function wp_dropdown_users( $args = '' ) { return $output; } -/** - * Add user meta data as properties to given user object. - * - * The finished user data is cached, but the cache is not used to fill in the - * user data for the given object. Once the function has been used, the cache - * should be used to retrieve user data. The intention is if the current data - * had been cached already, there would be no need to call this function. - * - * @access private - * @since 2.5.0 - * @uses $wpdb WordPress database object for queries - * - * @param object $user The user data object. - */ -function _fill_user( &$user ) { - $metavalues = get_user_metavalues(array($user->ID)); - _fill_single_user($user, $metavalues[$user->ID]); -} - -/** - * Perform the query to get the $metavalues array(s) needed by _fill_user and _fill_many_users - * - * @since 3.0.0 - * @param array $ids User ID numbers list. - * @return array of arrays. The array is indexed by user_id, containing $metavalues object arrays. - */ -function get_user_metavalues($ids) { - $objects = array(); - - $ids = array_map('intval', $ids); - foreach ( $ids as $id ) - $objects[$id] = array(); - - $metas = update_meta_cache('user', $ids); - - foreach ( $metas as $id => $meta ) { - foreach ( $meta as $key => $metavalues ) { - foreach ( $metavalues as $value ) { - $objects[$id][] = (object)array( 'user_id' => $id, 'meta_key' => $key, 'meta_value' => $value); - } - } - } - - return $objects; -} - -/** - * Unserialize user metadata, fill $user object, then cache everything. - * - * @since 3.0.0 - * @param object $user The User object. - * @param array $metavalues An array of objects provided by get_user_metavalues() - */ -function _fill_single_user( &$user, &$metavalues ) { - global $wpdb; - - foreach ( $metavalues as $meta ) { - $value = maybe_unserialize($meta->meta_value); - // Keys used as object vars cannot have dashes. - $key = str_replace('-', '', $meta->meta_key); - $user->{$key} = $value; - } - - $level = $wpdb->prefix . 'user_level'; - if ( isset( $user->{$level} ) ) - $user->user_level = $user->{$level}; - - // For backwards compat. - if ( isset($user->first_name) ) - $user->user_firstname = $user->first_name; - if ( isset($user->last_name) ) - $user->user_lastname = $user->last_name; - if ( isset($user->description) ) - $user->user_description = $user->description; - - update_user_caches($user); -} - -/** - * Take an array of user objects, fill them with metas, and cache them. - * - * @since 3.0.0 - * @param array $users User objects - */ -function _fill_many_users( &$users ) { - $ids = array(); - foreach( $users as $user_object ) { - $ids[] = $user_object->ID; - } - - $metas = get_user_metavalues($ids); - - foreach ( $users as $user_object ) { - if ( isset($metas[$user_object->ID]) ) { - _fill_single_user($user_object, $metas[$user_object->ID]); - } - } -} - -/** - * Sanitize every user field. - * - * If the context is 'raw', then the user object or array will get minimal santization of the int fields. - * - * @since 2.3.0 - * @uses sanitize_user_field() Used to sanitize the fields. - * - * @param object|array $user The User Object or Array - * @param string $context Optional, default is 'display'. How to sanitize user fields. - * @return object|array The now sanitized User Object or Array (will be the same type as $user) - */ -function sanitize_user_object($user, $context = 'display') { - if ( is_object($user) ) { - if ( !isset($user->ID) ) - $user->ID = 0; - if ( isset($user->data) ) - $vars = get_object_vars( $user->data ); - else - $vars = get_object_vars($user); - foreach ( array_keys($vars) as $field ) { - if ( is_string($user->$field) || is_numeric($user->$field) ) - $user->$field = sanitize_user_field($field, $user->$field, $user->ID, $context); - } - $user->filter = $context; - } else { - if ( !isset($user['ID']) ) - $user['ID'] = 0; - foreach ( array_keys($user) as $field ) - $user[$field] = sanitize_user_field($field, $user[$field], $user['ID'], $context); - $user['filter'] = $context; - } - - return $user; -} - /** * Sanitize user field based on context. * @@ -1264,7 +1127,7 @@ function sanitize_user_field($field, $value, $user_id, $context) { * * @param object $user User object to be cached */ -function update_user_caches(&$user) { +function update_user_caches($user) { wp_cache_add($user->ID, $user, 'users'); wp_cache_add($user->user_login, $user->ID, 'userlogins'); wp_cache_add($user->user_email, $user->ID, 'useremail'); @@ -1279,7 +1142,7 @@ function update_user_caches(&$user) { * @param int $id User ID */ function clean_user_cache($id) { - $user = new WP_User($id); + $user = WP_User::get_data_by( 'id', $id ); wp_cache_delete($id, 'users'); wp_cache_delete($user->user_login, 'userlogins'); @@ -1390,7 +1253,7 @@ function wp_insert_user($userdata) { if ( !empty($ID) ) { $ID = (int) $ID; $update = true; - $old_user_data = get_userdata($ID); + $old_user_data = WP_User::get_data_by( 'id', $ID ); } else { $update = false; // Hash the password @@ -1548,7 +1411,7 @@ function wp_update_user($userdata) { $ID = (int) $userdata['ID']; // First, get all of the original fields - $user = get_userdata($ID); + $user = WP_User::get_data_by('id', $ID); // Escape data pulled from DB. $user = add_magic_quotes(get_object_vars($user));