<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[BuddyPress][11705] trunk/src: Members: trust `WP_User::get_data_by()` and eliminate an additional user cache layer.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="http://buddypress.trac.wordpress.org/changeset/11705">11705</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"http://buddypress.trac.wordpress.org/changeset/11705","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>johnjamesjacoby</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2017-09-27 10:24:10 +0000 (Wed, 27 Sep 2017)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Members: trust `WP_User::get_data_by()` and eliminate an additional user cache layer.

This change removes ye olde `bp_core_userdata_` cache key system, relying 100% on the baked-in object cache for user data and improving the liklihood of cache hits (particularly when other membership or community plugins are looking for user data outside of a BuddyPress specific context.)

For example, bbPress will look for authors of topics and latest posts on various forum pages, but BuddyPress will want to make sure it's XProfile Field display names are used. Previous to now, BuddyPress would need to re-query for these users and keep a separate cache of them. By relying on the traditional user objects, those duplicate database queries never happen, resulting in much joy.

This additionally improves page performance throughout the entire application. When user accounts are updated (via XProfile or related) and then immediately prime their caches, there is no more secondary BuddyPress-specific user object cache to prime.

Fixes <a href="http://buddypress.trac.wordpress.org/ticket/7595">#7595</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcbpcoreclassesclassbpcoreuserphp">trunk/src/bp-core/classes/class-bp-core-user.php</a></li>
<li><a href="#trunksrcbpcoreclassesclassbpuserqueryphp">trunk/src/bp-core/classes/class-bp-user-query.php</a></li>
<li><a href="#trunksrcbpmembersbpmembersfunctionsphp">trunk/src/bp-members/bp-members-functions.php</a></li>
<li><a href="#trunksrcbpsettingsbpsettingsactionsphp">trunk/src/bp-settings/bp-settings-actions.php</a></li>
<li><a href="#trunksrcbpxprofilebpxprofilefunctionsphp">trunk/src/bp-xprofile/bp-xprofile-functions.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcbpcoreclassesclassbpcoreuserphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-core/classes/class-bp-core-user.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-core/classes/class-bp-core-user.php  2017-09-27 09:56:42 UTC (rev 11704)
+++ trunk/src/bp-core/classes/class-bp-core-user.php    2017-09-27 10:24:10 UTC (rev 11705)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -749,18 +749,13 @@
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><span class="cx" style="display: block; padding: 0 10px">         * Get WordPress user details for a specified user.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * @global wpdb $wpdb WordPress database object.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * @since 3.0.0 Results might be from cache
</ins><span class="cx" style="display: block; padding: 0 10px">          *
</span><span class="cx" style="display: block; padding: 0 10px">         * @param int $user_id User ID.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * @return array Associative array.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * @return false|object WP_User if successful, false on failure.
</ins><span class="cx" style="display: block; padding: 0 10px">          */
</span><span class="cx" style="display: block; padding: 0 10px">        public static function get_core_userdata( $user_id ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                global $wpdb;
-
-               if ( !$user = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->users} WHERE ID = %d LIMIT 1", $user_id ) ) )
-                       return false;
-
-               return $user;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         return WP_User::get_data_by( 'id', $user_id );
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span></span></pre></div>
<a id="trunksrcbpcoreclassesclassbpuserqueryphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-core/classes/class-bp-user-query.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-core/classes/class-bp-user-query.php 2017-09-27 09:56:42 UTC (rev 11704)
+++ trunk/src/bp-core/classes/class-bp-user-query.php   2017-09-27 10:24:10 UTC (rev 11705)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -570,14 +570,6 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                ), $this ) );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                // WP_User_Query doesn't cache the data it pulls from wp_users,
-               // and it does not give us a way to save queries by fetching
-               // only uncached users. However, BP does cache this data, so
-               // we set it here.
-               foreach ( $wp_user_query->results as $u ) {
-                       wp_cache_set( 'bp_core_userdata_' . $u->ID, $u, 'bp' );
-               }
-
</del><span class="cx" style="display: block; padding: 0 10px">                 // We calculate total_users using a standalone query, except
</span><span class="cx" style="display: block; padding: 0 10px">                // when a whitelist of user_ids is passed to the constructor.
</span><span class="cx" style="display: block; padding: 0 10px">                // This clause covers the latter situation, and ensures that
</span></span></pre></div>
<a id="trunksrcbpmembersbpmembersfunctionsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-members/bp-members-functions.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-members/bp-members-functions.php     2017-09-27 09:56:42 UTC (rev 11704)
+++ trunk/src/bp-members/bp-members-functions.php       2017-09-27 10:24:10 UTC (rev 11705)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -214,20 +214,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return false;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $userdata = wp_cache_get( 'bp_core_userdata_' . $user_id, 'bp' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Get core user data
+       $userdata = BP_Core_User::get_core_userdata( $user_id );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        // No cache.
-       if ( false === $userdata ) {
-               $userdata = BP_Core_User::get_core_userdata( $user_id );
-
-               // Cache data; no-result is cached as integer 0.
-               wp_cache_set( 'bp_core_userdata_' . $user_id, false === $userdata ? 0 : $userdata, 'bp' );
-
-       // Cached no-result, so set return value as false as expected.
-       } elseif ( 0 === $userdata ) {
-               $userdata = false;
-       }
-
</del><span class="cx" style="display: block; padding: 0 10px">         /**
</span><span class="cx" style="display: block; padding: 0 10px">         * Filters the userdata for a passed user.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span></span></pre></div>
<a id="trunksrcbpsettingsbpsettingsactionsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-settings/bp-settings-actions.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-settings/bp-settings-actions.php     2017-09-27 09:56:42 UTC (rev 11704)
+++ trunk/src/bp-settings/bp-settings-actions.php       2017-09-27 10:24:10 UTC (rev 11705)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -178,7 +178,6 @@
</span><span class="cx" style="display: block; padding: 0 10px">                // Clear cached data, so that the changed settings take effect
</span><span class="cx" style="display: block; padding: 0 10px">                // on the current page load.
</span><span class="cx" style="display: block; padding: 0 10px">                if ( ( false === $email_error ) && ( false === $pass_error ) && ( wp_update_user( $update_user ) ) ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        wp_cache_delete( 'bp_core_userdata_' . bp_displayed_user_id(), 'bp' );
</del><span class="cx" style="display: block; padding: 0 10px">                         $bp->displayed_user->userdata = bp_core_get_core_userdata( bp_displayed_user_id() );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -454,8 +453,6 @@
</span><span class="cx" style="display: block; padding: 0 10px">                ) );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                if ( $email_changed ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        // Delete object cache for displayed user.
-                       wp_cache_delete( 'bp_core_userdata_' . bp_displayed_user_id(), 'bp' );
</del><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        // Delete the pending email change key.
</span><span class="cx" style="display: block; padding: 0 10px">                        bp_delete_user_meta( bp_displayed_user_id(), 'pending_email_change' );
</span></span></pre></div>
<a id="trunksrcbpxprofilebpxprofilefunctionsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-xprofile/bp-xprofile-functions.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-xprofile/bp-xprofile-functions.php   2017-09-27 09:56:42 UTC (rev 11704)
+++ trunk/src/bp-xprofile/bp-xprofile-functions.php     2017-09-27 10:24:10 UTC (rev 11705)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -836,7 +836,6 @@
</span><span class="cx" style="display: block; padding: 0 10px">        bp_update_user_meta( $user_id, 'last_name',  $lastname  );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        wp_update_user( array( 'ID' => $user_id, 'display_name' => $fullname ) );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        wp_cache_delete( 'bp_core_userdata_' . $user_id, 'bp' );
</del><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> add_action( 'xprofile_updated_profile', 'xprofile_sync_wp_profile' );
</span><span class="cx" style="display: block; padding: 0 10px"> add_action( 'bp_core_signup_user',      'xprofile_sync_wp_profile' );
</span></span></pre>
</div>
</div>

</body>
</html>