/** * @group bp_blogs_update_meta_cache */ public function test_bp_blogs_update_meta_cache() { if (!is_multisite()) { return; } $b1 = $this->factory->blog->create(); $b2 = $this->factory->blog->create(); bp_blogs_add_blogmeta($b1, 'foo', 'bar'); bp_blogs_add_blogmeta($b1, 'foo2', 'bar2'); bp_blogs_add_blogmeta($b2, 'foo', 'bar'); // Need this info $b1_name = bp_blogs_get_blogmeta($b1, 'name'); $b1_description = bp_blogs_get_blogmeta($b1, 'description'); $b1_last_activity = bp_blogs_get_blogmeta($b1, 'last_activity'); $b2_name = bp_blogs_get_blogmeta($b2, 'name'); $b2_description = bp_blogs_get_blogmeta($b2, 'description'); $b2_last_activity = bp_blogs_get_blogmeta($b2, 'last_activity'); // Clear caches (due to _get_) wp_cache_delete($b1, 'blog_meta'); wp_cache_delete($b2, 'blog_meta'); // Caches should be empty $this->assertFalse(wp_cache_get($b1, 'blog_meta')); $this->assertFalse(wp_cache_get($b2, 'blog_meta')); bp_blogs_update_meta_cache(array($b1, $b2)); $b1_expected = array('name' => array($b1_name), 'description' => array($b1_description), 'last_activity' => array($b1_last_activity), 'foo' => array('bar'), 'foo2' => array('bar2')); $b2_expected = array('name' => array($b2_name), 'description' => array($b2_description), 'last_activity' => array($b2_last_activity), 'foo' => array('bar')); // The cache may contain more than just this, so loop through // and check only relevant keys $b1_found = wp_cache_get($b1, 'blog_meta'); foreach ($b1_expected as $k => $v) { $this->assertSame($v, $b1_found[$k]); } $b2_found = wp_cache_get($b2, 'blog_meta'); foreach ($b2_expected as $k => $v) { $this->assertSame($v, $b2_found[$k]); } }
/** * Fetch data related to blogs at the beginning of an activity loop. * * This reduces database overhead during the activity loop. * * @since BuddyPress (2.0.0) * * @param array $activities Array of activity items. * @return array */ function bp_blogs_prefetch_activity_object_data( $activities ) { if ( empty( $activities ) ) { return $activities; } $blog_ids = array(); foreach ( $activities as $activity ) { if ( buddypress()->blogs->id !== $activity->component ) { continue; } $blog_ids[] = $activity->item_id; } if ( ! empty( $blog_ids ) ) { bp_blogs_update_meta_cache( $blog_ids ); } return $activities; }
/** * Retrieve a set of blog-user associations. * * @param string $type The order in which results should be returned. * 'active', 'alphabetical', 'newest', or 'random'. * @param int|bool $limit Optional. The maximum records to return. * Default: false. * @param int|bool $page Optional. The page of records to return. * Default: false (unlimited results). * @param int $user_id Optional. ID of the user whose blogs are being * retrieved. Default: 0. * @param string|bool $search_terms Optional. Search by text stored in * blogmeta (such as the blog name). Default: false. * @param bool $update_meta_cache Whether to pre-fetch metadata for * blogs. Default: true. * @param array|bool $include_blog_ids Array of blog IDs to include. * @return array Multidimensional results array, structured as follows: * 'blogs' - Array of located blog objects * 'total' - A count of the total blogs matching the filter params */ public static function get($type, $limit = false, $page = false, $user_id = 0, $search_terms = false, $update_meta_cache = true, $include_blog_ids = false) { global $wpdb; $bp = buddypress(); if (!is_user_logged_in() || !bp_current_user_can('bp_moderate') && $user_id != bp_loggedin_user_id()) { $hidden_sql = "AND wb.public = 1"; } else { $hidden_sql = ''; } $pag_sql = $limit && $page ? $wpdb->prepare(" LIMIT %d, %d", intval(($page - 1) * $limit), intval($limit)) : ''; $user_sql = !empty($user_id) ? $wpdb->prepare(" AND b.user_id = %d", $user_id) : ''; switch ($type) { case 'active': default: $order_sql = "ORDER BY bm.meta_value DESC"; break; case 'alphabetical': $order_sql = "ORDER BY bm_name.meta_value ASC"; break; case 'newest': $order_sql = "ORDER BY wb.registered DESC"; break; case 'random': $order_sql = "ORDER BY RAND()"; break; } $include_sql = ''; $include_blog_ids = array_filter(wp_parse_id_list($include_blog_ids)); if (!empty($include_blog_ids)) { $blog_ids_sql = implode(',', $include_blog_ids); $include_sql = " AND b.blog_id IN ({$blog_ids_sql})"; } if (!empty($search_terms)) { $search_terms_like = '%' . bp_esc_like($search_terms) . '%'; $search_terms_sql = $wpdb->prepare('AND (bm_name.meta_value LIKE %s OR bm_description.meta_value LIKE %s)', $search_terms_like, $search_terms_like); } else { $search_terms_sql = ''; } $paged_blogs = $wpdb->get_results("\n\t\t\tSELECT b.blog_id, b.user_id as admin_user_id, u.user_email as admin_user_email, wb.domain, wb.path, bm.meta_value as last_activity, bm_name.meta_value as name\n\t\t\tFROM\n\t\t\t {$bp->blogs->table_name} b\n\t\t\t LEFT JOIN {$bp->blogs->table_name_blogmeta} bm ON (b.blog_id = bm.blog_id)\n\t\t\t LEFT JOIN {$bp->blogs->table_name_blogmeta} bm_name ON (b.blog_id = bm_name.blog_id)\n\t\t\t LEFT JOIN {$bp->blogs->table_name_blogmeta} bm_description ON (b.blog_id = bm_description.blog_id)\n\t\t\t LEFT JOIN {$wpdb->base_prefix}blogs wb ON (b.blog_id = wb.blog_id)\n\t\t\t LEFT JOIN {$wpdb->users} u ON (b.user_id = u.ID)\n\t\t\tWHERE\n\t\t\t wb.archived = '0' AND wb.spam = 0 AND wb.mature = 0 AND wb.deleted = 0 {$hidden_sql}\n\t\t\t AND bm.meta_key = 'last_activity' AND bm_name.meta_key = 'name' AND bm_description.meta_key = 'description'\n\t\t\t {$search_terms_sql} {$user_sql} {$include_sql}\n\t\t\tGROUP BY b.blog_id {$order_sql} {$pag_sql}\n\t\t"); $total_blogs = $wpdb->get_var("\n\t\t\tSELECT COUNT(DISTINCT b.blog_id)\n\t\t\tFROM\n\t\t\t {$bp->blogs->table_name} b\n\t\t\t LEFT JOIN {$wpdb->base_prefix}blogs wb ON (b.blog_id = wb.blog_id)\n\t\t\t LEFT JOIN {$bp->blogs->table_name_blogmeta} bm_name ON (b.blog_id = bm_name.blog_id)\n\t\t\t LEFT JOIN {$bp->blogs->table_name_blogmeta} bm_description ON (b.blog_id = bm_description.blog_id)\n\t\t\tWHERE\n\t\t\t wb.archived = '0' AND wb.spam = 0 AND wb.mature = 0 AND wb.deleted = 0 {$hidden_sql}\n\t\t\t AND\n\t\t\t bm_name.meta_key = 'name' AND bm_description.meta_key = 'description'\n\t\t\t {$search_terms_sql} {$user_sql} {$include_sql}\n\t\t"); $blog_ids = array(); foreach ((array) $paged_blogs as $blog) { $blog_ids[] = (int) $blog->blog_id; } $paged_blogs = BP_Blogs_Blog::get_blog_extras($paged_blogs, $blog_ids, $type); if ($update_meta_cache) { bp_blogs_update_meta_cache($blog_ids); } return array('blogs' => $paged_blogs, 'total' => $total_blogs); }