Skip to:
Content

BuddyPress.org


Ignore:
Timestamp:
05/21/2014 10:36:32 PM (12 years ago)
Author:
johnjamesjacoby
Message:

First pass enhancements to BP_Members_Admin

  • Introduce extended profiles to /wp-admin/user/ dashboard.
  • More robust single-site, multi-site, multi-network support, with access to extended profile data at all appropriate levels based on installation type, current user role, etc...
  • Add post-row checks to ensure correct administrative access to other user's data.
  • Allow super admins to edit any other user, always.
  • Allow users to edit their own extended profiles.
  • Various verbiage changes for improved clarity and workflow.
  • Some monolithic functions broken down into smaller private methods.

There is more to do here, including unit test coverage to confirm no unintended user-data leakage or accidental capability escalation is occurring, testing with more esoteric WordPress installation types, etc...

Props imath for the original patch. See #5623.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/bp-members/bp-members-admin.php

    r8432 r8441  
    11<?php
     2
    23// Exit if accessed directly
    34if ( !defined( 'ABSPATH' ) ) exit;
     
    6566         */
    6667        public static function register_members_admin() {
    67                 if( ! is_admin() )
     68                if ( ! is_admin() ) {
    6869                        return;
     70                }
    6971
    7072                $bp = buddypress();
    7173
    72                 if( empty( $bp->members->admin ) ) {
     74                if ( empty( $bp->members->admin ) ) {
    7375                        $bp->members->admin = new self;
    7476                }
     
    109111                $this->user_page = '';
    110112
     113                // The Show Profile Screen id
     114                $this->user_profile = is_network_admin() ? 'users' : 'profile';
     115
     116                // The current user id
     117                $this->current_user_id = get_current_user_id();
     118
     119                // The user id being edited
     120                $this->user_id = 0;
     121
     122                // Is a member editing their own profile
     123                $this->is_self_profile = false;
     124
    111125                // The screen ids to load specific css for
    112126                $this->screen_id = array();
     
    115129                $this->stats_metabox = new StdClass();
    116130
    117                 // The WordPress edit user url
    118                 $this->edit_url = bp_get_admin_url( 'user-edit.php' );
    119 
    120                 // BuddyPress edit user's profile url
    121                 $this->edit_profile_url = add_query_arg( 'page', 'bp-profile-edit', bp_get_admin_url( 'users.php' ) );
     131                // BuddyPress edit user's profile args
     132                $this->edit_profile_args = array( 'page' => 'bp-profile-edit' );
     133                $this->edit_profile_url  = '';
     134                $this->edit_url          = '';
    122135
    123136                // Data specific to signups
     
    144157        private function setup_actions() {
    145158
    146                 /** Extended Profile *****************************************/
     159                /** Extended Profile **************************************************/
     160
     161                // Enqueue all admin JS and CSS
     162                add_action( 'bp_admin_enqueue_scripts', array( $this, 'enqueue_scripts'   )        );
    147163
    148164                // Add some page specific output to the <head>
    149                 add_action( 'bp_admin_head',            array( $this, 'admin_head'      ), 999    );
     165                add_action( 'bp_admin_head',            array( $this, 'admin_head'        ), 999   );
    150166
    151167                // Add menu item to all users menu
    152                 add_action( bp_core_admin_hook(),       array( $this, 'admin_menus'     ),   5    );
    153 
    154                 // Enqueue all admin JS and CSS
    155                 add_action( 'bp_admin_enqueue_scripts', array( $this, 'enqueue_scripts' )         );
     168                add_action( 'admin_menu',               array( $this, 'admin_menus'       ), 5     );
     169                add_action( 'network_admin_menu',       array( $this, 'admin_menus'       ), 5     );
     170                add_action( 'user_admin_menu',          array( $this, 'user_profile_menu' ), 5     );
    156171
    157172                // Create the Profile Navigation (Profile/Extended Profile)
    158                 add_action( 'edit_user_profile',        array( $this, 'profile_nav'     ),  99, 1 );
     173                add_action( 'edit_user_profile',        array( $this, 'profile_nav'       ), 99, 1 );
     174                add_action( 'show_user_profile',        array( $this, 'profile_nav'       ), 99, 1 );
    159175
    160176                // Add a row action to users listing
    161                 add_filter( bp_core_do_network_admin() ? 'ms_user_row_actions' : 'user_row_actions', array( $this, 'row_actions' ), 10, 2 );
    162 
    163                 /** Signups **************************************************************/
     177                if ( bp_core_do_network_admin() ) {
     178                        add_filter( 'ms_user_row_actions',        array( $this, 'row_actions'                    ), 10, 2 );
     179                        add_action( 'admin_init',                 array( $this, 'add_edit_profile_url_filter'    )        );
     180                        add_action( 'wp_after_admin_bar_render',  array( $this, 'remove_edit_profile_url_filter' )        );
     181                }
     182
     183                // Add user row actions for single site
     184                add_filter( 'user_row_actions', array( $this, 'row_actions' ), 10, 2 );
     185
     186                /** Signups ***********************************************************/
    164187
    165188                if ( is_admin() ) {
     189
     190                        // Filter non multisite user query to remove sign-up users
    166191                        if ( ! is_multisite() ) {
    167                                 add_action( 'pre_user_query', array( $this, 'remove_signups_from_user_query'), 10, 1 );
     192                                add_action( 'pre_user_query', array( $this, 'remove_signups_from_user_query' ), 10, 1 );
    168193                        }
    169194
    170195                        // Reorganise the views navigation in users.php and signups page
    171196                        if ( current_user_can( $this->capability ) ) {
    172                                 add_filter( "views_{$this->users_screen}", array( $this, 'signup_filter_view' ),    10, 1 );
     197                                add_filter( "views_{$this->users_screen}", array( $this, 'signup_filter_view'    ), 10, 1 );
    173198                                add_filter( 'set-screen-option',           array( $this, 'signup_screen_options' ), 10, 3 );
    174199                        }
     
    177202
    178203        /**
    179          * Create the All Users > Edit Profile and Signups submenus.
    180          *
    181          * @access public
    182          * @since BuddyPress (2.0.0)
    183          *
    184          * @uses add_users_page() To add the Edit Profile page in Users section.
    185          */
    186         public function admin_menus() {
    187 
    188                 // Manage user's profile
    189                 $hooks['user'] = $this->user_page = add_users_page(
    190                         __( 'Edit Profile',  'buddypress' ),
    191                         __( 'Edit Profile',  'buddypress' ),
    192                         'bp_moderate',
    193                         'bp-profile-edit',
    194                         array( &$this, 'user_admin' )
    195                 );
    196 
    197                 // Manage signups
    198                 $hooks['signups'] = $this->signups_page = add_users_page(
    199                         __( 'Manage Signups',  'buddypress' ),
    200                         __( 'Manage Signups',  'buddypress' ),
    201                         $this->capability,
    202                         'bp-signups',
    203                         array( &$this, 'signups_admin' )
    204                 );
    205 
    206                 $edit_page = 'user-edit';
    207                 $this->users_page = 'users';
    208 
    209                 if ( bp_core_do_network_admin() ) {
    210                         $edit_page          .= '-network';
    211                         $this->users_page   .= '-network';
    212                         $this->user_page    .= '-network';
    213                         $this->signups_page .= '-network';
    214                 }
    215 
    216                 $this->screen_id = array( $edit_page, $this->user_page );
    217 
    218                 foreach ( $hooks as $key => $hook ) {
    219                         add_action( "load-$hook", array( $this, $key . '_admin_load' ) );
    220                 }
    221 
    222                 add_action( "admin_head-$this->user_page", array( $this, 'modify_admin_menu_highlight' ) );
    223 
    224         }
    225 
    226         /**
    227          * Highlight the Users menu if on Edit Profile.
    228          *
    229          * @access public
    230          * @since BuddyPress (2.0.0)
    231          */
    232         public function modify_admin_menu_highlight() {
    233                 global $plugin_page, $submenu_file;
    234 
    235                 // Only Show the All users menu
    236                 if ( $plugin_page = 'bp-profile-edit' ) {
    237                         $submenu_file = 'users.php';
    238                 }
    239         }
    240 
    241         /**
    242          * Remove the Edit Profile page.
    243          *
    244          * We add these pages in order to integrate with WP's Users panel, but
    245          * we want them to show up as a row action of the WP panel, not as separate
    246          * subnav items under the Users menu.
    247          *
    248          * @access public
    249          * @since BuddyPress (2.0.0)
    250          */
    251         public function admin_head() {
    252                 // Remove submenu to force using Profile Navigation
    253                 remove_submenu_page( 'users.php', 'bp-profile-edit' );
    254         }
    255 
    256         /** Community Profile ************************************************/
    257 
    258         /**
    259          * Add some specific styling to the Edit User and Edit User's Profile page.
    260          *
    261          * @access public
    262          * @since BuddyPress (2.0.0)
    263          */
    264         public function enqueue_scripts() {
    265                 if ( ! in_array( get_current_screen()->id, $this->screen_id ) ) {
    266                         return;
    267                 }
    268 
    269                 $min = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
    270 
    271                 $css = $this->css_url . "admin{$min}.css";
    272                 $css = apply_filters( 'bp_members_admin_css', $css );
    273                 wp_enqueue_style( 'bp-members-css', $css, array(), bp_get_version() );
    274 
    275                 // Only load javascript for BuddyPress profile
    276                 if ( get_current_screen()->id == $this->user_page ) {
    277                         $js = $this->js_url . "admin{$min}.js";
    278                         $js = apply_filters( 'bp_members_admin_js', $js );
    279                         wp_enqueue_script( 'bp-members-js', $js, array( 'jquery' ), bp_get_version(), true );
    280                 }
    281 
    282                 // Plugins may want to hook here to load some css/js
    283                 do_action( 'bp_members_admin_enqueue_scripts', get_current_screen()->id, $this->screen_id );
    284         }
    285 
    286         /**
    287          * Create the Profile navigation in Edit User & Edit Profile pages.
    288          *
    289          * @access public
    290          * @since BuddyPress (2.0.0)
    291          */
    292         public function profile_nav( $user = null, $active = 'WordPress' ) {
    293 
    294                 if ( empty( $user->ID ) ) {
    295                         return;
    296                 }
    297 
    298                 // Don't display here if this is not where other BP
    299                 // administration takes place
    300                 if ( bp_core_do_network_admin() && ! is_network_admin() ) {
    301                         return;
    302                 }
    303 
    304                 $query_args = array( 'user_id' => $user->ID );
    305 
    306                 if ( ! empty( $_REQUEST['wp_http_referer'] ) ) {
    307                         $query_args['wp_http_referer'] = urlencode( stripslashes_deep( $_REQUEST['wp_http_referer'] ) );
    308                 }
    309 
    310                 $community_url = add_query_arg( $query_args, $this->edit_profile_url );
    311                 $wordpress_url = add_query_arg( $query_args, $this->edit_url         );
    312 
    313                 $bp_active = false;
    314                 $wp_active = ' nav-tab-active';
    315                 if ( 'BuddyPress' === $active ) {
    316                         $bp_active = ' nav-tab-active';
    317                         $wp_active = false;
    318                 } ?>
    319 
    320                 <h2 id="profile-nav" class="nav-tab-wrapper">
    321                         <?php
    322                         /**
    323                          * In configs where BuddyPress is not network activated, as regular
    324                          * admins do not have the capacity to edit other users, we must add
    325                          * this check.
    326                          */
    327                         ?>
    328                         <?php if ( current_user_can( 'edit_user' ) ) : ?>
    329                                 <a class="nav-tab<?php echo esc_attr( $wp_active ); ?>" href="<?php echo esc_url( $wordpress_url );?>"><?php _e( 'Profile', 'buddypress' ); ?></a>
    330                         <?php endif; ?>
    331                         <a class="nav-tab<?php echo esc_attr( $bp_active ); ?>" href="<?php echo esc_url( $community_url );?>"><?php _e( 'Extended Profile', 'buddypress' ); ?></a>
    332                 </h2>
    333 
    334                 <?php
    335         }
    336 
    337         /**
    338          * Set up the user's profile admin page.
    339          *
    340          * Loaded before the page is rendered, this function does all initial
    341          * setup, including: processing form requests, registering contextual
    342          * help, and setting up screen options.
    343          *
    344          * @access public
    345          * @since BuddyPress (2.0.0)
    346          */
    347         public function user_admin_load() {
    348 
    349                 if ( ! $user_id = intval( $_GET['user_id'] ) ) {
    350                         wp_die( __( 'No users were found', 'buddypress' ) );
    351                 }
    352 
    353                 // Build redirection URL
    354                 $redirect_to = remove_query_arg( array( 'action', 'error', 'updated', 'spam', 'ham', 'delete_avatar' ), $_SERVER['REQUEST_URI'] );
    355                 $doaction = ! empty( $_REQUEST['action'] ) ? $_REQUEST['action'] : false;
    356 
    357                 if ( ! empty( $_REQUEST['user_status'] ) ) {
    358                         $spam = ( 'spam' == $_REQUEST['user_status'] ) ? true : false ;
    359 
    360                         if ( $spam != bp_is_user_spammer( $user_id ) ) {
    361                                 $doaction = $_REQUEST['user_status'];
    362                         }
    363                 }
    364 
    365                 // Call an action for plugins to hook in early
    366                 do_action_ref_array( 'bp_members_admin_load', array( $doaction, $_REQUEST ) );
    367 
    368                 // Allowed actions
    369                 $allowed_actions = apply_filters( 'bp_members_admin_allowed_actions', array( 'update', 'delete_avatar', 'spam', 'ham' ) );
    370 
    371                 // Prepare the display of the Community Profile screen
    372                 if ( ! in_array( $doaction, $allowed_actions ) ) {
    373                         add_screen_option( 'layout_columns', array( 'default' => 2, 'max' => 2, ) );
    374 
    375                         get_current_screen()->add_help_tab( array(
    376                                 'id'      => 'bp-profile-edit-overview',
    377                                 'title'   => __( 'Overview', 'buddypress' ),
    378                                 'content' =>
    379                                 '<p>' . __( 'This is the admin view of a user&#39;s profile.', 'buddypress' ) . '</p>' .
    380                                 '<p>' . __( 'In the main column, you can edit the fields of the user&#39;s extended profile.', 'buddypress' ) . '</p>' .
    381                                 '<p>' . __( 'In the right-hand column, you can update the user&#39;s status, delete the user&#39;s avatar, and view recent statistics.', 'buddypress' ) . '</p>'
    382                         ) );
    383 
    384                         // Help panel - sidebar links
    385                         get_current_screen()->set_help_sidebar(
    386                                 '<p><strong>' . __( 'For more information:', 'buddypress' ) . '</strong></p>' .
    387                                 '<p>' . __( '<a href="http://codex.buddypress.org/buddypress-site-administration/managing-user-profiles/">Managing Profiles</a>', 'buddypress' ) . '</p>' .
    388                                 '<p>' . __( '<a href="http://buddypress.org/support/">Support Forums</a>', 'buddypress' ) . '</p>'
    389                         );
    390 
    391                         // Register metaboxes for the edit screen.
    392                         add_meta_box( 'submitdiv', _x( 'Status', 'members user-admin edit screen', 'buddypress' ), array( &$this, 'user_admin_status_metabox' ), get_current_screen()->id, 'side', 'core' );
    393 
    394                         // In case xprofile is not active
    395                         $this->stats_metabox->context = 'normal';
    396                         $this->stats_metabox->priority = 'core';
    397 
    398                         /**
    399                          * xProfile Hooks to load the profile fields if component is active
    400                          * Plugins should not use this hook, please use 'bp_members_admin_user_metaboxes' instead
    401                          */
    402                         do_action_ref_array( 'bp_members_admin_xprofile_metabox', array( $user_id, get_current_screen()->id, $this->stats_metabox ) );
    403 
    404                         // If xProfile is inactive, difficult to know what's profile we're on
    405                         $display_name = false;
    406                         if ( 'normal' == $this->stats_metabox->context ) {
    407                                 $display_name = ' - ' . esc_html( bp_core_get_user_displayname( $user_id ) );
    408                         }
    409 
    410                         // User Stat metabox
    411                         add_meta_box( 'bp_members_admin_user_stats',    _x( 'Stats' . $display_name, 'members user-admin edit screen', 'buddypress' ), array( &$this, 'user_admin_stats_metabox' ), get_current_screen()->id, sanitize_key( $this->stats_metabox->context ), sanitize_key( $this->stats_metabox->priority ) );
    412 
    413                         // Custom metabox ?
    414                         do_action( 'bp_members_admin_user_metaboxes' );
    415 
    416                         // Enqueue javascripts
    417                         wp_enqueue_script( 'postbox' );
    418                         wp_enqueue_script( 'dashboard' );
    419 
    420                 // Spam or Ham user
    421                 } else if ( in_array( $doaction, array( 'spam', 'ham' ) ) ) {
    422 
    423                         check_admin_referer( 'edit-bp-profile_' . $user_id );
    424 
    425                         if ( bp_core_process_spammer_status( $user_id, $doaction ) ) {
    426                                 $redirect_to = add_query_arg( 'updated', $doaction, $redirect_to );
    427                         } else {
    428                                 $redirect_to = add_query_arg( 'error', $doaction, $redirect_to );
    429                         }
    430 
    431                         bp_core_redirect( $redirect_to );
    432 
    433                 // Update other stuff once above ones are done
     204         * Get the user ID
     205         *
     206         * Look for $_GET['user_id']. If anything else, force the user ID to the
     207         * current user's ID so they aren't left without a user to edit.
     208         *
     209         * @since BuddyPress (2.1.0)
     210         *
     211         * @return int
     212         */
     213        private function get_user_id() {
     214
     215                // No user ID to start
     216                $user_id = 0;
     217
     218                // We'll need a user ID when not on the user admin
     219                if ( ! empty( $_GET['user_id'] ) ) {
     220                        $user_id = $_GET['user_id'];
     221
     222                // Assume the current user ID
    434223                } else {
    435                         $this->redirect = $redirect_to;
    436 
    437                         do_action_ref_array( 'bp_members_admin_update_user', array( $doaction, $user_id, $_REQUEST, $this->redirect ) );
    438 
    439                         bp_core_redirect( $this->redirect );
    440                 }
    441         }
    442 
    443         /**
    444          * Display the user's profile.
    445          *
    446          * @access public
    447          * @since BuddyPress (2.0.0)
    448          */
    449         public function user_admin() {
    450 
    451                 if ( ! current_user_can( 'bp_moderate' ) ) {
    452                         die( '-1' );
    453                 }
    454 
    455                 $user = get_user_to_edit( $_GET['user_id'] );
    456 
    457                 // Construct URL for form
    458                 $form_url        = remove_query_arg( array( 'action', 'error', 'updated', 'spam', 'ham' ), $_SERVER['REQUEST_URI'] );
    459                 $form_url        = esc_url( add_query_arg( 'action', 'update', $form_url ) );
    460                 $wp_http_referer = remove_query_arg( array( 'action', 'updated' ), $_REQUEST['wp_http_referer'] );
    461 
    462                 // Prepare notice for admin
    463                 $notice = array();
     224                        $user_id = get_current_user_id();
     225                }
     226
     227                return intval( $user_id );
     228        }
     229
     230        /**
     231         * Can the current user edit the one displayed
     232         *
     233         * self profile editing / or bp_moderate check.
     234         * This might be replaced by more granular capabilities
     235         * in the future.
     236         *
     237         * @access public
     238         * @since BuddyPress (2.1.0)
     239         */
     240        private function member_can_edit( $user_id = 0 ) {
     241                $retval = false;
     242
     243                // Bail if no user ID was passed
     244                if ( empty( $user_id ) ) {
     245                        return $retval;
     246                }
     247
     248                // Member can edit if they are viewing their own profile
     249                if ( $this->current_user_id === $user_id ) {
     250                        $retval = true;
     251
     252                // Trust the 'bp_moderate' capability
     253                } else {
     254                        $retval = bp_current_user_can( 'bp_moderate' );
     255                }
     256
     257                return $retval;
     258        }
     259
     260        /**
     261         * Get admin notice when saving a user or member profile
     262         *
     263         * @since BuddyPress (2.1.0)
     264         *
     265         * @return array
     266         */
     267        private function get_user_notice() {
    464268
    465269                if ( ! empty( $_REQUEST['updated'] ) ) {
     
    533337                }
    534338
    535                 if ( ! empty( $notice ) ) :
    536                         if ( 'updated' === $notice['class'] ) : ?>
    537                                 <div id="message" class="<?php echo esc_attr( $notice['class'] ); ?>">
    538                         <?php else: ?>
    539                                 <div class="<?php echo esc_attr( $notice['class'] ); ?>">
     339                return $notice;
     340        }
     341
     342        /**
     343         * Create the /user/ admin Profile submenus for all members.
     344         *
     345         * @access public
     346         * @since BuddyPress (2.1.0)
     347         *
     348         * @uses add_submenu_page() To add the Edit Profile page in Profile section.
     349         */
     350        public function user_profile_menu() {
     351
     352                // Setup the hooks array
     353                $hooks = array();
     354
     355                // Add the faux "Edit Profile" submenu page
     356                $hooks['user'] = $this->user_page = add_submenu_page(
     357                        'profile.php',
     358                        __( 'Edit Profile',  'buddypress' ),
     359                        __( 'Edit Profile',  'buddypress' ),
     360                        'exist',
     361                        'bp-profile-edit',
     362                        array( $this, 'user_admin' )
     363                );
     364
     365                // Setup the screen ID's
     366                $this->screen_id = array(
     367                        $this->user_page    . '-user',
     368                        $this->user_profile . '-user'
     369                );
     370
     371                // Loop through new hooks and add method actions
     372                foreach ( $hooks as $key => $hook ) {
     373                        add_action( "load-{$hook}", array( $this, $key . '_admin_load' ) );
     374                }
     375
     376                // Add the profile_admin_head method to proper admin_head actions
     377                add_action( "admin_head-{$this->user_page}", array( $this, 'profile_admin_head' ) );
     378                add_action( "admin_head-profile.php",        array( $this, 'profile_admin_head' ) );
     379        }
     380
     381        /**
     382         * Create the All Users / Profile > Edit Profile and All Users Signups submenus.
     383         *
     384         * @access public
     385         * @since BuddyPress (2.0.0)
     386         *
     387         * @uses add_submenu_page() To add the Edit Profile page in Users/Profile section.
     388         */
     389        public function admin_menus() {
     390
     391                // Setup the hooks array
     392                $hooks = array();
     393
     394                // Manage user's profile
     395                $hooks['user'] = $this->user_page = add_submenu_page(
     396                        $this->user_profile . '.php',
     397                        __( 'Edit Profile',  'buddypress' ),
     398                        __( 'Edit Profile',  'buddypress' ),
     399                        'read',
     400                        'bp-profile-edit',
     401                        array( $this, 'user_admin' )
     402                );
     403
     404                // Only show sign-ups where they belong
     405                if ( ! is_multisite() || is_network_admin() ) {
     406
     407                        // Manage signups
     408                        $hooks['signups'] = $this->signups_page = add_users_page(
     409                                __( 'Manage Signups',  'buddypress' ),
     410                                __( 'Manage Signups',  'buddypress' ),
     411                                $this->capability,
     412                                'bp-signups',
     413                                array( $this, 'signups_admin' )
     414                        );
     415                }
     416
     417                $edit_page         = 'user-edit';
     418                $profile_page      = 'profile';
     419                $this->users_page  = 'users';
     420
     421                // Self profile check is needed for this pages
     422                $page_head = array(
     423                        $edit_page        . '.php',
     424                        $profile_page     . '.php',
     425                        $this->user_page,
     426                        $this->users_page . '.php',
     427                );
     428
     429                // Append '-network' to each array item if in network admin
     430                if ( is_network_admin() ) {
     431                        $edit_page          .= '-network';
     432                        $profile_page       .= '-network';
     433                        $this->user_page    .= '-network';
     434                        $this->users_page   .= '-network';
     435                        $this->signups_page .= '-network';
     436                }
     437
     438                // Setup the screen ID's
     439                $this->screen_id = array(
     440                        $edit_page,
     441                        $this->user_page,
     442                        $profile_page
     443                );
     444
     445                // Loop through new hooks and add method actions
     446                foreach ( $hooks as $key => $hook ) {
     447                        add_action( "load-{$hook}", array( $this, $key . '_admin_load' ) );
     448                }
     449
     450                // Add the profile_admin_head method to proper admin_head actions
     451                foreach ( $page_head as $head ) {
     452                        add_action( "admin_head-{$head}", array( $this, 'profile_admin_head' ) );
     453                }               
     454        }
     455
     456        /**
     457         * Highlight the Users menu if on Edit Profile.
     458         *
     459         * + Check if on the user's admin profile
     460         *
     461         * @access public
     462         * @since BuddyPress (2.1.0)
     463         */
     464        public function profile_admin_head() {
     465                global $submenu_file, $parent_file;
     466
     467                // Is the user editing their own profile?
     468                if ( is_user_admin() || ( defined( 'IS_PROFILE_PAGE' ) && IS_PROFILE_PAGE ) ) {
     469                        $this->is_self_profile = true;
     470
     471                // Is the user attempting to edit their own profile
     472                } else {
     473                        $this->is_self_profile = (bool) ( $this->get_user_id() === $this->current_user_id );
     474                }
     475
     476                // Force the parent file to users.php to open the correct top level menu
     477                $parent_file  = 'users.php';
     478                $submenu_file = 'users.php';
     479
     480                // Editing your own profile, so recheck some vars
     481                if ( true === $this->is_self_profile ) {
     482
     483                        // Use profile.php as the edit page
     484                        $edit_page = 'profile.php';
     485
     486                        // Set profile.php as the parent & sub files to correct the menu nav
     487                        if ( is_blog_admin() || is_user_admin() ) {
     488                                $parent_file  = 'profile.php';
     489                                $submenu_file = 'profile.php';
     490                        }
     491
     492                // Not editing yourserf, so use user-edit.php
     493                } else {
     494                        $edit_page = 'user-edit.php';
     495                }
     496
     497                if ( is_user_admin() ) {
     498                        $this->edit_profile_url = add_query_arg( $this->edit_profile_args, user_admin_url( 'profile.php' ) );
     499                        $this->edit_url         = user_admin_url( 'profile.php' );
     500
     501                } elseif ( is_blog_admin() ) {
     502                        $this->edit_profile_url = add_query_arg( $this->edit_profile_args, admin_url( 'users.php' ) );
     503                        $this->edit_url         = admin_url( $edit_page );
     504
     505                } elseif ( is_network_admin() ) {
     506                        $this->edit_profile_url = add_query_arg( $this->edit_profile_args, network_admin_url( 'users.php' ) );
     507                        $this->edit_url         = network_admin_url( $edit_page );
     508                }
     509        }
     510
     511        /**
     512         * Remove the Edit Profile page.
     513         *
     514         * We add these pages in order to integrate with WP's Users panel, but
     515         * we want them to show up as a row action of the WP panel, not as separate
     516         * subnav items under the Users menu.
     517         *
     518         * @access public
     519         * @since BuddyPress (2.0.0)
     520         */
     521        public function admin_head() {
     522                remove_submenu_page( 'users.php',   'bp-profile-edit' );
     523                remove_submenu_page( 'profile.php', 'bp-profile-edit' );
     524        }
     525
     526        /** Community Profile *****************************************************/
     527
     528        /**
     529         * Add some specific styling to the Edit User and Edit User's Profile page.
     530         *
     531         * @access public
     532         * @since BuddyPress (2.0.0)
     533         */
     534        public function enqueue_scripts() {
     535                if ( ! in_array( get_current_screen()->id, $this->screen_id ) ) {
     536                        return;
     537                }
     538
     539                $min = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
     540
     541                $css = $this->css_url . "admin{$min}.css";
     542                $css = apply_filters( 'bp_members_admin_css', $css );
     543                wp_enqueue_style( 'bp-members-css', $css, array(), bp_get_version() );
     544
     545                // Only load javascript for BuddyPress profile
     546                if ( get_current_screen()->id == $this->user_page ) {
     547                        $js = $this->js_url . "admin{$min}.js";
     548                        $js = apply_filters( 'bp_members_admin_js', $js );
     549                        wp_enqueue_script( 'bp-members-js', $js, array( 'jquery' ), bp_get_version(), true );
     550                }
     551
     552                // Plugins may want to hook here to load some css/js
     553                do_action( 'bp_members_admin_enqueue_scripts', get_current_screen()->id, $this->screen_id );
     554        }
     555
     556        /**
     557         * Create the Profile navigation in Edit User & Edit Profile pages.
     558         *
     559         * @access public
     560         * @since BuddyPress (2.0.0)
     561         */
     562        public function profile_nav( $user = null, $active = 'WordPress' ) {
     563
     564                // Bail if no user ID exists here
     565                if ( empty( $user->ID ) ) {
     566                        return;
     567                }
     568
     569                // Add the user ID to query agruments when not editing yourself
     570                if ( false === $this->is_self_profile ) {
     571                        $query_args = array( 'user_id' => $user->ID );
     572                } else {
     573                        $query_args = array();
     574                }
     575
     576                // Conditionally add a referer if it exists in the existing request
     577                if ( ! empty( $_REQUEST['wp_http_referer'] ) ) {
     578                        $query_args['wp_http_referer'] = urlencode( stripslashes_deep( $_REQUEST['wp_http_referer'] ) );
     579                }
     580
     581                // Setup the two distinct "edit" URL's
     582                $community_url = add_query_arg( $query_args, $this->edit_profile_url );
     583                $wordpress_url = add_query_arg( $query_args, $this->edit_url         );
     584
     585                $bp_active = false;
     586                $wp_active = ' nav-tab-active';
     587                if ( 'BuddyPress' === $active ) {
     588                        $bp_active = ' nav-tab-active';
     589                        $wp_active = false;
     590                } ?>
     591
     592                <h2 id="profile-nav" class="nav-tab-wrapper">
     593                        <?php
     594                        /**
     595                         * In configs where BuddyPress is not network activated, as regular
     596                         * admins do not have the capacity to edit other users, we must add
     597                         * this check.
     598                         */
     599                        if ( current_user_can( 'edit_user', $user->ID ) ) : ?>
     600
     601                                <a class="nav-tab<?php echo esc_attr( $wp_active ); ?>" href="<?php echo esc_url( $wordpress_url );?>"><?php _e( 'Profile', 'buddypress' ); ?></a>
     602
    540603                        <?php endif; ?>
     604
     605                        <a class="nav-tab<?php echo esc_attr( $bp_active ); ?>" href="<?php echo esc_url( $community_url );?>"><?php _e( 'Extended Profile', 'buddypress' ); ?></a>
     606                </h2>
     607
     608                <?php
     609        }
     610
     611        /**
     612         * Set up the user's profile admin page.
     613         *
     614         * Loaded before the page is rendered, this function does all initial
     615         * setup, including: processing form requests, registering contextual
     616         * help, and setting up screen options.
     617         *
     618         * @access public
     619         * @since BuddyPress (2.0.0)
     620         */
     621        public function user_admin_load() {
     622
     623                // Get the user ID
     624                $user_id = $this->get_user_id();
     625
     626                // can current user edit this profile ?
     627                if ( ! $this->member_can_edit( $user_id ) ) {
     628                        wp_die( __( 'You cannot edit the requested user.', 'buddypress' ) );
     629                }
     630
     631                // Build redirection URL
     632                $redirect_to = remove_query_arg( array( 'action', 'error', 'updated', 'spam', 'ham', 'delete_avatar' ), $_SERVER['REQUEST_URI'] );
     633                $doaction    = ! empty( $_REQUEST['action'] ) ? $_REQUEST['action'] : false;
     634
     635                if ( ! empty( $_REQUEST['user_status'] ) ) {
     636                        $spam = (bool) ( 'spam' === $_REQUEST['user_status'] );
     637
     638                        if ( $spam !== bp_is_user_spammer( $user_id ) ) {
     639                                $doaction = $_REQUEST['user_status'];
     640                        }
     641                }
     642
     643                // Call an action for plugins to hook in early
     644                do_action_ref_array( 'bp_members_admin_load', array( $doaction, $_REQUEST ) );
     645
     646                // Allowed actions
     647                $allowed_actions = apply_filters( 'bp_members_admin_allowed_actions', array( 'update', 'delete_avatar', 'spam', 'ham' ) );
     648
     649                // Prepare the display of the Community Profile screen
     650                if ( ! in_array( $doaction, $allowed_actions ) ) {
     651                        add_screen_option( 'layout_columns', array( 'default' => 2, 'max' => 2, ) );
     652
     653                        get_current_screen()->add_help_tab( array(
     654                                'id'      => 'bp-profile-edit-overview',
     655                                'title'   => __( 'Overview', 'buddypress' ),
     656                                'content' =>
     657                                '<p>' . __( 'This is the admin view of a user&#39;s profile.', 'buddypress' ) . '</p>' .
     658                                '<p>' . __( 'In the main column, you can edit the fields of the user&#39;s extended profile.', 'buddypress' ) . '</p>' .
     659                                '<p>' . __( 'In the right-hand column, you can update the user&#39;s status, delete the user&#39;s avatar, and view recent statistics.', 'buddypress' ) . '</p>'
     660                        ) );
     661
     662                        // Help panel - sidebar links
     663                        get_current_screen()->set_help_sidebar(
     664                                '<p><strong>' . __( 'For more information:', 'buddypress' ) . '</strong></p>' .
     665                                '<p>' . __( '<a href="http://codex.buddypress.org/buddypress-site-administration/managing-user-profiles/">Managing Profiles</a>', 'buddypress' ) . '</p>' .
     666                                '<p>' . __( '<a href="http://buddypress.org/support/">Support Forums</a>', 'buddypress' ) . '</p>'
     667                        );
     668
     669                        // Register metaboxes for the edit screen.
     670                        add_meta_box(
     671                                'submitdiv',
     672                                _x( 'Status', 'members user-admin edit screen', 'buddypress' ),
     673                                array( $this, 'user_admin_status_metabox' ),
     674                                get_current_screen()->id,
     675                                'side',
     676                                'core'
     677                        );
     678
     679                        // In case xprofile is not active
     680                        $this->stats_metabox->context  = 'normal';
     681                        $this->stats_metabox->priority = 'core';
     682
     683                        /**
     684                         * xProfile Hooks to load the profile fields if component is active
     685                         * Plugins should not use this hook, please use 'bp_members_admin_user_metaboxes' instead
     686                         */
     687                        do_action_ref_array( 'bp_members_admin_xprofile_metabox', array( $user_id, get_current_screen()->id, $this->stats_metabox ) );
     688
     689                        // If xProfile is inactive, difficult to know what's profile we're on
     690                        $display_name = '';
     691                        if ( 'normal' === $this->stats_metabox->context ) {
     692                                $display_name = ' - ' . bp_core_get_user_displayname( $user_id );
     693                        }
     694
     695                        // User Stat metabox
     696                        add_meta_box(
     697                                'bp_members_admin_user_stats',
     698                                sprintf( _x( 'Stats%s', 'members user-admin edit screen', 'buddypress' ), $display_name ),
     699                                array( $this, 'user_admin_stats_metabox' ),
     700                                get_current_screen()->id,
     701                                sanitize_key( $this->stats_metabox->context ),
     702                                sanitize_key( $this->stats_metabox->priority )
     703                        );
     704
     705                        /**
     706                         * Custom metabox ?
     707                         * Plugins can restrict metabox to "bp_moderate" admins checking
     708                         * the first argument ($this->is_self_profile) is false in their hook
     709                         * They can also restruct their metabox to self profile editing
     710                         * by cheking it set to true.
     711                         */
     712                        do_action( 'bp_members_admin_user_metaboxes', $this->is_self_profile, $user_id );
     713
     714                        // Enqueue javascripts
     715                        wp_enqueue_script( 'postbox'   );
     716                        wp_enqueue_script( 'dashboard' );
     717
     718                // Spam or Ham user
     719                } elseif ( in_array( $doaction, array( 'spam', 'ham' ) ) && empty( $this->is_self_profile ) ) {
     720
     721                        check_admin_referer( 'edit-bp-profile_' . $user_id );
     722
     723                        if ( bp_core_process_spammer_status( $user_id, $doaction ) ) {
     724                                $redirect_to = add_query_arg( 'updated', $doaction, $redirect_to );
     725                        } else {
     726                                $redirect_to = add_query_arg( 'error', $doaction, $redirect_to );
     727                        }
     728
     729                        bp_core_redirect( $redirect_to );
     730
     731                // Update other stuff once above ones are done
     732                } else {
     733                        $this->redirect = $redirect_to;
     734
     735                        do_action_ref_array( 'bp_members_admin_update_user', array( $doaction, $user_id, $_REQUEST, $this->redirect ) );
     736
     737                        bp_core_redirect( $this->redirect );
     738                }
     739        }
     740
     741        /**
     742         * Display the user's profile.
     743         *
     744         * @access public
     745         * @since BuddyPress (2.0.0)
     746         */
     747        public function user_admin() {
     748
     749                if ( ! bp_current_user_can( 'bp_moderate' ) && empty( $this->is_self_profile ) ) {
     750                        die( '-1' );
     751                }
     752
     753                // Get the user ID
     754                $user_id = $this->get_user_id();
     755                $user    = get_user_to_edit( $user_id );
     756
     757                // Construct title
     758                if ( true === $this->is_self_profile ) {
     759                        $title = __( 'Profile',   'buddypress' );
     760                } else {
     761                        $title = __( 'Edit User', 'buddypress' );
     762                }
     763
     764                // Construct URL for form
     765                $form_url        = remove_query_arg( array( 'action', 'error', 'updated', 'spam', 'ham' ), $_SERVER['REQUEST_URI'] );
     766                $form_url        = add_query_arg( 'action', 'update', $form_url );
     767                $wp_http_referer = false;
     768                if ( ! empty( $_REQUEST['wp_http_referer'] ) ) {
     769                        $wp_http_referer = remove_query_arg( array( 'action', 'updated' ), $_REQUEST['wp_http_referer'] );
     770                }
     771
     772                // Prepare notice for admin
     773                $notice = $this->get_user_notice();
     774
     775                if ( ! empty( $notice ) ) : ?>
     776
     777                        <div <?php if ( 'updated' === $notice['class'] ) : ?>id="message" <?php endif; ?>class="<?php echo esc_attr( $notice['class'] ); ?>">
     778
    541779                                <p><?php echo esc_html( $notice['message'] ); ?></p>
     780
    542781                                <?php if ( !empty( $wp_http_referer ) && ( 'updated' === $notice['class'] ) ) : ?>
     782
    543783                                        <p><a href="<?php echo esc_url( $wp_http_referer ); ?>"><?php esc_html_e( '&larr; Back to Users', 'buddypress' ); ?></a></p>
     784
    544785                                <?php endif; ?>
     786
    545787                        </div>
     788
    546789                <?php endif; ?>
    547790
    548                 <div class="wrap"  id="community-profile-page">
     791                <div class="wrap" id="community-profile-page">
    549792                        <?php screen_icon( 'users' ); ?>
    550                         <h2>
    551                                 <?php
    552                                 _e( 'Edit User', 'buddypress' );
    553                                 if ( current_user_can( 'create_users' ) ) { ?>
    554                                         <a href="user-new.php" class="add-new-h2"><?php echo esc_html_x( 'Add New', 'user', 'buddypress' ); ?></a>
    555                                 <?php } elseif ( is_multisite() && current_user_can( 'promote_users' ) ) { ?>
    556                                         <a href="user-new.php" class="add-new-h2"><?php echo esc_html_x( 'Add Existing', 'user', 'buddypress' ); ?></a>
    557                                 <?php }
    558                                 ?>
     793                        <h2><?php echo esc_html( $title ); ?>
     794
     795                                <?php if ( empty( $this->is_self_profile ) ) : ?>
     796
     797                                        <?php if ( current_user_can( 'create_users' ) ) : ?>
     798
     799                                                <a href="user-new.php" class="add-new-h2"><?php echo esc_html_x( 'Add New', 'user', 'buddypress' ); ?></a>
     800
     801                                        <?php elseif ( is_multisite() && current_user_can( 'promote_users' ) ) : ?>
     802
     803                                                <a href="user-new.php" class="add-new-h2"><?php echo esc_html_x( 'Add Existing', 'user', 'buddypress' ); ?></a>
     804
     805                                        <?php endif; ?>
     806
     807                                <?php endif; ?>
    559808                        </h2>
    560809
     
    563812                                $this->profile_nav( $user, 'BuddyPress' ); ?>
    564813
    565                                 <form action="<?php echo esc_attr( $form_url ); ?>" id="your-profile" method="post">
     814                                <form action="<?php echo esc_url( $form_url ); ?>" id="your-profile" method="post">
    566815                                        <div id="poststuff">
    567816
     
    589838
    590839                        <?php else : ?>
     840
    591841                                <p><?php printf( __( 'No user found with this ID. <a href="%s">Go back and try again</a>.', 'buddypress' ), esc_url( bp_get_admin_url( 'users.php' ) ) ); ?></p>
     842
    592843                        <?php endif; ?>
    593844
     
    615866                }
    616867
    617                 if ( ( isset( $user->user_status ) && 2 == $user->user_status ) ) {
    618                         echo '<p class="not-activated">' . esc_html__( 'User account has not yet been activated', 'buddypress' ) . '</p><br/>';
    619                         return;
    620                 }
    621                 ?>
     868                // Bail if user has not been activated yet (how didy ou get here?)
     869                if ( isset( $user->user_status ) && ( 2 == $user->user_status ) ) : ?>
     870
     871                        <p class="not-activated"><?php esc_html_e( 'User account has not yet been activated', 'buddypress' ); ?></p><br/>
     872
     873                        <?php return;
     874
     875                endif; ?>
    622876
    623877                <div class="submitbox" id="submitcomment">
     
    637891                                         * admins as spammers.
    638892                                         */
    639                                         if ( ( get_current_user_id() !== $user->ID ) && ( ! in_array( $user->user_login, get_super_admins() ) ) &&  empty( $this->subsite_activated ) || ( ! empty( $this->subsite_activated ) && current_user_can( 'manage_network_users' ) ) ) : ?>
     893                                        if ( ( empty( $this->is_self_profile ) && ( ! in_array( $user->user_login, get_super_admins() ) ) && empty( $this->subsite_activated ) ) || ( ! empty( $this->subsite_activated ) && current_user_can( 'manage_network_users' ) ) ) : ?>
     894
    640895                                                <div class="misc-pub-section" id="comment-status-radio">
    641896                                                        <label class="approved"><input type="radio" name="user_status" value="ham" <?php checked( $is_spammer, false ); ?>><?php esc_html_e( 'Active', 'buddypress' ); ?></label><br />
    642897                                                        <label class="spam"><input type="radio" name="user_status" value="spam" <?php checked( $is_spammer, true ); ?>><?php esc_html_e( 'Spammer', 'buddypress' ); ?></label>
    643898                                                </div>
     899
    644900                                        <?php endif ;?>
    645901
    646902                                        <div class="misc-pub-section curtime misc-pub-section-last">
    647903                                                <?php
     904
    648905                                                // translators: Publish box date format, see http://php.net/date
    649906                                                $datef = __( 'M j, Y @ G:i', 'buddypress' );
     
    680937         */
    681938        public function user_admin_spammer_metabox( $user = null ) {
    682                 ?>
     939        ?>
    683940                <p><?php printf( __( '%s has been marked as a spammer. All BuddyPress data associated with the user has been removed', 'buddypress' ), esc_html( bp_core_get_user_displayname( $user->ID ) ) ) ;?></p>
    684                 <?php
     941        <?php
    685942        }
    686943
     
    695952        public function user_admin_stats_metabox( $user = null ) {
    696953
     954                // Bail if no user ID
    697955                if ( empty( $user->ID ) ) {
    698956                        return;
     
    712970
    713971                <ul>
    714                         <li class="bp-members-profile-stats"><?php printf( __( 'Last active: <strong>%1$s</strong>', 'buddypress' ), $date ); ?></li>
     972                        <li class="bp-members-profile-stats"><?php printf( __( 'Last active: %1$s', 'buddypress' ), '<strong>' . $date . '</strong>' ); ?></li>
    715973
    716974                        <?php
     
    737995        public function row_actions( $actions = '', $user = null ) {
    738996
    739                 $edit_profile = add_query_arg( array(
    740                         'user_id'         => $user->ID,
    741                         'wp_http_referer' => urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ),
    742                 ), $this->edit_profile_url );
    743 
    744                 $edit_profile_link = sprintf( '<a href="%1$s">%2$s</a>',  esc_url( $edit_profile ), esc_html__( 'Extended', 'buddypress' ) );
    745 
    746                 /**
    747                  * Check the edit action is available
    748                  * and preserve the order edit | profile | remove/delete
    749                  */
    750                 if ( ! empty( $actions['edit'] ) ) {
    751                         $edit_action = $actions['edit'];
    752                         unset( $actions['edit'] );
    753 
    754                         $new_edit_actions = array(
    755                                 'edit'         => $edit_action,
    756                                 'edit-profile' => $edit_profile_link,
    757                         );
    758                 // if not available simply add the edit profile action
    759                 } else {
    760                         $new_edit_actions = array( 'edit-profile' => $edit_profile_link );
    761                 }
    762 
    763                 return array_merge( $new_edit_actions, $actions );
    764         }
    765 
    766         /** Signups Management ***********************************************/
     997                // Bail if no user ID
     998                if ( empty( $user->ID ) ) {
     999                        return;
     1000                }
     1001
     1002                // Setup args array
     1003                $args = array();
     1004
     1005                // Add the user ID if it's not for the current user
     1006                if ( $user->ID !== $this->current_user_id ) {
     1007                        $args['user_id'] = $user->ID;
     1008                }
     1009
     1010                // Add the referer
     1011                $args['wp_http_referer'] = urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) );
     1012
     1013                // Add the "Extended" link if the current user can edit this user
     1014                if ( current_user_can( 'edit_user', $user->ID ) || bp_current_user_can( 'bp_moderate' ) ) {
     1015
     1016                        // Add query args and setup the Extended link
     1017                        $edit_profile      = add_query_arg( $args, $this->edit_profile_url );
     1018                        $edit_profile_link = sprintf( '<a href="%1$s">%2$s</a>',  esc_url( $edit_profile ), esc_html__( 'Extended', 'buddypress' ) );
     1019
     1020                        /**
     1021                         * Check the edit action is available
     1022                         * and preserve the order edit | profile | remove/delete
     1023                         */
     1024                        if ( ! empty( $actions['edit'] ) ) {
     1025                                $edit_action = $actions['edit'];
     1026                                unset( $actions['edit'] );
     1027
     1028                                $new_edit_actions = array(
     1029                                        'edit'         => $edit_action,
     1030                                        'edit-profile' => $edit_profile_link,
     1031                                );
     1032
     1033                        // If not available simply add the edit profile action
     1034                        } else {
     1035                                $new_edit_actions = array( 'edit-profile' => $edit_profile_link );
     1036                        }
     1037
     1038                        $actions = array_merge( $new_edit_actions, $actions );
     1039                }
     1040
     1041                return $actions;
     1042        }
     1043
     1044        /**
     1045         * Add a filter to edit profile url in WP Admin Bar
     1046         *
     1047         * @access public
     1048         * @since BuddyPress (2.1.0)
     1049         */
     1050        public function add_edit_profile_url_filter() {
     1051                add_filter( 'bp_members_edit_profile_url', array( $this, 'filter_adminbar_profile_link' ), 10, 3 );
     1052        }
     1053
     1054        /**
     1055         * Filter the profile url
     1056         *
     1057         * @access public
     1058         * @since BuddyPress (2.1.0)
     1059         *
     1060         * @uses  user_admin_url()
     1061         */
     1062        public function filter_adminbar_profile_link( $profile_link = '', $url = '', $user_id = 0 ) {
     1063                if ( ! is_super_admin( $user_id ) && is_admin() ) {
     1064                        $profile_link = user_admin_url( 'profile.php' );
     1065                }
     1066                return $profile_link;
     1067        }
     1068
     1069        /**
     1070         * Remove the filter to edit profile url in WP Admin Bar
     1071         *
     1072         * @access public
     1073         * @since BuddyPress (2.1.0)
     1074         */
     1075        public function remove_edit_profile_url_filter() {
     1076                remove_filter( 'bp_members_edit_profile_url', array( $this, 'filter_adminbar_profile_link' ), 10, 3 );
     1077        }
     1078
     1079        /** Signups Management ****************************************************/
    7671080
    7681081        /**
     
    8371150         */
    8381151        public function signup_filter_view( $views = array() ) {
    839                 $class = '';
    840 
    841                 $signups = BP_Signup::count_signups();
    842 
    843                 // Remove the 'current' class from All if we're on the signups
    844                 // view
     1152
     1153                // Remove the 'current' class from All if we're on the signups view
    8451154                if ( $this->signups_page == get_current_screen()->id ) {
    8461155                        $views['all'] = str_replace( 'class="current"', '', $views['all'] );
    847                         $class = ' class="current"';
    848                 }
    849 
    850                 $views['registered'] = '<a href="' . add_query_arg( 'page', 'bp-signups', bp_get_admin_url( 'users.php' ) ) . '"' . $class . '>' . sprintf( _x( 'Pending <span class="count">(%s)</span>', 'signup users', 'buddypress' ), number_format_i18n( $signups ) ) . '</a>';
     1156                        $class        = 'current';
     1157                } else {
     1158                        $class        = '';
     1159                }
     1160
     1161                $signups = BP_Signup::count_signups();
     1162                $url     = add_query_arg( 'page', 'bp-signups', bp_get_admin_url( 'users.php' ) );
     1163                $text    = sprintf( _x( 'Pending %s', 'signup users', 'buddypress' ), '<span class="count">(' . number_format_i18n( $signups ) . ')</span>' );
     1164
     1165                $views['registered'] = sprintf( '<a href="%1$s" class="%2$s">%3$s</a>', $url, $class, $text );
    8511166
    8521167                return $views;
     
    8911206                // Build redirection URL
    8921207                $redirect_to = remove_query_arg( array( 'action', 'error', 'updated', 'activated', 'notactivated', 'deleted', 'notdeleted', 'resent', 'notresent', 'do_delete', 'do_resend', 'do_activate', '_wpnonce', 'signup_ids' ), $_SERVER['REQUEST_URI'] );
    893                 $doaction = bp_admin_list_table_current_bulk_action();
     1208                $doaction    = bp_admin_list_table_current_bulk_action();
    8941209
    8951210                // Call an action for plugins to hook in early
     
    9001215
    9011216                // Prepare the display of the Community Profile screen
    902                 if ( ! in_array( $doaction, $allowed_actions ) || -1 == $doaction ) {
     1217                if ( ! in_array( $doaction, $allowed_actions ) || ( -1 == $doaction ) ) {
    9031218
    9041219                        if ( bp_core_do_network_admin() ) {
     
    9441259                        // Handle resent activation links
    9451260                        if ( 'do_resend' == $doaction ) {
     1261
    9461262                                // nonce check
    9471263                                check_admin_referer( 'signups_resend' );
     
    9701286                        // Handle activated accounts
    9711287                        } else if ( 'do_activate' == $doaction ) {
     1288
    9721289                                // nonce check
    9731290                                check_admin_referer( 'signups_activate' );
     
    9961313                        // Handle sign-ups delete
    9971314                        } else if ( 'do_delete' == $doaction ) {
     1315
    9981316                                // nonce check
    9991317                                check_admin_referer( 'signups_delete' );
     
    10371355         */
    10381356        public function signups_display_errors() {
     1357
     1358                // Look for sign-up errors
     1359                $errors = get_transient( '_bp_admin_signups_errors' );
     1360
    10391361                // Bail if no activation errors
    1040                 if ( ! $errors = get_transient( '_bp_admin_signups_errors' ) ) {
     1362                if ( empty( $errors ) ) {
    10411363                        return;
    10421364                }
    10431365
    1044                 foreach ( $errors as $error ) {
    1045                         ?>
     1366                // Loop through errors and display them
     1367                foreach ( $errors as $error ) : ?>
     1368
    10461369                        <li><?php echo esc_html( $error[0] );?>: <?php echo esc_html( $error[1] );?></li>
    1047                         <?php
    1048                 }
     1370
     1371                <?php endforeach;
    10491372
    10501373                // Delete the redirect transient
     
    10531376
    10541377        /**
    1055          * Signups admin page router.
    1056          *
    1057          * Depending on the context, display
    1058          * - the list of signups
    1059          * - or the delete confirmation screen
    1060          * - or the activate confirmation screen
    1061          * - or the "resend" email confirmation screen
    1062          *
    1063          * Also prepare the admin notices.
    1064          *
    1065          * @since BuddyPress (2.0.0)
    1066          */
    1067         public function signups_admin() {
    1068                 $doaction = bp_admin_list_table_current_bulk_action();
    1069 
    1070                 // Prepare notices for admin
     1378         * Get admin notice when viewing the sign-up page
     1379         *
     1380         * @since BuddyPress (2.1.0)
     1381         *
     1382         * @return array
     1383         */
     1384        private function get_signup_notice() {
     1385
     1386                // Setup empty notice for return value
    10711387                $notice = array();
    10721388
     1389                // Updated
    10731390                if ( ! empty( $_REQUEST['updated'] ) ) {
    10741391                        switch ( $_REQUEST['updated'] ) {
     
    12031520                }
    12041521
     1522                return $notice;
     1523        }
     1524
     1525        /**
     1526         * Signups admin page router.
     1527         *
     1528         * Depending on the context, display
     1529         * - the list of signups
     1530         * - or the delete confirmation screen
     1531         * - or the activate confirmation screen
     1532         * - or the "resend" email confirmation screen
     1533         *
     1534         * Also prepare the admin notices.
     1535         *
     1536         * @since BuddyPress (2.0.0)
     1537         */
     1538        public function signups_admin() {
     1539                $doaction = bp_admin_list_table_current_bulk_action();
     1540
     1541                // Prepare notices for admin
     1542                $notice = $this->get_signup_notice();
     1543
    12051544                // Display notices
    12061545                if ( ! empty( $notice ) ) :
    12071546                        if ( 'updated' === $notice['class'] ) : ?>
     1547
    12081548                                <div id="message" class="<?php echo esc_attr( $notice['class'] ); ?>">
     1549
    12091550                        <?php else: ?>
     1551
    12101552                                <div class="<?php echo esc_attr( $notice['class'] ); ?>">
     1553
    12111554                        <?php endif; ?>
     1555
    12121556                                <p><?php echo $notice['message']; ?></p>
     1557
    12131558                                <?php if ( ! empty( $_REQUEST['notactivated'] ) || ! empty( $_REQUEST['notdeleted'] ) || ! empty( $_REQUEST['notsent'] ) ) :?>
     1559
    12141560                                        <ul><?php $this->signups_display_errors();?></ul>
     1561
    12151562                                <?php endif ;?>
     1563
    12161564                        </div>
     1565
    12171566                <?php endif;
    12181567
     
    12821631                <div class="wrap">
    12831632                        <?php screen_icon( 'users' ); ?>
    1284                         <h2>
    1285                                 <?php
    1286                                 _e( 'Users', 'buddypress' );
    1287                                 if ( current_user_can( 'create_users' ) ) { ?>
     1633                        <h2><?php _e( 'Users', 'buddypress' ); ?>
     1634
     1635                                <?php if ( current_user_can( 'create_users' ) ) : ?>
     1636
    12881637                                        <a href="user-new.php" class="add-new-h2"><?php echo esc_html_x( 'Add New', 'user', 'buddypress' ); ?></a>
    1289                                 <?php } elseif ( is_multisite() && current_user_can( 'promote_users' ) ) { ?>
     1638
     1639                                <?php elseif ( is_multisite() && current_user_can( 'promote_users' ) ) : ?>
     1640
    12901641                                        <a href="user-new.php" class="add-new-h2"><?php echo esc_html_x( 'Add Existing', 'user', 'buddypress' ); ?></a>
    1291                                 <?php }
     1642
     1643                                <?php endif;
    12921644
    12931645                                if ( $usersearch ) {
     
    13031655                        <form id="bp-signups-search-form" action="<?php echo esc_url( $search_form_url ) ;?>">
    13041656                                <input type="hidden" name="page" value="<?php echo esc_attr( $plugin_page ); ?>" />
    1305                                 <?php $bp_members_signup_list_table->search_box( __( 'Search Pending Accounts', 'buddypress' ), 'bp-signups' ); ?>
     1657                                <?php $bp_members_signup_list_table->search_box( __( 'Search Pending Users', 'buddypress' ), 'bp-signups' ); ?>
    13061658                        </form>
    13071659
     
    13911743                        <ol class="bp-signups-list">
    13921744                        <?php foreach ( $signups as $signup ) :
    1393                                 $last_notified = mysql2date( 'Y/m/d g:i:s a', $signup->date_sent )
    1394                         ?>
     1745
     1746                                $last_notified = mysql2date( 'Y/m/d g:i:s a', $signup->date_sent ); ?>
    13951747
    13961748                                <li>
     
    13981750
    13991751                                        <?php if ( 'resend' == $action ) : ?>
     1752
    14001753                                                <p class="description">
    14011754                                                        <?php printf( esc_html__( 'Last notified: %s', 'buddypress'), $last_notified ) ;?>
    14021755
    14031756                                                        <?php if ( ! empty( $signup->recently_sent ) ) : ?>
     1757
    14041758                                                                <span class="attention wp-ui-text-notification"> <?php esc_html_e( '(less than 24 hours ago)', 'buddypress' ); ?></span>
     1759
    14051760                                                        <?php endif; ?>
    14061761                                                </p>
    14071762
    14081763                                        <?php endif; ?>
     1764
    14091765                                </li>
    14101766
     
    14121768                        </ol>
    14131769
    1414                         <?php if ( 'resend' != $action ) : ?>
     1770                        <?php if ( 'delete' === $action ) : ?>
     1771
    14151772                                <p><strong><?php esc_html_e( 'This action cannot be undone.', 'buddypress' ) ?></strong></p>
     1773
    14161774                        <?php endif ; ?>
    14171775
Note: See TracChangeset for help on using the changeset viewer.