WordPress.org

Make WordPress Core

Ticket #15458: lazy-load.diff

File lazy-load.diff, 13.7 KB (added by scribu, 7 years ago)
  • wp-includes/user.php

     
    680680        }
    681681
    682682        if ( false === $blogs ) {
    683                 $user = get_userdata( (int) $id );
    684                 if ( !$user )
     683                $userkeys = array_keys( get_user_meta( (int) $id ) );
     684                if ( empty( $userkeys ) )
    685685                        return false;
    686686
    687687                $blogs = $match = array();
    688                 $prefix_length = strlen($wpdb->base_prefix);
    689                 foreach ( (array) $user as $key => $value ) {
     688                $prefix_length = strlen( $wpdb->base_prefix );
     689                foreach ( $userkeys as $key ) {
    690690                        if ( $prefix_length && substr($key, 0, $prefix_length) != $wpdb->base_prefix )
    691691                                continue;
    692692                        if ( substr($key, -12, 12) != 'capabilities' )
     
    792792 * @return mixed Will be an array if $single is false. Will be value of meta data field if $single
    793793 *  is true.
    794794 */
    795 function get_user_meta($user_id, $key, $single = false) {
     795function get_user_meta($user_id, $key = '', $single = false) {
    796796        return get_metadata('user', $user_id, $key, $single);
    797797}
    798798
     
    10421042}
    10431043
    10441044/**
    1045  * Add user meta data as properties to given user object.
    1046  *
    1047  * The finished user data is cached, but the cache is not used to fill in the
    1048  * user data for the given object. Once the function has been used, the cache
    1049  * should be used to retrieve user data. The intention is if the current data
    1050  * had been cached already, there would be no need to call this function.
    1051  *
    1052  * @access private
    1053  * @since 2.5.0
    1054  * @uses $wpdb WordPress database object for queries
    1055  *
    1056  * @param object $user The user data object.
    1057  */
    1058 function _fill_user( &$user ) {
    1059         $metavalues = get_user_metavalues(array($user->ID));
    1060         _fill_single_user($user, $metavalues[$user->ID]);
    1061 }
    1062 
    1063 /**
    1064  * Perform the query to get the $metavalues array(s) needed by _fill_user and _fill_many_users
    1065  *
    1066  * @since 3.0.0
    1067  * @param array $ids User ID numbers list.
    1068  * @return array of arrays. The array is indexed by user_id, containing $metavalues object arrays.
    1069  */
    1070 function get_user_metavalues($ids) {
    1071         $objects = array();
    1072 
    1073         $ids = array_map('intval', $ids);
    1074         foreach ( $ids as $id )
    1075                 $objects[$id] = array();
    1076 
    1077         $metas = update_meta_cache('user', $ids);
    1078 
    1079         foreach ( $metas as $id => $meta ) {
    1080                 foreach ( $meta as $key => $metavalues ) {
    1081                         foreach ( $metavalues as $value ) {
    1082                                 $objects[$id][] = (object)array( 'user_id' => $id, 'meta_key' => $key, 'meta_value' => $value);
    1083                         }
    1084                 }
    1085         }
    1086 
    1087         return $objects;
    1088 }
    1089 
    1090 /**
    1091  * Unserialize user metadata, fill $user object, then cache everything.
    1092  *
    1093  * @since 3.0.0
    1094  * @param object $user The User object.
    1095  * @param array $metavalues An array of objects provided by get_user_metavalues()
    1096  */
    1097 function _fill_single_user( &$user, &$metavalues ) {
    1098         global $wpdb;
    1099 
    1100         foreach ( $metavalues as $meta ) {
    1101                 $value = maybe_unserialize($meta->meta_value);
    1102                 // Keys used as object vars cannot have dashes.
    1103                 $key = str_replace('-', '', $meta->meta_key);
    1104                 $user->{$key} = $value;
    1105         }
    1106 
    1107         $level = $wpdb->prefix . 'user_level';
    1108         if ( isset( $user->{$level} ) )
    1109                 $user->user_level = $user->{$level};
    1110 
    1111         // For backwards compat.
    1112         if ( isset($user->first_name) )
    1113                 $user->user_firstname = $user->first_name;
    1114         if ( isset($user->last_name) )
    1115                 $user->user_lastname = $user->last_name;
    1116         if ( isset($user->description) )
    1117                 $user->user_description = $user->description;
    1118 
    1119         update_user_caches($user);
    1120 }
    1121 
    1122 /**
    1123  * Take an array of user objects, fill them with metas, and cache them.
    1124  *
    1125  * @since 3.0.0
    1126  * @param array $users User objects
    1127  */
    1128 function _fill_many_users( &$users ) {
    1129         $ids = array();
    1130         foreach( $users as $user_object ) {
    1131                 $ids[] = $user_object->ID;
    1132         }
    1133 
    1134         $metas = get_user_metavalues($ids);
    1135 
    1136         foreach ( $users as $user_object ) {
    1137                 if ( isset($metas[$user_object->ID]) ) {
    1138                         _fill_single_user($user_object, $metas[$user_object->ID]);
    1139                 }
    1140         }
    1141 }
    1142 
    1143 /**
    11441045 * Sanitize every user field.
    11451046 *
    11461047 * If the context is 'raw', then the user object or array will get minimal santization of the int fields.
     
    12631164 *
    12641165 * @param object $user User object to be cached
    12651166 */
    1266 function update_user_caches(&$user) {
     1167function update_user_caches($user) {
    12671168        wp_cache_add($user->ID, $user, 'users');
    12681169        wp_cache_add($user->user_login, $user->ID, 'userlogins');
    12691170        wp_cache_add($user->user_email, $user->ID, 'useremail');
  • wp-includes/capabilities.php

     
    420420         */
    421421        var $filter = null;
    422422
     423        private static $back_compat_keys = array(
     424                'user_firstname' => 'first_name',
     425                'user_lastname' => 'last_name',
     426                'user_description' => 'description'
     427        );
     428
    423429        /**
    424          * Constructor - Sets up the object properties.
     430         * Constructor
    425431         *
    426          * Retrieves the userdata and then assigns all of the data keys to direct
    427          * properties of the object. Calls {@link WP_User::_init_caps()} after
    428          * setting up the object's user data properties.
     432         * Retrieves the userdata and passes it to {@link WP_User::init()}.
    429433         *
    430434         * @since 2.0.0
    431435         * @access public
    432436         *
    433          * @param int|string $id User's ID or username
    434          * @param int $name Optional. User's username
     437         * @param int|string $id User's ID
     438         * @param string $name Optional. User's username
    435439         * @param int $blog_id Optional Blog ID, defaults to current blog.
    436440         * @return WP_User
    437441         */
    438         function __construct( $id, $name = '', $blog_id = '' ) {
    439                 if ( empty( $id ) && empty( $name ) )
    440                         return;
    441 
     442        function __construct( $id = 0, $name = '', $blog_id = '' ) {
    442443                if ( ! is_numeric( $id ) ) {
    443444                        $name = $id;
    444445                        $id = 0;
    445446                }
    446447
    447                 if ( ! empty( $id ) )
    448                         $this->data = get_userdata( $id );
     448                if ( $id )
     449                        $data = self::get_data_by( 'id', $id );
    449450                else
    450                         $this->data = get_user_by('login', $name );
     451                        $data = self::get_data_by( 'login', $name );
    451452
    452                 if ( empty( $this->data->ID ) )
    453                         return;
     453                if ( $data )
     454                        $this->init( $data, $blog_id );
     455        }
    454456
    455                 $this->ID = $this->data->ID;
     457        /**
     458         * Sets up object properties, including capabilities.
     459         *
     460         * @param object User DB row object
     461         */
     462        function init( $data, $blog_id = '' ) {
     463                $this->data = $data;
     464                $this->ID = (int) $data->ID;
     465
    456466                $this->for_blog( $blog_id );
    457467        }
    458468
    459469        /**
     470         * Return only the main user fields
     471         */
     472        static function get_data_by( $field, $value ) {
     473                global $wpdb;
     474
     475                switch ( $field ) {
     476                        case 'id':
     477                                $user_id = $value = absint($value);
     478                                $field = 'ID';
     479                                break;
     480                        case 'slug':
     481                                $user_id = wp_cache_get($value, 'userslugs');
     482                                $field = 'user_nicename';
     483                                break;
     484                        case 'email':
     485                                $user_id = wp_cache_get($value, 'useremail');
     486                                $field = 'user_email';
     487                                break;
     488                        case 'login':
     489                                $value = sanitize_user( $value );
     490                                $user_id = wp_cache_get($value, 'userlogins');
     491                                $field = 'user_login';
     492                                break;
     493                        default:
     494                                return false;
     495                }
     496
     497                if ( false !== $user_id ) {
     498                        if ( $user = wp_cache_get( $user_id, 'users' ) )
     499                                return $user;
     500                }
     501
     502                if ( !$user = $wpdb->get_row( $wpdb->prepare(
     503                        "SELECT * FROM $wpdb->users WHERE $field = %s", $value
     504                ) ) )
     505                        return false;
     506
     507                update_user_caches( $user );
     508
     509                return $user;
     510        }
     511
     512        /**
    460513         * Magic method for checking the existance of a certain custom field
    461514         *
    462515         * @since 3.3.0
     
    476529                        return $this->ID;
    477530                }
    478531
    479                 return $this->data->$key;
     532                if ( isset( $this->data->$key ) )
     533                        return $this->data->$key;
     534
     535                if ( isset( self::$back_compat_keys[ $key ] ) )
     536                        $key = self::$back_compat_keys[ $key ];
     537
     538                return get_user_meta( $this->ID, $key, true );
    480539        }
    481540
    482541        /**
     
    515574                else
    516575                        $this->cap_key = $cap_key;
    517576
    518                 $this->caps = &$this->data->{$this->cap_key};
     577                $this->caps = get_user_meta( $this->ID, $this->cap_key, true );
     578
    519579                if ( ! is_array( $this->caps ) )
    520580                        $this->caps = array();
    521581
     
    658718         */
    659719        function update_user_level_from_caps() {
    660720                global $wpdb;
    661                 $this->user_level = array_reduce( array_keys( $this->allcaps ), array( &$this, 'level_reduction' ), 0 );
     721                $this->user_level = array_reduce( array_keys( $this->allcaps ), array( $this, 'level_reduction' ), 0 );
    662722                update_user_meta( $this->ID, $wpdb->prefix . 'user_level', $this->user_level );
    663723        }
    664724
     
    10621122        $args = array_slice( func_get_args(), 1 );
    10631123        $args = array_merge( array( $capability ), $args );
    10641124
    1065         return call_user_func_array( array( &$current_user, 'has_cap' ), $args );
     1125        return call_user_func_array( array( $current_user, 'has_cap' ), $args );
    10661126}
    10671127
    10681128/**
  • wp-includes/deprecated.php

     
    26272627 */
    26282628function wp_default_editor() {
    26292629        _deprecated_function( __FUNCTION__, '3.3' );
    2630        
     2630
    26312631        global $wp_editor;
    26322632        if ( !is_a($wp_editor, 'WP_Editor') ) {
    26332633                require_once( ABSPATH . WPINC . '/class-wp-editor.php' );
    26342634                $wp_editor = new WP_Editor;
    26352635        }
    2636        
     2636
    26372637        return $wp_editor->wp_default_editor();
    26382638}
    26392639
     
    26412641 * Display editor: TinyMCE, HTML, or both.
    26422642 *
    26432643 * @since 2.1.0
    2644  * @deprecated 3.3 
     2644 * @deprecated 3.3
    26452645 *
    26462646 * @param string $content Textarea content.
    26472647 * @param string $id Optional, default is 'content'. HTML ID attribute value.
     
    26502650 * @param int $tab_index Optional, not used
    26512651 */
    26522652function the_editor($content, $id = 'content', $prev_id = 'title', $media_buttons = true, $tab_index = 2, $extended = true) {
    2653        
     2653
    26542654        wp_editor( $content, $id, array( 'media_buttons' => $media_buttons ) );
    26552655        return;
    26562656}
    26572657
     2658/**
     2659 * Perform the query to get the $metavalues array(s) needed by _fill_user and _fill_many_users
     2660 *
     2661 * @since 3.0.0
     2662 * @param array $ids User ID numbers list.
     2663 * @return array of arrays. The array is indexed by user_id, containing $metavalues object arrays.
     2664 */
     2665function get_user_metavalues($ids) {
     2666        _deprecated_function( __FUNCTION__, '3.3' );
     2667
     2668        $objects = array();
     2669
     2670        $ids = array_map('intval', $ids);
     2671        foreach ( $ids as $id )
     2672                $objects[$id] = array();
     2673
     2674        $metas = update_meta_cache('user', $ids);
     2675
     2676        foreach ( $metas as $id => $meta ) {
     2677                foreach ( $meta as $key => $metavalues ) {
     2678                        foreach ( $metavalues as $value ) {
     2679                                $objects[$id][] = (object)array( 'user_id' => $id, 'meta_key' => $key, 'meta_value' => $value);
     2680                        }
     2681                }
     2682        }
     2683
     2684        return $objects;
     2685}
  • wp-includes/pluggable.php

     
    9898 * @since 0.71
    9999 *
    100100 * @param int $user_id User ID
    101  * @return bool|object False on failure, User DB row object
     101 * @return bool|object False on failure, WP_User object on success
    102102 */
    103103function get_userdata( $user_id ) {
    104         global $wpdb;
     104        return get_user_by( 'id', $user_id );
     105}
     106endif;
    105107
    106         if ( ! is_numeric( $user_id ) )
    107                 return false;
     108if ( !function_exists('get_user_by') ) :
     109/**
     110 * Retrieve user info by a given field
     111 *
     112 * @since 2.8.0
     113 *
     114 * @param string $field The field to retrieve the user with.  id | slug | email | login
     115 * @param int|string $value A value for $field.  A user ID, slug, email address, or login name.
     116 * @return bool|object False on failure, WP_User object on success
     117 */
     118function get_user_by( $field, $value ) {
     119        $userdata = WP_User::get_data_by( $field, $value );
    108120
    109         $user_id = absint( $user_id );
    110         if ( ! $user_id )
     121        if ( !$userdata )
    111122                return false;
    112123
    113         $user = wp_cache_get( $user_id, 'users' );
     124        $user = new WP_User;
     125        $user->init( $userdata );
    114126
    115         if ( $user )
    116                 return $user;
    117 
    118         if ( ! $user = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->users WHERE ID = %d LIMIT 1", $user_id ) ) )
    119                 return false;
    120 
    121         _fill_user( $user );
    122 
    123127        return $user;
    124128}
    125129endif;
     
    130134 *
    131135 * @since 3.0.0
    132136 *
    133  * @param array $users User ID numbers list
     137 * @param array $user_ids User ID numbers list
    134138 */
    135 function cache_users( $users ) {
     139function cache_users( $user_ids ) {
    136140        global $wpdb;
    137141
    138142        $clean = array();
    139         foreach($users as $id) {
     143        foreach ( $user_ids as $id ) {
    140144                $id = (int) $id;
    141                 if (wp_cache_get($id, 'users')) {
    142                         // seems to be cached already
    143                 } else {
     145                if ( !wp_cache_get( $id, 'users' ) ) {
    144146                        $clean[] = $id;
    145147                }
    146148        }
    147149
    148         if ( 0 == count($clean) )
     150        if ( empty( $clean ) )
    149151                return;
    150152
    151         $list = implode(',', $clean);
     153        $list = implode( ',', $clean );
    152154
    153         $results = $wpdb->get_results("SELECT * FROM $wpdb->users WHERE ID IN ($list)");
     155        $users = $wpdb->get_results( "SELECT * FROM $wpdb->users WHERE ID IN ($list)" );
    154156
    155         _fill_many_users($results);
    156 }
    157 endif;
    158 
    159 if ( !function_exists('get_user_by') ) :
    160 /**
    161  * Retrieve user info by a given field
    162  *
    163  * @since 2.8.0
    164  *
    165  * @param string $field The field to retrieve the user with.  id | slug | email | login
    166  * @param int|string $value A value for $field.  A user ID, slug, email address, or login name.
    167  * @return bool|object False on failure, User DB row object
    168  */
    169 function get_user_by($field, $value) {
    170         global $wpdb;
    171 
    172         switch ($field) {
    173                 case 'id':
    174                         return get_userdata($value);
    175                         break;
    176                 case 'slug':
    177                         $user_id = wp_cache_get($value, 'userslugs');
    178                         $field = 'user_nicename';
    179                         break;
    180                 case 'email':
    181                         $user_id = wp_cache_get($value, 'useremail');
    182                         $field = 'user_email';
    183                         break;
    184                 case 'login':
    185                         $value = sanitize_user( $value );
    186                         $user_id = wp_cache_get($value, 'userlogins');
    187                         $field = 'user_login';
    188                         break;
    189                 default:
    190                         return false;
     157        $ids = array();
     158        foreach ( $users as $user ) {
     159                update_user_caches( $user );
     160                $ids[] = $user->ID;
    191161        }
    192 
    193          if ( false !== $user_id )
    194                 return get_userdata($user_id);
    195 
    196         if ( !$user = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->users WHERE $field = %s", $value) ) )
    197                 return false;
    198 
    199         _fill_user($user);
    200 
    201         return $user;
     162        update_meta_cache( 'user', $ids );
    202163}
    203164endif;
    204165