[wp-hackers] WP_Object_Cache and integration with bbPress

Michael D Adams mikea at turbonet.com
Fri Jan 4 07:27:58 GMT 2008

I'm looking to integrate WordPress' object cache with bbPress'.  With  
an common object cache mechanism, sites that load bbPress and  
WordPress on the same page view would gain a bit in efficiency, any  
persistent cache would be kept smaller, developers would only have to  
learn/write one kind of cache system, and site owners would be able to  
use the same object cache plugins (e.g. the memcache or APC plugins)  
for bbPress, WordPress, or both.

So, if you have a site with a WordPress install and a bbPress install  
both talking to the same memcached server (for example), we have to  
make sure bbPress doesn't poison WordPress' data or vice versa.   
That's easy, though.  We just have WordPress and bbPress store data in  
different cache groups:

WordPress posts: wp_cache_get( $post_id, 'posts' );
bbPress posts:   wp_cache_get( $bb_post_id, 'bb_posts' );

What about users though?

Some sites (I think most sites) will have a unified user base for  
their WordPress and bbPress installs.  Let's take WordPress.com as an  
example.  There, WordPress mu and bbPress share the same users table.   
Since it's the same data, it'd be silly to cache it all twice like the  
following would do:

WordPress user: wp_cache_get( $user_id, 'users' );
bbPress user:   wp_cache_get( $user_id, 'bb_users' );

So for the specific case of user data, it makes since to store them in  
the same place:

WordPress user: wp_cache_get( $user_id, 'users' );
bbPress user:   wp_cache_get( $user_id, 'users' );

But other sites (I think only a few sites) will *not* have a unified  
user base for their WordPress and bbPress installs.  Let's take  
WordPress.org as an example.  There, WordPress and bbPress do not  
share the same user table.  Since it's different data, we have to  
store it in different places.

So.  My suggestion is for WordPress and bbPress to use different cache  
groups for their respective users.

WordPress user: wp_cache_get( $user_id, 'users' );
bbPress user:   wp_cache_get( $user_id, 'bb_users' );

But to have the cache mechanism consider those two groups as  
synonymous;  wp_cache_get() would be written to look in the same place  
(and therefore return the same result) in either of the above cases.   
(Actually, wp_cache_get() wouldn't have a clue.   
WP_Object_Cache::get() would do the work.)

So we'd have something like:

class WP_Object_Cache {
	var $group_translations = array( 'bb_users' => 'users' );

	function get( $key, $group ) {
		if ( isset($this->group_translations[$group]) )
			$group = this->group_translations[$group];


By default, then, the object cache would assume that WordPress' and  
bbPress' user bases were unified.  If that weren't true for your  
particular set up, you'd write some small plugin that would modify the  
translation table (or write a complete new object cache, I suppose).

Or core WordPress could have an empty translation table (but  
WP_Object_Cache::get() would still know what to do with a translation  
table), and bbPress would add the necessary bits.

Another option would be to just store user data twice and not care  
about any supposed efficiency loss.



More information about the wp-hackers mailing list