Skip to:
Content

BuddyPress.org

Ticket #8156: 8156.3.patch

File 8156.3.patch, 69.2 KB (added by imath, 6 months ago)
  • 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 2bab95e9e..cf8d43468 100644
    function bp_admin_sanitize_callback_blogforum_comments( $value = false ) { 
    147147        return $value ? 0 : 1;
    148148}
    149149
    150 /** XProfile ******************************************************************/
     150/** Members *******************************************************************/
    151151
    152152/**
    153153 * Profile settings section description for the settings page.
    154154 *
    155155 * @since 1.6.0
    156156 */
    157 function bp_admin_setting_callback_xprofile_section() { }
    158 
    159 /**
    160  * Enable BP->WP profile syncing field.
    161  *
    162  * @since 1.6.0
    163  *
    164  */
    165 function bp_admin_setting_callback_profile_sync() {
    166 ?>
    167 
    168         <input id="bp-disable-profile-sync" name="bp-disable-profile-sync" type="checkbox" value="1" <?php checked( !bp_disable_profile_sync( false ) ); ?> />
    169         <label for="bp-disable-profile-sync"><?php _e( 'Enable BuddyPress to WordPress profile syncing', 'buddypress' ); ?></label>
    170 
    171 <?php
    172 }
     157function bp_admin_setting_callback_members_section() { }
    173158
    174159/**
    175160 * Allow members to upload avatars field.
    176161 *
    177162 * @since 1.6.0
    178  *
     163 * @since 6.0.0 Setting has been moved into the Members section.
    179164 */
    180165function bp_admin_setting_callback_avatar_uploads() {
    181166?>
    182 
    183167        <input id="bp-disable-avatar-uploads" name="bp-disable-avatar-uploads" type="checkbox" value="1" <?php checked( !bp_disable_avatar_uploads( false ) ); ?> />
    184168        <label for="bp-disable-avatar-uploads"><?php _e( 'Allow registered members to upload avatars', 'buddypress' ); ?></label>
    185 
    186169<?php
    187170}
    188171
    function bp_admin_setting_callback_avatar_uploads() { 
    190173 * Allow members to upload cover images field.
    191174 *
    192175 * @since 2.4.0
     176 * @since 6.0.0 Setting has been moved into the Members section.
    193177 */
    194178function bp_admin_setting_callback_cover_image_uploads() {
    195179?>
    function bp_admin_setting_callback_cover_image_uploads() { 
    198182<?php
    199183}
    200184
     185/** XProfile ******************************************************************/
     186
     187/**
     188 * Profile settings section description for the settings page.
     189 *
     190 * @since 1.6.0
     191 */
     192function bp_admin_setting_callback_xprofile_section() { }
     193
     194/**
     195 * Enable BP->WP profile syncing field.
     196 *
     197 * @since 1.6.0
     198 *
     199 */
     200function bp_admin_setting_callback_profile_sync() {
     201?>
     202
     203        <input id="bp-disable-profile-sync" name="bp-disable-profile-sync" type="checkbox" value="1" <?php checked( !bp_disable_profile_sync( false ) ); ?> />
     204        <label for="bp-disable-profile-sync"><?php _e( 'Enable BuddyPress to WordPress profile syncing', 'buddypress' ); ?></label>
     205
     206<?php
     207}
     208
    201209/** Groups Section ************************************************************/
    202210
    203211/**
  • src/bp-core/bp-core-attachments.php

    diff --git src/bp-core/bp-core-attachments.php src/bp-core/bp-core-attachments.php
    index bcdd0b675..a18de0a04 100644
     
    1010// Exit if accessed directly.
    1111defined( 'ABSPATH' ) || exit;
    1212
    13 /**
    14  * Check if the current WordPress version is using Plupload 2.1.1
    15  *
    16  * Plupload 2.1.1 was introduced in WordPress 3.9. Our bp-plupload.js
    17  * script requires it. So we need to make sure the current WordPress
    18  * match with our needs.
    19  *
    20  * @since 2.3.0
    21  * @since 3.0.0 This is always true.
    22  *
    23  * @return bool Always true.
    24  */
    25 function bp_attachments_is_wp_version_supported() {
    26         return true;
    27 }
    28 
    2913/**
    3014 * Get the Attachments Uploads dir data.
    3115 *
    function bp_attachments_uploads_dir_get( $data = '' ) { 
    9276 * @return array See wp_upload_dir().
    9377 */
    9478function bp_attachments_cover_image_upload_dir( $args = array() ) {
    95         // Default values are for profiles.
     79        // Default values are for members.
    9680        $object_id = bp_displayed_user_id();
    9781
    9882        if ( empty( $object_id ) ) {
    function bp_attachments_check_filetype( $file, $filename, $allowed_mimes ) { 
    288272 * @param array  $args {
    289273 *     @type int    $item_id   The ID of the object (Required). Default: 0.
    290274 *     @type string $object    The object type (eg: group, user, blog) (Required). Default: 'user'.
    291  *     @type string $component The component for the object (eg: groups, xprofile, blogs). Default: ''.
     275 *     @type string $component The component for the object (eg: groups, members, blogs). Default: ''.
    292276 *     @type string $image     The absolute path to the image (Required). Default: ''.
    293277 *     @type int    $crop_w    Crop width. Default: 0.
    294278 *     @type int    $crop_h    Crop height. Default: 0.
    function bp_attachments_create_item_type( $type = 'avatar', $args = array() ) { 
    325309        // Set the component if not already done.
    326310        if ( empty( $r['component'] ) ) {
    327311                if ( 'user' === $r['object'] ) {
    328                         $r['component'] = 'xprofile';
     312                        $r['component'] = 'members';
    329313                } else {
    330314                        $r['component'] = $r['object'] . 's';
    331315                }
    function bp_attachments_create_item_type( $type = 'avatar', $args = array() ) { 
    357341                if ( is_callable( $r['component'] . '_avatar_upload_dir' ) ) {
    358342                        $dir_args = array( $r['item_id'] );
    359343
    360                         // In case  of xprofile, we need an extra argument.
    361                         if ( 'xprofile' === $r['component'] ) {
     344                        // In case  of members, we need an extra argument.
     345                        if ( 'members' === $r['component'] ) {
    362346                                $dir_args = array( false, $r['item_id'] );
    363347                        }
    364348
    function bp_attachments_create_item_type( $type = 'avatar', $args = array() ) { 
    375359                // Default to members for xProfile.
    376360                $object_subdir = 'members';
    377361
    378                 if ( 'xprofile' !== $r['component'] ) {
     362                if ( 'members' !== $r['component'] ) {
    379363                        $object_subdir = sanitize_key( $r['component'] );
    380364                }
    381365
    function bp_attachments_get_plupload_default_settings() { 
    645629 * @return array Plupload default localization strings.
    646630 */
    647631function bp_attachments_get_plupload_l10n() {
    648         // Localization strings.
    649         return apply_filters( 'bp_attachments_get_plupload_l10n', array(
     632        /**
     633         * Use this filter to edit localization strings.
     634         *
     635         * @since 2.3.0
     636         *
     637         * @param array $value An associative array of the localization strings.
     638         */
     639        return apply_filters(
     640                'bp_attachments_get_plupload_l10n',
     641                array(
    650642                        'queue_limit_exceeded'      => __( 'You have attempted to queue too many files.', 'buddypress' ),
    651643                        'file_exceeds_size_limit'   => __( '%s exceeds the maximum upload size for this site.', 'buddypress' ),
    652644                        'zero_byte_file'            => __( 'This file is empty. Please try another.', 'buddypress' ),
    function bp_attachments_get_plupload_l10n() { 
    670662                        'unique_file_warning'       => __( 'Make sure to upload a unique file', 'buddypress' ),
    671663                        'error_uploading'           => __( '&#8220;%s&#8221; has failed to upload.', 'buddypress' ),
    672664                        'has_avatar_warning'        => __( 'If you&#39;d like to delete the existing profile photo but not upload a new one, please use the delete tab.', 'buddypress' )
    673         ) );
     665                )
     666        );
    674667}
    675668
    676669/**
    function bp_attachments_enqueue_scripts( $class = '' ) { 
    819812                // Cover images only need 1 file and 1 only!
    820813                $defaults['multi_selection'] = false;
    821814
    822                 // Default cover component is xprofile.
    823                 $cover_component = 'xprofile';
     815                // Default cover component is members.
     816                $cover_component = 'members';
    824817
    825818                // Get the object we're editing the cover image of.
    826819                $object = $defaults['multipart_params']['bp_params']['object'];
    function bp_attachments_current_user_can( $capability, $args = array() ) { 
    914907                                        $can = (bool) groups_is_user_admin( bp_loggedin_user_id(), $args['item_id'] ) || bp_current_user_can( 'bp_moderate' );
    915908                                }
    916909                        // User profile photo.
    917                         } elseif ( bp_is_active( 'xprofile' ) && 'user' === $args['object'] ) {
     910                        } elseif ( bp_is_active( 'members' ) && 'user' === $args['object'] ) {
    918911                                $can = bp_loggedin_user_id() === (int) $args['item_id'] || bp_current_user_can( 'bp_moderate' );
    919912                        }
    920913                /**
    function bp_attachments_get_template_part( $slug ) { 
    1003996 *
    1004997 * @since 2.4.0
    1005998 *
    1006  * @param string $component The component to get the settings for ("xprofile" for user or "groups").
     999 * @param string $component The component to get the settings for ("members" for user or "groups").
    10071000 * @return false|array The cover image settings in array, false on failure.
    10081001 */
    1009 function bp_attachments_get_cover_image_settings( $component = 'xprofile' ) {
     1002function bp_attachments_get_cover_image_settings( $component = 'members' ) {
    10101003        // Default parameters.
    10111004        $args = array();
    10121005
    function bp_attachments_get_cover_image_settings( $component = 'xprofile' ) { 
    10171010                $args = (array) $cover_image;
    10181011        }
    10191012
     1013        // Set default args.
     1014        $default_args = wp_parse_args(
     1015                $args,
     1016                array(
     1017                        'components'    => array(),
     1018                        'width'         => 1300,
     1019                        'height'        => 225,
     1020                        'callback'      => '',
     1021                        'theme_handle'  => '',
     1022                        'default_cover' => '',
     1023                )
     1024        );
     1025
     1026        // Handle deprecated xProfile fitler.
     1027        if ( 'members' === $component ) {
     1028                /** This filter is documented in wp-includes/deprecated.php */
     1029                $args = apply_filters_deprecated( 'bp_before_xprofile_cover_image_settings_parse_args', array( $default_args ), '6.0.0', 'bp_before_members_cover_image_settings_parse_args' );
     1030        }
     1031
    10201032        /**
    10211033         * Then let people override/set the feature using this dynamic filter
    10221034         *
    10231035         * Eg: for the user's profile cover image use:
    1024          * add_filter( 'bp_before_xprofile_cover_image_settings_parse_args', 'your_filter', 10, 1 );
     1036         * add_filter( 'bp_before_members_cover_image_settings_parse_args', 'your_filter', 10, 1 );
    10251037         *
    10261038         * @since 2.4.0
    10271039         *
    10281040         * @param array $settings The cover image settings
    10291041         */
    1030         $settings = bp_parse_args( $args, array(
    1031                 'components'    => array(),
    1032                 'width'         => 1300,
    1033                 'height'        => 225,
    1034                 'callback'      => '',
    1035                 'theme_handle'  => '',
    1036                 'default_cover' => '',
    1037         ), $component . '_cover_image_settings' );
     1042        $settings = bp_parse_args( $args, $default_args, $component . '_cover_image_settings' );
     1043
     1044        // Handle deprecated xProfile fitler.
     1045        if ( 'members' === $component ) {
     1046                /** This filter is documented in wp-includes/deprecated.php */
     1047                $settings = apply_filters_deprecated( 'bp_after_xprofile_cover_image_settings_parse_args', array( $settings ), '6.0.0', 'bp_after_members_cover_image_settings_parse_args' );
     1048        }
    10381049
    10391050        if ( empty( $settings['components'] ) || empty( $settings['callback'] ) || empty( $settings['theme_handle'] ) ) {
    10401051                return false;
    function bp_attachments_get_cover_image_settings( $component = 'xprofile' ) { 
    10541065 *
    10551066 * @since 2.4.0
    10561067 *
    1057  * @param string $component The BuddyPress component concerned ("xprofile" for user or "groups").
     1068 * @param string $component The BuddyPress component concerned ("members" for user or "groups").
    10581069 * @return array|bool An associative array containing the advised width and height for the cover image. False if settings are empty.
    10591070 */
    1060 function bp_attachments_get_cover_image_dimensions( $component = 'xprofile' ) {
     1071function bp_attachments_get_cover_image_dimensions( $component = 'members' ) {
    10611072        // Let's prevent notices when setting the warning strings.
    10621073        $default = array( 'width' => 0, 'height' => 0 );
    10631074
    function bp_attachments_cover_image_is_edit() { 
    10931104        $retval = false;
    10941105
    10951106        $current_component = bp_current_component();
    1096         if ( bp_is_active( 'xprofile' ) && bp_is_current_component( 'xprofile' ) ) {
    1097                 $current_component = 'xprofile';
     1107        if ( bp_is_user() ) {
     1108                $current_component = 'members';
    10981109        }
    10991110
    11001111        if ( ! bp_is_active( $current_component, 'cover_image' ) ) {
    function bp_attachments_get_group_has_cover_image( $group_id = 0 ) { 
    11611172 *
    11621173 * @param array                          $args {
    11631174 *     @type string $file            The absolute path to the image. Required.
    1164  *     @type string $component       The component for the object (eg: groups, xprofile). Required.
     1175 *     @type string $component       The component for the object (eg: groups, members). Required.
    11651176 *     @type string $cover_image_dir The Cover image dir to write the image into. Required.
    11661177 * }
    11671178 * @param BP_Attachment_Cover_Image|null $cover_image_class The class to use to fit the cover image.
    function bp_attachments_cover_image_ajax_upload() { 
    12821293
    12831294        // Member's cover image.
    12841295        if ( 'user' === $bp_params['object'] ) {
    1285                 $object_data = array( 'dir' => 'members', 'component' => 'xprofile' );
     1296                $object_data = array( 'dir' => 'members', 'component' => 'members' );
    12861297
    12871298                if ( ! bp_displayed_user_id() && ! empty( $bp_params['item_id'] ) ) {
    12881299                        $needs_reset = array( 'key' => 'displayed_user', 'value' => $bp->displayed_user );
    function bp_attachments_cover_image_ajax_upload() { 
    13991410        }
    14001411
    14011412        // Set the name of the file.
    1402         $name = $_FILES['file']['name'];
     1413        $name       = $_FILES['file']['name'];
    14031414        $name_parts = pathinfo( $name );
    1404         $name = trim( substr( $name, 0, - ( 1 + strlen( $name_parts['extension'] ) ) ) );
     1415        $name       = trim( substr( $name, 0, - ( 1 + strlen( $name_parts['extension'] ) ) ) );
     1416
     1417        // Set some arguments for filters.
     1418        $item_id   = (int) $bp_params['item_id'];
     1419        $component = $object_data['component'];
    14051420
    14061421        /**
    14071422         * Fires if the new cover image was successfully uploaded.
    14081423         *
    1409          * The dynamic portion of the hook will be xprofile in case of a user's
     1424         * The dynamic portion of the hook will be members in case of a user's
    14101425         * cover image, groups in case of a group's cover image. For instance:
    1411          * Use add_action( 'xprofile_cover_image_uploaded' ) to run your specific
     1426         * Use add_action( 'members_cover_image_uploaded' ) to run your specific
    14121427         * code once the user has set his cover image.
    14131428         *
    14141429         * @since 2.4.0
    function bp_attachments_cover_image_ajax_upload() { 
    14201435         * @param int    $feedback_code If value not 1, an error occured.
    14211436         */
    14221437        do_action(
    1423                 $object_data['component'] . '_cover_image_uploaded',
    1424                 (int) $bp_params['item_id'],
     1438                $component . '_cover_image_uploaded',
     1439                $item_id,
    14251440                $name,
    14261441                $cover_url,
    14271442                $feedback_code
    14281443        );
    14291444
     1445        // Handle deprecated xProfile action.
     1446        if ( 'members' === $component ) {
     1447                /** This filter is documented in wp-includes/deprecated.php */
     1448                do_action_deprecated(
     1449                        'xprofile_cover_image_uploaded',
     1450                        array(
     1451                                $item_id,
     1452                                $name,
     1453                                $cover_url,
     1454                                $feedback_code,
     1455                        ),
     1456                        '6.0.0',
     1457                        'members_cover_image_deleted'
     1458                );
     1459        }
     1460
    14301461        // Finally return the cover image url to the UI.
    14311462        bp_attachments_json_response( true, $is_html4, array(
    14321463                'name'          => $name,
    function bp_attachments_cover_image_ajax_delete() { 
    14661497
    14671498        // Set object for the user's case.
    14681499        if ( 'user' === $args['object'] ) {
    1469                 $component = 'xprofile';
     1500                $component = 'members';
    14701501                $dir       = 'members';
    14711502
    14721503        // Set it for any other cases.
    function bp_attachments_cover_image_ajax_delete() { 
    14771508
    14781509        // Handle delete.
    14791510        if ( bp_attachments_delete_file( array( 'item_id' => $args['item_id'], 'object_dir' => $dir, 'type' => 'cover-image' ) ) ) {
     1511                $item_id = (int) $args['item_id'];
     1512
    14801513                /**
    14811514                 * Fires if the cover image was successfully deleted.
    14821515                 *
    1483                  * The dynamic portion of the hook will be xprofile in case of a user's
     1516                 * The dynamic portion of the hook will be members in case of a user's
    14841517                 * cover image, groups in case of a group's cover image. For instance:
    1485                  * Use add_action( 'xprofile_cover_image_deleted' ) to run your specific
     1518                 * Use add_action( 'members_cover_image_deleted' ) to run your specific
    14861519                 * code once the user has deleted his cover image.
    14871520                 *
    14881521                 * @since 2.8.0
    14891522                 *
    14901523                 * @param int $item_id Inform about the item id the cover image was deleted for.
    14911524                 */
    1492                 do_action( "{$component}_cover_image_deleted", (int) $args['item_id'] );
     1525                do_action( "{$component}_cover_image_deleted", $item_id );
     1526
     1527                // Handle deprecated xProfile action.
     1528                if ( 'members' === $component ) {
     1529                        /** This filter is documented in wp-includes/deprecated.php */
     1530                        do_action_deprecated( 'xprofile_cover_image_deleted', array( $item_id ), '6.0.0', 'members_cover_image_deleted' );
     1531                }
    14931532
    14941533                $response = array(
    14951534                        'reset_url'     => '',
  • src/bp-core/bp-core-avatars.php

    diff --git src/bp-core/bp-core-avatars.php src/bp-core/bp-core-avatars.php
    index 12d52ae2b..29d62d720 100644
    function bp_avatar_ajax_upload() { 
    10051005        $bp_params['upload_dir_filter'] = '';
    10061006        $needs_reset = array();
    10071007
    1008         if ( 'user' === $bp_params['object'] && bp_is_active( 'xprofile' ) ) {
    1009                 $bp_params['upload_dir_filter'] = 'xprofile_avatar_upload_dir';
     1008        if ( 'user' === $bp_params['object'] && bp_is_active( 'members' ) ) {
     1009                $bp_params['upload_dir_filter'] = 'bp_members_avatar_upload_dir';
    10101010
    10111011                if ( ! bp_displayed_user_id() && ! empty( $bp_params['item_id'] ) ) {
    10121012                        $needs_reset = array( 'key' => 'displayed_user', 'value' => $bp->displayed_user );
    function bp_avatar_ajax_set() { 
    12971297                                'item_id'       => $avatar_data['item_id'],
    12981298                        );
    12991299
     1300                        /** This action is documented in wp-includes/deprecated.php */
     1301                        do_action_deprecated( 'xprofile_avatar_uploaded', array( (int) $avatar_data['item_id'], $avatar_data['type'], $avatar_data ), '6.0.0', 'bp_members_avatar_uploaded' );
     1302
    13001303                        /**
    13011304                         * Fires if the new avatar was successfully captured.
    13021305                         *
    1303                          * @since 1.1.0 Used to inform the avatar was successfully cropped
    1304                          * @since 2.3.4 Add two new parameters to inform about the user id and
    1305                          *              about the way the avatar was set (eg: 'crop' or 'camera')
    1306                          *              Move the action at the right place, once the avatar is set
    1307                          * @since 2.8.0 Added the `$avatar_data` parameter.
     1306                         * @since 6.0.0
    13081307                         *
    13091308                         * @param string $item_id     Inform about the user id the avatar was set for.
    13101309                         * @param string $type        Inform about the way the avatar was set ('camera').
    13111310                         * @param array  $avatar_data Array of parameters passed to the avatar handler.
    13121311                         */
    1313                         do_action( 'xprofile_avatar_uploaded', (int) $avatar_data['item_id'], $avatar_data['type'], $avatar_data );
     1312                        do_action( 'bp_members_avatar_uploaded', (int) $avatar_data['item_id'], $avatar_data['type'], $avatar_data );
    13141313
    13151314                        wp_send_json_success( $return );
    13161315                }
    function bp_avatar_ajax_set() { 
    13551354                );
    13561355
    13571356                if ( 'user' === $avatar_data['object'] ) {
     1357                        /** This action is documented in wp-includes/deprecated.php */
     1358                        do_action_deprecated( 'xprofile_avatar_uploaded', array( (int) $avatar_data['item_id'], $avatar_data['type'], $r ), '6.0.0', 'bp_members_avatar_uploaded' );
     1359
    13581360                        /** This action is documented in bp-core/bp-core-avatars.php */
    1359                         do_action( 'xprofile_avatar_uploaded', (int) $avatar_data['item_id'], $avatar_data['type'], $r );
     1361                        do_action( 'bp_members_avatar_uploaded', (int) $avatar_data['item_id'], $avatar_data['type'], $r );
    13601362                } elseif ( 'group' === $avatar_data['object'] ) {
    13611363                        /** This action is documented in bp-groups/bp-groups-screens.php */
    13621364                        do_action( 'groups_avatar_uploaded', (int) $avatar_data['item_id'], $avatar_data['type'], $r );
    add_action( 'bp_parse_query', 'bp_core_avatar_reset_query', 10, 1 ); 
    19361938function bp_avatar_is_front_edit() {
    19371939        $retval = false;
    19381940
    1939         // No need to carry on if the current WordPress version is not supported.
    1940         if ( ! bp_attachments_is_wp_version_supported() ) {
    1941                 return $retval;
    1942         }
    1943 
    19441941        if ( bp_is_user_change_avatar() && 'crop-image' !== bp_get_avatar_admin_step() ) {
    19451942                $retval = ! bp_core_get_root_option( 'bp-disable-avatar-uploads' );
    19461943        }
  • src/bp-core/bp-core-cssjs.php

    diff --git src/bp-core/bp-core-cssjs.php src/bp-core/bp-core-cssjs.php
    index de96cf465..5e5691f51 100644
    function bp_add_cover_image_inline_css( $return = false ) { 
    442442                }
    443443
    444444                $cover_image_object = array(
    445                         'component' => 'xprofile',
     445                        'component' => 'members',
    446446                        'object' => $bp->displayed_user
    447447                );
    448448        } elseif ( bp_is_group() ) {
    function bp_add_cover_image_inline_css( $return = false ) { 
    479479
    480480                $object_dir = $cover_image_object['component'];
    481481
    482                 if ( 'xprofile' === $object_dir ) {
     482                if ( 'members' === $object_dir ) {
    483483                        $object_dir = 'members';
    484484                }
    485485
  • 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 212b09a55..787c6b5b0 100644
    function bp_register_theme_compat_default_features() { 
    464464        bp_set_theme_compat_feature( 'legacy', array(
    465465                'name'     => 'cover_image',
    466466                'settings' => array(
    467                         'components'   => array( 'xprofile', 'groups' ),
     467                        'components'   => array( 'members', 'groups' ),
    468468                        'width'        => $bp_content_width,
    469469                        'height'       => $top_offset + round( $avatar_height / 2 ),
    470470                        '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 4f901dd85..e51b60ecb 100644
    class BP_Admin { 
    394394                add_settings_field( '_bp_theme_package_id', __( 'Template Pack', 'buddypress' ), 'bp_admin_setting_callback_theme_package_id', 'buddypress', 'bp_main', array( 'label_for' => '_bp_theme_package_id' ) );
    395395                register_setting( 'buddypress', '_bp_theme_package_id', 'sanitize_text_field' );
    396396
     397                /* Members Section  **************************************************/
     398
     399                // Add the main section.
     400                add_settings_section( 'bp_members', _x( 'Members Settings', 'BuddyPress setting tab', 'buddypress' ), 'bp_admin_setting_callback_members_section', 'buddypress' );
     401
     402                // Avatars.
     403                add_settings_field( 'bp-disable-avatar-uploads', __( 'Profile Photo Uploads', 'buddypress' ), 'bp_admin_setting_callback_avatar_uploads', 'buddypress', 'bp_members' );
     404                register_setting( 'buddypress', 'bp-disable-avatar-uploads', 'intval' );
     405
     406                // Cover images.
     407                if ( bp_is_active( 'members', 'cover_image' ) ) {
     408                        add_settings_field( 'bp-disable-cover-image-uploads', __( 'Cover Image Uploads', 'buddypress' ), 'bp_admin_setting_callback_cover_image_uploads', 'buddypress', 'bp_members' );
     409                        register_setting( 'buddypress', 'bp-disable-cover-image-uploads', 'intval' );
     410                }
     411
    397412                /* XProfile Section **************************************************/
    398413
    399414                if ( bp_is_active( 'xprofile' ) ) {
    class BP_Admin { 
    401416                        // Add the main section.
    402417                        add_settings_section( 'bp_xprofile', _x( 'Profile Settings', 'BuddyPress setting tab', 'buddypress' ), 'bp_admin_setting_callback_xprofile_section', 'buddypress' );
    403418
    404                         // Avatars.
    405                         add_settings_field( 'bp-disable-avatar-uploads', __( 'Profile Photo Uploads', 'buddypress' ), 'bp_admin_setting_callback_avatar_uploads', 'buddypress', 'bp_xprofile' );
    406                         register_setting( 'buddypress', 'bp-disable-avatar-uploads', 'intval' );
    407 
    408                         // Cover images.
    409                         if ( bp_is_active( 'xprofile', 'cover_image' ) ) {
    410                                 add_settings_field( 'bp-disable-cover-image-uploads', __( 'Cover Image Uploads', 'buddypress' ), 'bp_admin_setting_callback_cover_image_uploads', 'buddypress', 'bp_xprofile' );
    411                                 register_setting( 'buddypress', 'bp-disable-cover-image-uploads', 'intval' );
    412                         }
    413 
    414419                        // Profile sync setting.
    415420                        add_settings_field( 'bp-disable-profile-sync',   __( 'Profile Syncing',  'buddypress' ), 'bp_admin_setting_callback_profile_sync', 'buddypress', 'bp_xprofile' );
    416421                        register_setting  ( 'buddypress', 'bp-disable-profile-sync', 'intval' );
  • new file src/bp-core/deprecated/6.0.php

    diff --git src/bp-core/deprecated/6.0.php src/bp-core/deprecated/6.0.php
    new file mode 100644
    index 000000000..cf75d5b8e
    - +  
     1<?php
     2/**
     3 * Deprecated functions.
     4 *
     5 * @deprecated 6.0.0
     6 */
     7
     8// Exit if accessed directly.
     9defined( 'ABSPATH' ) || exit;
     10
     11/**
     12 * Check if the current WordPress version is using Plupload 2.1.1
     13 *
     14 * Plupload 2.1.1 was introduced in WordPress 3.9. Our bp-plupload.js
     15 * script requires it. So we need to make sure the current WordPress
     16 * match with our needs.
     17 *
     18 * @since 2.3.0
     19 * @since 3.0.0 This is always true.
     20 * @deprecated 6.0.0
     21 *
     22 * @return bool Always true.
     23 */
     24function bp_attachments_is_wp_version_supported() {
     25        _deprecated_function( __FUNCTION__, '6.0.0' );
     26        return true;
     27}
     28
     29/**
     30 * Setup the avatar upload directory for a user.
     31 *
     32 * @since 1.0.0
     33 * @deprecated 6.0.0
     34 *
     35 * @package BuddyPress Core
     36 *
     37 * @param string $directory The root directory name. Optional.
     38 * @param int    $user_id   The user ID. Optional.
     39 * @return array Array containing the path, URL, and other helpful settings.
     40 */
     41function xprofile_avatar_upload_dir( $directory = 'avatars', $user_id = 0 ) {
     42        _deprecated_function( __FUNCTION__, '6.0.0', 'bp_members_avatar_upload_dir()' );
     43
     44        $avatar_dir = bp_members_avatar_upload_dir( $directory, $user_id );
     45
     46        /** This filter is documented in wp-includes/deprecated.php */
     47        return apply_filters_deprecated( 'xprofile_avatar_upload_dir', array( $avatar_dir ), '6.0.0', 'bp_members_avatar_upload_dir' );
     48}
     49
     50/**
     51 * This function runs when an action is set for a screen:
     52 * example.com/members/andy/profile/change-avatar/ [delete-avatar]
     53 *
     54 * The function will delete the active avatar for a user.
     55 *
     56 * @since 1.0.0
     57 * @deprecated 6.0.0
     58 */
     59function xprofile_action_delete_avatar() {
     60        _deprecated_function( __FUNCTION__, '6.0.0', 'bp_members_action_delete_avatar()' );
     61
     62        bp_members_action_delete_avatar();
     63}
  • src/bp-core/js/avatar.js

    diff --git src/bp-core/js/avatar.js src/bp-core/js/avatar.js
    index b70f12f2c..938feaeda 100644
    window.bp = window.bp || {}; 
    5050                                self.resetViews();
    5151                        } );
    5252
    53                         $( 'body.wp-admin' ).on( 'click', '.bp-xprofile-avatar-user-edit', function() {
     53                        $( 'body.wp-admin' ).on( 'click', '.bp-members-avatar-user-edit', function() {
    5454                                self.resetViews();
    5555                        } );
    5656                },
    window.bp = window.bp || {}; 
    7878                                $( '.main-column p #file' ).remove();
    7979                                $( '.main-column p #upload' ).remove();
    8080
    81                         // Admin Extended Profile.
    82                         } else if ( $( '#bp_xprofile_user_admin_avatar a.bp-xprofile-avatar-user-admin' ).length ) {
    83                                 $( '#bp_xprofile_user_admin_avatar a.bp-xprofile-avatar-user-admin' ).remove();
     81                        // Member Admin.
     82                        } else if ( $( '#bp_members_user_admin_avatar a.bp-members-avatar-user-admin' ).length ) {
     83                                $( '#bp_members_user_admin_avatar a.bp-members-avatar-user-admin' ).remove();
    8484                        }
    8585                },
    8686
  • src/bp-groups/bp-groups-template.php

    diff --git src/bp-groups/bp-groups-template.php src/bp-groups/bp-groups-template.php
    index 3ccfd2a22..63df2efb7 100644
    function bp_get_group_avatar_url( $group = false, $type = 'full' ) { 
    912912 *              False otherwise
    913913 */
    914914function bp_group_use_cover_image_header() {
    915         return (bool) bp_is_active( 'groups', 'cover_image' ) && ! bp_disable_group_cover_image_uploads() && bp_attachments_is_wp_version_supported();
     915        return (bool) bp_is_active( 'groups', 'cover_image' ) && ! bp_disable_group_cover_image_uploads();
    916916}
    917917
    918918/**
  • actions/delete-avatar.php

    diff --git src/bp-xprofile/actions/delete-avatar.php src/bp-members/actions/delete-avatar.php
    similarity index 80%
    rename from src/bp-xprofile/actions/delete-avatar.php
    rename to src/bp-members/actions/delete-avatar.php
    index 719421b52..c7b5e258c 100644
    old new  
    11<?php
    22/**
    3  * XProfile: Avatar deletion action handler
     3 * Members: Avatar deletion action handler
    44 *
    55 * @package BuddyPress
    6  * @subpackage XProfileActions
    7  * @since 3.0.0
     6 * @subpackage MembersActions
     7 * @since 6.0.0
    88 */
    99
    1010/**
     
    1313 *
    1414 * The function will delete the active avatar for a user.
    1515 *
    16  * @since 1.0.0
    17  *
     16 * @since 6.0.0
    1817 */
    19 function xprofile_action_delete_avatar() {
     18function bp_members_action_delete_avatar() {
    2019
    2120        if ( ! bp_is_user_change_avatar() || ! bp_is_action_variable( 'delete-avatar', 0 ) ) {
    2221                return false;
    function xprofile_action_delete_avatar() { 
    3736
    3837        bp_core_redirect( wp_get_referer() );
    3938}
    40 add_action( 'bp_actions', 'xprofile_action_delete_avatar' );
    41  No newline at end of file
     39add_action( 'bp_actions', 'bp_members_action_delete_avatar' );
  • src/bp-members/admin/css/admin-rtl.css

    diff --git src/bp-members/admin/css/admin-rtl.css src/bp-members/admin/css/admin-rtl.css
    index e6726e042..d0773ed81 100644
    div#community-profile-page li.bp-members-profile-stats:before, 
    2929div#community-profile-page li.bp-friends-profile-stats:before,
    3030div#community-profile-page li.bp-groups-profile-stats:before,
    3131div#community-profile-page li.bp-blogs-profile-stats:before,
    32 div#community-profile-page a.bp-xprofile-avatar-user-admin:before,
    33 div#community-profile-page a.bp-xprofile-avatar-user-edit:before {
     32div#community-profile-page a.bp-members-avatar-user-admin:before,
     33div#community-profile-page a.bp-members-avatar-user-edit:before {
    3434        font: 400 20px/1 dashicons;
    3535        speak: none;
    3636        display: inline-block;
    div#community-profile-page li.bp-blogs-profile-stats:before { 
    6161        content: "\f120";
    6262}
    6363
    64 div#community-profile-page a.bp-xprofile-avatar-user-admin:before {
     64div#community-profile-page a.bp-members-avatar-user-admin:before {
    6565        content: "\f182";
    6666}
    6767
    68 div#community-profile-page a.bp-xprofile-avatar-user-edit:before {
     68div#community-profile-page a.bp-members-avatar-user-edit:before {
    6969        content: "\f107";
    7070}
    7171
    72 div#community-profile-page div#bp_xprofile_user_admin_avatar div.avatar {
     72div#community-profile-page div#bp_members_user_admin_avatar div.avatar {
    7373        width: 150px;
    7474        margin: 0 auto;
    7575}
    7676
    77 div#community-profile-page div#bp_xprofile_user_admin_avatar div.avatar img {
     77div#community-profile-page div#bp_members_user_admin_avatar div.avatar img {
    7878        max-width: 100%;
    7979        height: auto;
    8080}
    8181
    82 div#community-profile-page div#bp_xprofile_user_admin_avatar a {
     82div#community-profile-page div#bp_members_user_admin_avatar a {
    8383        display: block;
    8484        margin: 1em 0;
    8585}
  • src/bp-members/admin/css/admin.css

    diff --git src/bp-members/admin/css/admin.css src/bp-members/admin/css/admin.css
    index dafa5d097..12686e7e7 100644
    div#community-profile-page li.bp-members-profile-stats:before, 
    2929div#community-profile-page li.bp-friends-profile-stats:before,
    3030div#community-profile-page li.bp-groups-profile-stats:before,
    3131div#community-profile-page li.bp-blogs-profile-stats:before,
    32 div#community-profile-page a.bp-xprofile-avatar-user-admin:before,
    33 div#community-profile-page a.bp-xprofile-avatar-user-edit:before {
     32div#community-profile-page a.bp-members-avatar-user-admin:before,
     33div#community-profile-page a.bp-members-avatar-user-edit:before {
    3434        font: 400 20px/1 dashicons;
    3535        speak: none;
    3636        display: inline-block;
    div#community-profile-page li.bp-blogs-profile-stats:before { 
    6161        content: "\f120";
    6262}
    6363
    64 div#community-profile-page a.bp-xprofile-avatar-user-admin:before {
     64div#community-profile-page a.bp-members-avatar-user-admin:before {
    6565        content: "\f182";
    6666}
    6767
    68 div#community-profile-page a.bp-xprofile-avatar-user-edit:before {
     68div#community-profile-page a.bp-members-avatar-user-edit:before {
    6969        content: "\f107";
    7070}
    7171
    72 div#community-profile-page div#bp_xprofile_user_admin_avatar div.avatar {
     72div#community-profile-page div#bp_members_user_admin_avatar div.avatar {
    7373        width: 150px;
    7474        margin: 0 auto;
    7575}
    7676
    77 div#community-profile-page div#bp_xprofile_user_admin_avatar div.avatar img {
     77div#community-profile-page div#bp_members_user_admin_avatar div.avatar img {
    7878        max-width: 100%;
    7979        height: auto;
    8080}
    8181
    82 div#community-profile-page div#bp_xprofile_user_admin_avatar a {
     82div#community-profile-page div#bp_members_user_admin_avatar a {
    8383        display: block;
    8484        margin: 1em 0;
    8585}
  • src/bp-members/bp-members-functions.php

    diff --git src/bp-members/bp-members-functions.php src/bp-members/bp-members-functions.php
    index 0bbe3d133..e986ca2f0 100644
    function bp_get_current_member_type() { 
    28482848         */
    28492849        return apply_filters( 'bp_get_current_member_type', buddypress()->current_member_type );
    28502850}
     2851
     2852/**
     2853 * Setup the avatar upload directory for a user.
     2854 *
     2855 * @since 6.0.0
     2856 *
     2857 * @param string $directory The root directory name. Optional.
     2858 * @param int    $user_id   The user ID. Optional.
     2859 * @return array Array containing the path, URL, and other helpful settings.
     2860 */
     2861function bp_members_avatar_upload_dir( $directory = 'avatars', $user_id = 0 ) {
     2862
     2863        // Use displayed user if no user ID was passed.
     2864        if ( empty( $user_id ) ) {
     2865                $user_id = bp_displayed_user_id();
     2866        }
     2867
     2868        // Failsafe against accidentally nooped $directory parameter.
     2869        if ( empty( $directory ) ) {
     2870                $directory = 'avatars';
     2871        }
     2872
     2873        $path      = bp_core_avatar_upload_path() . '/' . $directory. '/' . $user_id;
     2874        $newbdir   = $path;
     2875        $newurl    = bp_core_avatar_url() . '/' . $directory. '/' . $user_id;
     2876        $newburl   = $newurl;
     2877        $newsubdir = '/' . $directory. '/' . $user_id;
     2878
     2879        /**
     2880         * Filters the avatar upload directory for a user.
     2881         *
     2882         * @since 6.0.0
     2883         *
     2884         * @param array $value Array containing the path, URL, and other helpful settings.
     2885         */
     2886        return apply_filters( 'bp_members_avatar_upload_dir', array(
     2887                'path'    => $path,
     2888                'url'     => $newurl,
     2889                'subdir'  => $newsubdir,
     2890                'basedir' => $newbdir,
     2891                'baseurl' => $newburl,
     2892                'error'   => false
     2893        ) );
     2894}
  • src/bp-members/bp-members-template.php

    diff --git src/bp-members/bp-members-template.php src/bp-members/bp-members-template.php
    index 17701f866..787487802 100644
    function bp_get_displayed_user_nav() { 
    15101510 *              False otherwise
    15111511 */
    15121512function bp_displayed_user_use_cover_image_header() {
    1513         return (bool) bp_is_active( 'xprofile', 'cover_image' ) && ! bp_disable_cover_image_uploads() && bp_attachments_is_wp_version_supported();
     1513        return (bool) bp_is_active( 'members', 'cover_image' ) && ! bp_disable_cover_image_uploads();
    15141514}
    15151515
    15161516/** Avatars *******************************************************************/
    function bp_members_component_link( $component, $action = '', $query_args = '', 
    26452645                if ( !empty( $url ) )
    26462646                        return $url;
    26472647        }
     2648
     2649
     2650/**
     2651 * Render an avatar delete link.
     2652 *
     2653 * @since 1.1.0
     2654 * @since 6.0.0 Moved from /bp-xprofile/bp-xprofile-template.php to this file.
     2655 */
     2656function bp_avatar_delete_link() {
     2657        echo bp_get_avatar_delete_link();
     2658}
     2659
     2660        /**
     2661         * Return an avatar delete link.
     2662         *
     2663         * @since 1.1.0
     2664         * @since 6.0.0 Moved from /bp-xprofile/bp-xprofile-template.php to this file.
     2665         *
     2666         * @return string
     2667         */
     2668        function bp_get_avatar_delete_link() {
     2669
     2670                /**
     2671                 * Filters the link used for deleting an avatar.
     2672                 *
     2673                 * @since 1.1.0
     2674                 *
     2675                 * @param string $value Nonced URL used for deleting an avatar.
     2676                 */
     2677                return apply_filters( 'bp_get_avatar_delete_link', wp_nonce_url( bp_displayed_user_domain() . bp_get_profile_slug() . '/change-avatar/delete-avatar/', 'bp_delete_avatar_link' ) );
     2678        }
  • src/bp-members/classes/class-bp-members-admin.php

    diff --git src/bp-members/classes/class-bp-members-admin.php src/bp-members/classes/class-bp-members-admin.php
    index ad00eafdb..964b7a25c 100644
    class BP_Members_Admin { 
    642642                         */
    643643                        $js = apply_filters( 'bp_members_admin_js', $js );
    644644                        wp_enqueue_script( 'bp-members-js', $js, array( 'jquery' ), bp_get_version(), true );
     645
     646                        if ( ! bp_core_get_root_option( 'bp-disable-avatar-uploads' ) && buddypress()->avatar->show_avatars ) {
     647                                /**
     648                                 * Get Thickbox.
     649                                 *
     650                                 * We cannot simply use add_thickbox() here as WordPress is not playing
     651                                 * nice with Thickbox width/height see https://core.trac.wordpress.org/ticket/17249
     652                                 * Using media-upload might be interesting in the future for the send to editor stuff
     653                                 * and we make sure the tb_window is wide enough
     654                                 */
     655                                wp_enqueue_style ( 'thickbox' );
     656                                wp_enqueue_script( 'media-upload' );
     657
     658                                // Get Avatar Uploader.
     659                                bp_attachments_enqueue_scripts( 'BP_Attachment_Avatar' );
     660                        }
    645661                }
    646662
    647663                /**
    class BP_Members_Admin { 
    723739         * help, and setting up screen options.
    724740         *
    725741         * @since 2.0.0
     742         * @since 6.0.0 The `delete_avatar` action is now managed into this method.
    726743         */
    727744        public function user_admin_load() {
    728745
    class BP_Members_Admin { 
    819836                                $display_name = __( 'Member', 'buddypress' );
    820837                        }
    821838
     839                        // Set the screen id.
     840                        $screen_id = get_current_screen()->id;
     841
    822842                        // User Stat metabox.
    823843                        add_meta_box(
    824844                                'bp_members_admin_user_stats',
    825845                                sprintf( _x( "%s's Stats", 'members user-admin edit screen', 'buddypress' ), $display_name ),
    826846                                array( $this, 'user_admin_stats_metabox' ),
    827                                 get_current_screen()->id,
     847                                $screen_id,
    828848                                sanitize_key( $this->stats_metabox->context ),
    829849                                sanitize_key( $this->stats_metabox->priority )
    830850                        );
    831851
     852                        if ( buddypress()->avatar->show_avatars ) {
     853                                // Avatar Metabox.
     854                                add_meta_box(
     855                                        'bp_members_user_admin_avatar',
     856                                        _x( 'Profile Photo', 'members user-admin edit screen', 'buddypress' ),
     857                                        array( $this, 'user_admin_avatar_metabox' ),
     858                                        $screen_id,
     859                                        'side',
     860                                        'low'
     861                                );
     862                        }
     863
    832864                        // Member Type metabox. Only added if member types have been registered.
    833865                        $member_types = bp_get_member_types();
    834866                        if ( ! empty( $member_types ) ) {
    class BP_Members_Admin { 
    836868                                        'bp_members_admin_member_type',
    837869                                        _x( 'Member Type', 'members user-admin edit screen', 'buddypress' ),
    838870                                        array( $this, 'user_admin_member_type_metabox' ),
    839                                         get_current_screen()->id,
     871                                        $screen_id,
    840872                                        'side',
    841873                                        'core'
    842874                                );
    class BP_Members_Admin { 
    874906
    875907                        bp_core_redirect( $redirect_to );
    876908
     909                // Eventually delete avatar.
     910                } elseif ( 'delete_avatar' === $doaction ) {
     911
     912                        // Check the nonce.
     913                        check_admin_referer( 'delete_avatar' );
     914
     915                        $redirect_to = remove_query_arg( '_wpnonce', $redirect_to );
     916
     917                        if ( bp_core_delete_existing_avatar( array( 'item_id' => $user_id ) ) ) {
     918                                $redirect_to = add_query_arg( 'updated', 'avatar', $redirect_to );
     919                        } else {
     920                                $redirect_to = add_query_arg( 'error', 'avatar', $redirect_to );
     921                        }
     922
     923                        bp_core_redirect( $redirect_to );
     924
    877925                // Update other stuff once above ones are done.
    878926                } else {
    879927                        $this->redirect = $redirect_to;
    class BP_Members_Admin { 
    11731221                <?php
    11741222        }
    11751223
     1224        /**
     1225         * Render the Avatar metabox to moderate inappropriate images.
     1226         *
     1227         * @since 6.0.0
     1228         *
     1229         * @param WP_User|null $user The WP_User object for the user being edited.
     1230         */
     1231        public function user_admin_avatar_metabox( $user = null ) {
     1232
     1233                if ( empty( $user->ID ) ) {
     1234                        return;
     1235                } ?>
     1236
     1237                <div class="avatar">
     1238
     1239                        <?php echo bp_core_fetch_avatar( array(
     1240                                'item_id' => $user->ID,
     1241                                'object'  => 'user',
     1242                                'type'    => 'full',
     1243                                'title'   => $user->display_name
     1244                        ) ); ?>
     1245
     1246                        <?php if ( bp_get_user_has_avatar( $user->ID ) ) :
     1247
     1248                                $query_args = array(
     1249                                        'user_id' => $user->ID,
     1250                                        'action'  => 'delete_avatar'
     1251                                );
     1252
     1253                                if ( ! empty( $_REQUEST['wp_http_referer'] ) ) {
     1254                                        $wp_http_referer = wp_unslash( $_REQUEST['wp_http_referer'] );
     1255                                        $wp_http_referer = remove_query_arg( array( 'action', 'updated' ), $wp_http_referer );
     1256                                        $wp_http_referer = wp_validate_redirect( esc_url_raw( $wp_http_referer ) );
     1257                                        $query_args['wp_http_referer'] = urlencode( $wp_http_referer );
     1258                                }
     1259
     1260                                $community_url = add_query_arg( $query_args, $this->edit_profile_url );
     1261                                $delete_link   = wp_nonce_url( $community_url, 'delete_avatar' ); ?>
     1262
     1263                                <a href="<?php echo esc_url( $delete_link ); ?>" class="bp-members-avatar-user-admin"><?php esc_html_e( 'Delete Profile Photo', 'buddypress' ); ?></a>
     1264
     1265                        <?php endif;
     1266
     1267                        // Load the Avatar UI templates if user avatar uploads are enabled.
     1268                        if ( ! bp_core_get_root_option( 'bp-disable-avatar-uploads' ) ) : ?>
     1269                                <a href="#TB_inline?width=800px&height=400px&inlineId=bp-members-avatar-editor" class="thickbox bp-members-avatar-user-edit"><?php esc_html_e( 'Edit Profile Photo', 'buddypress' ); ?></a>
     1270                                <div id="bp-members-avatar-editor" style="display:none;">
     1271                                        <?php bp_attachments_get_template_part( 'avatars/index' ); ?>
     1272                                </div>
     1273                        <?php endif; ?>
     1274
     1275                </div>
     1276                <?php
     1277        }
     1278
    11761279        /**
    11771280         * Render the Member Type metabox.
    11781281         *
  • src/bp-members/classes/class-bp-members-component.php

    diff --git src/bp-members/classes/class-bp-members-component.php src/bp-members/classes/class-bp-members-component.php
    index 73b63348b..29576b52f 100644
    class BP_Members_Component extends BP_Component { 
    106106                // Members - User main nav screen.
    107107                if ( bp_is_user() ) {
    108108                        require $this->path . 'bp-members/screens/profile.php';
     109
     110                        // Action - Delete avatar.
     111                        if ( is_user_logged_in()&& bp_is_user_change_avatar() && bp_is_action_variable( 'delete-avatar', 0 ) ) {
     112                                require $this->path . 'bp-members/actions/delete-avatar.php';
     113                        }
     114
     115                        // Sub-nav items.
     116                        if ( is_user_logged_in() &&
     117                                in_array( bp_current_action(), array( 'change-avatar', 'change-cover-image' ), true )
     118                        ) {
     119                                require $this->path . 'bp-members/screens/' . bp_current_action() . '.php';
     120                        }
    109121                }
    110122
    111123                // Members - Theme compatibility.
    class BP_Members_Component extends BP_Component { 
    288300                }
    289301        }
    290302
     303        /**
     304         * Get the Avatar and Cover image subnavs.
     305         *
     306         * @since 6.0.0
     307         *
     308         * @return array The Avatar and Cover image subnavs.
     309         */
     310        public function get_avatar_cover_image_subnavs() {
     311                $subnavs = array();
     312
     313                $access       = bp_core_can_edit_settings();
     314                $slug         = bp_get_profile_slug();
     315                $profile_link = bp_get_members_component_link( $slug );
     316
     317                // Change Avatar.
     318                if ( buddypress()->avatar->show_avatars ) {
     319                        $subnavs[] = array(
     320                                'name'            => _x( 'Change Profile Photo', 'Profile header sub menu', 'buddypress' ),
     321                                'slug'            => 'change-avatar',
     322                                'parent_url'      => $profile_link,
     323                                'parent_slug'     => $slug,
     324                                'screen_function' => 'bp_members_screen_change_avatar',
     325                                'position'        => 30,
     326                                'user_has_access' => $access
     327                        );
     328                }
     329
     330                // Change Cover image.
     331                if ( bp_displayed_user_use_cover_image_header() ) {
     332                        $subnavs[] = array(
     333                                'name'            => _x( 'Change Cover Image', 'Profile header sub menu', 'buddypress' ),
     334                                'slug'            => 'change-cover-image',
     335                                'parent_url'      => $profile_link,
     336                                'parent_slug'     => $slug,
     337                                'screen_function' => 'bp_members_screen_change_cover_image',
     338                                'position'        => 40,
     339                                'user_has_access' => $access
     340                        );
     341                }
     342
     343                return $subnavs;
     344        }
     345
    291346        /**
    292347         * Set up fall-back component navigation if XProfile is inactive.
    293348         *
    class BP_Members_Component extends BP_Component { 
    311366
    312367                // Bail if XProfile component is active and there's no custom front page for the user.
    313368                if ( ! bp_displayed_user_has_front_template() && $is_xprofile_active ) {
     369                        add_action( 'bp_xprofile_setup_nav', array( $this, 'setup_xprofile_nav' ) );
    314370                        return;
    315371                }
    316372
    class BP_Members_Component extends BP_Component { 
    339395                                'default_subnav_slug' => 'public',
    340396                                'item_css_id'         => buddypress()->profile->id
    341397                        );
     398
     399                /**
     400                 * The xProfile component is active.
     401                 *
     402                 * We need to make sure the Change Avatar and Change Cover Image subnavs are
     403                 * added just like it was the case before.
     404                 */
     405                } else {
     406                        add_action( 'bp_xprofile_setup_nav', array( $this, 'setup_xprofile_nav' ) );
    342407                }
    343408
    344409                /**
    class BP_Members_Component extends BP_Component { 
    393458                 */
    394459                } else {
    395460                        $main_nav  = $this->main_nav;
    396                         $sub_nav[] = $this->sub_nav;
     461                        $sub_nav   = array( $this->sub_nav );
     462
     463                        if ( ! $is_xprofile_active ) {
     464                                $sub_nav = array_merge( $sub_nav, $this->get_avatar_cover_image_subnavs() );
     465                        }
    397466                }
    398467
    399468
    class BP_Members_Component extends BP_Component { 
    417486
    418487                // Add the sub nav item.
    419488                bp_core_new_subnav_item( $this->sub_nav, 'members' );
     489
     490                // Get the Avatar and cover image subnavs.
     491                $this->setup_xprofile_nav();
     492        }
     493
     494        /**
     495         * Set up the xProfile nav.
     496         *
     497         * @since 6.0.0
     498         */
     499        public function setup_xprofile_nav() {
     500                // Get the Avatar and cover image subnavs.
     501                $items = $this->get_avatar_cover_image_subnavs();
     502
     503                foreach ( $items as $item ) {
     504                        bp_core_new_subnav_item( $item, 'members' );
     505                }
     506        }
     507
     508        /**
     509         * Get the Avatar and Cover image admin navs.
     510         *
     511         * @since 6.0.0
     512         *
     513         * @param  string $admin_bar_menu_id The Admin bar menu ID to attach sub items to.
     514         * @return array                     The Avatar and Cover image admin navs.
     515         */
     516        public function get_avatar_cover_image_admin_navs( $admin_bar_menu_id = '' ) {
     517                $wp_admin_nav = array();
     518                $profile_link = trailingslashit( bp_loggedin_user_domain() . bp_get_profile_slug() );
     519
     520                if ( ! $admin_bar_menu_id ) {
     521                        $admin_bar_menu_id = $this->id;
     522                }
     523
     524                // Edit Avatar.
     525                if ( buddypress()->avatar->show_avatars ) {
     526                        $wp_admin_nav[] = array(
     527                                'parent'   => 'my-account-' . $admin_bar_menu_id,
     528                                'id'       => 'my-account-' . $admin_bar_menu_id . '-change-avatar',
     529                                'title'    => _x( 'Change Profile Photo', 'My Account Profile sub nav', 'buddypress' ),
     530                                'href'     => trailingslashit( $profile_link . 'change-avatar' ),
     531                                'position' => 30
     532                        );
     533                }
     534
     535                // Edit Cover Image
     536                if ( bp_displayed_user_use_cover_image_header() ) {
     537                        $wp_admin_nav[] = array(
     538                                'parent'   => 'my-account-' . $admin_bar_menu_id,
     539                                'id'       => 'my-account-' . $admin_bar_menu_id . '-change-cover-image',
     540                                'title'    => _x( 'Change Cover Image', 'My Account Profile sub nav', 'buddypress' ),
     541                                'href'     => trailingslashit( $profile_link . 'change-cover-image' ),
     542                                'position' => 40
     543                        );
     544                }
     545
     546                return $wp_admin_nav;
     547        }
     548
     549        /**
     550         * Set up the Admin Bar.
     551         *
     552         * @since 6.0.0
     553         *
     554         * @param array $wp_admin_nav Admin Bar items.
     555         */
     556        public function setup_admin_bar( $wp_admin_nav = array() ) {
     557                // Menus for logged in user.
     558                if ( is_user_logged_in() ) {
     559                        $profile_link = trailingslashit( bp_loggedin_user_domain() . bp_get_profile_slug() );
     560
     561                        if ( ! bp_is_active( 'xprofile' ) ) {
     562                                // Add the "Profile" sub menu.
     563                                $wp_admin_nav[] = array(
     564                                        'parent' => buddypress()->my_account_menu_id,
     565                                        'id'     => 'my-account-' . $this->id,
     566                                        'title'  => _x( 'Profile', 'My Account Profile', 'buddypress' ),
     567                                        'href'   => $profile_link
     568                                );
     569
     570                                // View Profile.
     571                                $wp_admin_nav[] = array(
     572                                        'parent'   => 'my-account-' . $this->id,
     573                                        'id'       => 'my-account-' . $this->id . '-public',
     574                                        'title'    => _x( 'View', 'My Account Profile sub nav', 'buddypress' ),
     575                                        'href'     => $profile_link,
     576                                        'position' => 10
     577                                );
     578
     579                                $wp_admin_nav = array_merge( $wp_admin_nav, $this->get_avatar_cover_image_admin_navs() );
     580
     581                        /**
     582                         * The xProfile is active.
     583                         *
     584                         * Add the Change Avatar and Change Cover Image Admin Bar items
     585                         * to the xProfile Admin Bar Menu.
     586                         */
     587                        } else {
     588                                add_filter( 'bp_xprofile_admin_nav', array( $this, 'setup_xprofile_admin_nav' ), 2 );
     589                        }
     590                }
     591
     592                parent::setup_admin_bar( $wp_admin_nav );
     593        }
     594
     595        /**
     596         * Adds "Profile > Change Avatar" & "Profile > Change Cover Image" subnav item
     597         * under the "Profile" adminbar menu.
     598         *
     599         * @since 6.0.0
     600         *
     601         * @param array $wp_admin_nav The Profile adminbar nav array.
     602         * @return array
     603         */
     604        public function setup_xprofile_admin_nav( $wp_admin_nav ) {
     605                $items = $this->get_avatar_cover_image_admin_navs( buddypress()->profile->id );
     606
     607                if ( $items ) {
     608                        $wp_admin_nav = array_merge( $wp_admin_nav, $items );
     609                }
     610
     611                return $wp_admin_nav;
    420612        }
    421613
    422614        /**
    class BP_Members_Component extends BP_Component { 
    473665                         */
    474666                        'BP_REST_Components_Endpoint',
    475667                        'BP_REST_Members_Endpoint',
     668                        'BP_REST_Attachments_Member_Avatar_Endpoint',
    476669                ) );
    477670        }
    478671}
  • screens/change-avatar.php

    diff --git src/bp-xprofile/screens/change-avatar.php src/bp-members/screens/change-avatar.php
    similarity index 56%
    rename from src/bp-xprofile/screens/change-avatar.php
    rename to src/bp-members/screens/change-avatar.php
    index dc9da918a..5c4bcf440 100644
    old new  
    11<?php
    22/**
    3  * XProfile: User's "Profile > Change Avatar" screen handler
     3 * Members: Change Avatar screen handler
    44 *
    55 * @package BuddyPress
    6  * @subpackage XProfileScreens
    7  * @since 3.0.0
     6 * @subpackage MembersScreens
     7 * @since 6.0.0
    88 */
    99
    1010/**
    11  * Handles the uploading and cropping of a user avatar. Displays the change avatar page.
    12  *
    13  * @since 1.0.0
     11 * Handle the display of the profile Change Avatar page by loading the correct template file.
    1412 *
     13 * @since 6.0.0
    1514 */
    16 function xprofile_screen_change_avatar() {
    17 
     15function bp_members_screen_change_avatar() {
    1816        // Bail if not the correct screen.
    1917        if ( ! bp_is_my_profile() && ! bp_current_user_can( 'bp_moderate' ) ) {
    2018                return false;
    function xprofile_screen_change_avatar() { 
    4038                check_admin_referer( 'bp_avatar_upload' );
    4139
    4240                // Pass the file to the avatar upload handler.
    43                 if ( bp_core_avatar_handle_upload( $_FILES, 'xprofile_avatar_upload_dir' ) ) {
     41                if ( bp_core_avatar_handle_upload( $_FILES, 'bp_members_avatar_upload_dir' ) ) {
    4442                        $bp->avatar_admin->step = 'crop-image';
    4543
    4644                        // Make sure we include the jQuery jCrop file for image cropping.
    function xprofile_screen_change_avatar() { 
    6765                        bp_core_add_message( __( 'There was a problem cropping your profile photo.', 'buddypress' ), 'error' );
    6866                } else {
    6967
     68                        /** This action is documented in wp-includes/deprecated.php */
     69                        do_action_deprecated( 'xprofile_avatar_uploaded', array( (int) $args['item_id'], 'crop' ), '6.0.0', 'bp_members_avatar_uploaded' );
     70
    7071                        /**
    7172                         * Fires right before the redirect, after processing a new avatar.
    7273                         *
    73                          * @since 1.1.0
    74                          * @since 2.3.4 Add two new parameters to inform about the user id and
    75                          *              about the way the avatar was set (eg: 'crop' or 'camera').
     74                         * @since 6.0.0
    7675                         *
    7776                         * @param string $item_id Inform about the user id the avatar was set for.
    7877                         * @param string $value   Inform about the way the avatar was set ('crop').
    7978                         */
    80                         do_action( 'xprofile_avatar_uploaded', (int) $args['item_id'], 'crop' );
     79                        do_action( 'bp_members_avatar_uploaded', (int) $args['item_id'], 'crop' );
     80
    8181                        bp_core_add_message( __( 'Your new profile photo was uploaded successfully.', 'buddypress' ) );
    8282                        bp_core_redirect( bp_displayed_user_domain() );
    8383                }
    8484        }
    8585
     86        /** This action is documented in wp-includes/deprecated.php */
     87        do_action_deprecated( 'xprofile_screen_change_avatar', array(), '6.0.0', 'bp_members_screen_change_avatar' );
     88
    8689        /**
    87          * Fires right before the loading of the XProfile change avatar screen template file.
     90         * Fires right before the loading of the Member Change Avatar screen template file.
    8891         *
    89          * @since 1.0.0
     92         * @since 6.0.0
    9093         */
    91         do_action( 'xprofile_screen_change_avatar' );
     94        do_action( 'bp_members_screen_change_avatar' );
     95
     96        /** This filter is documented in wp-includes/deprecated.php */
     97        $template = apply_filters_deprecated( 'xprofile_template_change_avatar', array( 'members/single/home' ), '6.0.0', 'bp_members_template_change_avatar' );
    9298
    9399        /**
    94          * Filters the template to load for the XProfile change avatar screen.
     100         * Filters the template to load for the Member Change Avatar page screen.
    95101         *
    96          * @since 1.0.0
     102         * @since 6.0.0
    97103         *
    98          * @param string $template Path to the XProfile change avatar template to load.
     104         * @param string $template Path to the Member template to load.
    99105         */
    100         bp_core_load_template( apply_filters( 'xprofile_template_change_avatar', 'members/single/home' ) );
    101 }
    102  No newline at end of file
     106        bp_core_load_template( apply_filters( 'bp_members_template_change_avatar', $template ) );
     107}
  • new file src/bp-members/screens/change-cover-image.php

    diff --git src/bp-members/screens/change-cover-image.php src/bp-members/screens/change-cover-image.php
    new file mode 100644
    index 000000000..3cd69acf7
    - +  
     1<?php
     2/**
     3 * Members: Change Cover Image screen handler
     4 *
     5 * @package BuddyPress
     6 * @subpackage MembersScreens
     7 * @since 6.0.0
     8 */
     9
     10/**
     11 * Handle the display of the profile Change Cover Image page by loading the correct template file.
     12 *
     13 * @since 6.0.0
     14 */
     15function bp_members_screen_change_cover_image() {
     16        // Bail if not the correct screen.
     17        if ( ! bp_is_my_profile() && ! bp_current_user_can( 'bp_moderate' ) ) {
     18                return false;
     19        }
     20
     21        /** This action is documented in wp-includes/deprecated.php */
     22        do_action_deprecated( 'xprofile_screen_change_cover_image', array(), '6.0.0', 'bp_members_screen_change_cover_image' );
     23
     24        /**
     25         * Fires right before the loading of the Member Change Cover Image screen template file.
     26         *
     27         * @since 6.0.0
     28         */
     29        do_action( 'bp_members_screen_change_cover_image' );
     30
     31        /** This filter is documented in wp-includes/deprecated.php */
     32        $template = apply_filters_deprecated( 'xprofile_template_cover_image', array( 'members/single/home' ), '6.0.0', 'bp_members_template_change_cover_image' );
     33
     34        /**
     35         * Filters the template to load for the Member Change Cover Image page screen.
     36         *
     37         * @since 6.0.0
     38         *
     39         * @param string $template Path to the Member template to load.
     40         */
     41        bp_core_load_template( apply_filters( 'bp_members_template_change_cover_image', $template ) );
     42}
  • src/bp-members/screens/profile.php

    diff --git src/bp-members/screens/profile.php src/bp-members/screens/profile.php
    index 79606586f..159719ecc 100644
    function bp_members_screen_display_profile() { 
    2929         * @param string $template Path to the Member template to load.
    3030         */
    3131        bp_core_load_template( apply_filters( 'bp_members_screen_display_profile', 'members/single/home' ) );
    32 }
    33  No newline at end of file
     32}
  • src/bp-templates/bp-nouveau/buddypress-functions.php

    diff --git src/bp-templates/bp-nouveau/buddypress-functions.php src/bp-templates/bp-nouveau/buddypress-functions.php
    index 0240119f9..12b7d0f57 100644
    class BP_Nouveau extends BP_Theme_Compat { 
    146146                bp_set_theme_compat_feature( $this->id, array(
    147147                        'name'     => 'cover_image',
    148148                        'settings' => array(
    149                                 'components'   => array( 'xprofile', 'groups' ),
     149                                'components'   => array( 'members', 'groups' ),
    150150                                'width'        => $width,
    151151                                'height'       => $top_offset + round( $avatar_height / 2 ),
    152152                                'callback'     => 'bp_nouveau_theme_cover_image',
  • src/bp-xprofile/bp-xprofile-functions.php

    diff --git src/bp-xprofile/bp-xprofile-functions.php src/bp-xprofile/bp-xprofile-functions.php
    index 160a8de9a..25d6d5fc0 100644
    function xprofile_override_user_fullnames() { 
    705705}
    706706add_action( 'bp_setup_globals', 'xprofile_override_user_fullnames', 100 );
    707707
    708 /**
    709  * Setup the avatar upload directory for a user.
    710  *
    711  * @since 1.0.0
    712  *
    713  * @package BuddyPress Core
    714  *
    715  * @param string $directory The root directory name. Optional.
    716  * @param int    $user_id   The user ID. Optional.
    717  * @return array Array containing the path, URL, and other helpful settings.
    718  */
    719 function xprofile_avatar_upload_dir( $directory = 'avatars', $user_id = 0 ) {
    720 
    721         // Use displayed user if no user ID was passed.
    722         if ( empty( $user_id ) ) {
    723                 $user_id = bp_displayed_user_id();
    724         }
    725 
    726         // Failsafe against accidentally nooped $directory parameter.
    727         if ( empty( $directory ) ) {
    728                 $directory = 'avatars';
    729         }
    730 
    731         $path      = bp_core_avatar_upload_path() . '/' . $directory. '/' . $user_id;
    732         $newbdir   = $path;
    733         $newurl    = bp_core_avatar_url() . '/' . $directory. '/' . $user_id;
    734         $newburl   = $newurl;
    735         $newsubdir = '/' . $directory. '/' . $user_id;
    736 
    737         /**
    738          * Filters the avatar upload directory for a user.
    739          *
    740          * @since 1.1.0
    741          *
    742          * @param array $value Array containing the path, URL, and other helpful settings.
    743          */
    744         return apply_filters( 'xprofile_avatar_upload_dir', array(
    745                 'path'    => $path,
    746                 'url'     => $newurl,
    747                 'subdir'  => $newsubdir,
    748                 'basedir' => $newbdir,
    749                 'baseurl' => $newburl,
    750                 'error'   => false
    751         ) );
    752 }
    753 
    754708/**
    755709 * When search_terms are passed to BP_User_Query, search against xprofile fields.
    756710 *
  • src/bp-xprofile/bp-xprofile-template.php

    diff --git src/bp-xprofile/bp-xprofile-template.php src/bp-xprofile/bp-xprofile-template.php
    index 332fb4c74..412a79d82 100644
    function bp_current_profile_group_id() { 
    12041204                return (int) apply_filters( 'bp_get_current_profile_group_id', $profile_group_id );
    12051205        }
    12061206
    1207 /**
    1208  * Render an avatar delete link.
    1209  *
    1210  * @since 1.1.0
    1211  */
    1212 function bp_avatar_delete_link() {
    1213         echo bp_get_avatar_delete_link();
    1214 }
    1215 
    1216         /**
    1217          * Return an avatar delete link.
    1218          *
    1219          * @since 1.1.0
    1220          *
    1221          * @return string
    1222          */
    1223         function bp_get_avatar_delete_link() {
    1224 
    1225                 /**
    1226                  * Filters the link used for deleting an avatar.
    1227                  *
    1228                  * @since 1.1.0
    1229                  *
    1230                  * @param string $value Nonced URL used for deleting an avatar.
    1231                  */
    1232                 return apply_filters( 'bp_get_avatar_delete_link', wp_nonce_url( bp_displayed_user_domain() . bp_get_profile_slug() . '/change-avatar/delete-avatar/', 'bp_delete_avatar_link' ) );
    1233         }
    1234 
    12351207/**
    12361208 * Render an edit profile button.
    12371209 *
  • src/bp-xprofile/classes/class-bp-xprofile-component.php

    diff --git src/bp-xprofile/classes/class-bp-xprofile-component.php src/bp-xprofile/classes/class-bp-xprofile-component.php
    index 49ae02dd5..439c02886 100644
    class BP_XProfile_Component extends BP_Component { 
    112112                if ( bp_is_profile_component() ) {
    113113                        require $this->path . 'bp-xprofile/screens/public.php';
    114114
    115                         // Action - Delete avatar.
    116                         if ( is_user_logged_in()&& bp_is_user_change_avatar() && bp_is_action_variable( 'delete-avatar', 0 ) ) {
    117                                 require $this->path . 'bp-xprofile/actions/delete-avatar.php';
    118                         }
    119 
    120115                        // Sub-nav items.
    121                         if ( is_user_logged_in() &&
    122                                 in_array( bp_current_action(), array( 'edit', 'change-avatar', 'change-cover-image' ), true )
    123                         ) {
    124                                 require $this->path . 'bp-xprofile/screens/' . bp_current_action() . '.php';
     116                        if ( is_user_logged_in() && 'edit' === bp_current_action() ) {
     117                                require $this->path . 'bp-xprofile/screens/edit.php';
    125118                        }
    126119                }
    127120
    class BP_XProfile_Component extends BP_Component { 
    278271                        'user_has_access' => $access
    279272                );
    280273
    281                 // Change Avatar.
    282                 if ( buddypress()->avatar->show_avatars ) {
    283                         $sub_nav[] = array(
    284                                 'name'            => _x( 'Change Profile Photo', 'Profile header sub menu', 'buddypress' ),
    285                                 'slug'            => 'change-avatar',
    286                                 'parent_url'      => $profile_link,
    287                                 'parent_slug'     => $slug,
    288                                 'screen_function' => 'xprofile_screen_change_avatar',
    289                                 'position'        => 30,
    290                                 'user_has_access' => $access
    291                         );
    292                 }
    293 
    294                 // Change Cover image.
    295                 if ( bp_displayed_user_use_cover_image_header() ) {
    296                         $sub_nav[] = array(
    297                                 'name'            => _x( 'Change Cover Image', 'Profile header sub menu', 'buddypress' ),
    298                                 'slug'            => 'change-cover-image',
    299                                 'parent_url'      => $profile_link,
    300                                 'parent_slug'     => $slug,
    301                                 'screen_function' => 'xprofile_screen_change_cover_image',
    302                                 'position'        => 40,
    303                                 'user_has_access' => $access
    304                         );
    305                 }
    306 
    307274                // The Settings > Profile nav item can only be set up after
    308275                // the Settings component has run its own nav routine.
    309276                add_action( 'bp_settings_setup_nav', array( $this, 'setup_settings_nav' ) );
    class BP_XProfile_Component extends BP_Component { 
    387354                                'href'     => trailingslashit( $profile_link . 'edit' ),
    388355                                'position' => 20
    389356                        );
    390 
    391                         // Edit Avatar.
    392                         if ( buddypress()->avatar->show_avatars ) {
    393                                 $wp_admin_nav[] = array(
    394                                         'parent'   => 'my-account-' . $this->id,
    395                                         'id'       => 'my-account-' . $this->id . '-change-avatar',
    396                                         'title'    => _x( 'Change Profile Photo', 'My Account Profile sub nav', 'buddypress' ),
    397                                         'href'     => trailingslashit( $profile_link . 'change-avatar' ),
    398                                         'position' => 30
    399                                 );
    400                         }
    401 
    402                         if ( bp_displayed_user_use_cover_image_header() ) {
    403                                 $wp_admin_nav[] = array(
    404                                         'parent'   => 'my-account-' . $this->id,
    405                                         'id'       => 'my-account-' . $this->id . '-change-cover-image',
    406                                         'title'    => _x( 'Change Cover Image', 'My Account Profile sub nav', 'buddypress' ),
    407                                         'href'     => trailingslashit( $profile_link . 'change-cover-image' ),
    408                                         'position' => 40
    409                                 );
    410                         }
    411357                }
    412358
    413359                parent::setup_admin_bar( $wp_admin_nav );
    class BP_XProfile_Component extends BP_Component { 
    503449                        'BP_REST_XProfile_Fields_Endpoint',
    504450                        'BP_REST_XProfile_Field_Groups_Endpoint',
    505451                        'BP_REST_XProfile_Data_Endpoint',
    506                         'BP_REST_Attachments_Member_Avatar_Endpoint',
    507452                ) );
    508453        }
    509454}
  • src/bp-xprofile/classes/class-bp-xprofile-user-admin.php

    diff --git src/bp-xprofile/classes/class-bp-xprofile-user-admin.php src/bp-xprofile/classes/class-bp-xprofile-user-admin.php
    index f24a4e047..73db1afec 100644
    class BP_XProfile_User_Admin { 
    5656         * @since 2.0.0
    5757         */
    5858        private function setup_actions() {
    59                 // Enqueue scripts.
    60                 add_action( 'bp_members_admin_enqueue_scripts',  array( $this, 'enqueue_scripts'    ), 10, 1 );
    6159
    6260                // Register the metabox in Member's community admin profile.
    6361                add_action( 'bp_members_admin_xprofile_metabox', array( $this, 'register_metaboxes' ), 10, 3 );
    6462
    65                 // Saves the profile actions for user ( avatar, profile fields ).
     63                // Saves the profile actions for user ( profile fields ).
    6664                add_action( 'bp_members_admin_update_user',      array( $this, 'user_admin_load'    ), 10, 4 );
    6765        }
    6866
    69         /**
    70          * Enqueue needed scripts.
    71          *
    72          * @since 2.3.0
    73          *
    74          * @param int $screen_id Screen ID being displayed.
    75          */
    76         public function enqueue_scripts( $screen_id ) {
    77                 if ( ( false === strpos( $screen_id, 'users_page_bp-profile-edit' )
    78                         && false === strpos( $screen_id, 'profile_page_bp-profile-edit' ) )
    79                         || bp_core_get_root_option( 'bp-disable-avatar-uploads' )
    80                         || ! buddypress()->avatar->show_avatars
    81                         || ! bp_attachments_is_wp_version_supported() ) {
    82                         return;
    83                 }
    84 
    85                 /**
    86                  * Get Thickbox.
    87                  *
    88                  * We cannot simply use add_thickbox() here as WordPress is not playing
    89                  * nice with Thickbox width/height see https://core.trac.wordpress.org/ticket/17249
    90                  * Using media-upload might be interesting in the future for the send to editor stuff
    91                  * and we make sure the tb_window is wide enough
    92                  */
    93                 wp_enqueue_style ( 'thickbox' );
    94                 wp_enqueue_script( 'media-upload' );
    95 
    96                 // Get Avatar Uploader.
    97                 bp_attachments_enqueue_scripts( 'BP_Attachment_Avatar' );
    98         }
    99 
    10067        /**
    10168         * Register the xProfile metabox on Community Profile admin page.
    10269         *
    class BP_XProfile_User_Admin { 
    155122                                'core'
    156123                        );
    157124                }
    158 
    159                 if ( buddypress()->avatar->show_avatars ) {
    160                         // Avatar Metabox.
    161                         add_meta_box(
    162                                 'bp_xprofile_user_admin_avatar',
    163                                 _x( 'Profile Photo', 'xprofile user-admin edit screen', 'buddypress' ),
    164                                 array( $this, 'user_admin_avatar_metabox' ),
    165                                 $screen_id,
    166                                 'side',
    167                                 'low'
    168                         );
    169                 }
    170125        }
    171126
    172127        /**
    class BP_XProfile_User_Admin { 
    176131         * requests.
    177132         *
    178133         * @since 2.0.0
     134         * @since 6.0.0 The `delete_avatar` action is now managed into BP_Members_Admin::user_admin_load().
    179135         *
    180136         * @param string $doaction    Action being run.
    181137         * @param int    $user_id     ID for the user whose profile is being saved.
    class BP_XProfile_User_Admin { 
    184140         */
    185141        public function user_admin_load( $doaction = '', $user_id = 0, $request = array(), $redirect_to = '' ) {
    186142
    187                 // Eventually delete avatar.
    188                 if ( 'delete_avatar' === $doaction ) {
    189 
    190                         check_admin_referer( 'delete_avatar' );
     143                // Update profile fields.
     144                if ( isset( $_POST['field_ids'] ) ) {
    191145
    192                         $redirect_to = remove_query_arg( '_wpnonce', $redirect_to );
    193 
    194                         if ( bp_core_delete_existing_avatar( array( 'item_id' => $user_id ) ) ) {
    195                                 $redirect_to = add_query_arg( 'updated', 'avatar', $redirect_to );
    196                         } else {
    197                                 $redirect_to = add_query_arg( 'error', 'avatar', $redirect_to );
    198                         }
    199 
    200                         bp_core_redirect( $redirect_to );
    201 
    202                 } elseif ( isset( $_POST['field_ids'] ) ) {
    203                         // Update profile fields.
    204146                        // Check the nonce.
    205147                        check_admin_referer( 'edit-bp-profile_' . $user_id );
    206148
    class BP_XProfile_User_Admin { 
    434376        <?php
    435377        }
    436378
    437         /**
    438          * Render the Avatar metabox to moderate inappropriate images.
    439          *
    440          * @since 2.0.0
    441          *
    442          * @param WP_User|null $user The WP_User object for the user being edited.
    443          */
    444         public function user_admin_avatar_metabox( $user = null ) {
    445 
    446                 if ( empty( $user->ID ) ) {
    447                         return;
    448                 } ?>
    449 
    450                 <div class="avatar">
    451 
    452                         <?php echo bp_core_fetch_avatar( array(
    453                                 'item_id' => $user->ID,
    454                                 'object'  => 'user',
    455                                 'type'    => 'full',
    456                                 'title'   => $user->display_name
    457                         ) ); ?>
    458 
    459                         <?php if ( bp_get_user_has_avatar( $user->ID ) ) :
    460 
    461                                 $query_args = array(
    462                                         'user_id' => $user->ID,
    463                                         'action'  => 'delete_avatar'
    464                                 );
    465 
    466                                 if ( ! empty( $_REQUEST['wp_http_referer'] ) ) {
    467                                         $wp_http_referer = wp_unslash( $_REQUEST['wp_http_referer'] );
    468                                         $wp_http_referer = remove_query_arg( array( 'action', 'updated' ), $wp_http_referer );
    469                                         $wp_http_referer = wp_validate_redirect( esc_url_raw( $wp_http_referer ) );
    470                                         $query_args['wp_http_referer'] = urlencode( $wp_http_referer );
    471                                 }
    472 
    473                                 $community_url = add_query_arg( $query_args, buddypress()->members->admin->edit_profile_url );
    474                                 $delete_link   = wp_nonce_url( $community_url, 'delete_avatar' ); ?>
    475 
    476                                 <a href="<?php echo esc_url( $delete_link ); ?>" class="bp-xprofile-avatar-user-admin"><?php esc_html_e( 'Delete Profile Photo', 'buddypress' ); ?></a>
    477 
    478                         <?php endif;
    479 
    480                         // Load the Avatar UI templates if user avatar uploads are enabled and current WordPress version is supported.
    481                         if ( ! bp_core_get_root_option( 'bp-disable-avatar-uploads' ) && bp_attachments_is_wp_version_supported() ) : ?>
    482                                 <a href="#TB_inline?width=800px&height=400px&inlineId=bp-xprofile-avatar-editor" class="thickbox bp-xprofile-avatar-user-edit"><?php esc_html_e( 'Edit Profile Photo', 'buddypress' ); ?></a>
    483                                 <div id="bp-xprofile-avatar-editor" style="display:none;">
    484                                         <?php bp_attachments_get_template_part( 'avatars/index' ); ?>
    485                                 </div>
    486                         <?php endif; ?>
    487 
    488                 </div>
    489                 <?php
    490         }
    491 
    492379}
    493380endif; // End class_exists check.
  • deleted file src/bp-xprofile/screens/change-cover-image.php

    diff --git src/bp-xprofile/screens/change-cover-image.php src/bp-xprofile/screens/change-cover-image.php
    deleted file mode 100644
    index 64b1b15d1..000000000
    + -  
    1 <?php
    2 /**
    3  * XProfile: User's "Profile > Change Cover Image" screen handler
    4  *
    5  * @package BuddyPress
    6  * @subpackage XProfileScreens
    7  * @since 3.0.0
    8  */
    9 
    10 /**
    11  * Displays the change cover image page.
    12  *
    13  * @since 2.4.0
    14  */
    15 function xprofile_screen_change_cover_image() {
    16 
    17         // Bail if not the correct screen.
    18         if ( ! bp_is_my_profile() && ! bp_current_user_can( 'bp_moderate' ) ) {
    19                 return false;
    20         }
    21 
    22         /**
    23          * Fires right before the loading of the XProfile change cover image screen template file.
    24          *
    25          * @since 2.4.0
    26          */
    27         do_action( 'xprofile_screen_change_cover_image' );
    28 
    29         /**
    30          * Filters the template to load for the XProfile cover image screen.
    31          *
    32          * @since 2.4.0
    33          *
    34          * @param string $template Path to the XProfile cover image template to load.
    35          */
    36         bp_core_load_template( apply_filters( 'xprofile_template_cover_image', 'members/single/home' ) );
    37 }
    38  No newline at end of file
  • tests/phpunit/testcases/core/class-bp-attachment.php

    diff --git tests/phpunit/testcases/core/class-bp-attachment.php tests/phpunit/testcases/core/class-bp-attachment.php
    index b967a778e..80f933f5d 100644
    class BP_Tests_BP_Attachment_TestCases extends BP_UnitTestCase { 
    238238                );
    239239
    240240                /* No error */
    241                 $user_avatar = $avatar_attachment->upload( $_FILES, 'xprofile_avatar_upload_dir' );
     241                $user_avatar = $avatar_attachment->upload( $_FILES, 'bp_members_avatar_upload_dir' );
    242242                $this->assertEquals( $user_avatar['file'], $bp->avatar->upload_path . '/avatars/' . $u1 .'/mystery-man.jpg' );
    243243
    244244                /* File size error */
    245245                add_filter( 'bp_core_avatar_original_max_filesize', array( $this, 'max_filesize' ) );
    246246
    247                 $user_avatar = $avatar_attachment->upload( $_FILES, 'xprofile_avatar_upload_dir' );
     247                $user_avatar = $avatar_attachment->upload( $_FILES, 'bp_members_avatar_upload_dir' );
    248248
    249249                remove_filter( 'bp_core_avatar_original_max_filesize', array( $this, 'max_filesize' ) );
    250250                $this->assertFalse( empty( $user_avatar['error'] ) );
    class BP_Tests_BP_Attachment_TestCases extends BP_UnitTestCase { 
    253253                $_FILES[ $avatar_attachment->file_input ]['name'] = 'buddypress_logo.pdf';
    254254                $_FILES[ $avatar_attachment->file_input ]['type'] = 'application/pdf';
    255255
    256                 $user_avatar = $avatar_attachment->upload( $_FILES, 'xprofile_avatar_upload_dir' );
     256                $user_avatar = $avatar_attachment->upload( $_FILES, 'bp_members_avatar_upload_dir' );
    257257                $this->assertFalse( empty( $user_avatar['error'] ) );
    258258
    259259                // clean up!
  • tests/phpunit/testcases/core/class-bp-component.php

    diff --git tests/phpunit/testcases/core/class-bp-component.php tests/phpunit/testcases/core/class-bp-component.php
    index c5a5dd2b6..bb8ad1b90 100644
    class BP_Tests_BP_Component_TestCases extends BP_UnitTestCase { 
    3232                $this->assertSame( $bp->unit_test_rest->controllers, array(
    3333                        'BP_REST_Components_Endpoint',
    3434                        'BP_REST_Members_Endpoint',
     35                        'BP_REST_Attachments_Member_Avatar_Endpoint',
    3536                ) );
    3637        }
    3738
    class BP_Tests_BP_Component_TestCases extends BP_UnitTestCase { 
    4748
    4849                $this->assertSame( $bp->unit_test_rest->controllers, array(
    4950                        'BP_REST_Components_Endpoint',
     51                        'BP_REST_Attachments_Member_Avatar_Endpoint',
    5052                ) );
    5153        }
    5254
    class BP_Tests_BP_Component_TestCases extends BP_UnitTestCase { 
    6365                $this->assertSame( $bp->unit_test_rest->controllers, array(
    6466                        'BP_REST_Components_Endpoint',
    6567                        'BP_REST_Members_Endpoint',
     68                        'BP_REST_Attachments_Member_Avatar_Endpoint',
    6669                ) );
    6770        }
    6871}