Skip to:
Content

BuddyPress.org

Ticket #6026: 6026.smaller-steps.04.patch

File 6026.smaller-steps.04.patch, 83.5 KB (added by imath, 3 years ago)
  • src/bp-activity/classes/class-bp-activity-component.php

    diff --git src/bp-activity/classes/class-bp-activity-component.php src/bp-activity/classes/class-bp-activity-component.php
    index 4052f1d..52dd284 100644
    class BP_Activity_Component extends BP_Component { 
    234234                }
    235235
    236236                // Additional menu if blogs is active
    237                 if ( bp_is_active( 'blogs' ) ) {
     237                if ( is_multisite() && bp_is_active( 'blogs' ) ) {
    238238                        $sub_nav[] = array(
    239239                                'name'            => _x( 'Sites', 'Profile activity screen sub nav', 'buddypress' ),
    240240                                'slug'            => bp_get_blogs_slug(),
    class BP_Activity_Component extends BP_Component { 
    344344                        }
    345345
    346346                        // Blogs ?
    347                         if ( bp_is_active( 'blogs' ) ) {
     347                        if ( is_multisite() && bp_is_active( 'blogs' ) ) {
    348348                                $wp_admin_nav[] = array(
    349349                                        'parent' => 'my-account-' . $this->id,
    350350                                        'id'     => 'my-account-' . $this->id . '-blogs',
  • src/bp-blogs/bp-blogs-activity.php

    diff --git src/bp-blogs/bp-blogs-activity.php src/bp-blogs/bp-blogs-activity.php
    index 0af9220..502f138 100644
    function bp_blogs_blog_activity_scope( $retval = array(), $filter = array() ) { 
    14571457        }
    14581458
    14591459        // Determine blogs of user
    1460         $blogs = bp_blogs_get_blogs_for_user( $user_id );
     1460        $is_contributor = 1;
     1461        if ( 'site_subscriptions' === $filter['scope'] ) {
     1462                $is_contributor = 0;
     1463        }
     1464
     1465        $blogs = bp_blogs_get_blogs_for_user( $user_id, false, $is_contributor );
     1466
    14611467        if ( empty( $blogs['blogs'] ) ) {
    14621468                $blogs = array( 'blogs' => 0 );
    14631469        } else {
    function bp_blogs_blog_activity_scope( $retval = array(), $filter = array() ) { 
    14981504
    14991505        return $retval;
    15001506}
    1501 add_filter( 'bp_activity_set_blogs_scope_args', 'bp_blogs_blog_activity_scope', 10, 2 );
     1507add_filter( 'bp_activity_set_blogs_scope_args',              'bp_blogs_blog_activity_scope', 10, 2 );
     1508add_filter( 'bp_activity_set_site_subscriptions_scope_args', 'bp_blogs_blog_activity_scope', 10, 2 );
  • src/bp-blogs/bp-blogs-filters.php

    diff --git src/bp-blogs/bp-blogs-filters.php src/bp-blogs/bp-blogs-filters.php
    index 2826c02..3de98b6 100644
    function bp_blogs_default_avatar( $avatar, $params ) { 
    140140}
    141141add_filter( 'bp_core_avatar_default',       'bp_blogs_default_avatar', 10, 3 );
    142142add_filter( 'bp_core_avatar_default_thumb', 'bp_blogs_default_avatar', 10, 3 );
     143
     144/**
     145 * Triggers to add filters to get_blogs_of_user
     146 *
     147 * @since  2.7.0
     148 */
     149function bp_blogs_get_blogs_of_user_add_filters() {
     150        add_filter( 'pre_get_blogs_of_user', 'bp_blogs_get_sites_of_user', 10, 2 );
     151        add_filter( 'get_blogs_of_user',     'bp_blogs_get_sites_of_user', 10, 2 );
     152}
     153
     154/**
     155 * Triggers to remove filters to get_blogs_of_user
     156 *
     157 * @since  2.7.0
     158 */
     159function bp_blogs_get_blogs_of_user_remove_filters() {
     160        remove_filter( 'pre_get_blogs_of_user', 'bp_blogs_get_sites_of_user', 10, 2 );
     161        remove_filter( 'get_blogs_of_user',     'bp_blogs_get_sites_of_user', 10, 2 );
     162}
  • src/bp-blogs/bp-blogs-functions.php

    diff --git src/bp-blogs/bp-blogs-functions.php src/bp-blogs/bp-blogs-functions.php
    index 0748ba8..7ebb564 100644
    add_action( 'delete_blog', 'bp_blogs_remove_data_for_blog', 1 ); 
    12161216 * @see BP_Blogs_Blog::get_blogs_for_user() for a description of parameters
    12171217 *      and return values.
    12181218 *
    1219  * @param int  $user_id     See {@BP_Blogs_Blog::get_blogs_for_user()}.
    1220  * @param bool $show_hidden See {@BP_Blogs_Blog::get_blogs_for_user()}.
     1219 * @since  2.7.0 Adds the $is_contributor parameter.
     1220 *
     1221 * @param int      $user_id        See {@BP_Blogs_Blog::get_blogs_for_user()}.
     1222 * @param bool     $show_hidden    See {@BP_Blogs_Blog::get_blogs_for_user()}.
     1223 * @param int|null $is_contributor See {@BP_Blogs_Blog::get_blogs_for_user()}.
    12211224 * @return array See {@BP_Blogs_Blog::get_blogs_for_user()}.
    12221225 */
    1223 function bp_blogs_get_blogs_for_user( $user_id, $show_hidden = false ) {
    1224         return BP_Blogs_Blog::get_blogs_for_user( $user_id, $show_hidden );
     1226function bp_blogs_get_blogs_for_user( $user_id, $show_hidden = false, $is_contributor = 1 ) {
     1227        return BP_Blogs_Blog::get_blogs_for_user( $user_id, $show_hidden, $is_contributor );
    12251228}
    12261229
    12271230/**
    add_action( 'bp_make_ham_user', 'bp_blogs_restore_data', 10, 1 ); 
    14491452function bp_blogs_is_site_subscriptions_active() {
    14501453        return bp_is_active( 'blogs', 'site' ) && ! bp_disable_site_subscriptions();
    14511454}
     1455
     1456/**
     1457 * This function is used to "replace" `get_blogs_of_user` when WordPress
     1458 * or BuddyPress are spamming users.
     1459 *
     1460 * This is making sure that if a subscriber is spammed, it won't spam all the sites
     1461 * he subscribed to!
     1462 *
     1463 * @since  2.7.0
     1464 *
     1465 * @param  array  $args {
     1466 *     Array of arguments. Accepts all arguments accepted by
     1467 *     {@link get_blogs_of_user()}. In cases function were used
     1468 *     to filter it before or after.
     1469 * }
     1470 * @return array  The list of sites the user can at least contribute to.
     1471 */
     1472function bp_blogs_get_sites_of_user( $args = array() ) {
     1473        /**
     1474         * Default user id is the displayed one, as it's possible
     1475         * to spam a user on his Profile page in BuddyPress.
     1476         */
     1477        $user_id = bp_displayed_user_id();
     1478
     1479        // Defaults to an empty array.
     1480        $sites   = array();
     1481
     1482        /**
     1483         * This function can be used to filter `pre_get_blogs_of_user`
     1484         * or `get_blogs_of_user`
     1485         */
     1486        if ( 2 === func_num_args() ) {
     1487                list( $sites, $user_id ) = func_get_args();
     1488
     1489                if ( 'get_blogs_of_user' === current_filter() ) {
     1490                        /**
     1491                         * The `pre_get_blogs_of_user` can be used as WordPress is 4.6
     1492                         * so the Blogs will already be the one the users is contributing
     1493                         * to. For WordPress < 4.6, we need remove the blogs the user has
     1494                         * subscribed to
     1495                         */
     1496                        if ( ! function_exists( 'get_sites' ) ) {
     1497                                $s_sites = BP_Blogs_Blog::get_blog_ids_for_user( $user_id, 0 );
     1498
     1499                                foreach ( $s_sites as $s_site_id ) {
     1500                                        unset( $sites[ $s_site_id ] );
     1501                                }
     1502                        }
     1503
     1504                        return $sites;
     1505                }
     1506        }
     1507
     1508        /**
     1509         * Default arguments are making sure only the sites
     1510         * the user is at least a contributor of will be returned.
     1511         */
     1512        $r = bp_parse_args( $args, array(
     1513                'user_id'          => $user_id,
     1514                'is_contributor'   => 1,
     1515                'skip_latest_post' => true,
     1516        ), 'get_sites_of_user' );
     1517
     1518        // The user id is required.
     1519        if ( empty( $r['user_id'] ) ) {
     1520                return $sites;
     1521        }
     1522
     1523        $q_sites = new BP_Site_Query( $r );
     1524
     1525        $r_sites = $q_sites->get_results();
     1526
     1527        if ( ! empty( $r_sites['blogs'] ) ) {
     1528                foreach ( $r_sites['blogs'] as $site ) {
     1529                        $sites[ $site->blog_id ] = (object) array(
     1530                                'userblog_id' => (int) $site->blog_id,
     1531                                'blogname'    => $site->name,
     1532                                'domain'      => $site->domain,
     1533                                'path'        => $site->path,
     1534                                'site_id'     => $site->site_id,
     1535                                'siteurl'     => $site->url,
     1536                                'archived'    => $site->archived,
     1537                                'mature'      => $site->mature,
     1538                                'spam'        => $site->spam,
     1539                                'deleted'     => $site->deleted,
     1540                        );
     1541                }
     1542        } elseif ( is_null( $sites ) ) {
     1543                $sites = array();
     1544        }
     1545
     1546        /**
     1547         * Filter here to edit the sites of the user.
     1548         *
     1549         * @since  2.7.0
     1550         *
     1551         * @param  array $sites An array of Site objects.
     1552         * @param  array $r     The merged arguments.
     1553         * @param  array $args  The requested arguments.
     1554         */
     1555        return apply_filters( 'bp_blogs_get_sites_of_user', $sites, $r, $args );
     1556}
  • src/bp-blogs/bp-blogs-site.php

    diff --git src/bp-blogs/bp-blogs-site.php src/bp-blogs/bp-blogs-site.php
    index 5e16d87..e6250e7 100644
    require dirname( __FILE__ ) . '/site/screens.php'; 
    1515require dirname( __FILE__ ) . '/site/template.php';
    1616require dirname( __FILE__ ) . '/site/adminbar.php';
    1717require dirname( __FILE__ ) . '/site/filters.php';
     18require dirname( __FILE__ ) . '/site/cache.php';
    1819
    1920if ( bp_is_active( 'activity' ) ) {
    2021        require dirname( __FILE__ ) . '/site/activity.php';
  • src/bp-blogs/bp-blogs-template.php

    diff --git src/bp-blogs/bp-blogs-template.php src/bp-blogs/bp-blogs-template.php
    index 890f7e4..af8e453 100644
    function bp_blogs_signup_blog( $blogname = '', $blog_title = '', $errors = '' ) 
    10751075        if ( !is_subdomain_install() )
    10761076                echo '<span class="prefix_address">' . $current_site->domain . $current_site->path . '</span> <input name="blogname" type="text" id="blogname" value="'.$blogname.'" maxlength="63" /><br />';
    10771077        else
    1078                 echo '<input name="blogname" type="text" id="blogname" value="'.$blogname.'" maxlength="63" ' . bp_get_form_field_attributes( 'blogname' ) . '/> <span class="suffix_address">.' . bp_blogs_get_subdomain_base() . '</span><br />';
     1078                echo '<input name="blogname" type="text" id="blogname" value="'.$blogname.'" maxlength="63" ' . bp_get_form_field_attributes( 'blogname' ) . '/> <span class="suffix_address">.' . bp_signup_get_subdomain_base() . '</span><br />';
    10791079
    10801080        if ( !is_user_logged_in() ) {
    10811081                print '(<strong>' . __( 'Your address will be ' , 'buddypress');
    function bp_blogs_validate_blog_form() { 
    12101210 * @param int|null     $blog_id    ID of the newly created blog.
    12111211 */
    12121212function bp_blogs_confirm_blog_signup( $domain, $path, $blog_title, $user_name, $user_email = '', $meta = '', $blog_id = null ) {
    1213         switch_to_blog( $blog_id );
    1214         $blog_url  = set_url_scheme( home_url() );
    1215         $login_url = set_url_scheme( wp_login_url() );
    1216         restore_current_blog();
     1213        $site_url  = '';
     1214        $login_url = '';
     1215
     1216        if ( ! empty( $blog_id ) ) {
     1217                $site = bp_blogs_get_site( $blog_id );
     1218
     1219                if ( ! empty( $site->blog_id ) ) {
     1220                        $site_url  = $site->url;
     1221                        $login_url = $site->login_url;
     1222                }
     1223        }
    12171224
    12181225        ?>
    12191226        <p><?php _e( 'Congratulations! You have successfully registered a new site.', 'buddypress' ) ?></p>
    12201227        <p>
    1221                 <?php printf(
    1222                         '%s %s',
    1223                         sprintf(
    1224                                 __( '%s is your new site.', 'buddypress' ),
    1225                                 sprintf( '<a href="%s">%s</a>', esc_url( $blog_url ), esc_url( $blog_url ) )
    1226                         ),
    1227                         sprintf(
    1228                                 /* translators: 1: Login URL, 2: User name */
    1229                                 __( '<a href="%1$s">Log in</a> as "%2$s" using your existing password.', 'buddypress' ),
     1228                <?php
     1229                /* translators: 1: Blog URL, 2: Login Link, 2: User name */
     1230                printf( '%1$s is your new site. %2$s as "%3$s" using your existing password.',
     1231                        sprintf( '<a href="%s">%s</a>', esc_url( $site_url ), esc_url( $site_url ) ),
     1232                        sprintf( '<a href="%1$s">%2$s</a>',
    12301233                                esc_url( $login_url ),
    1231                                 esc_html( $user_name )
    1232                         )
     1234                                esc_html_x( 'Log in', 'Blog registered first login', 'buddypress' )
     1235                        ),
     1236                        esc_html( $user_name )
    12331237                ); ?>
    12341238        </p>
    12351239
    1236 <?php
     1240        <?php if ( bp_blogs_is_site_avatar_uploads_enabled() && is_user_logged_in() ) :
     1241                $community_url = bp_blogs_get_site_community_url( $site->slug );
     1242                ?>
     1243
     1244                <p>
     1245                        <?php
     1246                        /* translators: 1: Community URL for the newly created site, 2: Link to the edit Site Profile photo page. */
     1247                        printf( __( 'Discover the %1$s of your site and take a few moments to add a %2$s.', 'buddypress' ),
     1248                                sprintf( '<a href="%1$s">%2$s</a>',
     1249                                        esc_url( $community_url ),
     1250                                        esc_html_x( 'community pages', 'Link text', 'buddypress' )
     1251                                ),
     1252                                sprintf( '<a href="%1$s">%2$s</a>',
     1253                                        esc_url( trailingslashit( $community_url . 'manage/edit-avatar' ) ),
     1254                                        esc_html_x( 'Site Profile Photo', 'Link text', 'buddypress' )
     1255                                )
     1256                        ); ?>
     1257                </p>
     1258
     1259        <?php endif;
    12371260
    12381261        /**
    12391262         * Fires after the default successful blog registration message markup.
  • src/bp-blogs/classes/class-bp-blogs-component.php

    diff --git src/bp-blogs/classes/class-bp-blogs-component.php src/bp-blogs/classes/class-bp-blogs-component.php
    index 0780650..e956716 100644
    class BP_Blogs_Component extends BP_Component { 
    151151                        // Initialize the nav for the current site.
    152152                        $this->nav = new BP_Core_Nav( $this->current_site->blog_id );
    153153
     154                        // Add the id property, so that it's easier for the cover image
     155                        $this->current_site->id = (int) $this->current_site->blog_id;
     156
    154157                        /**
    155158                         * Hook here to add your custom globals for the site feature.
    156159                         * Use it to add specific settings using bp_blogs_register_site_settings()
    class BP_Blogs_Component extends BP_Component { 
    438441                        ), 'blogs' );
    439442
    440443                        /**
    441                          * @todo Site's logo
     444                         * Site's Profile Photo
    442445                         *
    443446                         * Edit the logo for the current site.
    444447                         * Access is restricted to the site admins.
    445448                         */
     449                        if ( bp_blogs_is_site_avatar_uploads_enabled() ) {
     450                                bp_core_new_subnav_item( array(
     451                                        'name'              => _x( 'Profile Photo', 'Single Site edit photo screen', 'buddypress' ),
     452                                        'slug'              => 'edit-avatar',
     453                                        'parent_url'        => trailingslashit( $site_link . 'manage' ),
     454                                        'parent_slug'       => 'manage',
     455                                        'screen_function'   => 'bp_blogs_screen_site_manage',
     456                                        'position'          => 10,
     457                                        'user_has_access'   => bp_is_item_admin(),
     458                                        'no_access_url'     => $site_link,
     459                                        'show_in_admin_bar' => true,
     460                                ), 'blogs' );
     461                        }
    446462
    447463                        /**
    448464                         * @todo Site's Cover Image
    class BP_Blogs_Component extends BP_Component { 
    450466                         * Edit the cover image for the current site.
    451467                         * Access is restricted to the site admins.
    452468                         */
     469                        if ( bp_site_use_cover_image_header() ) {
     470                                bp_core_new_subnav_item( array(
     471                                        'name'              => _x( 'Cover Image', 'Single Blog setting screen', 'buddypress' ),
     472                                        'slug'              => 'edit-cover-image',
     473                                        'parent_url'        => trailingslashit( $site_link . 'manage' ),
     474                                        'parent_slug'       => 'manage',
     475                                        'screen_function'   => 'bp_blogs_screen_site_manage',
     476                                        'position'          => 20,
     477                                        'user_has_access'   => bp_is_item_admin(),
     478                                        'no_access_url'     => $site_link,
     479                                        'show_in_admin_bar' => true,
     480                                ), 'blogs' );
     481                        }
    453482
    454483                        if ( bp_blogs_current_site_can_subscribe() ) {
    455484                                /**
    class BP_Blogs_Component extends BP_Component { 
    463492                                        'parent_url'        => trailingslashit( $site_link . 'manage' ),
    464493                                        'parent_slug'       => 'manage',
    465494                                        'screen_function'   => 'bp_blogs_screen_site_manage',
    466                                         'position'          => 20,
     495                                        'position'          => 30,
    467496                                        'user_has_access'   => bp_is_item_admin(),
    468497                                        'no_access_url'     => $site_link,
    469498                                        'show_in_admin_bar' => true,
    class BP_Blogs_Component extends BP_Component { 
    605634         * @since 2.2.0
    606635         */
    607636        public function setup_cache_groups() {
     637                $cache_group = array( 'blog_meta' );
     638
     639                if ( bp_is_active( 'blogs', 'site' ) ) {
     640                        $cache_group = array_merge( $cache_group, array(
     641                                'bp_site',
     642                                'bp_site_slugs',
     643                        ) );
     644                }
    608645
    609646                // Global groups.
    610                 wp_cache_add_global_groups( array(
    611                         'blog_meta'
    612                 ) );
     647                wp_cache_add_global_groups( $cache_group );
    613648
    614649                parent::setup_cache_groups();
    615650        }
  • src/bp-blogs/classes/class-bp-site-query.php

    diff --git src/bp-blogs/classes/class-bp-site-query.php src/bp-blogs/classes/class-bp-site-query.php
    index 60e973d..7ca74e0 100644
    class BP_Site_Query extends WP_Site_Query { 
    7979         */
    8080        private function set_bp_query( $query = '' ) {
    8181                $this->query_vars = wp_parse_args( $query, array(
    82                         'offset'        => 0,
    83                         'number'        => 20,
     82                        'offset'   => 0,
     83                        'number'   => 20,
     84                        /**
     85                         * Make sure to not display
     86                         * the following site status:
     87                         */
     88                        'mature'   => 0,
     89                        'spam'     => 0,
     90                        'archived' => 0,
     91                        'deleted'  => 0,
    8492                ) );
    8593
    8694                // Get total for loop queries.
    class BP_Site_Query extends WP_Site_Query { 
    93101                 * is a contributor or a subscriber of.
    94102                 */
    95103                if ( ! empty( $this->query_vars['user_id'] ) ) {
    96                         $is_contributor = 1;
     104                        $is_contributor = null;
    97105
    98                         if ( isset( $this->query_vars['is_contributor'] ) ) {
     106                        // This way `null` can be used to get all contribution types.
     107                        if ( isset( $this->query_vars['is_contributor'] ) && ! is_null( $this->query_vars['is_contributor'] ) ) {
    99108                                $is_contributor = (int) $this->query_vars['is_contributor'];
    100109                        }
    101110
    class BP_Site_Query extends WP_Site_Query { 
    223232                                        $site->admin_user_id = reset( $site->{$key} );
    224233                                }
    225234
    226                                 // Attach latest post data, if not querying for a single site.
    227                                 if ( empty( $this->query_vars['single_site'] ) ) {
     235                                /**
     236                                 * Attach latest post data, if not querying for a single site
     237                                 * & if the query is not including the skip_latest_post flag
     238                                 */
     239                                if ( empty( $this->query_vars['single_site'] ) && empty( $this->query_vars['skip_latest_post'] ) ) {
    228240                                        $site = $this->get_latest_post( $site );
    229241                                }
    230242                        }
    class BP_Site_Query extends WP_Site_Query { 
    315327                );
    316328
    317329                // Bail if we don't need to edit the query
    318                 if ( empty( $this->query_vars['meta_query'] ) && empty( $this->query_vars['orderby'] ) && isset( $buddypress_orders[$this->query_vars['orderby']] ) ) {
     330                if ( empty( $this->query_vars['meta_query'] ) && empty( $this->query_vars['orderby'] ) ) {
    319331                        return $pieces;
    320332                }
    321333
    class BP_Site_Query extends WP_Site_Query { 
    394406
    395407                /** Custom order *****************************************************/
    396408
    397                 // Alphabetical or active order
    398                 if ( 'name' === $this->query_vars['orderby'] || 'last_activity' === $this->query_vars['orderby'] ) {
    399                         if ( 'blog_id' === $pieces['fields'] ) {
    400                                 $pieces['fields'] = "{$wpdb->blogs}.blog_id";
    401                         }
     409                if ( ! empty( $this->query_vars['orderby'] ) ) {
     410                        // Alphabetical or active order
     411                        if ( 'name' === $this->query_vars['orderby'] || 'last_activity' === $this->query_vars['orderby'] ) {
     412                                if ( 'blog_id' === $pieces['fields'] ) {
     413                                        $pieces['fields'] = "{$wpdb->blogs}.blog_id";
     414                                }
    402415
    403                         $pieces['fields'] .= sprintf( ', bm.meta_value as %s', $this->query_vars['orderby'] );
    404                         $join = " INNER JOIN {$wpdb->blogmeta} bm ON ({$wpdb->blogs}.blog_id = bm.blog_id )";
     416                                $pieces['fields'] .= sprintf( ', bm.meta_value as %s', $this->query_vars['orderby'] );
     417                                $join = " INNER JOIN {$wpdb->blogmeta} bm ON ({$wpdb->blogs}.blog_id = bm.blog_id )";
    405418
    406                         if ( empty( $pieces['join'] ) ) {
    407                                 $pieces['join']  = $join;
    408                         } else {
    409                                 $pieces['join'] .= $join;
    410                         }
     419                                if ( empty( $pieces['join'] ) ) {
     420                                        $pieces['join']  = $join;
     421                                } else {
     422                                        $pieces['join'] .= $join;
     423                                }
    411424
    412                         $where = sprintf( " AND bm.meta_key = '%s'", $this->query_vars['orderby'] );
     425                                $where = sprintf( " AND bm.meta_key = '%s'", $this->query_vars['orderby'] );
    413426
    414                         if ( empty( $pieces['where'] ) ) {
    415                                 $pieces['where'] = '1=1' . $where;
    416                         } else {
    417                                 $pieces['where'] .= $where;
    418                         }
     427                                if ( empty( $pieces['where'] ) ) {
     428                                        $pieces['where'] = '1=1' . $where;
     429                                } else {
     430                                        $pieces['where'] .= $where;
     431                                }
    419432
    420                         $pieces['orderby'] = ' ' . $this->query_vars['orderby'] . ' ' . $this->query_vars['order'] ;
     433                                $pieces['orderby'] = ' ' . $this->query_vars['orderby'] . ' ' . $this->query_vars['order'] ;
    421434
    422                 // Random order
    423                 } elseif ( 'RAND()' === $this->query_vars['orderby'] ) {
    424                         $pieces['orderby'] = $this->query_vars['orderby'];
     435                        // Random order
     436                        } elseif ( 'RAND()' === $this->query_vars['orderby'] ) {
     437                                $pieces['orderby'] = $this->query_vars['orderby'];
     438                        }
    425439                }
    426440
    427441                // Reset the global blogmeta table if needed.
  • src/bp-blogs/site/cache.php

    diff --git src/bp-blogs/site/cache.php src/bp-blogs/site/cache.php
    index e69de29..eb0469d 100644
     
     1<?php
     2/**
     3 * BuddyPress Blogs Site cache.
     4 *
     5 * @package BuddyPress
     6 * @subpackage BlogsSiteCache
     7 * @since 2.7.0
     8 */
     9
     10// Exit if accessed directly.
     11defined( 'ABSPATH' ) || exit;
     12
     13/**
     14 * Update the site caches.
     15 *
     16 * @since  2.7.0
     17 *
     18 * @param  WP_Site|object $site The site object.
     19 */
     20function bp_blogs_update_site_caches( $site ) {
     21        wp_cache_add( $site->blog_id, $site,          'bp_site'       );
     22        wp_cache_add( $site->slug,    $site->blog_id, 'bp_site_slugs' );
     23}
     24
     25/**
     26 * Clean all site caches
     27 *
     28 * @since 2.7.0
     29 *
     30 * @param WP_Site|object|int $site The site object or ID to be
     31 *                                 cleaned from the cache.
     32 */
     33function bp_blogs_clean_site_caches( $site ) {
     34        if ( is_numeric( $site ) ) {
     35                $site = bp_blogs_get_site( $site );
     36        }
     37
     38        if ( empty( $site->blog_id ) ) {
     39                return;
     40        }
     41
     42        wp_cache_delete( $site->blog_id, 'bp_site'       );
     43        wp_cache_delete( $site->slug,    'bp_site_slugs' );
     44
     45        /**
     46         * Fires immediately after the given site's cache is cleaned.
     47         *
     48         * @since 2.7.0
     49         *
     50         * @param int     $blog_id The Site ID.
     51         * @param WP_User $site    The Site object.
     52         */
     53        do_action( 'bp_blogs_clean_site_caches', $site->blog_id, $site );
     54}
     55add_action( 'refresh_blog_details',          'bp_blogs_clean_site_caches' );
     56add_action( 'bp_blogs_remove_blog',          'bp_blogs_clean_site_caches' );
     57add_action( 'bp_blogs_remove_data_for_blog', 'bp_blogs_clean_site_caches' );
     58add_action( 'bp_blogs_remove_blog_for_user', 'bp_blogs_clean_site_caches' );
     59
     60/**
     61 * Clean site cache on blogmeta edits.
     62 *
     63 * @since  2.7.0
     64 *
     65 * @param  int $meta_ids ID of updated metadata entry.
     66 * @param  int $site_id  ID of the site.
     67 */
     68function bp_blogs_meta_edit_clean_caches( $meta_ids, $site_id, $meta_key ) {
     69        $meta_keys = array(
     70                'name'                   => true,
     71                'description'            => true,
     72                'last_activity'          => true,
     73                'site_admins'            => true,
     74                'disallow_subscriptions' => true,
     75        );
     76
     77        if ( empty( $meta_keys[ $meta_key ] ) ) {
     78                return;
     79        }
     80
     81        bp_blogs_clean_site_caches( $site_id );
     82}
     83add_action( 'deleted_blog_meta', 'bp_blogs_meta_edit_clean_caches', 10, 3 );
     84add_action( 'updated_blog_meta', 'bp_blogs_meta_edit_clean_caches', 10, 3 );
     85
     86/**
     87 * Bust blogs caches when a user was deleted or marked as spam
     88 *
     89 * @since 2.7.0
     90 *
     91 * @param int $user_id ID of the user whose blog cache should be cleared.
     92 */
     93function bp_blogs_user_sites_clean_caches( $user_id = 0 ) {
     94        $sites = BP_Blogs_Blog::get_blog_ids_for_user( $user_id, null );
     95
     96        if ( empty( $sites ) ) {
     97                return;
     98        }
     99
     100        foreach ( $sites as $site_id ) {
     101                bp_blogs_clean_site_caches( $site_id );
     102        }
     103}
     104add_action( 'bp_blogs_before_remove_data', 'bp_blogs_user_sites_clean_caches' );
     105add_action( 'bp_blogs_restore_data',       'bp_blogs_user_sites_clean_caches' );
     106
     107/**
     108 * Bust blog caches when a user subcribes or unsubscribe to a site
     109 *
     110 * @since 2.7.0
     111 *
     112 * @param int            $user_id ID of the user.
     113 * @param WP_Site|object $site    The site object.
     114 */
     115function bp_blogs_subscription_site_clean_caches( $user_id, $site ) {
     116        bp_blogs_clean_site_caches( $site );
     117
     118        // Totals
     119        wp_cache_delete( 'bp_total_blogs_for_user_'              . $user_id, 'bp' );
     120        wp_cache_delete( 'bp_total_site_subscriptions_for_user_' . $user_id, 'bp' );
     121}
     122add_action( 'bp_blogs_after_site_subscribed',   'bp_blogs_subscription_site_clean_caches', 10, 2 );
     123add_action( 'bp_blogs_after_site_unsubscribed', 'bp_blogs_subscription_site_clean_caches', 10, 2 );
  • src/bp-blogs/site/filters.php

    diff --git src/bp-blogs/site/filters.php src/bp-blogs/site/filters.php
    index 707b6f2..b915e3a 100644
    add_filter( 'bp_get_site_description', 'stripslashes' ); 
    2323add_filter( 'bp_get_site_description_editable', 'stripslashes'      );
    2424add_filter( 'bp_get_sitename',                  'stripslashes'      );
    2525add_filter( 'bp_get_site_name_editable',        'stripslashes'      );
     26
     27
     28/**
     29 * Generate the avatar upload directory path for a given site.
     30 *
     31 * @since 2.7.0
     32 *
     33 * @param int $site_id Optional. ID of the blog. Default: ID of the
     34 *        current site.
     35 * @return array
     36 */
     37function blogs_avatar_upload_dir( $site_id = 0 ) {
     38
     39        if ( empty( $site_id ) ) {
     40                $site_id = bp_blogs_get_current_site_id();
     41        }
     42
     43        $directory = 'blog-avatars';
     44        $path      = bp_core_avatar_upload_path() . '/' . $directory . '/' . $site_id;
     45        $newbdir   = $path;
     46        $newurl    = bp_core_avatar_url() . '/' . $directory . '/' . $site_id;
     47        $newburl   = $newurl;
     48        $newsubdir = '/' . $directory . '/' . $site_id;
     49
     50        /**
     51         * Filters the avatar upload directory path for a given site.
     52         *
     53         * @since 2.7.0
     54         *
     55         * @param array $value Array of parts related to the blog avatar upload directory.
     56         */
     57        return apply_filters( 'blogs_avatar_upload_dir', array(
     58                'path'    => $path,
     59                'url'     => $newurl,
     60                'subdir'  => $newsubdir,
     61                'basedir' => $newbdir,
     62                'baseurl' => $newburl,
     63                'error'   => false
     64        ) );
     65}
     66
     67/**
     68 * Eventually filters get_blogs_of_user() to make sure
     69 * subscribers marked as spam won't generate the sites
     70 * to be marked as spam too.
     71 *
     72 * @since  2.7.0
     73 */
     74function bp_blogs_site_maybe_filter_get_blogs_of_user() {
     75        $action = bp_admin_list_table_current_bulk_action();
     76
     77        if ( 'spam' !== $action || 'users-network' !== get_current_screen()->id ) {
     78                return;
     79        }
     80
     81        // Trigger the filter.
     82        bp_blogs_get_blogs_of_user_add_filters();
     83}
     84add_action( 'wpmuadminedit', 'bp_blogs_site_maybe_filter_get_blogs_of_user' );
  • src/bp-blogs/site/functions.php

    diff --git src/bp-blogs/site/functions.php src/bp-blogs/site/functions.php
    index 4bf23fe..b3e387b 100644
    function bp_blogs_get_site( $slug = '' ) { 
    7777
    7878        if ( is_numeric( $slug ) ) {
    7979                $query_vars['ID'] = (int) $slug;
    80         } elseif ( is_subdomain_install() ) {
    81                 $query_vars['domain__in'] = array( $slug . '.' . get_current_site()->domain );
     80                $site_id          = $query_vars['ID'];
    8281        } else {
    83                 $query_vars['path__in'] = array( '/' . $slug . '/' );
    84         }
     82                if ( is_subdomain_install() ) {
     83                        $query_vars['domain__in'] = array( $slug . '.' . get_current_site()->domain );
     84                } else {
     85                        $query_vars['path__in'] = array( '/' . $slug . '/' );
     86                }
    8587
    86         if ( true === (bool) apply_filters( 'bp_blogs_use_bp_site_query', true ) && function_exists( 'get_sites' ) ) {
    87                 $queried_site = new BP_Site_Query( $query_vars );
    88                 $result = $queried_site->get_results();
    89         } else {
    90                 $result = BP_Blogs_Blog::legacy_get( $query_vars );
     88                $site_id = wp_cache_get( $slug, 'bp_site_slugs' );
    9189        }
    9290
    93         if ( empty( $result['blogs'] ) ) {
    94                 return false;
     91        // Look in the cache.
     92        if ( ! empty( $site_id ) ) {
     93                $site = wp_cache_get( $site_id, 'bp_site' );
    9594        }
    9695
    97         $site = reset( $result['blogs'] );
    98 
     96        // The Site wasn't found in cache, query for it.
    9997        if ( empty( $site->blog_id ) ) {
    100                 return false;
    101         }
     98                if ( true === (bool) apply_filters( 'bp_blogs_use_bp_site_query', true ) && function_exists( 'get_sites' ) ) {
     99                        $queried_site = new BP_Site_Query( $query_vars );
     100                        $result = $queried_site->get_results();
     101                } else {
     102                        $result = BP_Blogs_Blog::legacy_get( $query_vars );
     103                }
     104
     105                if ( empty( $result['blogs'] ) ) {
     106                        return false;
     107                }
    102108
    103         if ( ! is_a( $site, 'WP_Site' ) ) {
    104                 $bp_props = clone $site;
     109                $site = reset( $result['blogs'] );
    105110
    106                 // Reset the site so that it's a WP_Site instance
    107                 $site = get_blog_details( $site->blog_id, false );
     111                if ( empty( $site->blog_id ) ) {
     112                        return false;
     113                }
     114
     115                if ( ! is_a( $site, 'WP_Site' ) ) {
     116                        $bp_props = clone $site;
     117
     118                        // Reset the site so that it's a WP_Site instance
     119                        $site = get_blog_details( $site->blog_id, false );
    108120
    109                 foreach ( $bp_props as $bp_prop_key => $bp_prop ) {
    110                         if ( isset( $site->{$bp_prop_key} ) ) {
    111                                 continue;
     121                        foreach ( $bp_props as $bp_prop_key => $bp_prop ) {
     122                                if ( isset( $site->{$bp_prop_key} ) ) {
     123                                        continue;
     124                                }
     125
     126                                $site->{$bp_prop_key} = $bp_prop;
    112127                        }
    113128
    114                         $site->{$bp_prop_key} = $bp_prop;
     129                        $site->site_admins = bp_blogs_get_blogmeta( $site->blog_id, 'site_admins' );
     130                        $site->url         = bp_blogs_get_blogmeta( $site->blog_id, 'url' );
     131                }
     132
     133                $site->slug = '';
     134                if ( (int) bp_get_root_blog_id() === (int) $site->blog_id ) {
     135                        $site->slug = bp_blogs_get_root_site_slug();
     136                } elseif ( is_subdomain_install() ) {
     137                        $site->slug = trim( str_replace( get_current_site()->domain, '', $site->domain ), '.' );
     138                } else {
     139                        $site->slug = trim( str_replace( get_current_site()->path, '', $site->path ), '/' );
    115140                }
    116141
    117                 $site->site_admins = bp_blogs_get_blogmeta( $site->blog_id, 'site_admins' );
    118                 $site->url         = bp_blogs_get_blogmeta( $site->blog_id, 'url' );
     142                // How many users ?
     143                $site->total_users = BP_Blogs_Blog::get_site_users_count( $site->blog_id );
     144
     145                // Update Site caches.
     146                bp_blogs_update_site_caches( $site );
    119147        }
    120148
    121149        // Bail if the site is not showable.
    function bp_blogs_get_site( $slug = '' ) { 
    123151                return false;
    124152        }
    125153
    126         $site->slug = '';
    127         if ( (int) bp_get_root_blog_id() === (int) $site->blog_id ) {
    128                 $site->slug = bp_blogs_get_root_site_slug();
    129         } elseif ( is_subdomain_install() ) {
    130                 $site->slug = trim( str_replace( get_current_site()->domain, '', $site->domain ), '.' );
    131         } else {
    132                 $site->slug = trim( str_replace( get_current_site()->path, '', $site->path ), '/' );
    133         }
    134 
    135         // How many users ?
    136         $site->total_users = BP_Blogs_Blog::get_site_users_count( $site->blog_id );
    137 
    138154        if ( ! bp_is_blogs_component() && ! bp_current_action() ) {
    139155                return $site;
    140156        }
    function bp_blogs_get_site( $slug = '' ) { 
    169185                ) );
    170186        }
    171187
     188        // Login url
     189        $site->login_url = wp_login_url();
     190
    172191        if ( $needs_switch ) {
    173192                restore_current_blog();
    174193        }
    175194
     195        /**
     196         * Use this filter to add properties to the site.
     197         *
     198         * @since  2.7.0
     199         *
     200         * @param  WP_Site|object $site The site object.
     201         */
    176202        return apply_filters( 'bp_blogs_get_site', $site );
    177203}
    178204
    function bp_blogs_get_site_settings( $option = '' ) { 
    508534
    509535        return $settings[ $option ];
    510536}
     537
     538/**
     539 * Check if avatar uploads are enabled for the site.
     540 *
     541 * @since 2.7.0
     542 *
     543 * @return bool true if avatar uploads are enabled, false otherwise.
     544 */
     545function bp_blogs_is_site_avatar_uploads_enabled() {
     546        $bp = buddypress();
     547
     548        /**
     549         * Check if :
     550         * - user can upload site avatars
     551         * - the WordPress show avatars setting is enabled
     552         * - the new avatar UI is not disabled.
     553         */
     554        $is_avatar_enabled = ! bp_disable_site_avatar_uploads() && $bp->avatar->show_avatars && false !== (bool) apply_filters( 'bp_avatar_is_front_edit', true );
     555
     556        /**
     557         * Filters the ability to set an avatar for a given site.
     558         *
     559         * @since 2.7.0
     560         *
     561         * @param bool $is_avatar_enabled true if avatar uploads are enabled, false otherwise.
     562         */
     563        return (bool) apply_filters( 'bp_blogs_is_site_avatar_uploads_enabled', $is_avatar_enabled );
     564}
     565
     566/**
     567 * Register the Site Icon script into the common scripts.
     568 * This script is making sure we can set an avatar using a WordPress Site Icon.
     569 *
     570 * @since  2.7.0
     571 *
     572 * @param  array $scripts The BuddyPress common scripts.
     573 * @return array          The BuddyPress common scripts.
     574 */
     575function blogs_register_site_icon_script( $scripts = array() ) {
     576        $min = bp_core_get_minified_asset_suffix();
     577        $uri = buddypress()->plugin_url . 'bp-blogs/site/js/';
     578
     579        return array_merge( $scripts, array(
     580                'bp-site-icon' => array(
     581                        'file'         => sprintf( '%1$ssite-icon%2$s.js', $uri, $min ),
     582                        'dependencies' => array( 'bp-avatar' ),
     583                        'footer'       => true
     584                ),
     585        ) );
     586}
     587add_filter( 'bp_core_register_common_scripts', 'blogs_register_site_icon_script', 10, 1 );
     588
     589/**
     590 * Checks the Site Icon can be used as this feature was introduced in WordPress 4.3.
     591 *
     592 * @since  2.7.0
     593 *
     594 * @return bool True if the site icon can be used. False otherwise.
     595 */
     596function bp_blogs_is_site_icon_enabled() {
     597        /**
     598         * filter here to disable the "site icon avatar"
     599         *
     600         * @since  2.7.0
     601         *
     602         * @param  bool $value True to use the site icon, false otherwise.
     603         */
     604        return (bool) apply_filters( 'bp_blogs_is_site_icon_enabled', function_exists( 'get_site_icon_url' ) );
     605}
     606
     607/**
     608 * Set the Attachments script data for the site icon.
     609 *
     610 * @since  2.7.0
     611 *
     612 * @param  array  $script_data Script datas for the Uploader UI.
     613 * @return array               Script datas for the Uploader UI.
     614 */
     615function bp_blogs_set_site_icon_script_data( $script_data = array() ) {
     616        if ( empty( $script_data['bp_params']['item_id'] ) ) {
     617                return $script_data;
     618        }
     619
     620        // The site id.
     621        $site_id = $script_data['bp_params']['item_id'];
     622
     623        // By default, we set no icon to true.
     624        $params  = array( 'no_icon' => true );
     625        $w_max   = bp_core_avatar_full_width();
     626
     627        // Try to get the site icon
     628        $url = get_site_icon_url( $w_max, '', $site_id );
     629
     630        if ( ! empty( $url ) ) {
     631                $params = array(
     632                        'id'      => (int) get_blog_option( $site_id, 'site_icon', 0 ),
     633                        'src'     => $url,
     634                        'no_icon' => false,
     635                        'max_dim' => $w_max,
     636                        'nonce'   => $script_data['bp_params']['nonces']['set'],
     637                        'in_use'  => false,
     638                );
     639        }
     640
     641        // Check if the site icon is already used as the site logo.
     642        if ( 'site_icon' === bp_blogs_get_blogmeta( $site_id, 'avatar_type' ) ) {
     643                $params['in_use'] = true;
     644        }
     645
     646        // Include specific params for the site icon
     647        $script_data['bp_params']['site_icon'] = $params;
     648
     649        // Finally return the script data.
     650        return $script_data;
     651}
     652
     653/**
     654 * Create a new site's profile photo out of a site icon
     655 *
     656 * @since  2.7.0
     657 *
     658 * @param  int $site_id The site ID
     659 * @param  int $icon_id The ID of the site icon attachment.
     660 * @return bool True on success. False otherwise.
     661 */
     662function blogs_site_icon_create_avatar( $site_id = 0, $icon_id = 0 ) {
     663        if ( empty( $site_id ) || empty( $icon_id ) ) {
     664                return false;
     665        }
     666
     667        // Check if we need to switch the blog.
     668        $needs_switch = ! bp_is_root_blog( (int) $site_id );
     669
     670        // Eventually switch
     671        if ( $needs_switch ) {
     672                switch_to_blog( $site_id );
     673        }
     674
     675        // Get the site icon image file
     676        $icon_img = get_attached_file( $icon_id );
     677
     678        if ( $needs_switch ) {
     679                restore_current_blog();
     680        }
     681
     682        if ( empty( $icon_img ) ) {
     683                return false;
     684        }
     685
     686        $icon_data = BP_Attachment::get_image_data( $icon_img );
     687
     688        if ( empty( $icon_data['width'] ) || empty( $icon_data['height'] ) ) {
     689                return false;
     690        }
     691
     692        // Create the avatar using the site icon image.
     693        if ( ! bp_attachments_create_item_type( 'avatar', array(
     694                'item_id'   => $site_id,
     695                'object'    => 'blog',
     696                'component' => 'blogs',
     697                'image'     => $icon_img,
     698                'crop_w'    => $icon_data['width'],
     699                'crop_h'    => $icon_data['height'],
     700        ) ) ) {
     701                return false;
     702        }
     703
     704        // Set the avatar type.
     705        bp_blogs_update_blogmeta( $site_id, 'avatar_type', 'site_icon' );
     706
     707        return true;
     708}
     709
     710/**
     711 * Update the site's profile photo if the site icon was updated
     712 *
     713 * @since 2.7.0
     714 *
     715 * @param  int $option  The 'site_icon' option
     716 * @param  int $icon_id The ID of the site icon attachment.
     717 */
     718function blogs_site_icon_update_avatar( $option = 'site_icon', $icon_id = 0 ) {
     719        $icon_id = (int) $icon_id;
     720        $site_id = get_current_blog_id();
     721
     722        if ( 'site_icon' !== bp_blogs_get_blogmeta( $site_id, 'avatar_type' ) ) {
     723                return;
     724        }
     725
     726        // Delete the Site's profile photo
     727        if ( empty( $icon_id ) ) {
     728                bp_core_delete_existing_avatar( array( 'item_id' => $site_id, 'object' => 'blog' ) );
     729
     730        // Update the Site's profile photo
     731        } else {
     732                blogs_site_icon_create_avatar( $site_id, $icon_id );
     733        }
     734}
     735add_action( 'update_option_site_icon', 'blogs_site_icon_update_avatar', 10, 2 );
     736
     737/**
     738 * Check if we need to redirect the user who just registered a new site
     739 * to the Site's edit avatar manage screen.
     740 *
     741 * @since 2.7.0
     742 */
     743function bp_blogs_maybe_redirect_to_site_manage_avatar_screen() {
     744        /**
     745         * No need to carry on if Site signups are not allowed or
     746         * if the user is not logged in yet.
     747         */
     748        if ( ! bp_blog_signup_enabled() || ! is_user_logged_in() ) {
     749                return;
     750        }
     751
     752        /**
     753         * No need to carry on if the Site's feature is not active
     754         * or if avatar uploads are disabled.
     755         */
     756        if ( ! bp_is_active( 'blogs', 'site' ) || ! bp_blogs_is_site_avatar_uploads_enabled() ) {
     757                return;
     758        }
     759
     760        $transient_key = sprintf( '_bp_activation_%d_redirect', bp_loggedin_user_id() );
     761        $site_id = get_transient( $transient_key );
     762
     763        if ( empty( $site_id ) ) {
     764                return;
     765        }
     766
     767        // Delete the redirect transient
     768        delete_transient( $transient_key );
     769
     770        $site = bp_blogs_get_site( $site_id );
     771
     772        if ( empty( $site->slug ) ) {
     773                return;
     774        }
     775
     776        $redirect = trailingslashit( bp_blogs_get_site_community_url( $site->slug ) . 'manage/edit-avatar' );
     777
     778        bp_core_add_message( __( 'Welcome to the community pages of your new site, please consider adding a site profile photo for your site', 'buddypress' ) );
     779        bp_core_redirect( esc_url( $redirect ) );
     780}
     781add_action( 'bp_blogs_setup_nav', 'bp_blogs_maybe_redirect_to_site_manage_avatar_screen' );
     782
     783/**
     784 * Delete the site's avatar on site removal.
     785 *
     786 * @since  2.7.0
     787 *
     788 * @param  int $site_id The site ID
     789 */
     790function bp_blogs_remove_site_avatar( $site_id = 0 ) {
     791        bp_core_delete_existing_avatar( array( 'item_id' => $site_id, 'object' => 'blog', 'avatar_dir' => 'blog-avatars' ) );
     792}
     793add_action( 'bp_blogs_remove_blog', 'bp_blogs_remove_site_avatar', 10, 1 );
  • src/bp-blogs/site/js/site-icon.js

    diff --git src/bp-blogs/site/js/site-icon.js src/bp-blogs/site/js/site-icon.js
    index e69de29..c2ecd0f 100644
     
     1/* globals bp, _, BP_Uploader, Backbone */
     2
     3window.bp = window.bp || {};
     4
     5( function( exports, $ ) {
     6
     7        // Bail if not set
     8        if ( typeof BP_Uploader === 'undefined' ) {
     9                return;
     10        }
     11
     12        bp.Models      = bp.Models || {};
     13        bp.Collections = bp.Collections || {};
     14        bp.Views       = bp.Views || {};
     15        bp.Avatar      = bp.Avatar || {};
     16
     17        bp.Avatar.SiteIcon = {
     18                start: function() {
     19                        bp.Avatar.nav.on( 'bp-avatar-view:changed', _.bind( this.setView, this ) );
     20
     21                        this.site_icon = new Backbone.Model( _.extend(
     22                                _.pick( BP_Uploader.settings.defaults.multipart_params.bp_params,
     23                                        'object',
     24                                        'item_id'
     25                                ),
     26                                BP_Uploader.settings.defaults.multipart_params.bp_params.site_icon
     27                        ) );
     28
     29                        bp.Avatar.Attachment.on( 'change:url', _.bind( this.updateSiteIcon, this ) );
     30                },
     31
     32                setView: function( view ) {
     33                        if ( 'site_icon' !== view ) {
     34                                return;
     35                        }
     36
     37                        // Create the view
     38                        var siteIconView = new bp.Views.SiteIcon( { model: this.site_icon } );
     39
     40                        // Add it to Avatar views
     41                        bp.Avatar.views.add( { id: 'site_icon', view: siteIconView } );
     42
     43                        // Display it
     44                        siteIconView.inject( '.bp-avatar' );
     45                },
     46
     47                updateSiteIcon: function( model ) {
     48                        if ( ( 'deleted' === model.get( 'action' ) && true === this.site_icon.get( 'in_use' ) ) ||
     49                                ( 'uploaded' === model.get( 'action' ) && model.get( 'url' ) !== this.site_icon.get( 'src' ) )
     50                        ) {
     51                                this.site_icon.set( 'in_use', false );
     52                        }
     53                }
     54        };
     55
     56        // Main view
     57        bp.Views.SiteIcon = bp.View.extend( {
     58                tagName: 'div',
     59                id: 'bp-site-icon',
     60                template: bp.template( 'bp-avatar-site-icon' ),
     61
     62                events: {
     63                        'click .avatar-crop-submit': 'setAvatar'
     64                },
     65
     66                initialize: function() {
     67                        // The site does not have an icon
     68                        if ( true === this.model.get( 'no_icon' ) ) {
     69                                bp.Avatar.displayWarning( BP_Uploader.strings.site_icon.noicon );
     70
     71                        // Message to inform the site icon can be used as an avatar
     72                        } else if ( true === this.model.get( 'in_use' ) ) {
     73                                bp.Avatar.displayWarning( BP_Uploader.strings.site_icon.set );
     74
     75                        } else {
     76                                bp.Avatar.displayWarning( BP_Uploader.strings.site_icon.info );
     77                        }
     78                },
     79
     80                setAvatar: function( event ) {
     81                        var self = this;
     82
     83                        event.preventDefault();
     84
     85                        // Remove the site icon view
     86                        if ( ! _.isUndefined( bp.Avatar.views.get( 'site_icon' ) ) ) {
     87                                var siteIconView = bp.Avatar.views.get( 'site_icon' );
     88                                siteIconView.get( 'view' ).remove();
     89                                bp.Avatar.views.remove( { id: 'site_icon', view: siteIconView } );
     90                        }
     91
     92                        return wp.ajax.post( 'bp_avatar_set', {
     93                                item_id:       self.model.get( 'item_id' ),
     94                                object:        self.model.get( 'object' ),
     95                                original_file: self.model.get( 'id' ),
     96                                type:          'site_icon',
     97                                nonce:         self.model.get( 'nonce' )
     98                        } ).done( function( resp ) {
     99                                self.model.set( 'in_use', true );
     100
     101                                var avatarStatus = new bp.Views.AvatarStatus( {
     102                                        value : BP_Uploader.strings.site_icon[ resp.feedback_code ],
     103                                        type : 'success'
     104                                } );
     105
     106                                bp.Avatar.views.add( {
     107                                        id   : 'status',
     108                                        view : avatarStatus
     109                                } );
     110
     111                                avatarStatus.inject( '.bp-avatar-status' );
     112
     113                                // Update each avatars of the page
     114                                $( '.' + self.model.get( 'object' ) + '-' + self.model.get( 'item_id' ) + '-avatar' ).each( function() {
     115                                        $( this ).prop( 'src', self.model.get( 'src' ) );
     116                                } );
     117
     118                                // Show the delete nav
     119                                bp.Avatar.navItems.get( 'delete' ).set( { hide: 0 } );
     120
     121                                // Update the Avatar Attachment object
     122                                bp.Avatar.Attachment.set( _.extend(
     123                                        _.pick( self.model.attributes, ['object', 'item_id'] ),
     124                                        { url: self.model.get( 'src' ), action: 'uploaded' }
     125                                ) );
     126
     127                        } ).fail( function( resp ) {
     128
     129                                var avatarStatus = new bp.Views.AvatarStatus( {
     130                                        value : BP_Uploader.strings.site_icon[ resp.feedback_code ],
     131                                        type : 'error'
     132                                } );
     133
     134                                bp.Avatar.views.add( {
     135                                        id   : 'status',
     136                                        view : avatarStatus
     137                                } );
     138
     139                                avatarStatus.inject( '.bp-avatar-status' );
     140                        } );
     141                }
     142        } );
     143
     144        bp.Avatar.SiteIcon.start();
     145
     146} )( bp, jQuery );
  • src/bp-blogs/site/template.php

    diff --git src/bp-blogs/site/template.php src/bp-blogs/site/template.php
    index 364710f..afdb5f2 100644
    function bp_site_has_members( $args = '' ) { 
    651651        $bp->blogs->site->members->loop_args = bp_parse_args( $args, array(
    652652                'blog_id'         => bp_blogs_get_current_site_id(), // Only return users recorded for the site.
    653653                'is_contributor'  => $is_contributor,                // Null to get all site members, 1 for contributors and 0 for subscribers
    654                 'type'            => 'newest',
     654                'type'            => 'last_joined',
    655655                'page'            => 1,
    656656                'per_page'        => 20,
    657657                'page_arg'        => 'site_page',
    function bp_site_plugin_settings() { 
    12981298
    12991299        print( "\n<fieldset>\n" );
    13001300}
     1301
     1302/** Site avatar ***************************************************************/
     1303
     1304/**
     1305 * Return whether a site has an avatar.
     1306 *
     1307 * @since 2.7.0
     1308 *
     1309 * @param int|bool $site_id Site ID to check.
     1310 * @return boolean
     1311 */
     1312function bp_get_site_has_avatar( $site_id = false ) {
     1313        if ( false === $site_id ) {
     1314                $site_id = bp_blogs_get_current_site_id();
     1315        }
     1316
     1317        $avatar_args = array(
     1318                'item_id' => $site_id,
     1319                'object'  => 'blog',
     1320                'no_grav' => true,
     1321                'html'    => false,
     1322                'type'    => 'thumb',
     1323        );
     1324
     1325        $site_avatar = bp_core_fetch_avatar( $avatar_args );
     1326
     1327        if ( bp_core_avatar_default( 'local', $avatar_args ) === $site_avatar ) {
     1328                return false;
     1329        }
     1330
     1331        return true;
     1332}
     1333
     1334/** Site cover image **********************************************************/
     1335
     1336/**
     1337 * Should we use the site's cover image header.
     1338 *
     1339 * @since 2.4.0
     1340 *
     1341 * @return bool True if the displayed user has a cover image,
     1342 *              False otherwise
     1343 */
     1344function bp_site_use_cover_image_header() {
     1345        return (bool) bp_is_active( 'blogs', 'cover_image' ) && ! bp_disable_site_cover_image_uploads() && bp_attachments_is_wp_version_supported();
     1346}
  • src/bp-core/admin/bp-core-admin-settings.php

    diff --git src/bp-core/admin/bp-core-admin-settings.php src/bp-core/admin/bp-core-admin-settings.php
    index a79335c..d8760ac 100644
    function bp_admin_setting_callback_blog_avatar_uploads() { 
    285285<?php
    286286}
    287287
     288/**
     289 * Disable site cover images field markup.
     290 *
     291 * @since 2.7.0
     292 */
     293function bp_admin_setting_callback_site_cover_image_uploads() {
     294?>
     295        <input id="bp-disable-site-cover-image-uploads" name="bp-disable-site-cover-image-uploads" type="checkbox" value="1" <?php checked( ! bp_disable_site_cover_image_uploads() ); ?> />
     296        <label for="bp-disable-site-cover-image-uploads"><?php _e( 'Allow customizable cover images for sites', 'buddypress' ); ?></label>
     297<?php
     298}
     299
    288300/** Settings Page *************************************************************/
    289301
    290302/**
    function bp_core_admin_settings_save() { 
    354366                        'bp_disable_blogforum_comments',
    355367                        'bp-disable-site-subscriptions',
    356368                        'bp-disable-site-avatar-uploads',
     369                        'bp-disable-site-cover-image-uploads',
    357370                        'bp-disable-profile-sync',
    358371                        'bp_restrict_group_creation',
    359372                        'hide-loggedout-adminbar',
  • src/bp-core/bp-core-attachments.php

    diff --git src/bp-core/bp-core-attachments.php src/bp-core/bp-core-attachments.php
    index 893f9e5..7c7a9fb 100644
    function bp_attachments_enqueue_scripts( $class = '' ) { 
    736736                        );
    737737                }
    738738
     739                if ( bp_is_active( 'blogs', 'site' ) && bp_blogs_is_site_icon_enabled() && 'blog' === $object ) {
     740                        $avatar_nav['site_icon'] = array( 'id' => 'site_icon', 'caption' => __( 'Site Icon', 'buddypress' ), 'order' => 10 );
     741
     742                        // Set warning messages.
     743                        $strings['site_icon'] = array(
     744                                'success' => __( 'The Site Icon has been successfully set as the Site\'s Profile Photo.', 'buddypress'),
     745                                'error'   => __( 'There was a problem setting the Site Icon as the Site\'s Profile Photo. Please try again.', 'buddypress' ),
     746                                'info'    => __( 'You can use the Site Icon to set your Site\'s Profile Photo.', 'buddypress' ),
     747                                'noicon'  => __( 'The Site Icon is not set for this site. Please use the Upload tab.', 'buddypress' ),
     748                                'set'     => __( 'The Site Icon is already used as the Site\'s Profile Photo. You can either delete it or upload a new one using the corresponding tabs.', 'buddypress' ),
     749                        );
     750                }
     751
    739752                /**
    740753                 * Use this filter to add a navigation to a custom tool to set the object's avatar.
    741754                 *
    function bp_attachments_current_user_can( $capability, $args = array() ) { 
    858871                        // User profile photo.
    859872                        } elseif ( bp_is_active( 'xprofile' ) && 'user' === $args['object'] ) {
    860873                                $can = bp_loggedin_user_id() === (int) $args['item_id'] || bp_current_user_can( 'bp_moderate' );
     874
     875                        // Site profile phogo
     876                        } elseif ( bp_is_active( 'blogs', 'site' ) && 'blog' === $args['object'] ) {
     877                                $can = current_user_can_for_blog( (int) $args['item_id'], 'manage_options' );
    861878                        }
    862879                /**
    863880                 * No avatar arguments, fallback to bp_user_can_create_groups()
    function bp_attachments_cover_image_is_edit() { 
    10501067                $retval = ! bp_disable_group_cover_image_uploads();
    10511068        }
    10521069
     1070        if ( bp_is_site_manage_screen( 'edit-cover-image' ) ) {
     1071                $retval = ! bp_disable_site_cover_image_uploads();
     1072        }
     1073
    10531074        return apply_filters( 'bp_attachments_cover_image_is_edit', $retval, $current_component );
    10541075}
    10551076
    function bp_attachments_get_group_has_cover_image( $group_id = 0 ) { 
    10951116}
    10961117
    10971118/**
     1119 * Does the site has a cover image?
     1120 *
     1121 * @since 2.7.0
     1122 *
     1123 * @param int $site_id Site ID to check cover image existence for.
     1124 * @return bool True if the site has a cover image, false otherwise.
     1125 */
     1126function bp_attachments_get_site_has_cover_image( $site_id = 0 ) {
     1127        if ( empty( $site_id ) && bp_is_active( 'blogs', 'site' ) ) {
     1128                $site_id = bp_blogs_get_current_site_id();
     1129        }
     1130
     1131        $cover_src = bp_attachments_get_attachment( 'url', array(
     1132                'object_dir' => 'blogs',
     1133                'item_id'    => $site_id,
     1134        ) );
     1135
     1136        return (bool) apply_filters( 'bp_attachments_get_site_has_cover_image', $cover_src, $site_id );
     1137}
     1138
     1139/**
    10981140 * Generate the cover image file.
    10991141 *
    11001142 * @since 2.4.0
    function bp_attachments_cover_image_ajax_upload() { 
    12481290                        ) );
    12491291                }
    12501292
     1293        // Site's cover image.
     1294        } elseif ( 'blog' === $bp_params['object'] ) {
     1295                $object_data = array( 'dir' => 'blogs', 'component' => 'blogs' );
     1296
     1297                if ( ! bp_get_current_group_id() && ! empty( $bp_params['item_id'] ) ) {
     1298                        $needs_reset = array( 'component' => 'blogs', 'key' => 'current_site', 'value' => $bp->blogs->current_site );
     1299                        $bp->groups->current_site = bp_blogs_get_site( $bp_params['item_id'] );
     1300                }
     1301
    12511302        // Other object's cover image.
    12521303        } else {
    12531304                $object_data = apply_filters( 'bp_attachments_cover_image_object_dir', array(), $bp_params['object'] );
  • src/bp-core/bp-core-avatars.php

    diff --git src/bp-core/bp-core-avatars.php src/bp-core/bp-core-avatars.php
    index b542544..044101b 100644
    function bp_core_fetch_avatar( $args = '' ) { 
    227227                switch ( $params['object'] ) {
    228228
    229229                        case 'blog'  :
    230                                 $params['item_id'] = $current_blog->id;
     230                                if ( bp_is_active( 'blogs', 'site' ) ) {
     231                                        $params['item_id'] = bp_blogs_get_current_site_id();
     232                                } else {
     233                                        $params['item_id'] = false;
     234                                }
    231235                                break;
    232236
    233237                        case 'group' :
    function bp_core_delete_existing_avatar( $args = '' ) { 
    745749        }
    746750
    747751        if ( empty( $item_id ) ) {
    748                 if ( 'user' == $object )
     752                if ( 'user' === $object ) {
    749753                        $item_id = bp_displayed_user_id();
    750                 elseif ( 'group' == $object )
     754                } elseif ( 'group' === $object && bp_is_active( 'groups' ) ) {
    751755                        $item_id = buddypress()->groups->current_group->id;
    752                 elseif ( 'blog' == $object )
    753                         $item_id = $current_blog->id;
     756                } elseif ( 'blog' === $object && bp_is_active( 'blogs', 'site' ) ) {
     757                        $item_id = bp_blogs_get_current_site_id();
     758                }
    754759
    755760                /** This filter is documented in bp-core/bp-core-avatars.php */
    756761                $item_id = apply_filters( 'bp_core_avatar_item_id', $item_id, $object );
    757762
    758                 if ( !$item_id ) return false;
     763                if ( ! $item_id ) return false;
    759764        }
    760765
    761766        if ( empty( $avatar_dir ) ) {
    762                 if ( 'user' == $object )
     767                if ( 'user' === $object ) {
    763768                        $avatar_dir = 'avatars';
    764                 elseif ( 'group' == $object )
     769                } elseif ( 'group' === $object ) {
    765770                        $avatar_dir = 'group-avatars';
    766                 elseif ( 'blog' == $object )
     771                } elseif ( 'blog' === $object ) {
    767772                        $avatar_dir = 'blog-avatars';
     773                }
    768774
    769775                /** This filter is documented in bp-core/bp-core-avatars.php */
    770776                $avatar_dir = apply_filters( 'bp_core_avatar_dir', $avatar_dir, $object );
    771777
    772                 if ( !$avatar_dir ) return false;
     778                if ( ! $avatar_dir ) return false;
    773779        }
    774780
    775781        /** This filter is documented in bp-core/bp-core-avatars.php */
    function bp_avatar_ajax_delete() { 
    846852                        'item_id'       => $avatar_data['item_id'],
    847853                );
    848854
     855                // Delete the avatar type.
     856                if ( 'blog' === $avatar_data['object'] ) {
     857                        bp_blogs_delete_blogmeta( $avatar_data['item_id'], 'avatar_type' );
     858                }
     859
    849860                wp_send_json_success( $return );
    850861        } else {
    851862                wp_send_json_error( array(
    function bp_avatar_ajax_upload() { 
    10101021                                'populate_extras' => false,
    10111022                        ) );
    10121023                }
     1024        } elseif ( 'blog' === $bp_params['object'] && bp_is_active( 'blogs', 'site' ) ) {
     1025                $bp_params['upload_dir_filter'] = 'blogs_avatar_upload_dir';
     1026
     1027                if ( ! bp_blogs_get_current_site_id() && ! empty( $bp_params['item_id'] ) ) {
     1028                        $needs_reset = array( 'component' => 'blogs', 'key' => 'current_site', 'value' => $bp->blogs->current_site );
     1029                        $bp->blogs->current_site = bp_blogs_get_site( $bp_params['item_id'] );
     1030                }
    10131031        } else {
    10141032                /**
    10151033                 * Filter here to deal with other components.
    function bp_avatar_ajax_set() { 
    12641282                wp_send_json_error();
    12651283        }
    12661284
    1267         if ( ! empty( $avatar_data['type'] ) && 'camera' === $avatar_data['type'] && 'user' === $avatar_data['object'] ) {
    1268                 $webcam_avatar = false;
     1285        if ( ! empty( $avatar_data['type'] ) && 'crop' !== $avatar_data['type'] ) {
     1286                if ( 'camera' === $avatar_data['type'] && 'user' === $avatar_data['object'] ) {
     1287                        $webcam_avatar = false;
    12691288
    1270                 if ( ! empty( $avatar_data['original_file'] ) ) {
    1271                         $webcam_avatar = str_replace( array( 'data:image/png;base64,', ' ' ), array( '', '+' ), $avatar_data['original_file'] );
    1272                         $webcam_avatar = base64_decode( $webcam_avatar );
    1273                 }
     1289                        if ( ! empty( $avatar_data['original_file'] ) ) {
     1290                                $webcam_avatar = str_replace( array( 'data:image/png;base64,', ' ' ), array( '', '+' ), $avatar_data['original_file'] );
     1291                                $webcam_avatar = base64_decode( $webcam_avatar );
     1292                        }
    12741293
    1275                 if ( ! bp_avatar_handle_capture( $webcam_avatar, $avatar_data['item_id'] ) ) {
    1276                         wp_send_json_error( array(
    1277                                 'feedback_code' => 1
    1278                         ) );
     1294                        if ( ! bp_avatar_handle_capture( $webcam_avatar, $avatar_data['item_id'] ) ) {
     1295                                wp_send_json_error( array(
     1296                                        'feedback_code' => 1
     1297                                ) );
    12791298
    1280                 } else {
    1281                         $return = array(
    1282                                 'avatar' => html_entity_decode( bp_core_fetch_avatar( array(
    1283                                         'object'  => $avatar_data['object'],
    1284                                         'item_id' => $avatar_data['item_id'],
    1285                                         'html'    => false,
    1286                                         'type'    => 'full',
    1287                                 ) ) ),
    1288                                 'feedback_code' => 2,
    1289                                 'item_id'       => $avatar_data['item_id'],
    1290                         );
     1299                        } else {
     1300                                $return = array(
     1301                                        'avatar' => html_entity_decode( bp_core_fetch_avatar( array(
     1302                                                'object'  => $avatar_data['object'],
     1303                                                'item_id' => $avatar_data['item_id'],
     1304                                                'html'    => false,
     1305                                                'type'    => 'full',
     1306                                        ) ) ),
     1307                                        'feedback_code' => 2,
     1308                                        'item_id'       => $avatar_data['item_id'],
     1309                                );
    12911310
    1292                         /**
    1293                          * Fires if the new avatar was successfully captured.
    1294                          *
    1295                          * @since 1.1.0 Used to inform the avatar was successfully cropped
    1296                          * @since 2.3.4 Add two new parameters to inform about the user id and
    1297                          *              about the way the avatar was set (eg: 'crop' or 'camera')
    1298                          *              Move the action at the right place, once the avatar is set
    1299                          *
    1300                          * @param string $item_id Inform about the user id the avatar was set for
    1301                          * @param string $type    Inform about the way the avatar was set ('camera')
    1302                          */
    1303                         do_action( 'xprofile_avatar_uploaded', (int) $avatar_data['item_id'], $avatar_data['type'] );
     1311                                /**
     1312                                 * Fires if the new avatar was successfully captured.
     1313                                 *
     1314                                 * @since 1.1.0 Used to inform the avatar was successfully cropped
     1315                                 * @since 2.3.4 Add two new parameters to inform about the user id and
     1316                                 *              about the way the avatar was set (eg: 'crop' or 'camera')
     1317                                 *              Move the action at the right place, once the avatar is set
     1318                                 *
     1319                                 * @param string $item_id Inform about the user id the avatar was set for
     1320                                 * @param string $type    Inform about the way the avatar was set ('camera')
     1321                                 */
     1322                                do_action( 'xprofile_avatar_uploaded', (int) $avatar_data['item_id'], $avatar_data['type'] );
     1323
     1324                                wp_send_json_success( $return );
     1325                        }
    13041326
    1305                         wp_send_json_success( $return );
     1327                // Site icon for Sites
     1328                } elseif ( 'site_icon' === $avatar_data['type'] && 'blog' === $avatar_data['object'] ) {
     1329                        if ( ! blogs_site_icon_create_avatar( $avatar_data['item_id'], $avatar_data['original_file'] ) ) {
     1330                                wp_send_json_error( array( 'feedback_code' => 'error' ) );
     1331                        } else {
     1332                                wp_send_json_success( array( 'feedback_code' => 'success' ) );
     1333                        }
    13061334                }
    13071335
    13081336                return;
    function bp_avatar_ajax_set() { 
    13571385                         * @param string $type Inform about the way the avatar was set ('crop')
    13581386                         */
    13591387                        do_action( 'xprofile_avatar_uploaded', (int) $avatar_data['item_id'], $avatar_data['type'] );
     1388
     1389                // If it's a blog set the avatar type.
     1390                } elseif ( 'blog' === $avatar_data['object'] ) {
     1391                        bp_blogs_update_blogmeta( $avatar_data['item_id'], 'avatar_type', $avatar_data['type'] );
    13601392                }
    13611393
    13621394                wp_send_json_success( $return );
    function bp_avatar_is_front_edit() { 
    19982030                }
    19992031        }
    20002032
     2033        if ( bp_is_active( 'blogs', 'site' ) && bp_is_site_manage_screen( 'edit-avatar' ) ) {
     2034                $retval = ! bp_disable_site_avatar_uploads();
     2035        }
     2036
    20012037        /**
    20022038         * Use this filter if you need to :
    20032039         * - Load the avatar UI for a component that is !groups or !user (return true regarding your conditions)
  • src/bp-core/bp-core-cssjs.php

    diff --git src/bp-core/bp-core-cssjs.php src/bp-core/bp-core-cssjs.php
    index 7cfe3d9..2bbab7a 100644
    function bp_add_cover_image_inline_css( $return = false ) { 
    397397                        'component' =>'groups',
    398398                        'object' => $bp->groups->current_group
    399399                );
     400        } elseif ( bp_is_site() ) {
     401
     402                /**
     403                 * Users are not allowed to upload cover images for their sites
     404                 * no need to carry on.
     405                 */
     406                if ( bp_disable_site_cover_image_uploads() ) {
     407                        return;
     408                }
     409
     410                $cover_image_object = array(
     411                        'component' =>'blogs',
     412                        'object'    => $bp->blogs->current_site,
     413                );
    400414        } else {
    401415                $cover_image_object = apply_filters( 'bp_current_cover_image_object_inline_css', array() );
    402416        }
  • src/bp-core/bp-core-options.php

    diff --git src/bp-core/bp-core-options.php src/bp-core/bp-core-options.php
    index cf974dd..9781722 100644
    function bp_get_default_options() { 
    7676                // Blog Profile Photos
    7777                'bp-disable-site-avatar-uploads'       => false,
    7878
     79                // Site Cover image
     80                'bp-disable-site-cover-image-uploads'  => false,
     81
    7982                // The ID for the current theme package.
    8083                '_bp_theme_package_id'                 => 'legacy',
    8184
    function bp_disable_site_avatar_uploads( $default = false ) { 
    736739        /**
    737740         * Filters whether or not members are able to upload site avatars.
    738741         *
    739          * @since BuddyPress (2.4.0)
     742         * @since 2.7.0
    740743         *
    741744         * @param bool $disabled Whether or not members are able to upload their site avatars.
    742745         * @param bool $default  Default value passed to the function.
    function bp_disable_site_avatar_uploads( $default = false ) { 
    745748}
    746749
    747750/**
     751 * Are site cover images disabled?
     752 *
     753 * @since 2.7.0
     754 *
     755 * @param bool $default Optional. Fallback value if not found in the database.
     756 *                      Default: false.
     757 * @return bool True if site cover image uploads are disabled, otherwise false.
     758 */
     759function bp_disable_site_cover_image_uploads( $default = false ) {
     760
     761        /**
     762         * Filters whether or not members are able to upload site cover images.
     763         *
     764         * @since 2.7.0
     765         *
     766         * @param bool $value Whether or not members are able to upload thier sites cover images.
     767         */
     768        return (bool) apply_filters( 'bp_disable_site_cover_image_uploads', (bool) bp_get_option( 'bp-disable-site-cover-image-uploads', $default ) );
     769}
     770
     771/**
    748772 * Is group creation turned off?
    749773 *
    750774 * @since 1.6.0
  • src/bp-core/bp-core-theme-compatibility.php

    diff --git src/bp-core/bp-core-theme-compatibility.php src/bp-core/bp-core-theme-compatibility.php
    index ea83317..44fe3a7 100644
    function bp_register_theme_compat_default_features() { 
    467467                $top_offset = $avatar_height;
    468468        }
    469469
     470        $components = array( 'xprofile', 'groups' );
     471
     472        if ( bp_is_active( 'blogs', 'site' ) ) {
     473                $components[] = 'blogs';
     474        }
     475
    470476        bp_set_theme_compat_feature( 'legacy', array(
    471477                'name'     => 'cover_image',
    472478                'settings' => array(
    473                         'components'   => array( 'xprofile', 'groups' ),
     479                        'components'   => $components,
    474480                        'width'        => $bp_content_width,
    475481                        'height'       => $top_offset + round( $avatar_height / 2 ),
    476482                        'callback'     => 'bp_legacy_theme_cover_image',
  • src/bp-core/classes/class-bp-admin.php

    diff --git src/bp-core/classes/class-bp-admin.php src/bp-core/classes/class-bp-admin.php
    index 4e65e93..579a67e 100644
    class BP_Admin { 
    485485                        // Disable site avatars
    486486                        add_settings_field( 'bp-disable-site-avatar-uploads', __( 'Site Photo Uploads', 'buddypress' ), 'bp_admin_setting_callback_blog_avatar_uploads', 'buddypress', 'bp_blogs' );
    487487                        register_setting( 'buddypress', 'bp-disable-site-avatar-uploads', 'intval' );
     488
     489                        // Disable site cover images
     490                        add_settings_field( 'bp-disable-site-cover-image-uploads', __( 'Site Cover Image Uploads', 'buddypress' ), 'bp_admin_setting_callback_site_cover_image_uploads', 'buddypress', 'bp_blogs' );
     491                        register_setting( 'buddypress', 'bp-disable-site-cover-image-uploads', 'intval' );
    488492                }
    489493        }
    490494
  • src/bp-core/classes/class-bp-attachment-avatar.php

    diff --git src/bp-core/classes/class-bp-attachment-avatar.php src/bp-core/classes/class-bp-attachment-avatar.php
    index a4c9ba6..44aceb7 100644
    class BP_Attachment_Avatar extends BP_Attachment { 
    325325        }
    326326
    327327        /**
     328         * Get the Site id to set its avatar
     329         *
     330         * @since 2.7.0
     331         *
     332         * @return integer the Site id
     333         */
     334        private function get_site_id() {
     335                $site_id = 0;
     336
     337                if ( bp_is_site() ) {
     338                        $site_id = bp_blogs_get_current_site_id();
     339                }
     340
     341                return $site_id;
     342        }
     343
     344        /**
    328345         * Build script datas for the Uploader UI.
    329346         *
    330347         * @since 2.3.0
    class BP_Attachment_Avatar extends BP_Attachment { 
    344361                // Get the possible item ids.
    345362                $user_id  = $this->get_user_id();
    346363                $group_id = $this->get_group_id();
     364                $site_id  = $this->get_site_id();
    347365
    348366                if ( ! empty( $user_id ) ) {
    349367                        // Should we load the the Webcam Avatar javascript file.
    class BP_Attachment_Avatar extends BP_Attachment { 
    386404                                3 => __( 'There was a problem deleting the group profile photo. Please try again.', 'buddypress' ),
    387405                                4 => __( 'The group profile photo was deleted successfully!', 'buddypress' ),
    388406                        );
     407                } elseif( ! empty( $site_id ) ) {
     408                        $script_data['bp_params'] = array(
     409                                'object'     => 'blog',
     410                                'item_id'    => $site_id,
     411                                'has_avatar' => bp_get_site_has_avatar( $site_id ),
     412                                'nonces'     => array(
     413                                        'set'    => wp_create_nonce( 'bp_avatar_cropstore' ),
     414                                        'remove' => wp_create_nonce( 'bp_delete_avatar_link' ),
     415                                ),
     416                        );
     417
     418                        // Set feedback messages
     419                        $script_data['feedback_messages'] = array(
     420                                1 => __( 'There was a problem cropping the site profile photo.', 'buddypress' ),
     421                                2 => __( 'The site profile photo was uploaded successfully.', 'buddypress' ),
     422                                3 => __( 'There was a problem deleting the site profile photo. Please try again.', 'buddypress' ),
     423                                4 => __( 'The site profile photo was deleted successfully!', 'buddypress' ),
     424                        );
     425
     426                        if ( bp_blogs_is_site_icon_enabled() ) {
     427                                $script_data = bp_blogs_set_site_icon_script_data( $script_data );
     428                                $js_scripts = array( 'bp-site-icon' );
     429                        }
    389430                } else {
    390431
    391432                        /**
    392433                         * Use this filter to include specific BuddyPress params for your object.
    393                          * e.g. Blavatar.
    394434                         *
    395435                         * @since 2.3.0
    396436                         *
  • src/bp-core/classes/class-bp-attachment-cover-image.php

    diff --git src/bp-core/classes/class-bp-attachment-cover-image.php src/bp-core/classes/class-bp-attachment-cover-image.php
    index 1feb3a4..e9a5366 100644
    class BP_Attachment_Cover_Image extends BP_Attachment { 
    111111                        $object_directory = 'groups';
    112112                }
    113113
     114                if ( bp_is_site() ) {
     115                        $object_id = bp_blogs_get_current_site_id();
     116                        $object_directory = 'blogs';
     117                }
     118
    114119                // Set the subdir.
    115120                $subdir  = '/' . $object_directory . '/' . $object_id . '/cover-image';
    116121
    class BP_Attachment_Cover_Image extends BP_Attachment { 
    225230        public function script_data() {
    226231                // Get default script data.
    227232                $script_data = parent::script_data();
     233                $nonce       = wp_create_nonce( 'bp_delete_cover_image' );
    228234
    229235                if ( bp_is_user() ) {
    230236                        $item_id = bp_displayed_user_id();
    class BP_Attachment_Cover_Image extends BP_Attachment { 
    234240                                'item_id'         => $item_id,
    235241                                'has_cover_image' => bp_attachments_get_user_has_cover_image( $item_id ),
    236242                                'nonces'  => array(
    237                                         'remove' => wp_create_nonce( 'bp_delete_cover_image' ),
     243                                        'remove' => $nonce,
    238244                                ),
    239245                        );
    240246
    class BP_Attachment_Cover_Image extends BP_Attachment { 
    252258                                'item_id'         => bp_get_current_group_id(),
    253259                                'has_cover_image' => bp_attachments_get_group_has_cover_image( $item_id ),
    254260                                'nonces'  => array(
    255                                         'remove' => wp_create_nonce( 'bp_delete_cover_image' ),
     261                                        'remove' => $nonce,
    256262                                ),
    257263                        );
    258264
    class BP_Attachment_Cover_Image extends BP_Attachment { 
    262268                                2 => __( 'There was a problem deleting the group cover image. Please try again.', 'buddypress' ),
    263269                                3 => __( 'The group cover image was deleted successfully!', 'buddypress' ),
    264270                        );
     271                } elseif ( bp_is_site() ) {
     272                        $item_id = bp_blogs_get_current_site_id();
     273
     274                        $script_data['bp_params'] = array(
     275                                'object'          => 'blog',
     276                                'item_id'         => $item_id,
     277                                'has_cover_image' => bp_attachments_get_site_has_cover_image( $item_id ),
     278                                'nonces'  => array(
     279                                        'remove' => $nonce,
     280                                ),
     281                        );
     282
     283                        // Set feedback messages.
     284                        $script_data['feedback_messages'] = array(
     285                                1 => __( 'The site cover image was uploaded successfully.', 'buddypress' ),
     286                                2 => __( 'There was a problem deleting the site cover image. Please try again.', 'buddypress' ),
     287                                3 => __( 'The site cover image was deleted successfully!', 'buddypress' ),
     288                        );
    265289                } else {
    266290
    267291                        /**
  • src/bp-members/bp-members-functions.php

    diff --git src/bp-members/bp-members-functions.php src/bp-members/bp-members-functions.php
    index 8ee5a6d..69ce650 100644
    function bp_core_process_spammer_status( $user_id, $status, $do_wp_cleanup = tru 
    820820
    821821        // Force the cleanup of WordPress content and status for multisite configs.
    822822        if ( $do_wp_cleanup ) {
     823                /**
     824                 * Only filter `get_blogs_of_user` if the site's feature is active,
     825                 * subscriptions are enbaled and user is been marked as spam.
     826                 * When user is marked as ham, as the association were deleted, we need
     827                 * to let WordPress give it for us.
     828                 */
     829                $do_wp_filters = is_multisite() && bp_is_active( 'blogs', 'site' ) && ! bp_disable_site_subscriptions() && $is_spam;
     830
     831                if ( $do_wp_filters ) {
     832                        bp_blogs_get_blogs_of_user_add_filters();
     833                }
    823834
    824835                // Get the blogs for the user.
    825836                $blogs = get_blogs_of_user( $user_id, true );
    826837
     838                if ( $do_wp_filters ) {
     839                        bp_blogs_get_blogs_of_user_remove_filters();
     840                }
     841
    827842                foreach ( (array) array_values( $blogs ) as $details ) {
    828843
    829844                        // Do not mark the main or current root blog as spam.
    function bp_core_activate_signup( $key ) { 
    19551970
    19561971                $user_id = $user['user_id'];
    19571972
     1973                /**
     1974                 * If the user registered with a site and Profile photos are enabled
     1975                 * save a transient so that the user once loggedin will be redirected
     1976                 * to the edit-avatar manage screen of his site
     1977                 */
     1978                if ( ! empty( $user['blog_id'] ) && bp_is_active( 'blogs', 'site' ) ) {
     1979                        // Taking no risk
     1980                        if ( bp_blogs_is_site_avatar_uploads_enabled() ) {
     1981                                $transient_key = sprintf( '_bp_activation_%d_redirect', $user_id );
     1982
     1983                                // Five minutes should be ok.
     1984                                set_transient( $transient_key, intval( $user['blog_id'] ), 300 );
     1985                        }
     1986                }
     1987
    19581988        } else {
    19591989                $signups = BP_Signup::get( array(
    19601990                        'activation_key' => $key,
  • src/bp-templates/bp-legacy/buddypress-functions.php

    diff --git src/bp-templates/bp-legacy/buddypress-functions.php src/bp-templates/bp-legacy/buddypress-functions.php
    index 703badd..c4ba506 100644
    function bp_legacy_theme_ajax_querystring( $query_string, $object ) { 
    687687                        $qs[] = 'user_id=' . $user_id;
    688688
    689689                // Blogs directory, list sites the user subscribed to
    690                 } elseif ( 'blogs' === $object && 'subscriptions' === $_BP_COOKIE['bp-' . $object . '-scope'] ) {
     690                } elseif ( 'blogs' === $object && 'subscriptions' === $_BP_COOKIE['bp-' . $object . '-scope'] && ! bp_is_user() ) {
    691691                        $qs[] = 'user_id=' . $user_id;
    692692                        $qs[] = 'is_contributor=0';
    693693                }
  • src/bp-templates/bp-legacy/buddypress/activity/index.php

    diff --git src/bp-templates/bp-legacy/buddypress/activity/index.php src/bp-templates/bp-legacy/buddypress/activity/index.php
    index fd433b1..8b37e81 100644
    do_action( 'bp_before_directory_activity' ); ?> 
    124124
    125125                                <?php endif; ?>
    126126
    127                                 <?php if ( bp_is_active( 'blogs' ) && bp_get_total_blog_count_for_user( bp_loggedin_user_id() ) ) : ?>
     127                                <?php if ( is_multisite() && bp_is_active( 'blogs' ) && bp_get_total_blog_count_for_user( bp_loggedin_user_id() ) ) : ?>
    128128
    129129                                        <li id="activity-blogs"><a href="<?php echo bp_loggedin_user_domain() . bp_get_activity_slug() . '/' . bp_get_blogs_slug() . '/'; ?>" title="<?php esc_attr_e( 'The activity of sites I contribute to.', 'buddypress' ); ?>"><?php printf( __( 'My Sites <span>%s</span>', 'buddypress' ), bp_get_total_blog_count_for_user( bp_loggedin_user_id() ) ); ?></a></li>
    130130
  • src/bp-templates/bp-legacy/buddypress/assets/_attachments/avatars/index.php

    diff --git src/bp-templates/bp-legacy/buddypress/assets/_attachments/avatars/index.php src/bp-templates/bp-legacy/buddypress/assets/_attachments/avatars/index.php
    index edd76fc..2bfd0a5 100644
    do_action( 'bp_attachments_avatar_check_template' ); 
    3232
    3333<?php bp_attachments_get_template_part( 'avatars/camera' ); ?>
    3434
     35<?php if ( bp_is_active( 'blogs', 'site' ) && bp_is_site() && bp_blogs_is_site_icon_enabled() ) :
     36
     37        bp_attachments_get_template_part( 'avatars/site-icon' );
     38
     39endif ; ?>
     40
    3541<script id="tmpl-bp-avatar-delete" type="text/html">
    3642        <# if ( 'user' === data.object ) { #>
    3743                <p><?php _e( "If you'd like to delete your current profile photo but not upload a new one, please use the delete profile photo button.", 'buddypress' ); ?></p>
    do_action( 'bp_attachments_avatar_check_template' ); 
    3945        <# } else if ( 'group' === data.object ) { #>
    4046                <p><?php _e( "If you'd like to remove the existing group profile photo but not upload a new one, please use the delete group profile photo button.", 'buddypress' ); ?></p>
    4147                <p><a class="button edit" id="bp-delete-avatar" href="#"><?php esc_html_e( 'Delete Group Profile Photo', 'buddypress' ); ?></a></p>
     48        <# } else if ( 'blog' === data.object ) { #>
     49                <p><?php _e( "If you'd like to remove the existing site profile photo but not upload a new one, please use the delete site profile photo button.", 'buddypress' ); ?></p>
     50                <p><a class="button edit" id="bp-delete-avatar" href="#"><?php esc_html_e( 'Delete Site Profile Photo', 'buddypress' ); ?></a></p>
    4251        <# } else { #>
    4352                <?php do_action( 'bp_attachments_avatar_delete_template' ); ?>
    4453        <# } #>
  • src/bp-templates/bp-legacy/buddypress/assets/_attachments/avatars/site-icon.php

    diff --git src/bp-templates/bp-legacy/buddypress/assets/_attachments/avatars/site-icon.php src/bp-templates/bp-legacy/buddypress/assets/_attachments/avatars/site-icon.php
    index e69de29..f12f417 100644
     
     1<?php
     2/**
     3 * BuddyPress Avatars site icon template.
     4 *
     5 * This template is used by the Blogs component to create the site icon Backbone views.
     6 *
     7 * @since 2.7.0
     8 *
     9 * @package BuddyPress
     10 * @subpackage bp-attachments
     11 */
     12
     13?>
     14
     15<script id="tmpl-bp-avatar-site-icon" type="text/html">
     16        <# if ( ! data.no_icon && ! data.in_use ) { #>
     17                <div class="avatar-crop-management">
     18                        <div id="avatar-crop-pane" class="avatar" style="max-width:{{data.max_dim}}px; max-height:{{data.max_dim}}px">
     19                                <img src="{{data.src}}" id="avatar-crop-preview"/>
     20                        </div>
     21                        <div id="avatar-crop-actions">
     22                                <a class="button avatar-crop-submit" href="#"><?php esc_html_e( 'Use Site Icon', 'buddypress' ); ?></a>
     23                        </div>
     24                </div>
     25        <# } #>
     26</script>
  • src/bp-templates/bp-legacy/buddypress/assets/_attachments/cover-images/index.php

    diff --git src/bp-templates/bp-legacy/buddypress/assets/_attachments/cover-images/index.php src/bp-templates/bp-legacy/buddypress/assets/_attachments/cover-images/index.php
    index 9bc18be..ddeb4a5 100644
     
    2828        <# } else if ( 'group' === data.object ) { #>
    2929                <p><?php _e( "If you'd like to remove the existing group cover image but not upload a new one, please use the delete group cover image button.", 'buddypress' ); ?></p>
    3030                <p><a class="button edit" id="bp-delete-cover-image" href="#"><?php esc_html_e( 'Delete Group Cover Image', 'buddypress' ); ?></a></p>
     31        <# } else if ( 'blog' === data.object ) { #>
     32                <p><?php _e( "If you'd like to remove the existing site cover image but not upload a new one, please use the delete site cover image button.", 'buddypress' ); ?></p>
     33                <p><a class="button edit" id="bp-delete-cover-image" href="#"><?php esc_html_e( 'Delete Site Cover Image', 'buddypress' ); ?></a></p>
    3134        <# } else { #>
    3235                <?php do_action( 'bp_attachments_cover_image_delete_template' ); ?>
    3336        <# } #>
  • src/bp-templates/bp-legacy/buddypress/blogs/blogs-loop.php

    diff --git src/bp-templates/bp-legacy/buddypress/blogs/blogs-loop.php src/bp-templates/bp-legacy/buddypress/blogs/blogs-loop.php
    index b1ff379..a411616 100644
    do_action( 'bp_before_blogs_loop' ); ?> 
    4343        <?php while ( bp_blogs() ) : bp_the_blog(); ?>
    4444
    4545                <li <?php bp_blog_class() ?>>
    46                         <div class="item-avatar">
    47                                 <a href="<?php bp_blog_permalink(); ?>"><?php bp_blog_avatar( 'type=thumb' ); ?></a>
    48                         </div>
     46                        <?php if ( ! bp_disable_site_avatar_uploads() ) : ?>
     47                                <div class="item-avatar">
     48                                        <a href="<?php bp_blog_permalink(); ?>"><?php bp_blog_avatar( 'type=thumb' ); ?></a>
     49                                </div>
     50                        <?php endif ; ?>
    4951
    5052                        <div class="item">
    5153                                <div class="item-title"><a href="<?php bp_blog_permalink(); ?>"><?php bp_blog_name(); ?></a></div>
  • src/bp-templates/bp-legacy/buddypress/blogs/single/cover-image-header.php

    diff --git src/bp-templates/bp-legacy/buddypress/blogs/single/cover-image-header.php src/bp-templates/bp-legacy/buddypress/blogs/single/cover-image-header.php
    index e69de29..f0a8171 100644
     
     1<?php
     2/**
     3 * BuddyPress - Sites Cover Image Header.
     4 *
     5 * @since  2.7.0
     6 *
     7 * @package BuddyPress
     8 * @subpackage bp-legacy
     9 */
     10
     11// Exit if accessed directly
     12defined( 'ABSPATH' ) or die; ?>
     13
     14<div id="cover-image-container">
     15        <a id="header-cover-image" href="<?php echo esc_url( bp_blogs_get_site_community_url() ); ?>"></a>
     16
     17        <div id="item-header-cover-image">
     18                <?php if ( ! bp_disable_group_avatar_uploads() ) : ?>
     19                        <div id="item-header-avatar">
     20                                <a href="<?php echo esc_url( bp_blogs_get_site_community_url() ); ?>" title="<?php echo esc_attr( bp_get_sitename() ); ?>">
     21
     22                                        <?php bp_site_avatar(); ?>
     23
     24                                </a>
     25                        </div><!-- #item-header-avatar -->
     26                <?php endif; ?>
     27
     28                <div id="item-header-content">
     29
     30                        <?php if ( bp_site_has_header_actions() ) : ?>
     31                                <div id="item-buttons">
     32
     33                                        <?php bp_site_header_actions() ;?>
     34
     35                                </div><!-- #item-buttons -->
     36                        <?php endif; ?>
     37
     38                        <div id="item-meta">
     39
     40                                <?php bp_site_description(); ?>
     41
     42                        </div>
     43                </div><!-- #item-header-content -->
     44
     45                <div id="item-actions">
     46
     47                        <?php if ( bp_site_has_access() ) :
     48
     49                                bp_site_list_admins();
     50
     51                        endif; ?>
     52
     53                </div><!-- #item-actions -->
     54
     55        </div><!-- #item-header-cover-image -->
     56</div><!-- #cover-image-container -->
     57
     58<?php
     59
     60/** This action is documented in bp-templates/bp-legacy/buddypress/activity/index.php */
     61do_action( 'template_notices' ); ?>
  • src/bp-templates/bp-legacy/buddypress/blogs/single/home.php

    diff --git src/bp-templates/bp-legacy/buddypress/blogs/single/home.php src/bp-templates/bp-legacy/buddypress/blogs/single/home.php
    index c72e2f6..bc8232d 100644
    defined( 'ABSPATH' ) or die; ?> 
    1515
    1616        <div id="item-header" role="complementary">
    1717
    18                 <?php bp_get_template_part( 'blogs/single/site-header' ); ?>
     18                <?php if ( bp_site_use_cover_image_header() ) :
     19
     20                        bp_get_template_part( 'blogs/single/cover-image-header' );
     21
     22                else :
     23
     24                bp_get_template_part( 'blogs/single/site-header' );
     25
     26                endif; ?>
    1927
    2028        </div><!-- #item-header -->
    2129
  • src/bp-templates/bp-legacy/buddypress/blogs/single/manage.php

    diff --git src/bp-templates/bp-legacy/buddypress/blogs/single/manage.php src/bp-templates/bp-legacy/buddypress/blogs/single/manage.php
    index ec83266..6b44e1e 100644
    defined( 'ABSPATH' ) or die; ?> 
    2020</div>
    2121
    2222<?php switch ( bp_site_get_manage_action() ) :
    23         case 'settings'  :
     23        case 'settings'         :
    2424                bp_get_template_part( 'blogs/single/manage/settings' );
    2525                break;
    26         case 'members'   :
     26        case 'members'          :
    2727                bp_get_template_part( 'blogs/single/members' );
    2828                break;
     29        case 'edit-avatar'      :
     30                bp_get_template_part( 'blogs/single/manage/edit-avatar' );
     31                break;
     32        case 'edit-cover-image' :
     33                bp_get_template_part( 'blogs/single/manage/edit-cover-image' );
     34                break;
    2935        default:
    3036                bp_get_template_part( 'blogs/single/plugins' );
    3137                break;
  • src/bp-templates/bp-legacy/buddypress/blogs/single/manage/edit-avatar.php

    diff --git src/bp-templates/bp-legacy/buddypress/blogs/single/manage/edit-avatar.php src/bp-templates/bp-legacy/buddypress/blogs/single/manage/edit-avatar.php
    index 56ee23c..b5ae670 100644
     
    1010
    1111// Exit if accessed directly
    1212defined( 'ABSPATH' ) or die; ?>
     13
     14<p><?php esc_html_e( "Upload an image to use as a the profile photo for this site. The image will be shown on the site&#39;s community page, and in search results.", 'buddypress' ); ?></p>
     15
     16<?php bp_avatar_get_templates(); ?>
  • src/bp-templates/bp-legacy/buddypress/blogs/single/manage/edit-cover-image.php

    diff --git src/bp-templates/bp-legacy/buddypress/blogs/single/manage/edit-cover-image.php src/bp-templates/bp-legacy/buddypress/blogs/single/manage/edit-cover-image.php
    index a77fc01..792ee65 100644
     
    99 */
    1010
    1111// Exit if accessed directly
    12 defined( 'ABSPATH' ) or die; ?>
    13  No newline at end of file
     12defined( 'ABSPATH' ) or die; ?>
     13
     14<p><?php _e( 'The Cover Image will be used to customize the header of your site\'s community pages.', 'buddypress' ); ?></p>
     15
     16<?php bp_attachments_get_template_part( 'cover-images/index' ); ?>
  • src/bp-templates/bp-legacy/buddypress/blogs/single/site-header.php

    diff --git src/bp-templates/bp-legacy/buddypress/blogs/single/site-header.php src/bp-templates/bp-legacy/buddypress/blogs/single/site-header.php
    index ae99210..e1a7de1 100644
    defined( 'ABSPATH' ) or die; ?> 
    1313
    1414<div id="item-actions">
    1515
    16         <?php if ( bp_site_has_access() ) : ?>
     16        <?php if ( bp_site_has_access() ) :
    1717
    18                 <?php bp_site_list_admins();
     18                bp_site_list_admins();
    1919
    2020        endif; ?>
    2121
  • src/bp-templates/bp-legacy/buddypress/members/single/blogs/site-tabs.php

    diff --git src/bp-templates/bp-legacy/buddypress/members/single/blogs/site-tabs.php src/bp-templates/bp-legacy/buddypress/members/single/blogs/site-tabs.php
    index 6d24476..22c803c 100644
     
    99 */
    1010
    1111// Exit if accessed directly
    12 defined( 'ABSPATH' ) or die; ?>
     12defined( 'ABSPATH' ) or die;
     13
     14if ( ! bp_is_active( 'blogs', 'site' ) || bp_disable_site_subscriptions() ) {
     15        return;
     16}
     17?>
    1318
    1419<div class="item-list-tabs no-ajax" id="subsubnav" role="navigation">
    1520        <ul>
  • tests/phpunit/testcases/blogs/site.php

    diff --git tests/phpunit/testcases/blogs/site.php tests/phpunit/testcases/blogs/site.php
    index 9b36b4f..2de1585 100644
    class BP_Tests_Blogs_Site_TestCases extends BP_UnitTestCase { 
    3636
    3737                $this->set_current_user( $this->current_user );
    3838
    39                 /**
    40                  * Workaround till #7150 is fixed
    41                  *
    42                  * @see https://buddypress.trac.wordpress.org/ticket/7150
    43                  */
    44                 $bp_pages = array_keys( bp_get_option( 'bp-pages' ) );
    45                 if ( ! isset( $bp_pages['blogs'] ) && bp_is_active( 'blogs' ) ) {
    46                         bp_core_add_root_component( 'blogs' );
    47                         bp_core_create_root_component_page();
    48                 }
    49 
    5039                add_action( 'bp_init', array( $this, 'set_early_setting' ) );
    5140                add_action( 'bp_blogs_setup_site_globals', array( $this, 'set_site_settings' ) );
    5241        }
    class BP_Tests_Blogs_Site_TestCases extends BP_UnitTestCase { 
    145134        /**
    146135         * @group subscriptions
    147136         */
    148         public function test_bp_blogs_site_subscribe() {
     137        public function test_bp_blogs_site_subscribe_not_public() {
    149138                $bp = buddypress();
    150139
    151140                $u = $this->factory->user->create();
    class BP_Tests_Blogs_Site_TestCases extends BP_UnitTestCase { 
    153142                // Trying to subscribe to a private site
    154143                $result = bp_blogs_site_subscribe( $u, 'tazfoo' );
    155144                $this->assertTrue( 'error' === $result['type'] );
     145        }
     146
     147        /**
     148         * @group subscriptions
     149         */
     150        public function test_bp_blogs_site_subscribe_globally_disabled() {
     151                $bp = buddypress();
     152
     153                $u = $this->factory->user->create();
    156154
    157155                // Trying to subscribe to a site when subscription are disabled
    158156                add_filter( 'bp_disable_site_subscriptions', '__return_true' );
    class BP_Tests_Blogs_Site_TestCases extends BP_UnitTestCase { 
    161159                $this->assertTrue( 'error' === $result['type'] );
    162160
    163161                remove_filter( 'bp_disable_site_subscriptions', '__return_true' );
     162        }
     163
     164        /**
     165         * @group subscriptions
     166         */
     167        public function test_bp_blogs_site_subscribe_site_disabled() {
     168                $bp = buddypress();
     169
     170                $u = $this->factory->user->create();
    164171
    165172                // Trying to subscribe to a site when it disabled subscriptions
    166173                bp_blogs_update_blogmeta( $this->sites['bar']['id'], 'disallow_subscriptions', 1 );
    class BP_Tests_Blogs_Site_TestCases extends BP_UnitTestCase { 
    169176                $this->assertTrue( 'error' === $result['type'] );
    170177
    171178                bp_blogs_delete_blogmeta( $this->sites['bar']['id'], 'disallow_subscriptions' );
     179        }
     180
     181        /**
     182         * @group subscriptions
     183         */
     184        public function test_bp_blogs_site_subscribe() {
     185                $bp = buddypress();
     186
     187                $u = $this->factory->user->create();
    172188
    173189                // Finally subscribe to foobar!
    174190                $result = bp_blogs_site_subscribe( $u, 'foobar' );
    class BP_Tests_Blogs_Site_TestCases extends BP_UnitTestCase { 
    202218                $user_blogs = BP_Blogs_Blog::get_user_blog( $u, $this->sites['bar']['id'] );
    203219                $this->assertEmpty( $user_blogs );
    204220        }
     221
     222        /**
     223         * @group site_cache
     224         */
     225        public function test_bp_blogs_update_site_caches() {
     226                $site = bp_blogs_get_site( $this->sites['foo']['id'] );
     227
     228                $site_id = wp_cache_get( 'foobar', 'bp_site_slugs' );
     229                $this->assertEquals( $site->blog_id, $site_id );
     230
     231                $this->assertEquals( $site, wp_cache_get( $site_id, 'bp_site' ) );
     232        }
     233
     234        /**
     235         * @group site_cache
     236         */
     237        public function test_bp_blogs_clean_site_caches() {
     238                $bp = buddypress();
     239
     240                $site = bp_blogs_get_site( $this->sites['bar']['id'] );
     241
     242                update_blog_details( $this->sites['bar']['id'], array( 'public' => 0 ) );
     243
     244                $this->assertEmpty( wp_cache_get( $this->sites['bar']['id'], 'bp_site' ) );
     245                $this->assertEmpty( wp_cache_get( 'barfoo', 'bp_site_slugs' ) );
     246        }
     247
     248        /**
     249         * @group site_cache
     250         */
     251        public function test_bp_blogs_meta_edit_clean_caches() {
     252                $site = bp_blogs_get_site( $this->sites['bar']['id'] );
     253                bp_blogs_delete_blogmeta( $this->sites['bar']['id'], 'description' );
     254                $site = bp_blogs_get_site( $this->sites['bar']['id'] );
     255
     256                $this->assertEmpty( $site->description );
     257        }
     258
     259        /**
     260         * @group site_cache
     261         */
     262        public function test_bp_blogs_user_sites_clean_caches_subscriber() {
     263                $u = $this->factory->user->create();
     264
     265                add_user_to_blog( $this->sites['bar']['id'], $u, 'subscriber' );
     266
     267                $site = bp_blogs_get_site( $this->sites['bar']['id'] );
     268                $this->assertTrue( 2 === $site->total_users );
     269
     270                bp_core_process_spammer_status( $u, 'spam' );
     271
     272                $site = bp_blogs_get_site( $this->sites['bar']['id'] );
     273                $this->assertFalse( 2 === $site->total_users, 'When a user is marked as spam, total users count should be updated.' );
     274        }
     275
     276        /**
     277         * @group site_cache
     278         */
     279        public function test_bp_blogs_user_sites_clean_caches_contributor() {
     280                $u = $this->factory->user->create();
     281
     282                add_user_to_blog( $this->sites['foo']['id'], $u, 'contributor' );
     283
     284                bp_core_process_spammer_status( $u, 'spam' );
     285
     286                $site = bp_blogs_get_site( $this->sites['foo']['id'] );
     287                $this->assertFalse( $site );
     288
     289                bp_core_process_spammer_status( $u, 'ham' );
     290
     291                $site = bp_blogs_get_site( $this->sites['foo']['id'] );
     292                $this->assertTrue( 2 === $site->total_users, 'When a user is marked as ham, user association should be reset.' );
     293        }
     294
     295        /**
     296         * @group site_cache
     297         */
     298        public function test_bp_blogs_subscription_site_clean_caches() {
     299                $u = $this->factory->user->create();
     300
     301                $site  = bp_blogs_get_site( $this->sites['bar']['id'] );
     302                $total = $site->total_users;
     303                bp_blogs_site_subscribe( $u, 'barfoo' );
     304
     305                $site = bp_blogs_get_site( $this->sites['bar']['id'] );
     306                $this->assertEquals( $total + 1, $site->total_users );
     307
     308                add_user_to_blog( $this->sites['foo']['id'], $u, 'subscriber' );
     309
     310                $site = bp_blogs_get_site( $this->sites['foo']['id'] );
     311                $total = $site->total_users;
     312                bp_blogs_site_unsubscribe( $u, 'foobar' );
     313
     314                $site = bp_blogs_get_site( $this->sites['foo']['id'] );
     315                $this->assertEquals( $total - 1, $site->total_users );
     316        }
     317
     318        /**
     319         * @group site_cache
     320         */
     321        public function test_bp_blogs_user_promoted_sites_clean_caches() {
     322                $u = $this->factory->user->create();
     323
     324                bp_blogs_site_subscribe( $u, 'barfoo' );
     325                $site = bp_blogs_get_site( $this->sites['bar']['id'] );
     326
     327                switch_to_blog( $this->sites['bar']['id'] );
     328
     329                $user = new WP_User( $u );
     330                $user->set_role( 'administrator' );
     331
     332                restore_current_blog();
     333
     334                $site = bp_blogs_get_site( $this->sites['bar']['id'] );
     335
     336                $this->assertTrue( in_array( $u , $site->site_admins ) );
     337        }
    205338}