I’ve written a plugin that allows users to bookmark their favorite posts, but have run into a small problem when using it on a multisite network.
Each time a post is bookmarked, the ID of that post is stored in an array of IDs in the current user’s meta table. This all works great, until it’s used on a MS setup.
If viewing the site that the bookmarks were created on, everything works great, but when viewing a different site, I get a list of post IDs that belong to the other site. This is because the user meta table is shared between sites.
So, what I need to do is retrieve only the user meta for the current site. Is there a way to do this? I don’t think there is, so if anyone has some insight, that’d be great.
WordPress distinguishes usermeta keys between sites by using the database prefix for each site.
For example, instead of using the favorite_posts key, you’d use the meta key wp_23_favorite_posts. To get the prefix, you can use
$wpdb->get_blog_prefix()
.But wait, there’s actually a whole API dedicated to this. Rather than using
*_user_meta()
, use*_user_option()
. These are internally translated to be against the individual site.And, it’s easily integrated into your existing plugin.
get_user_option()
checks against a site-specific key first, but if it doesn’t find anything, it falls back to a user-wide meta key. So go ahead and switch toget_user_option()
and your existing plugin will work on single site without a problem.Here are the function definitions:
why not store the blog id together with the array of postIds, so you will have something like this stored in the user meta data:
you can use the global $blog_id to get the current blogid. On a non multisite setup, the blogid will be 0 and should still work when you try to get the posts out the array by
arr[$blog_id]