Skip to:
Content

BuddyPress.org

Ticket #6370: 6370.01.patch

File 6370.01.patch, 5.8 KB (added by r-a-y, 5 years ago)
  • src/bp-blogs/bp-blogs-functions.php

     
    6969}
    7070
    7171/**
    72  * Populate the BP blogs table with existing blogs.
     72 * Re-populate the BP blogs table with existing blogs.
     73 *
     74 * Warning: By default, this will remove all existing records from the BP
     75 * blogs and blogmeta tables before re-populating the tables.
    7376 *
    7477 * @since BuddyPress (1.0.0)
     78 * @since BuddyPress (2.3.0) Accepts $args as a parameter.
    7579 *
    76  * @global object $wpdb WordPress database object
    77  * @uses get_users()
    78  * @uses bp_blogs_record_blog()
     80 * @param array $args {
     81 *     Array of arguments.
     82 *     @type int   $offset   The offset to use.
     83 *     @type int   $limit    The number of blogs to record at one time.
     84 *     @type array $blog_ids Blog IDs to record. If empty, all blogs will be recorded.
     85 *     @type array $site_id  The network site ID to use.
     86 * }
     87 * @return bool
    7988 */
    80 function bp_blogs_record_existing_blogs() {
     89function bp_blogs_record_existing_blogs( $args = array() ) {
    8190        global $wpdb;
    8291
    83         // Query for all sites in network
     92        $r = bp_parse_args( $args, array(
     93                'offset'   => false === bp_get_option( '_bp_record_blogs_offset' ) ? 0 : bp_get_option( '_bp_record_blogs_offset' ),
     94                'limit'    => 50,
     95                'blog_ids' => array(),
     96                'site_id'  => $wpdb->siteid
     97        ), 'record_existing_blogs' );
     98
     99        // truncate all BP blogs tables if starting fresh
     100        if ( empty( $r['offset'] ) && empty( $r['blog_ids'] ) ) {
     101                $bp = buddypress();
     102
     103                // Truncate user blogs table
     104                $truncate = $wpdb->query( "TRUNCATE {$bp->blogs->table_name}" );
     105                if ( is_wp_error( $truncate ) ) {
     106                        return false;
     107                }
     108
     109                // Truncate user blogmeta table
     110                $truncate = $wpdb->query( "TRUNCATE {$bp->blogs->table_name_blogmeta}" );
     111                if ( is_wp_error( $truncate ) ) {
     112                        return false;
     113                }
     114        }
     115
     116        // Multisite
    84117        if ( is_multisite() ) {
     118                $sql = array();
     119                $sql['select'] = $wpdb->prepare( "SELECT blog_id, last_updated FROM {$wpdb->base_prefix}blogs WHERE mature = 0 AND spam = 0 AND deleted = 0 AND site_id = %d", $r['site_id'] );
    85120
    86                 // Get blog ID's if not a large network
    87                 if ( ! wp_is_large_network() ) {
    88                         $blog_ids = $wpdb->get_col( $wpdb->prepare( "SELECT blog_id FROM {$wpdb->base_prefix}blogs WHERE mature = 0 AND spam = 0 AND deleted = 0 AND site_id = %d", $wpdb->siteid ) );
     121                // Omit root blog if large network
     122                if ( wp_is_large_network( 'users' ) ) {
     123                        $sql['omit_root_blog'] = $wpdb->prepare( "AND blog_id != %d", bp_get_root_blog_id() );
     124                }
    89125
    90                         // If error running this query, set blog ID's to false
    91                         if ( is_wp_error( $blog_ids ) ) {
    92                                 $blog_ids = false;
    93                         }
     126                // Filter by selected blog IDs
     127                if ( ! empty( $r['blog_ids'] ) ) {
     128                        $in        = implode( ',', wp_parse_id_list( $r['blog_ids'] ) );
     129                        $sql['in'] = "AND blog_id IN ({$in})";
     130                }
    94131
    95                 // Large networks are not currently supported
    96                 } else {
    97                         $blog_ids = false;
     132                $sql['orderby'] = 'ORDER BY blog_id ASC';
     133
     134                $sql['limit'] = $wpdb->prepare( "LIMIT %d", $r['limit'] );
     135
     136                if ( ! empty( $r['offset'] ) ) {
     137                        $sql['offset'] = $wpdb->prepare( "OFFSET %d", $r['offset'] );
    98138                }
    99139
     140                $blogs = $wpdb->get_results( implode( ' ', $sql ) );
     141
    100142        // Record a single site
    101143        } else {
    102                 $blog_ids = $wpdb->blogid;
    103         }
    104 
    105         // Bail if there are no blogs in the network
    106         if ( empty( $blog_ids ) ) {
    107                 return false;
     144                $blogs = array();
     145                $blogs[] = (object) array(
     146                        'blog_id' => $wpdb->blogid,
     147                );
    108148        }
    109149
    110         // Get BuddyPress
    111         $bp = buddypress();
    112 
    113         // Truncate user blogs table
    114         $truncate = $wpdb->query( "TRUNCATE {$bp->blogs->table_name}" );
    115         if ( is_wp_error( $truncate ) ) {
    116                 return false;
    117         }
     150        // Bail if there are no blogs
     151        if ( empty( $blogs ) ) {
     152                // Make sure we remove our offset marker
     153                if ( is_multisite() ) {
     154                        bp_delete_option( '_bp_record_blogs_offset' );
     155                }
    118156
    119         // Truncate user blogsmeta table
    120         $truncate = $wpdb->query( "TRUNCATE {$bp->blogs->table_name_blogmeta}" );
    121         if ( is_wp_error( $truncate ) ) {
    122157                return false;
    123158        }
    124159
    125160        // Loop through users of blogs and record the relationship
    126         foreach ( (array) $blog_ids as $blog_id ) {
    127 
     161        foreach ( (array) $blogs as $blog ) {
    128162                // Ensure that the cache is clear after the table TRUNCATE above
    129                 wp_cache_delete( $blog_id, 'blog_meta' );
     163                wp_cache_delete( $blog->blog_id, 'blog_meta' );
    130164
    131165                // Get all users
    132166                $users = get_users( array(
    133                         'blog_id' => $blog_id
     167                        'blog_id' => $blog->blog_id
    134168                ) );
    135169
    136170                // Continue on if no users exist for this site (how did this happen?)
     
    140174
    141175                // Loop through users and record their relationship to this blog
    142176                foreach ( (array) $users as $user ) {
    143                         bp_blogs_add_user_to_blog( $user->ID, false, $blog_id );
     177                        bp_blogs_add_user_to_blog( $user->ID, false, $blog->blog_id );
     178
     179                        // Clear cache
     180                        bp_blogs_clear_blog_object_cache( $blog->blog_id, $user->ID );
     181                }
     182
     183                // Update blog last activity timestamp
     184                if ( ! empty( $blog->last_updated ) ) {
     185                        bp_blogs_update_blogmeta( $blog->blog_id, 'last_activity', $blog->last_updated );
     186                }
     187        }
     188
     189        // See if we need to do this again
     190        if ( is_multisite() && empty( $r['blog_ids'] ) ) {
     191                $sql['offset'] = $wpdb->prepare( " OFFSET %d", $r['limit'] + $r['offset'] );
     192
     193                // Check if there are more blogs to record
     194                $blog_ids = $wpdb->get_results( implode( ' ', $sql ) );
     195
     196                // We have more blogs; record offset and re-run function
     197                if ( ! empty( $blog_ids  ) ) {
     198                        bp_update_option( '_bp_record_blogs_offset', $r['limit'] + $r['offset'] );
     199                        bp_blogs_record_existing_blogs( array(
     200                                'offset'   => $r['limit'] + $r['offset'],
     201                                'limit'    => $r['limit'],
     202                                'blog_ids' => $r['blog_ids'],
     203                                'site_id'  => $r['site_id']
     204                        ) );
     205
     206                // No more blogs; delete offset marker
     207                } else {
     208                        bp_delete_option( '_bp_record_blogs_offset' );
    144209                }
    145210        }
    146211