Changeset 10521
- Timestamp:
- 02/05/2016 05:15:55 AM (9 years ago)
- Location:
- trunk/src/bp-members
- Files:
-
- 6 edited
- 10 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/bp-members/admin/bp-members-admin-classes.php
r10456 r10521 11 11 defined( 'ABSPATH' ) || exit; 12 12 13 if ( class_exists( 'WP_Users_List_Table') ) : 14 15 /** 16 * List table class for signups admin page. 17 * 18 * @since 2.0.0 19 */ 20 class BP_Members_List_Table extends WP_Users_List_Table { 21 22 /** 23 * Signup counts. 24 * 25 * @since 2.0.0 26 * 27 * @var int 28 */ 29 public $signup_counts = 0; 30 31 /** 32 * Constructor. 33 * 34 * @since 2.0.0 35 */ 36 public function __construct() { 37 // Define singular and plural labels, as well as whether we support AJAX. 38 parent::__construct( array( 39 'ajax' => false, 40 'plural' => 'signups', 41 'singular' => 'signup', 42 ) ); 43 } 44 45 /** 46 * Set up items for display in the list table. 47 * 48 * Handles filtering of data, sorting, pagination, and any other data 49 * manipulation required prior to rendering. 50 * 51 * @since 2.0.0 52 */ 53 public function prepare_items() { 54 global $usersearch; 55 56 $usersearch = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : ''; 57 $signups_per_page = $this->get_items_per_page( str_replace( '-', '_', "{$this->screen->id}_per_page" ) ); 58 $paged = $this->get_pagenum(); 59 60 $args = array( 61 'offset' => ( $paged - 1 ) * $signups_per_page, 62 'number' => $signups_per_page, 63 'usersearch' => $usersearch, 64 'orderby' => 'signup_id', 65 'order' => 'DESC' 66 ); 67 68 if ( isset( $_REQUEST['orderby'] ) ) { 69 $args['orderby'] = $_REQUEST['orderby']; 70 } 71 72 if ( isset( $_REQUEST['order'] ) ) { 73 $args['order'] = $_REQUEST['order']; 74 } 75 76 $signups = BP_Signup::get( $args ); 77 78 $this->items = $signups['signups']; 79 $this->signup_counts = $signups['total']; 80 81 $this->set_pagination_args( array( 82 'total_items' => $this->signup_counts, 83 'per_page' => $signups_per_page, 84 ) ); 85 } 86 87 /** 88 * Get the views (the links above the WP List Table). 89 * 90 * @since 2.0.0 91 * 92 * @uses WP_Users_List_Table::get_views() to get the users views. 93 */ 94 public function get_views() { 95 $views = parent::get_views(); 96 97 // Remove the 'current' class from the 'All' link. 98 $views['all'] = str_replace( 'class="current"', '', $views['all'] ); 99 $views['registered'] = sprintf( '<a href="%1$s" class="current">%2$s</a>', esc_url( add_query_arg( 'page', 'bp-signups', bp_get_admin_url( 'users.php' ) ) ), sprintf( _x( 'Pending %s', 'signup users', 'buddypress' ), '<span class="count">(' . number_format_i18n( $this->signup_counts ) . ')</span>' ) ); 100 101 return $views; 102 } 103 104 /** 105 * Get rid of the extra nav. 106 * 107 * WP_Users_List_Table will add an extra nav to change user's role. 108 * As we're dealing with signups, we don't need this. 109 * 110 * @since 2.0.0 111 * 112 * @param array $which Current table nav item. 113 */ 114 public function extra_tablenav( $which ) { 115 return; 116 } 117 118 /** 119 * Specific signups columns. 120 * 121 * @since 2.0.0 122 * 123 * @return array 124 */ 125 public function get_columns() { 126 127 /** 128 * Filters the single site Members signup columns. 129 * 130 * @since 2.0.0 131 * 132 * @param array $value Array of columns to display. 133 */ 134 return apply_filters( 'bp_members_signup_columns', array( 135 'cb' => '<input type="checkbox" />', 136 'username' => __( 'Username', 'buddypress' ), 137 'name' => __( 'Name', 'buddypress' ), 138 'email' => __( 'Email', 'buddypress' ), 139 'registered' => __( 'Registered', 'buddypress' ), 140 'date_sent' => __( 'Last Sent', 'buddypress' ), 141 'count_sent' => __( 'Emails Sent', 'buddypress' ) 142 ) ); 143 } 144 145 /** 146 * Specific bulk actions for signups. 147 * 148 * @since 2.0.0 149 */ 150 public function get_bulk_actions() { 151 $actions = array( 152 'activate' => _x( 'Activate', 'Pending signup action', 'buddypress' ), 153 'resend' => _x( 'Email', 'Pending signup action', 'buddypress' ), 154 ); 155 156 if ( current_user_can( 'delete_users' ) ) { 157 $actions['delete'] = __( 'Delete', 'buddypress' ); 158 } 159 160 return $actions; 161 } 162 163 /** 164 * The text shown when no items are found. 165 * 166 * Nice job, clean sheet! 167 * 168 * @since 2.0.0 169 */ 170 public function no_items() { 171 172 if ( bp_get_signup_allowed() ) { 173 esc_html_e( 'No pending accounts found.', 'buddypress' ); 174 } else { 175 $link = false; 176 177 // Specific case when BuddyPress is not network activated. 178 if ( is_multisite() && current_user_can( 'manage_network_users') ) { 179 $link = sprintf( '<a href="%1$s">%2$s</a>', esc_url( network_admin_url( 'settings.php' ) ), esc_html__( 'Edit settings', 'buddypress' ) ); 180 } elseif ( current_user_can( 'manage_options' ) ) { 181 $link = sprintf( '<a href="%1$s">%2$s</a>', esc_url( bp_get_admin_url( 'options-general.php' ) ), esc_html__( 'Edit settings', 'buddypress' ) ); 182 } 183 184 printf( __( 'Registration is disabled. %s', 'buddypress' ), $link ); 185 } 186 187 } 188 189 /** 190 * The columns signups can be reordered with. 191 * 192 * @since 2.0.0 193 */ 194 public function get_sortable_columns() { 195 return array( 196 'username' => 'login', 197 'email' => 'email', 198 'registered' => 'signup_id', 199 ); 200 } 201 202 /** 203 * Display signups rows. 204 * 205 * @since 2.0.0 206 */ 207 public function display_rows() { 208 $style = ''; 209 foreach ( $this->items as $userid => $signup_object ) { 210 211 // Avoid a notice error appearing since 4.3.0. 212 if ( isset( $signup_object->id ) ) { 213 $signup_object->ID = $signup_object->id; 214 } 215 216 $style = ( ' class="alternate"' == $style ) ? '' : ' class="alternate"'; 217 echo "\n\t" . $this->single_row( $signup_object, $style ); 218 } 219 } 220 221 /** 222 * Display a signup row. 223 * 224 * @since 2.0.0 225 * 226 * @see WP_List_Table::single_row() for explanation of params. 227 * 228 * @param object|null $signup_object Signup user object. 229 * @param string $style Styles for the row. 230 * @param string $role Role to be assigned to user. 231 * @param int $numposts Numper of posts. 232 * @return void 233 */ 234 public function single_row( $signup_object = null, $style = '', $role = '', $numposts = 0 ) { 235 echo '<tr' . $style . ' id="signup-' . esc_attr( $signup_object->id ) . '">'; 236 echo $this->single_row_columns( $signup_object ); 237 echo '</tr>'; 238 } 239 240 /** 241 * Markup for the checkbox used to select items for bulk actions. 242 * 243 * @since 2.0.0 244 * 245 * @param object|null $signup_object The signup data object. 246 */ 247 public function column_cb( $signup_object = null ) { 248 ?> 249 <label class="screen-reader-text" for="signup_<?php echo intval( $signup_object->id ); ?>"><?php printf( esc_html__( 'Select user: %s', 'buddypress' ), $signup_object->user_login ); ?></label> 250 <input type="checkbox" id="signup_<?php echo intval( $signup_object->id ) ?>" name="allsignups[]" value="<?php echo esc_attr( $signup_object->id ) ?>" /> 251 <?php 252 } 253 254 /** 255 * The row actions (delete/activate/email). 256 * 257 * @since 2.0.0 258 * 259 * @param object|null $signup_object The signup data object. 260 */ 261 public function column_username( $signup_object = null ) { 262 $avatar = get_avatar( $signup_object->user_email, 32 ); 263 264 // Activation email link. 265 $email_link = add_query_arg( 266 array( 267 'page' => 'bp-signups', 268 'signup_id' => $signup_object->id, 269 'action' => 'resend', 270 ), 271 bp_get_admin_url( 'users.php' ) 272 ); 273 274 // Activate link. 275 $activate_link = add_query_arg( 276 array( 277 'page' => 'bp-signups', 278 'signup_id' => $signup_object->id, 279 'action' => 'activate', 280 ), 281 bp_get_admin_url( 'users.php' ) 282 ); 283 284 // Delete link. 285 $delete_link = add_query_arg( 286 array( 287 'page' => 'bp-signups', 288 'signup_id' => $signup_object->id, 289 'action' => 'delete', 290 ), 291 bp_get_admin_url( 'users.php' ) 292 ); 293 294 echo $avatar . sprintf( '<strong><a href="%1$s" class="edit" title="%2$s">%3$s</a></strong><br/>', esc_url( $activate_link ), esc_attr__( 'Activate', 'buddypress' ), $signup_object->user_login ); 295 296 $actions = array(); 297 298 $actions['activate'] = sprintf( '<a href="%1$s">%2$s</a>', esc_url( $activate_link ), __( 'Activate', 'buddypress' ) ); 299 $actions['resend'] = sprintf( '<a href="%1$s">%2$s</a>', esc_url( $email_link ), __( 'Email', 'buddypress' ) ); 300 301 if ( current_user_can( 'delete_users' ) ) { 302 $actions['delete'] = sprintf( '<a href="%1$s" class="delete">%2$s</a>', esc_url( $delete_link ), __( 'Delete', 'buddypress' ) ); 303 } 304 305 /** 306 * Filters the multisite row actions for each user in list. 307 * 308 * @since 2.0.0 309 * 310 * @param array $actions Array of actions and corresponding links. 311 * @param object $signup_object The signup data object. 312 */ 313 $actions = apply_filters( 'bp_members_ms_signup_row_actions', $actions, $signup_object ); 314 315 echo $this->row_actions( $actions ); 316 } 317 318 /** 319 * Display user name, if any. 320 * 321 * @since 2.0.0 322 * 323 * @param object $signup_object The signup data object. 324 */ 325 public function column_name( $signup_object = null ) { 326 echo esc_html( $signup_object->user_name ); 327 } 328 329 /** 330 * Display user email. 331 * 332 * @since 2.0.0 333 * 334 * @param object|null $signup_object The signup data object. 335 */ 336 public function column_email( $signup_object = null ) { 337 printf( '<a href="mailto:%1$s">%2$s</a>', esc_attr( $signup_object->user_email ), esc_html( $signup_object->user_email ) ); 338 } 339 340 /** 341 * Display registration date. 342 * 343 * @since 2.0.0 344 * 345 * @param object|null $signup_object The signup data object. 346 */ 347 public function column_registered( $signup_object = null ) { 348 echo mysql2date( 'Y/m/d', $signup_object->registered ); 349 } 350 351 /** 352 * Display the last time an activation email has been sent. 353 * 354 * @since 2.0.0 355 * 356 * @param object|null $signup_object The signup data object. 357 */ 358 public function column_date_sent( $signup_object = null ) { 359 echo mysql2date( 'Y/m/d', $signup_object->date_sent ); 360 } 361 362 /** 363 * Display number of time an activation email has been sent. 364 * 365 * @since 2.0.0 366 * 367 * @param object|null $signup_object Signup object instance. 368 */ 369 public function column_count_sent( $signup_object = null ) { 370 echo absint( $signup_object->count_sent ); 371 } 372 373 /** 374 * Allow plugins to add their custom column. 375 * 376 * @since 2.1.0 377 * 378 * @param object|null $signup_object The signup data object. 379 * @param string $column_name The column name. 380 * @return string 381 */ 382 function column_default( $signup_object = null, $column_name = '' ) { 383 384 /** 385 * Filters the single site custom columns for plugins. 386 * 387 * @since 2.1.0 388 * 389 * @param string $column_name The column name. 390 * @param object $signup_object The signup data object. 391 */ 392 return apply_filters( 'bp_members_signup_custom_column', '', $column_name, $signup_object ); 393 } 13 if ( class_exists( 'WP_Users_List_Table' ) ) { 14 require dirname( dirname( __FILE__ ) ) . '/classes/class-bp-members-list-table.php'; 394 15 } 395 16 396 endif; 397 398 if ( class_exists( 'WP_MS_Users_List_Table' ) ) : 399 400 /** 401 * List table class for signups network admin page. 402 * 403 * @since 2.0.0 404 */ 405 class BP_Members_MS_List_Table extends WP_MS_Users_List_Table { 406 407 /** 408 * Signup counts. 409 * 410 * @since 2.0.0 411 * 412 * @var int 413 */ 414 public $signup_counts = 0; 415 416 /** 417 * Constructor. 418 * 419 * @since 2.0.0 420 */ 421 public function __construct() { 422 // Define singular and plural labels, as well as whether we support AJAX. 423 parent::__construct( array( 424 'ajax' => false, 425 'plural' => 'signups', 426 'singular' => 'signup', 427 ) ); 428 } 429 430 /** 431 * Set up items for display in the list table. 432 * 433 * Handles filtering of data, sorting, pagination, and any other data 434 * manipulation required prior to rendering. 435 * 436 * @since 2.0.0 437 */ 438 public function prepare_items() { 439 global $usersearch, $mode; 440 441 $usersearch = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : ''; 442 $signups_per_page = $this->get_items_per_page( str_replace( '-', '_', "{$this->screen->id}_per_page" ) ); 443 $paged = $this->get_pagenum(); 444 445 $args = array( 446 'offset' => ( $paged - 1 ) * $signups_per_page, 447 'number' => $signups_per_page, 448 'usersearch' => $usersearch, 449 'orderby' => 'signup_id', 450 'order' => 'DESC' 451 ); 452 453 if ( isset( $_REQUEST['orderby'] ) ) { 454 $args['orderby'] = $_REQUEST['orderby']; 455 } 456 457 if ( isset( $_REQUEST['order'] ) ) { 458 $args['order'] = $_REQUEST['order']; 459 } 460 461 $mode = empty( $_REQUEST['mode'] ) ? 'list' : $_REQUEST['mode']; 462 $signups = BP_Signup::get( $args ); 463 464 $this->items = $signups['signups']; 465 $this->signup_counts = $signups['total']; 466 467 $this->set_pagination_args( array( 468 'total_items' => $this->signup_counts, 469 'per_page' => $signups_per_page, 470 ) ); 471 } 472 473 /** 474 * Get the views : the links above the WP List Table. 475 * 476 * @since 2.0.0 477 * 478 * @uses WP_MS_Users_List_Table::get_views() to get the users views. 479 */ 480 public function get_views() { 481 $views = parent::get_views(); 482 483 // Remove the 'current' class from the 'All' link. 484 $views['all'] = str_replace( 'class="current"', '', $views['all'] ); 485 $views['registered'] = sprintf( '<a href="%1$s" class="current">%2$s</a>', esc_url( add_query_arg( 'page', 'bp-signups', network_admin_url( 'users.php' ) ) ), sprintf( _x( 'Pending %s', 'signup users', 'buddypress' ), '<span class="count">(' . number_format_i18n( $this->signup_counts ) . ')</span>' ) ); 486 487 return $views; 488 } 489 490 /** 491 * Specific signups columns. 492 * 493 * @since 2.0.0 494 * 495 * @return array 496 */ 497 public function get_columns() { 498 499 /** 500 * Filters the multisite Members signup columns. 501 * 502 * @since 2.0.0 503 * 504 * @param array $value Array of columns to display. 505 */ 506 return apply_filters( 'bp_members_ms_signup_columns', array( 507 'cb' => '<input type="checkbox" />', 508 'username' => __( 'Username', 'buddypress' ), 509 'name' => __( 'Name', 'buddypress' ), 510 'email' => __( 'Email', 'buddypress' ), 511 'registered' => __( 'Registered', 'buddypress' ), 512 'date_sent' => __( 'Last Sent', 'buddypress' ), 513 'count_sent' => __( 'Emails Sent', 'buddypress' ) 514 ) ); 515 } 516 517 /** 518 * Specific bulk actions for signups. 519 * 520 * @since 2.0.0 521 */ 522 public function get_bulk_actions() { 523 $actions = array( 524 'activate' => _x( 'Activate', 'Pending signup action', 'buddypress' ), 525 'resend' => _x( 'Email', 'Pending signup action', 'buddypress' ), 526 ); 527 528 if ( current_user_can( 'delete_users' ) ) { 529 $actions['delete'] = __( 'Delete', 'buddypress' ); 530 } 531 532 return $actions; 533 } 534 535 /** 536 * The text shown when no items are found. 537 * 538 * Nice job, clean sheet! 539 * 540 * @since 2.0.0 541 */ 542 public function no_items() { 543 if ( bp_get_signup_allowed() ) { 544 esc_html_e( 'No pending accounts found.', 'buddypress' ); 545 } else { 546 $link = false; 547 548 if ( current_user_can( 'manage_network_users' ) ) { 549 $link = sprintf( '<a href="%1$s">%2$s</a>', esc_url( network_admin_url( 'settings.php' ) ), esc_html__( 'Edit settings', 'buddypress' ) ); 550 } 551 552 printf( __( 'Registration is disabled. %s', 'buddypress' ), $link ); 553 } 554 } 555 556 /** 557 * The columns signups can be reordered with. 558 * 559 * @since 2.0.0 560 */ 561 public function get_sortable_columns() { 562 return array( 563 'username' => 'login', 564 'email' => 'email', 565 'registered' => 'signup_id', 566 ); 567 } 568 569 /** 570 * Display signups rows. 571 * 572 * @since 2.0.0 573 */ 574 public function display_rows() { 575 $style = ''; 576 foreach ( $this->items as $userid => $signup_object ) { 577 578 // Avoid a notice error appearing since 4.3.0. 579 if ( isset( $signup_object->id ) ) { 580 $signup_object->ID = $signup_object->id; 581 } 582 583 $style = ( ' class="alternate"' == $style ) ? '' : ' class="alternate"'; 584 echo "\n\t" . $this->single_row( $signup_object, $style ); 585 } 586 } 587 588 /** 589 * Display a signup row. 590 * 591 * @since 2.0.0 592 * 593 * @see WP_List_Table::single_row() for explanation of params. 594 * 595 * @param object|null $signup_object Signup user object. 596 * @param string $style Styles for the row. 597 */ 598 public function single_row( $signup_object = null, $style = '' ) { 599 echo '<tr' . $style . ' id="signup-' . esc_attr( $signup_object->id ) . '">'; 600 echo $this->single_row_columns( $signup_object ); 601 echo '</tr>'; 602 } 603 604 /** 605 * Prevents regular users row actions to be output. 606 * 607 * @since 2.4.0 608 * 609 * @param object|null $signup_object Signup being acted upon. 610 * @param string $column_name Current column name. 611 * @param string $primary Primary column name. 612 * @return string 613 */ 614 protected function handle_row_actions( $signup_object = null, $column_name = '', $primary = '' ) { 615 return ''; 616 } 617 618 /** 619 * Markup for the checkbox used to select items for bulk actions. 620 * 621 * @since 2.0.0 622 * 623 * @param object|null $signup_object The signup data object. 624 */ 625 public function column_cb( $signup_object = null ) { 626 ?> 627 <label class="screen-reader-text" for="signup_<?php echo intval( $signup_object->id ); ?>"><?php printf( esc_html__( 'Select user: %s', 'buddypress' ), $signup_object->user_login ); ?></label> 628 <input type="checkbox" id="signup_<?php echo intval( $signup_object->id ) ?>" name="allsignups[]" value="<?php echo esc_attr( $signup_object->id ) ?>" /> 629 <?php 630 } 631 632 /** 633 * The row actions (delete/activate/email). 634 * 635 * @since 2.0.0 636 * 637 * @param object|null $signup_object The signup data object. 638 */ 639 public function column_username( $signup_object = null ) { 640 $avatar = get_avatar( $signup_object->user_email, 32 ); 641 642 // Activation email link. 643 $email_link = add_query_arg( 644 array( 645 'page' => 'bp-signups', 646 'signup_id' => $signup_object->id, 647 'action' => 'resend', 648 ), 649 network_admin_url( 'users.php' ) 650 ); 651 652 // Activate link. 653 $activate_link = add_query_arg( 654 array( 655 'page' => 'bp-signups', 656 'signup_id' => $signup_object->id, 657 'action' => 'activate', 658 ), 659 network_admin_url( 'users.php' ) 660 ); 661 662 // Delete link. 663 $delete_link = add_query_arg( 664 array( 665 'page' => 'bp-signups', 666 'signup_id' => $signup_object->id, 667 'action' => 'delete', 668 ), 669 network_admin_url( 'users.php' ) 670 ); 671 672 echo $avatar . sprintf( '<strong><a href="%1$s" class="edit" title="%2$s">%3$s</a></strong><br/>', esc_url( $activate_link ), esc_attr__( 'Activate', 'buddypress' ), $signup_object->user_login ); 673 674 $actions = array(); 675 676 $actions['activate'] = sprintf( '<a href="%1$s">%2$s</a>', esc_url( $activate_link ), __( 'Activate', 'buddypress' ) ); 677 $actions['resend'] = sprintf( '<a href="%1$s">%2$s</a>', esc_url( $email_link ), __( 'Email', 'buddypress' ) ); 678 679 if ( current_user_can( 'delete_users' ) ) { 680 $actions['delete'] = sprintf( '<a href="%1$s" class="delete">%2$s</a>', esc_url( $delete_link ), __( 'Delete', 'buddypress' ) ); 681 } 682 683 /** This filter is documented in bp-members/admin/bp-members-classes.php */ 684 $actions = apply_filters( 'bp_members_ms_signup_row_actions', $actions, $signup_object ); 685 686 echo $this->row_actions( $actions ); 687 } 688 689 /** 690 * Display user name, if any. 691 * 692 * @since 2.0.0 693 * 694 * @param object|null $signup_object The signup data object. 695 */ 696 public function column_name( $signup_object = null ) { 697 echo esc_html( $signup_object->user_name ); 698 } 699 700 /** 701 * Display user email. 702 * 703 * @since 2.0.0 704 * 705 * @param object|null $signup_object The signup data object. 706 */ 707 public function column_email( $signup_object = null ) { 708 printf( '<a href="mailto:%1$s">%2$s</a>', esc_attr( $signup_object->user_email ), esc_html( $signup_object->user_email ) ); 709 } 710 711 /** 712 * Display registration date. 713 * 714 * @since 2.0.0 715 * 716 * @param object|null $signup_object The signup data object. 717 */ 718 public function column_registered( $signup_object = null ) { 719 global $mode; 720 721 if ( 'list' === $mode ) { 722 $date = 'Y/m/d'; 723 } else { 724 $date = 'Y/m/d \<\b\r \/\> g:i:s a'; 725 } 726 727 echo mysql2date( $date, $signup_object->registered ) . "</td>"; 728 } 729 730 /** 731 * Display the last time an activation email has been sent. 732 * 733 * @since 2.0.0 734 * 735 * @param object|null $signup_object Signup object instance. 736 */ 737 public function column_date_sent( $signup_object = null ) { 738 global $mode; 739 740 if ( 'list' === $mode ) { 741 $date = 'Y/m/d'; 742 } else { 743 $date = 'Y/m/d \<\b\r \/\> g:i:s a'; 744 } 745 746 echo mysql2date( $date, $signup_object->date_sent ); 747 } 748 749 /** 750 * Display number of time an activation email has been sent. 751 * 752 * @since 2.0.0 753 * 754 * @param object|null $signup_object Signup object instance. 755 */ 756 public function column_count_sent( $signup_object = null ) { 757 echo absint( $signup_object->count_sent ); 758 } 759 760 /** 761 * Allow plugins to add their custom column. 762 * 763 * @since 2.1.0 764 * 765 * @param object|null $signup_object The signup data object. 766 * @param string $column_name The column name. 767 * @return string 768 */ 769 function column_default( $signup_object = null, $column_name = '' ) { 770 771 /** 772 * Filters the multisite custom columns for plugins. 773 * 774 * @since 2.1.0 775 * 776 * @param string $column_name The column name. 777 * @param object $signup_object The signup data object. 778 */ 779 return apply_filters( 'bp_members_ms_signup_custom_column', '', $column_name, $signup_object ); 780 } 17 if ( class_exists( 'WP_MS_Users_List_Table' ) ) { 18 require dirname( dirname( __FILE__ ) ) . '/classes/class-bp-members-ms-list-table.php'; 781 19 } 782 783 endif; -
trunk/src/bp-members/bp-members-admin.php
r10461 r10521 11 11 defined( 'ABSPATH' ) || exit; 12 12 13 if ( !class_exists( 'BP_Members_Admin' ) ) : 14 15 /** 16 * Load Members admin area. 17 * 18 * @since 2.0.0 19 */ 20 class BP_Members_Admin { 21 22 /** Directory *************************************************************/ 23 24 /** 25 * Path to the BP Members Admin directory. 26 * 27 * @var string $admin_dir 28 */ 29 public $admin_dir = ''; 30 31 /** URLs ******************************************************************/ 32 33 /** 34 * URL to the BP Members Admin directory. 35 * 36 * @var string $admin_url 37 */ 38 public $admin_url = ''; 39 40 /** 41 * URL to the BP Members Admin CSS directory. 42 * 43 * @var string $css_url 44 */ 45 public $css_url = ''; 46 47 /** 48 * URL to the BP Members Admin JS directory. 49 * 50 * @var string 51 */ 52 public $js_url = ''; 53 54 /** Other *****************************************************************/ 55 56 /** 57 * Screen id for edit user's profile page. 58 * 59 * @var string 60 */ 61 public $user_page = ''; 62 63 /** 64 * Setup BP Members Admin. 65 * 66 * @since 2.0.0 67 * 68 * @uses buddypress() to get BuddyPress main instance. 69 */ 70 public static function register_members_admin() { 71 if ( ! is_admin() ) { 72 return; 73 } 74 75 $bp = buddypress(); 76 77 if ( empty( $bp->members->admin ) ) { 78 $bp->members->admin = new self; 79 } 80 81 return $bp->members->admin; 82 } 83 84 /** 85 * Constructor method. 86 * 87 * @since 2.0.0 88 */ 89 public function __construct() { 90 $this->setup_globals(); 91 $this->setup_actions(); 92 } 93 94 /** 95 * Set admin-related globals. 96 * 97 * @since 2.0.0 98 */ 99 private function setup_globals() { 100 $bp = buddypress(); 101 102 // Paths and URLs 103 $this->admin_dir = trailingslashit( $bp->plugin_dir . 'bp-members/admin' ); // Admin path. 104 $this->admin_url = trailingslashit( $bp->plugin_url . 'bp-members/admin' ); // Admin URL. 105 $this->css_url = trailingslashit( $this->admin_url . 'css' ); // Admin CSS URL. 106 $this->js_url = trailingslashit( $this->admin_url . 'js' ); // Admin CSS URL. 107 108 // Capability depends on config. 109 $this->capability = bp_core_do_network_admin() ? 'manage_network_users' : 'edit_users'; 110 111 // The Edit Profile Screen id. 112 $this->user_page = ''; 113 114 // The Show Profile Screen id. 115 $this->user_profile = is_network_admin() ? 'users' : 'profile'; 116 117 // The current user id. 118 $this->current_user_id = get_current_user_id(); 119 120 // The user id being edited. 121 $this->user_id = 0; 122 123 // Is a member editing their own profile. 124 $this->is_self_profile = false; 125 126 // The screen ids to load specific css for. 127 $this->screen_id = array(); 128 129 // The stats metabox default position. 130 $this->stats_metabox = new StdClass(); 131 132 // BuddyPress edit user's profile args. 133 $this->edit_profile_args = array( 'page' => 'bp-profile-edit' ); 134 $this->edit_profile_url = ''; 135 $this->edit_url = ''; 136 137 // Data specific to signups. 138 $this->users_page = ''; 139 $this->signups_page = ''; 140 $this->users_url = bp_get_admin_url( 'users.php' ); 141 $this->users_screen = bp_core_do_network_admin() ? 'users-network' : 'users'; 142 143 // Specific config: BuddyPress is not network activated. 144 $this->subsite_activated = (bool) is_multisite() && ! bp_is_network_activated(); 145 146 // When BuddyPress is not network activated, only Super Admin can moderate signups. 147 if ( ! empty( $this->subsite_activated ) ) { 148 $this->capability = 'manage_network_users'; 149 } 150 } 151 152 /** 153 * Set admin-related actions and filters. 154 * 155 * @since 2.0.0 156 */ 157 private function setup_actions() { 158 159 /** Extended Profile ************************************************* 160 */ 161 162 // Enqueue all admin JS and CSS. 163 add_action( 'bp_admin_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); 164 165 // Add some page specific output to the <head>. 166 add_action( 'bp_admin_head', array( $this, 'admin_head' ), 999 ); 167 168 // Add menu item to all users menu. 169 add_action( 'admin_menu', array( $this, 'admin_menus' ), 5 ); 170 add_action( 'network_admin_menu', array( $this, 'admin_menus' ), 5 ); 171 add_action( 'user_admin_menu', array( $this, 'user_profile_menu' ), 5 ); 172 173 // Create the Profile Navigation (Profile/Extended Profile). 174 add_action( 'edit_user_profile', array( $this, 'profile_nav' ), 99, 1 ); 175 add_action( 'show_user_profile', array( $this, 'profile_nav' ), 99, 1 ); 176 177 // Editing users of a specific site. 178 add_action( "admin_head-site-users.php", array( $this, 'profile_admin_head' ) ); 179 180 // Add a row action to users listing. 181 if ( bp_core_do_network_admin() ) { 182 add_filter( 'ms_user_row_actions', array( $this, 'row_actions' ), 10, 2 ); 183 add_action( 'admin_init', array( $this, 'add_edit_profile_url_filter' ) ); 184 add_action( 'wp_after_admin_bar_render', array( $this, 'remove_edit_profile_url_filter' ) ); 185 } 186 187 // Add user row actions for single site. 188 add_filter( 'user_row_actions', array( $this, 'row_actions' ), 10, 2 ); 189 190 // Process changes to member type. 191 add_action( 'bp_members_admin_load', array( $this, 'process_member_type_update' ) ); 192 193 /** Signups ********************************************************** 194 */ 195 196 if ( is_admin() ) { 197 198 // Filter non multisite user query to remove sign-up users. 199 if ( ! is_multisite() ) { 200 add_action( 'pre_user_query', array( $this, 'remove_signups_from_user_query' ), 10, 1 ); 201 } 202 203 // Reorganise the views navigation in users.php and signups page. 204 if ( current_user_can( $this->capability ) ) { 205 $user_screen = $this->users_screen; 206 207 /** 208 * Users screen on multiblog is users, but signups 209 * need to be managed in the network for this case 210 */ 211 if ( bp_is_network_activated() && bp_is_multiblog_mode() && false === strpos( $user_screen, '-network' ) ) { 212 $user_screen .= '-network'; 213 } 214 215 add_filter( "views_{$user_screen}", array( $this, 'signup_filter_view' ), 10, 1 ); 216 add_filter( 'set-screen-option', array( $this, 'signup_screen_options' ), 10, 3 ); 217 } 218 } 219 } 220 221 /** 222 * Get the user ID. 223 * 224 * Look for $_GET['user_id']. If anything else, force the user ID to the 225 * current user's ID so they aren't left without a user to edit. 226 * 227 * @since 2.1.0 228 * 229 * @return int 230 */ 231 private function get_user_id() { 232 if ( ! empty( $this->user_id ) ) { 233 return $this->user_id; 234 } 235 236 $this->user_id = (int) get_current_user_id(); 237 238 // We'll need a user ID when not on self profile. 239 if ( ! empty( $_GET['user_id'] ) ) { 240 $this->user_id = (int) $_GET['user_id']; 241 } 242 243 return $this->user_id; 244 } 245 246 /** 247 * Can the current user edit the one displayed. 248 * 249 * Self profile editing / or bp_moderate check. 250 * This might be replaced by more granular capabilities 251 * in the future. 252 * 253 * @since 2.1.0 254 * 255 * @param int $user_id ID of the user being checked for edit ability. 256 * 257 * @return bool 258 */ 259 private function member_can_edit( $user_id = 0 ) { 260 $retval = false; 261 262 // Bail if no user ID was passed. 263 if ( empty( $user_id ) ) { 264 return $retval; 265 } 266 267 // Member can edit if they are viewing their own profile. 268 if ( $this->current_user_id === $user_id ) { 269 $retval = true; 270 271 // Trust the 'bp_moderate' capability. 272 } else { 273 $retval = bp_current_user_can( 'bp_moderate' ); 274 } 275 276 return $retval; 277 } 278 279 /** 280 * Get admin notice when saving a user or member profile. 281 * 282 * @since 2.1.0 283 * 284 * @return array 285 */ 286 private function get_user_notice() { 287 288 // Setup empty notice for return value. 289 $notice = array(); 290 291 // Updates. 292 if ( ! empty( $_REQUEST['updated'] ) ) { 293 switch ( $_REQUEST['updated'] ) { 294 case 'avatar': 295 $notice = array( 296 'class' => 'updated', 297 'message' => __( 'Profile photo was deleted.', 'buddypress' ) 298 ); 299 break; 300 case 'ham' : 301 $notice = array( 302 'class' => 'updated', 303 'message' => __( 'User removed as spammer.', 'buddypress' ) 304 ); 305 break; 306 case 'spam' : 307 $notice = array( 308 'class' => 'updated', 309 'message' => __( 'User marked as spammer. Spam users are visible only to site admins.', 'buddypress' ) 310 ); 311 break; 312 case 1 : 313 $notice = array( 314 'class' => 'updated', 315 'message' => __( 'Profile updated.', 'buddypress' ) 316 ); 317 break; 318 } 319 } 320 321 // Errors. 322 if ( ! empty( $_REQUEST['error'] ) ) { 323 switch ( $_REQUEST['error'] ) { 324 case 'avatar': 325 $notice = array( 326 'class' => 'error', 327 'message' => __( 'There was a problem deleting that profile photo. Please try again.', 'buddypress' ) 328 ); 329 break; 330 case 'ham' : 331 $notice = array( 332 'class' => 'error', 333 'message' => __( 'User could not be removed as spammer.', 'buddypress' ) 334 ); 335 break; 336 case 'spam' : 337 $notice = array( 338 'class' => 'error', 339 'message' => __( 'User could not be marked as spammer.', 'buddypress' ) 340 ); 341 break; 342 case 1 : 343 $notice = array( 344 'class' => 'error', 345 'message' => __( 'An error occurred while trying to update the profile.', 'buddypress' ) 346 ); 347 break; 348 case 2: 349 $notice = array( 350 'class' => 'error', 351 'message' => __( 'Please make sure you fill in all required fields in this profile field group before saving.', 'buddypress' ) 352 ); 353 break; 354 case 3: 355 $notice = array( 356 'class' => 'error', 357 'message' => __( 'There was a problem updating some of your profile information. Please try again.', 'buddypress' ) 358 ); 359 break; 360 } 361 } 362 363 return $notice; 364 } 365 366 /** 367 * Create the /user/ admin Profile submenus for all members. 368 * 369 * @since 2.1.0 370 * 371 * @uses add_submenu_page() To add the Edit Profile page in Profile section. 372 */ 373 public function user_profile_menu() { 374 375 // Setup the hooks array. 376 $hooks = array(); 377 378 // Add the faux "Edit Profile" submenu page. 379 $hooks['user'] = $this->user_page = add_submenu_page( 380 'profile.php', 381 __( 'Edit Profile', 'buddypress' ), 382 __( 'Edit Profile', 'buddypress' ), 383 'exist', 384 'bp-profile-edit', 385 array( $this, 'user_admin' ) 386 ); 387 388 // Setup the screen ID's. 389 $this->screen_id = array( 390 $this->user_page . '-user', 391 $this->user_profile . '-user' 392 ); 393 394 // Loop through new hooks and add method actions. 395 foreach ( $hooks as $key => $hook ) { 396 add_action( "load-{$hook}", array( $this, $key . '_admin_load' ) ); 397 } 398 399 // Add the profile_admin_head method to proper admin_head actions. 400 add_action( "admin_head-{$this->user_page}", array( $this, 'profile_admin_head' ) ); 401 add_action( "admin_head-profile.php", array( $this, 'profile_admin_head' ) ); 402 } 403 404 /** 405 * Create the All Users / Profile > Edit Profile and All Users Signups submenus. 406 * 407 * @since 2.0.0 408 * 409 * @uses add_submenu_page() To add the Edit Profile page in Users/Profile section. 410 */ 411 public function admin_menus() { 412 413 // Setup the hooks array. 414 $hooks = array(); 415 416 // Manage user's profile. 417 $hooks['user'] = $this->user_page = add_submenu_page( 418 $this->user_profile . '.php', 419 __( 'Edit Profile', 'buddypress' ), 420 __( 'Edit Profile', 'buddypress' ), 421 'read', 422 'bp-profile-edit', 423 array( $this, 'user_admin' ) 424 ); 425 426 // Only show sign-ups where they belong. 427 if ( ( ! bp_is_network_activated() && ! is_network_admin() ) || ( is_network_admin() && bp_is_network_activated() ) ) { 428 429 // Manage signups. 430 $hooks['signups'] = $this->signups_page = add_users_page( 431 __( 'Manage Signups', 'buddypress' ), 432 __( 'Manage Signups', 'buddypress' ), 433 $this->capability, 434 'bp-signups', 435 array( $this, 'signups_admin' ) 436 ); 437 } 438 439 $edit_page = 'user-edit'; 440 $profile_page = 'profile'; 441 $this->users_page = 'users'; 442 443 // Self profile check is needed for this pages. 444 $page_head = array( 445 $edit_page . '.php', 446 $profile_page . '.php', 447 $this->user_page, 448 $this->users_page . '.php', 449 ); 450 451 // Append '-network' to each array item if in network admin. 452 if ( is_network_admin() ) { 453 $edit_page .= '-network'; 454 $profile_page .= '-network'; 455 $this->user_page .= '-network'; 456 $this->users_page .= '-network'; 457 $this->signups_page .= '-network'; 458 } 459 460 // Setup the screen ID's. 461 $this->screen_id = array( 462 $edit_page, 463 $this->user_page, 464 $profile_page 465 ); 466 467 // Loop through new hooks and add method actions. 468 foreach ( $hooks as $key => $hook ) { 469 add_action( "load-{$hook}", array( $this, $key . '_admin_load' ) ); 470 } 471 472 // Add the profile_admin_head method to proper admin_head actions. 473 foreach ( $page_head as $head ) { 474 add_action( "admin_head-{$head}", array( $this, 'profile_admin_head' ) ); 475 } 476 } 477 478 /** 479 * Highlight the Users menu if on Edit Profile and check if on the user's admin profile. 480 * 481 * @since 2.1.0 482 */ 483 public function profile_admin_head() { 484 global $submenu_file, $parent_file; 485 486 // Is the user editing their own profile? 487 if ( is_user_admin() || ( defined( 'IS_PROFILE_PAGE' ) && IS_PROFILE_PAGE ) ) { 488 $this->is_self_profile = true; 489 490 // Is the user attempting to edit their own profile. 491 } elseif ( isset( $_GET['user_id' ] ) || ( isset( $_GET['page'] ) && ( 'bp-profile-edit' === $_GET['page'] ) ) ) { 492 $this->is_self_profile = (bool) ( $this->get_user_id() === $this->current_user_id ); 493 } 494 495 // Force the parent file to users.php to open the correct top level menu 496 // but only if not editing a site via the network site editing page. 497 if ( 'sites.php' !== $parent_file ) { 498 $parent_file = 'users.php'; 499 $submenu_file = 'users.php'; 500 } 501 502 // Editing your own profile, so recheck some vars. 503 if ( true === $this->is_self_profile ) { 504 505 // Use profile.php as the edit page. 506 $edit_page = 'profile.php'; 507 508 // Set profile.php as the parent & sub files to correct the menu nav. 509 if ( is_blog_admin() || is_user_admin() ) { 510 $parent_file = 'profile.php'; 511 $submenu_file = 'profile.php'; 512 } 513 514 // Not editing yourself, so use user-edit.php. 515 } else { 516 $edit_page = 'user-edit.php'; 517 } 518 519 if ( is_user_admin() ) { 520 $this->edit_profile_url = add_query_arg( $this->edit_profile_args, user_admin_url( 'profile.php' ) ); 521 $this->edit_url = user_admin_url( 'profile.php' ); 522 523 } elseif ( is_blog_admin() ) { 524 $this->edit_profile_url = add_query_arg( $this->edit_profile_args, admin_url( 'users.php' ) ); 525 $this->edit_url = admin_url( $edit_page ); 526 527 } elseif ( is_network_admin() ) { 528 $this->edit_profile_url = add_query_arg( $this->edit_profile_args, network_admin_url( 'users.php' ) ); 529 $this->edit_url = network_admin_url( $edit_page ); 530 } 531 } 532 533 /** 534 * Remove the Edit Profile page. 535 * 536 * We add these pages in order to integrate with WP's Users panel, but 537 * we want them to show up as a row action of the WP panel, not as separate 538 * subnav items under the Users menu. 539 * 540 * @since 2.0.0 541 */ 542 public function admin_head() { 543 remove_submenu_page( 'users.php', 'bp-profile-edit' ); 544 remove_submenu_page( 'profile.php', 'bp-profile-edit' ); 545 } 546 547 /** Community Profile *****************************************************/ 548 549 /** 550 * Add some specific styling to the Edit User and Edit User's Profile page. 551 * 552 * @since 2.0.0 553 */ 554 public function enqueue_scripts() { 555 if ( ! in_array( get_current_screen()->id, $this->screen_id ) ) { 556 return; 557 } 558 559 $min = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; 560 $css = $this->css_url . "admin{$min}.css"; 561 562 /** 563 * Filters the CSS URL to enqueue in the Members admin area. 564 * 565 * @since 2.0.0 566 * 567 * @param string $css URL to the CSS admin file to load. 568 */ 569 $css = apply_filters( 'bp_members_admin_css', $css ); 570 571 wp_enqueue_style( 'bp-members-css', $css, array(), bp_get_version() ); 572 573 wp_style_add_data( 'bp-members-css', 'rtl', true ); 574 if ( $min ) { 575 wp_style_add_data( 'bp-members-css', 'suffix', $min ); 576 } 577 578 // Only load JavaScript for BuddyPress profile. 579 if ( get_current_screen()->id == $this->user_page ) { 580 $js = $this->js_url . "admin{$min}.js"; 581 582 /** 583 * Filters the JS URL to enqueue in the Members admin area. 584 * 585 * @since 2.0.0 586 * 587 * @param string $js URL to the JavaScript admin file to load. 588 */ 589 $js = apply_filters( 'bp_members_admin_js', $js ); 590 wp_enqueue_script( 'bp-members-js', $js, array( 'jquery' ), bp_get_version(), true ); 591 } 592 593 /** 594 * Fires after all of the members JavaScript and CSS are enqueued. 595 * 596 * @since 2.0.0 597 * 598 * @param string $id ID of the current screen. 599 * @param array $screen_id Array of allowed screens to add scripts and styles to. 600 */ 601 do_action( 'bp_members_admin_enqueue_scripts', get_current_screen()->id, $this->screen_id ); 602 } 603 604 /** 605 * Create the Profile navigation in Edit User & Edit Profile pages. 606 * 607 * @since 2.0.0 608 * 609 * @param object|null $user User to create profile navigation for. 610 * @param string $active Which profile to highlight. 611 * @return string 612 */ 613 public function profile_nav( $user = null, $active = 'WordPress' ) { 614 615 // Bail if no user ID exists here. 616 if ( empty( $user->ID ) ) { 617 return; 618 } 619 620 // Add the user ID to query arguments when not editing yourself. 621 if ( false === $this->is_self_profile ) { 622 $query_args = array( 'user_id' => $user->ID ); 623 } else { 624 $query_args = array(); 625 } 626 627 // Conditionally add a referer if it exists in the existing request. 628 if ( ! empty( $_REQUEST['wp_http_referer'] ) ) { 629 $query_args['wp_http_referer'] = urlencode( stripslashes_deep( $_REQUEST['wp_http_referer'] ) ); 630 } 631 632 // Setup the two distinct "edit" URL's. 633 $community_url = add_query_arg( $query_args, $this->edit_profile_url ); 634 $wordpress_url = add_query_arg( $query_args, $this->edit_url ); 635 636 $bp_active = false; 637 $wp_active = ' nav-tab-active'; 638 if ( 'BuddyPress' === $active ) { 639 $bp_active = ' nav-tab-active'; 640 $wp_active = false; 641 } ?> 642 643 <h2 id="profile-nav" class="nav-tab-wrapper"> 644 <?php 645 /** 646 * In configs where BuddyPress is not network activated, as regular 647 * admins do not have the capacity to edit other users, we must add 648 * this check. 649 */ 650 if ( current_user_can( 'edit_user', $user->ID ) ) : ?> 651 652 <a class="nav-tab<?php echo esc_attr( $wp_active ); ?>" href="<?php echo esc_url( $wordpress_url );?>"><?php _e( 'Profile', 'buddypress' ); ?></a> 653 654 <?php endif; ?> 655 656 <a class="nav-tab<?php echo esc_attr( $bp_active ); ?>" href="<?php echo esc_url( $community_url );?>"><?php _e( 'Extended Profile', 'buddypress' ); ?></a> 657 </h2> 658 659 <?php 660 } 661 662 /** 663 * Set up the user's profile admin page. 664 * 665 * Loaded before the page is rendered, this function does all initial 666 * setup, including: processing form requests, registering contextual 667 * help, and setting up screen options. 668 * 669 * @since 2.0.0 670 */ 671 public function user_admin_load() { 672 673 // Get the user ID. 674 $user_id = $this->get_user_id(); 675 676 // Can current user edit this profile? 677 if ( ! $this->member_can_edit( $user_id ) ) { 678 wp_die( __( 'You cannot edit the requested user.', 'buddypress' ) ); 679 } 680 681 // Build redirection URL. 682 $redirect_to = remove_query_arg( array( 'action', 'error', 'updated', 'spam', 'ham', 'delete_avatar' ), $_SERVER['REQUEST_URI'] ); 683 $doaction = ! empty( $_REQUEST['action'] ) ? $_REQUEST['action'] : false; 684 685 if ( ! empty( $_REQUEST['user_status'] ) ) { 686 $spam = (bool) ( 'spam' === $_REQUEST['user_status'] ); 687 688 if ( $spam !== bp_is_user_spammer( $user_id ) ) { 689 $doaction = $_REQUEST['user_status']; 690 } 691 } 692 693 /** 694 * Fires at the start of the signups admin load. 695 * 696 * @since 2.0.0 697 * 698 * @param string $doaction Current bulk action being processed. 699 * @param array $_REQUEST Current $_REQUEST global. 700 */ 701 do_action_ref_array( 'bp_members_admin_load', array( $doaction, $_REQUEST ) ); 702 703 /** 704 * Filters the allowed actions for use in the user admin page. 705 * 706 * @since 2.0.0 707 * 708 * @param array $value Array of allowed actions to use. 709 */ 710 $allowed_actions = apply_filters( 'bp_members_admin_allowed_actions', array( 'update', 'delete_avatar', 'spam', 'ham' ) ); 711 712 // Prepare the display of the Community Profile screen. 713 if ( ! in_array( $doaction, $allowed_actions ) ) { 714 add_screen_option( 'layout_columns', array( 'default' => 2, 'max' => 2, ) ); 715 716 get_current_screen()->add_help_tab( array( 717 'id' => 'bp-profile-edit-overview', 718 'title' => __( 'Overview', 'buddypress' ), 719 'content' => 720 '<p>' . __( 'This is the admin view of a user's profile.', 'buddypress' ) . '</p>' . 721 '<p>' . __( 'In the main column, you can edit the fields of the user's extended profile.', 'buddypress' ) . '</p>' . 722 '<p>' . __( 'In the right-hand column, you can update the user's status, delete the user's avatar, and view recent statistics.', 'buddypress' ) . '</p>' 723 ) ); 724 725 // Help panel - sidebar links. 726 get_current_screen()->set_help_sidebar( 727 '<p><strong>' . __( 'For more information:', 'buddypress' ) . '</strong></p>' . 728 '<p>' . __( '<a href="https://codex.buddypress.org/administrator-guide/extended-profiles/">Managing Profiles</a>', 'buddypress' ) . '</p>' . 729 '<p>' . __( '<a href="https://buddypress.org/support/">Support Forums</a>', 'buddypress' ) . '</p>' 730 ); 731 732 // Register metaboxes for the edit screen. 733 add_meta_box( 734 'submitdiv', 735 _x( 'Status', 'members user-admin edit screen', 'buddypress' ), 736 array( $this, 'user_admin_status_metabox' ), 737 get_current_screen()->id, 738 'side', 739 'core' 740 ); 741 742 // In case xprofile is not active. 743 $this->stats_metabox->context = 'normal'; 744 $this->stats_metabox->priority = 'core'; 745 746 /** 747 * Fires before loading the profile fields if component is active. 748 * 749 * Plugins should not use this hook, please use 'bp_members_admin_user_metaboxes' instead. 750 * 751 * @since 2.0.0 752 * 753 * @param int $user_id Current user ID for the screen. 754 * @param string $id Current screen ID. 755 * @param object $stats_metabox Object holding position data for use with the stats metabox. 756 */ 757 do_action_ref_array( 'bp_members_admin_xprofile_metabox', array( $user_id, get_current_screen()->id, $this->stats_metabox ) ); 758 759 // If xProfile is inactive, difficult to know what's profile we're on. 760 if ( 'normal' === $this->stats_metabox->context ) { 761 $display_name = bp_core_get_user_displayname( $user_id ); 762 } else { 763 $display_name = __( 'Member', 'buddypress' ); 764 } 765 766 // User Stat metabox. 767 add_meta_box( 768 'bp_members_admin_user_stats', 769 sprintf( _x( "%s's Stats", 'members user-admin edit screen', 'buddypress' ), $display_name ), 770 array( $this, 'user_admin_stats_metabox' ), 771 get_current_screen()->id, 772 sanitize_key( $this->stats_metabox->context ), 773 sanitize_key( $this->stats_metabox->priority ) 774 ); 775 776 // Member Type metabox. Only added if member types have been registered. 777 $member_types = bp_get_member_types(); 778 if ( ! empty( $member_types ) ) { 779 add_meta_box( 780 'bp_members_admin_member_type', 781 _x( 'Member Type', 'members user-admin edit screen', 'buddypress' ), 782 array( $this, 'user_admin_member_type_metabox' ), 783 get_current_screen()->id, 784 'side', 785 'core' 786 ); 787 } 788 789 /** 790 * Fires at the end of the Community Profile screen. 791 * 792 * Plugins can restrict metabox to "bp_moderate" admins by checking if 793 * the first argument ($this->is_self_profile) is false in their callback. 794 * They can also restrict their metabox to self profile editing 795 * by setting it to true. 796 * 797 * @since 2.0.0 798 * 799 * @param bool $is_self_profile Whether or not it is the current user's profile. 800 * @param int $user_id Current user ID. 801 */ 802 do_action( 'bp_members_admin_user_metaboxes', $this->is_self_profile, $user_id ); 803 804 // Enqueue JavaScript files. 805 wp_enqueue_script( 'postbox' ); 806 wp_enqueue_script( 'dashboard' ); 807 808 // Spam or Ham user. 809 } elseif ( in_array( $doaction, array( 'spam', 'ham' ) ) && empty( $this->is_self_profile ) ) { 810 811 check_admin_referer( 'edit-bp-profile_' . $user_id ); 812 813 if ( bp_core_process_spammer_status( $user_id, $doaction ) ) { 814 $redirect_to = add_query_arg( 'updated', $doaction, $redirect_to ); 815 } else { 816 $redirect_to = add_query_arg( 'error', $doaction, $redirect_to ); 817 } 818 819 bp_core_redirect( $redirect_to ); 820 821 // Update other stuff once above ones are done. 822 } else { 823 $this->redirect = $redirect_to; 824 825 /** 826 * Fires at end of user profile admin load if doaction does not match any available actions. 827 * 828 * @since 2.0.0 829 * 830 * @param string $doaction Current bulk action being processed. 831 * @param int $user_id Current user ID. 832 * @param array $_REQUEST Current $_REQUEST global. 833 * @param string $redirect Determined redirect url to send user to. 834 */ 835 do_action_ref_array( 'bp_members_admin_update_user', array( $doaction, $user_id, $_REQUEST, $this->redirect ) ); 836 837 bp_core_redirect( $this->redirect ); 838 } 839 } 840 841 /** 842 * Display the user's profile. 843 * 844 * @since 2.0.0 845 */ 846 public function user_admin() { 847 848 if ( ! bp_current_user_can( 'bp_moderate' ) && empty( $this->is_self_profile ) ) { 849 die( '-1' ); 850 } 851 852 // Get the user ID. 853 $user_id = $this->get_user_id(); 854 $user = get_user_to_edit( $user_id ); 855 856 // Construct title. 857 if ( true === $this->is_self_profile ) { 858 $title = __( 'Profile', 'buddypress' ); 859 } else { 860 $title = __( 'Edit User', 'buddypress' ); 861 } 862 863 // Construct URL for form. 864 $request_url = remove_query_arg( array( 'action', 'error', 'updated', 'spam', 'ham' ), $_SERVER['REQUEST_URI'] ); 865 $form_action_url = add_query_arg( 'action', 'update', $request_url ); 866 $wp_http_referer = false; 867 if ( ! empty( $_REQUEST['wp_http_referer'] ) ) { 868 $wp_http_referer = remove_query_arg( array( 'action', 'updated' ), $_REQUEST['wp_http_referer'] ); 869 } 870 871 // Prepare notice for admin. 872 $notice = $this->get_user_notice(); 873 874 if ( ! empty( $notice ) ) : ?> 875 876 <div <?php if ( 'updated' === $notice['class'] ) : ?>id="message" <?php endif; ?>class="<?php echo esc_attr( $notice['class'] ); ?>"> 877 878 <p><?php echo esc_html( $notice['message'] ); ?></p> 879 880 <?php if ( !empty( $wp_http_referer ) && ( 'updated' === $notice['class'] ) ) : ?> 881 882 <p><a href="<?php echo esc_url( $wp_http_referer ); ?>"><?php esc_html_e( '← Back to Users', 'buddypress' ); ?></a></p> 883 884 <?php endif; ?> 885 886 </div> 887 888 <?php endif; ?> 889 890 <div class="wrap" id="community-profile-page"> 891 <h1><?php echo esc_html( $title ); ?> 892 893 <?php if ( empty( $this->is_self_profile ) ) : ?> 894 895 <?php if ( current_user_can( 'create_users' ) ) : ?> 896 897 <a href="user-new.php" class="add-new-h2"><?php echo esc_html_x( 'Add New', 'user', 'buddypress' ); ?></a> 898 899 <?php elseif ( is_multisite() && current_user_can( 'promote_users' ) ) : ?> 900 901 <a href="user-new.php" class="add-new-h2"><?php echo esc_html_x( 'Add Existing', 'user', 'buddypress' ); ?></a> 902 903 <?php endif; ?> 904 905 <?php endif; ?> 906 </h1> 907 908 <?php if ( ! empty( $user ) ) : 909 910 $this->profile_nav( $user, 'BuddyPress' ); ?> 911 912 <form action="<?php echo esc_url( $form_action_url ); ?>" id="your-profile" method="post"> 913 <div id="poststuff"> 914 915 <div id="post-body" class="metabox-holder columns-<?php echo 1 == get_current_screen()->get_columns() ? '1' : '2'; ?>"> 916 917 <div id="postbox-container-1" class="postbox-container"> 918 <?php do_meta_boxes( get_current_screen()->id, 'side', $user ); ?> 919 </div> 920 921 <div id="postbox-container-2" class="postbox-container"> 922 <?php do_meta_boxes( get_current_screen()->id, 'normal', $user ); ?> 923 <?php do_meta_boxes( get_current_screen()->id, 'advanced', $user ); ?> 924 </div> 925 </div><!-- #post-body --> 926 927 </div><!-- #poststuff --> 928 929 <?php wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false ); ?> 930 <?php wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false ); ?> 931 <?php wp_nonce_field( 'edit-bp-profile_' . $user->ID ); ?> 932 933 </form> 934 935 <?php else : ?> 936 937 <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> 938 939 <?php endif; ?> 940 941 </div><!-- .wrap --> 942 <?php 943 } 944 945 /** 946 * Render the Status metabox for user's profile screen. 947 * 948 * Actions are: 949 * - Update profile fields if xProfile component is active 950 * - Spam/Unspam user 951 * 952 * @since 2.0.0 953 * 954 * @param WP_User|null $user The WP_User object to be edited. 955 */ 956 public function user_admin_status_metabox( $user = null ) { 957 958 // Bail if no user id or if the user has not activated their account yet. 959 if ( empty( $user->ID ) ) { 960 return; 961 } 962 963 // Bail if user has not been activated yet (how did you get here?). 964 if ( isset( $user->user_status ) && ( 2 == $user->user_status ) ) : ?> 965 966 <p class="not-activated"><?php esc_html_e( 'User account has not yet been activated', 'buddypress' ); ?></p><br/> 967 968 <?php return; 969 970 endif; ?> 971 972 <div class="submitbox" id="submitcomment"> 973 <div id="minor-publishing"> 974 <div id="misc-publishing-actions"> 975 <?php 976 977 // Get the spam status once here to compare against below. 978 $is_spammer = bp_is_user_spammer( $user->ID ); 979 980 /** 981 * In configs where BuddyPress is not network activated, 982 * regular admins cannot mark a user as a spammer on front 983 * end. This prevent them to do it in backend. 984 * 985 * Also prevent admins from marking themselves or other 986 * admins as spammers. 987 */ 988 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' ) ) ) : ?> 989 990 <div class="misc-pub-section" id="comment-status-radio"> 991 <label class="approved"><input type="radio" name="user_status" value="ham" <?php checked( $is_spammer, false ); ?>><?php esc_html_e( 'Active', 'buddypress' ); ?></label><br /> 992 <label class="spam"><input type="radio" name="user_status" value="spam" <?php checked( $is_spammer, true ); ?>><?php esc_html_e( 'Spammer', 'buddypress' ); ?></label> 993 </div> 994 995 <?php endif ;?> 996 997 <div class="misc-pub-section curtime misc-pub-section-last"> 998 <?php 999 1000 // Translators: Publish box date format, see http://php.net/date. 1001 $datef = __( 'M j, Y @ G:i', 'buddypress' ); 1002 $date = date_i18n( $datef, strtotime( $user->user_registered ) ); 1003 ?> 1004 <span id="timestamp"><?php printf( __( 'Registered on: %s', 'buddypress' ), '<strong>' . $date . '</strong>' ); ?></span> 1005 </div> 1006 </div> <!-- #misc-publishing-actions --> 1007 1008 <div class="clear"></div> 1009 </div><!-- #minor-publishing --> 1010 1011 <div id="major-publishing-actions"> 1012 1013 <div id="publishing-action"> 1014 <a class="button bp-view-profile" href="<?php echo esc_url( bp_core_get_user_domain( $user->ID ) ); ?>" target="_blank"><?php esc_html_e( 'View Profile', 'buddypress' ); ?></a> 1015 <?php submit_button( esc_html__( 'Update Profile', 'buddypress' ), 'primary', 'save', false ); ?> 1016 </div> 1017 <div class="clear"></div> 1018 </div><!-- #major-publishing-actions --> 1019 1020 </div><!-- #submitcomment --> 1021 1022 <?php 1023 } 1024 1025 /** 1026 * Render the fallback metabox in case a user has been marked as a spammer. 1027 * 1028 * @since 2.0.0 1029 * 1030 * @param WP_User|null $user The WP_User object to be edited. 1031 */ 1032 public function user_admin_spammer_metabox( $user = null ) { 1033 ?> 1034 <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> 1035 <?php 1036 } 1037 1038 /** 1039 * Render the Stats metabox to moderate inappropriate images. 1040 * 1041 * @since 2.0.0 1042 * 1043 * @param WP_User|null $user The WP_User object to be edited. 1044 */ 1045 public function user_admin_stats_metabox( $user = null ) { 1046 1047 // Bail if no user ID. 1048 if ( empty( $user->ID ) ) { 1049 return; 1050 } 1051 1052 // If account is not activated last activity is the time user registered. 1053 if ( isset( $user->user_status ) && 2 == $user->user_status ) { 1054 $last_active = $user->user_registered; 1055 1056 // Account is activated, getting user's last activity. 1057 } else { 1058 $last_active = bp_get_user_last_activity( $user->ID ); 1059 } 1060 1061 $datef = __( 'M j, Y @ G:i', 'buddypress' ); 1062 $date = date_i18n( $datef, strtotime( $last_active ) ); ?> 1063 1064 <ul> 1065 <li class="bp-members-profile-stats"><?php printf( __( 'Last active: %1$s', 'buddypress' ), '<strong>' . $date . '</strong>' ); ?></li> 1066 1067 <?php 1068 // Loading other stats only if user has activated their account. 1069 if ( empty( $user->user_status ) ) { 1070 1071 /** 1072 * Fires in the user stats metabox if the user has activated their account. 1073 * 1074 * @since 2.0.0 1075 * 1076 * @param array $value Array holding the user ID. 1077 * @param object $user Current displayed user object. 1078 */ 1079 do_action( 'bp_members_admin_user_stats', array( 'user_id' => $user->ID ), $user ); 1080 } 1081 ?> 1082 </ul> 1083 1084 <?php 1085 } 1086 1087 /** 1088 * Render the Member Type metabox. 1089 * 1090 * @since 2.2.0 1091 * 1092 * @param WP_User|null $user The WP_User object to be edited. 1093 */ 1094 public function user_admin_member_type_metabox( $user = null ) { 1095 1096 // Bail if no user ID. 1097 if ( empty( $user->ID ) ) { 1098 return; 1099 } 1100 1101 $types = bp_get_member_types( array(), 'objects' ); 1102 $current_type = bp_get_member_type( $user->ID ); 1103 ?> 1104 1105 <label for="bp-members-profile-member-type" class="screen-reader-text"><?php esc_html_e( 'Select member type', 'buddypress' ); ?></label> 1106 <select name="bp-members-profile-member-type" id="bp-members-profile-member-type"> 1107 <option value="" <?php selected( '', $current_type ); ?>><?php /* translators: no option picked in select box */ esc_attr_e( '----', 'buddypress' ) ?></option> 1108 <?php foreach ( $types as $type ) : ?> 1109 <option value="<?php echo esc_attr( $type->name ) ?>" <?php selected( $type->name, $current_type ) ?>><?php echo esc_html( $type->labels['singular_name'] ) ?></option> 1110 <?php endforeach; ?> 1111 </select> 1112 1113 <?php 1114 1115 wp_nonce_field( 'bp-member-type-change-' . $user->ID, 'bp-member-type-nonce' ); 1116 } 1117 1118 /** 1119 * Process changes from the Member Type metabox. 1120 * 1121 * @since 2.2.0 1122 */ 1123 public function process_member_type_update() { 1124 if ( ! isset( $_POST['bp-member-type-nonce'] ) || ! isset( $_POST['bp-members-profile-member-type'] ) ) { 1125 return; 1126 } 1127 1128 $user_id = $this->get_user_id(); 1129 1130 check_admin_referer( 'bp-member-type-change-' . $user_id, 'bp-member-type-nonce' ); 1131 1132 // Permission check. 1133 if ( ! current_user_can( 'bp_moderate' ) && $user_id != bp_loggedin_user_id() ) { 1134 return; 1135 } 1136 1137 // Member type string must either reference a valid member type, or be empty. 1138 $member_type = stripslashes( $_POST['bp-members-profile-member-type'] ); 1139 if ( ! empty( $member_type ) && ! bp_get_member_type_object( $member_type ) ) { 1140 return; 1141 } 1142 1143 /* 1144 * If an invalid member type is passed, someone's doing something 1145 * fishy with the POST request, so we can fail silently. 1146 */ 1147 if ( bp_set_member_type( $user_id, $member_type ) ) { 1148 // @todo Success messages can't be posted because other stuff happens on the page load. 1149 } 1150 } 1151 1152 /** 1153 * Add a link to Profile in Users listing row actions. 1154 * 1155 * @since 2.0.0 1156 * 1157 * @param array|string $actions WordPress row actions (edit, delete). 1158 * @param object|null $user The object for the user row. 1159 * @return array Merged actions. 1160 */ 1161 public function row_actions( $actions = '', $user = null ) { 1162 1163 // Bail if no user ID. 1164 if ( empty( $user->ID ) ) { 1165 return; 1166 } 1167 1168 // Setup args array. 1169 $args = array(); 1170 1171 // Add the user ID if it's not for the current user. 1172 if ( $user->ID !== $this->current_user_id ) { 1173 $args['user_id'] = $user->ID; 1174 } 1175 1176 // Add the referer. 1177 $args['wp_http_referer'] = urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ); 1178 1179 // Add the "Extended" link if the current user can edit this user. 1180 if ( current_user_can( 'edit_user', $user->ID ) || bp_current_user_can( 'bp_moderate' ) ) { 1181 1182 // Add query args and setup the Extended link. 1183 $edit_profile = add_query_arg( $args, $this->edit_profile_url ); 1184 $edit_profile_link = sprintf( '<a href="%1$s">%2$s</a>', esc_url( $edit_profile ), esc_html__( 'Extended', 'buddypress' ) ); 1185 1186 /** 1187 * Check the edit action is available 1188 * and preserve the order edit | profile | remove/delete. 1189 */ 1190 if ( ! empty( $actions['edit'] ) ) { 1191 $edit_action = $actions['edit']; 1192 unset( $actions['edit'] ); 1193 1194 $new_edit_actions = array( 1195 'edit' => $edit_action, 1196 'edit-profile' => $edit_profile_link, 1197 ); 1198 1199 // If not available simply add the edit profile action. 1200 } else { 1201 $new_edit_actions = array( 'edit-profile' => $edit_profile_link ); 1202 } 1203 1204 $actions = array_merge( $new_edit_actions, $actions ); 1205 } 1206 1207 return $actions; 1208 } 1209 1210 /** 1211 * Add a filter to edit profile url in WP Admin Bar. 1212 * 1213 * @since 2.1.0 1214 */ 1215 public function add_edit_profile_url_filter() { 1216 add_filter( 'bp_members_edit_profile_url', array( $this, 'filter_adminbar_profile_link' ), 10, 3 ); 1217 } 1218 1219 /** 1220 * Filter the profile url. 1221 * 1222 * @since 2.1.0 1223 * 1224 * @uses user_admin_url() 1225 * 1226 * @param string $profile_link Profile Link for admin bar. 1227 * @param string $url Profile URL. 1228 * @param int $user_id User ID. 1229 * @return string 1230 */ 1231 public function filter_adminbar_profile_link( $profile_link = '', $url = '', $user_id = 0 ) { 1232 if ( ! is_super_admin( $user_id ) && is_admin() ) { 1233 $profile_link = user_admin_url( 'profile.php' ); 1234 } 1235 return $profile_link; 1236 } 1237 1238 /** 1239 * Remove the filter to edit profile url in WP Admin Bar. 1240 * 1241 * @since 2.1.0 1242 */ 1243 public function remove_edit_profile_url_filter() { 1244 remove_filter( 'bp_members_edit_profile_url', array( $this, 'filter_adminbar_profile_link' ), 10, 3 ); 1245 } 1246 1247 /** Signups Management ****************************************************/ 1248 1249 /** 1250 * Display the admin preferences about signups pagination. 1251 * 1252 * @since 2.0.0 1253 * 1254 * @param int $value Value for signup option. 1255 * @param string $option Value for the option key. 1256 * @param int $new_value Value for the saved option. 1257 * @return int The pagination preferences. 1258 */ 1259 public function signup_screen_options( $value = 0, $option = '', $new_value = 0 ) { 1260 if ( 'users_page_bp_signups_network_per_page' != $option && 'users_page_bp_signups_per_page' != $option ) { 1261 return $value; 1262 } 1263 1264 // Per page. 1265 $new_value = (int) $new_value; 1266 if ( $new_value < 1 || $new_value > 999 ) { 1267 return $value; 1268 } 1269 1270 return $new_value; 1271 } 1272 1273 /** 1274 * Make sure no signups will show in users list. 1275 * 1276 * This is needed to handle signups that may have not been activated 1277 * before the 2.0.0 upgrade. 1278 * 1279 * @since 2.0.0 1280 * 1281 * @param WP_User_Query|null $query The users query. 1282 * @return WP_User_Query The users query without the signups. 1283 */ 1284 public function remove_signups_from_user_query( $query = null ) { 1285 global $wpdb; 1286 1287 // Bail if this is an ajax request. 1288 if ( defined( 'DOING_AJAX' ) ) { 1289 return; 1290 } 1291 1292 // Bail if updating BuddyPress. 1293 if ( bp_is_update() ) { 1294 return; 1295 } 1296 1297 // Bail if there is no current admin screen. 1298 if ( ! function_exists( 'get_current_screen' ) || ! get_current_screen() ) { 1299 return; 1300 } 1301 1302 // Get current screen. 1303 $current_screen = get_current_screen(); 1304 1305 // Bail if not on a users page. 1306 if ( ! isset( $current_screen->id ) || $this->users_page !== $current_screen->id ) { 1307 return; 1308 } 1309 1310 // Bail if already querying by an existing role. 1311 if ( ! empty( $query->query_vars['role'] ) ) { 1312 return; 1313 } 1314 1315 $query->query_where .= " AND {$wpdb->users}.user_status != 2"; 1316 } 1317 1318 /** 1319 * Filter the WP Users List Table views to include 'bp-signups'. 1320 * 1321 * @since 2.0.0 1322 * 1323 * @param array $views WP List Table views. 1324 * @return array The views with the signup view added. 1325 */ 1326 public function signup_filter_view( $views = array() ) { 1327 1328 // Remove the 'current' class from All if we're on the signups view. 1329 if ( $this->signups_page == get_current_screen()->id ) { 1330 $views['all'] = str_replace( 'class="current"', '', $views['all'] ); 1331 $class = 'current'; 1332 } else { 1333 $class = ''; 1334 } 1335 1336 $signups = BP_Signup::count_signups(); 1337 1338 if ( is_network_admin() ) { 1339 $base_url = network_admin_url( 'users.php' ); 1340 } else { 1341 $base_url = bp_get_admin_url( 'users.php' ); 1342 } 1343 1344 $url = add_query_arg( 'page', 'bp-signups', $base_url ); 1345 $text = sprintf( _x( 'Pending %s', 'signup users', 'buddypress' ), '<span class="count">(' . number_format_i18n( $signups ) . ')</span>' ); 1346 1347 $views['registered'] = sprintf( '<a href="%1$s" class="%2$s">%3$s</a>', esc_url( $url ), $class, $text ); 1348 1349 return $views; 1350 } 1351 1352 /** 1353 * Load the Signup WP Users List table. 1354 * 1355 * @since 2.0.0 1356 * 1357 * @param string $class The name of the class to use. 1358 * @param string $required The parent class. 1359 * @return WP_List_Table The List table. 1360 */ 1361 public static function get_list_table_class( $class = '', $required = '' ) { 1362 if ( empty( $class ) ) { 1363 return; 1364 } 1365 1366 if ( ! empty( $required ) ) { 1367 require_once( ABSPATH . 'wp-admin/includes/class-wp-' . $required . '-list-table.php' ); 1368 require_once( buddypress()->members->admin->admin_dir . 'bp-members-admin-classes.php' ); 1369 } 1370 1371 return new $class(); 1372 } 1373 1374 /** 1375 * Set up the signups admin page. 1376 * 1377 * Loaded before the page is rendered, this function does all initial 1378 * setup, including: processing form requests, registering contextual 1379 * help, and setting up screen options. 1380 * 1381 * @since 2.0.0 1382 * 1383 * @global $bp_members_signup_list_table 1384 */ 1385 public function signups_admin_load() { 1386 global $bp_members_signup_list_table; 1387 1388 // Build redirection URL. 1389 $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'] ); 1390 $doaction = bp_admin_list_table_current_bulk_action(); 1391 1392 /** 1393 * Fires at the start of the signups admin load. 1394 * 1395 * @since 2.0.0 1396 * 1397 * @param string $doaction Current bulk action being processed. 1398 * @param array $_REQUEST Current $_REQUEST global. 1399 */ 1400 do_action( 'bp_signups_admin_load', $doaction, $_REQUEST ); 1401 1402 /** 1403 * Filters the allowed actions for use in the user signups admin page. 1404 * 1405 * @since 2.0.0 1406 * 1407 * @param array $value Array of allowed actions to use. 1408 */ 1409 $allowed_actions = apply_filters( 'bp_signups_admin_allowed_actions', array( 'do_delete', 'do_activate', 'do_resend' ) ); 1410 1411 // Prepare the display of the Community Profile screen. 1412 if ( ! in_array( $doaction, $allowed_actions ) || ( -1 == $doaction ) ) { 1413 1414 if ( is_network_admin() ) { 1415 $bp_members_signup_list_table = self::get_list_table_class( 'BP_Members_MS_List_Table', 'ms-users' ); 1416 } else { 1417 $bp_members_signup_list_table = self::get_list_table_class( 'BP_Members_List_Table', 'users' ); 1418 } 1419 1420 // The per_page screen option. 1421 add_screen_option( 'per_page', array( 'label' => _x( 'Pending Accounts', 'Pending Accounts per page (screen options)', 'buddypress' ) ) ); 1422 1423 get_current_screen()->add_help_tab( array( 1424 'id' => 'bp-signups-overview', 1425 'title' => __( 'Overview', 'buddypress' ), 1426 'content' => 1427 '<p>' . __( 'This is the administration screen for pending accounts on your site.', 'buddypress' ) . '</p>' . 1428 '<p>' . __( 'From the screen options, you can customize the displayed columns and the pagination of this screen.', 'buddypress' ) . '</p>' . 1429 '<p>' . __( 'You can reorder the list of your pending accounts by clicking on the Username, Email or Registered column headers.', 'buddypress' ) . '</p>' . 1430 '<p>' . __( 'Using the search form, you can find pending accounts more easily. The Username and Email fields will be included in the search.', 'buddypress' ) . '</p>' 1431 ) ); 1432 1433 get_current_screen()->add_help_tab( array( 1434 'id' => 'bp-signups-actions', 1435 'title' => __( 'Actions', 'buddypress' ), 1436 'content' => 1437 '<p>' . __( 'Hovering over a row in the pending accounts list will display action links that allow you to manage pending accounts. You can perform the following actions:', 'buddypress' ) . '</p>' . 1438 '<ul><li>' . __( '"Email" takes you to the confirmation screen before being able to send the activation link to the desired pending account. You can only send the activation email once per day.', 'buddypress' ) . '</li>' . 1439 '<li>' . __( '"Delete" allows you to delete a pending account from your site. You will be asked to confirm this deletion.', 'buddypress' ) . '</li></ul>' . 1440 '<p>' . __( 'By clicking on a Username you will be able to activate a pending account from the confirmation screen.', 'buddypress' ) . '</p>' . 1441 '<p>' . __( 'Bulk actions allow you to perform these 3 actions for the selected rows.', 'buddypress' ) . '</p>' 1442 ) ); 1443 1444 // Help panel - sidebar links. 1445 get_current_screen()->set_help_sidebar( 1446 '<p><strong>' . __( 'For more information:', 'buddypress' ) . '</strong></p>' . 1447 '<p>' . __( '<a href="https://buddypress.org/support/">Support Forums</a>', 'buddypress' ) . '</p>' 1448 ); 1449 1450 // Add accessible hidden headings and text for the Pending Users screen. 1451 if ( bp_get_major_wp_version() >= 4.4 ) { 1452 get_current_screen()->set_screen_reader_content( array( 1453 'heading_views' => __( 'Filter users list', 'buddypress' ), 1454 'heading_pagination' => __( 'Pending users list navigation', 'buddypress' ), 1455 'heading_list' => __( 'Pending users list', 'buddypress' ), 1456 ) ); 1457 } 1458 1459 } else { 1460 if ( ! empty( $_REQUEST['signup_ids' ] ) ) { 1461 $signups = wp_parse_id_list( $_REQUEST['signup_ids' ] ); 1462 } 1463 1464 // Handle resent activation links. 1465 if ( 'do_resend' == $doaction ) { 1466 1467 // Nonce check. 1468 check_admin_referer( 'signups_resend' ); 1469 1470 $resent = BP_Signup::resend( $signups ); 1471 1472 if ( empty( $resent ) ) { 1473 $redirect_to = add_query_arg( 'error', $doaction, $redirect_to ); 1474 } else { 1475 $query_arg = array( 'updated' => 'resent' ); 1476 1477 if ( ! empty( $resent['resent'] ) ) { 1478 $query_arg['resent'] = count( $resent['resent'] ); 1479 } 1480 1481 if ( ! empty( $resent['errors'] ) ) { 1482 $query_arg['notsent'] = count( $resent['errors'] ); 1483 set_transient( '_bp_admin_signups_errors', $resent['errors'], 30 ); 1484 } 1485 1486 $redirect_to = add_query_arg( $query_arg, $redirect_to ); 1487 } 1488 1489 bp_core_redirect( $redirect_to ); 1490 1491 // Handle activated accounts. 1492 } elseif ( 'do_activate' == $doaction ) { 1493 1494 // Nonce check. 1495 check_admin_referer( 'signups_activate' ); 1496 1497 $activated = BP_Signup::activate( $signups ); 1498 1499 if ( empty( $activated ) ) { 1500 $redirect_to = add_query_arg( 'error', $doaction, $redirect_to ); 1501 } else { 1502 $query_arg = array( 'updated' => 'activated' ); 1503 1504 if ( ! empty( $activated['activated'] ) ) { 1505 $query_arg['activated'] = count( $activated['activated'] ); 1506 } 1507 1508 if ( ! empty( $activated['errors'] ) ) { 1509 $query_arg['notactivated'] = count( $activated['errors'] ); 1510 set_transient( '_bp_admin_signups_errors', $activated['errors'], 30 ); 1511 } 1512 1513 $redirect_to = add_query_arg( $query_arg, $redirect_to ); 1514 } 1515 1516 bp_core_redirect( $redirect_to ); 1517 1518 // Handle sign-ups delete. 1519 } elseif ( 'do_delete' == $doaction ) { 1520 1521 // Nonce check. 1522 check_admin_referer( 'signups_delete' ); 1523 1524 $deleted = BP_Signup::delete( $signups ); 1525 1526 if ( empty( $deleted ) ) { 1527 $redirect_to = add_query_arg( 'error', $doaction, $redirect_to ); 1528 } else { 1529 $query_arg = array( 'updated' => 'deleted' ); 1530 1531 if ( ! empty( $deleted['deleted'] ) ) { 1532 $query_arg['deleted'] = count( $deleted['deleted'] ); 1533 } 1534 1535 if ( ! empty( $deleted['errors'] ) ) { 1536 $query_arg['notdeleted'] = count( $deleted['errors'] ); 1537 set_transient( '_bp_admin_signups_errors', $deleted['errors'], 30 ); 1538 } 1539 1540 $redirect_to = add_query_arg( $query_arg, $redirect_to ); 1541 } 1542 1543 bp_core_redirect( $redirect_to ); 1544 1545 // Plugins can update other stuff from here. 1546 } else { 1547 $this->redirect = $redirect_to; 1548 1549 /** 1550 * Fires at end of signups admin load if doaction does not match any actions. 1551 * 1552 * @since 2.0.0 1553 * 1554 * @param string $doaction Current bulk action being processed. 1555 * @param array $_REQUEST Current $_REQUEST global. 1556 * @param string $redirect Determined redirect url to send user to. 1557 */ 1558 do_action( 'bp_members_admin_update_signups', $doaction, $_REQUEST, $this->redirect ); 1559 1560 bp_core_redirect( $this->redirect ); 1561 } 1562 } 1563 } 1564 1565 /** 1566 * Display any activation errors. 1567 * 1568 * @since 2.0.0 1569 */ 1570 public function signups_display_errors() { 1571 1572 // Look for sign-up errors. 1573 $errors = get_transient( '_bp_admin_signups_errors' ); 1574 1575 // Bail if no activation errors. 1576 if ( empty( $errors ) ) { 1577 return; 1578 } 1579 1580 // Loop through errors and display them. 1581 foreach ( $errors as $error ) : ?> 1582 1583 <li><?php echo esc_html( $error[0] );?>: <?php echo esc_html( $error[1] );?></li> 1584 1585 <?php endforeach; 1586 1587 // Delete the redirect transient. 1588 delete_transient( '_bp_admin_signups_errors' ); 1589 } 1590 1591 /** 1592 * Get admin notice when viewing the sign-up page. 1593 * 1594 * @since 2.1.0 1595 * 1596 * @return array 1597 */ 1598 private function get_signup_notice() { 1599 1600 // Setup empty notice for return value. 1601 $notice = array(); 1602 1603 // Updates. 1604 if ( ! empty( $_REQUEST['updated'] ) ) { 1605 switch ( $_REQUEST['updated'] ) { 1606 case 'resent': 1607 $notice = array( 1608 'class' => 'updated', 1609 'message' => '' 1610 ); 1611 1612 if ( ! empty( $_REQUEST['resent'] ) ) { 1613 $notice['message'] .= sprintf( 1614 _nx( '%s activation email successfully sent! ', '%s activation emails successfully sent! ', 1615 absint( $_REQUEST['resent'] ), 1616 'signup resent', 1617 'buddypress' 1618 ), 1619 number_format_i18n( absint( $_REQUEST['resent'] ) ) 1620 ); 1621 } 1622 1623 if ( ! empty( $_REQUEST['notsent'] ) ) { 1624 $notice['message'] .= sprintf( 1625 _nx( '%s activation email was not sent.', '%s activation emails were not sent.', 1626 absint( $_REQUEST['notsent'] ), 1627 'signup notsent', 1628 'buddypress' 1629 ), 1630 number_format_i18n( absint( $_REQUEST['notsent'] ) ) 1631 ); 1632 1633 if ( empty( $_REQUEST['resent'] ) ) { 1634 $notice['class'] = 'error'; 1635 } 1636 } 1637 1638 break; 1639 1640 case 'activated': 1641 $notice = array( 1642 'class' => 'updated', 1643 'message' => '' 1644 ); 1645 1646 if ( ! empty( $_REQUEST['activated'] ) ) { 1647 $notice['message'] .= sprintf( 1648 _nx( '%s account successfully activated! ', '%s accounts successfully activated! ', 1649 absint( $_REQUEST['activated'] ), 1650 'signup resent', 1651 'buddypress' 1652 ), 1653 number_format_i18n( absint( $_REQUEST['activated'] ) ) 1654 ); 1655 } 1656 1657 if ( ! empty( $_REQUEST['notactivated'] ) ) { 1658 $notice['message'] .= sprintf( 1659 _nx( '%s account was not activated.', '%s accounts were not activated.', 1660 absint( $_REQUEST['notactivated'] ), 1661 'signup notsent', 1662 'buddypress' 1663 ), 1664 number_format_i18n( absint( $_REQUEST['notactivated'] ) ) 1665 ); 1666 1667 if ( empty( $_REQUEST['activated'] ) ) { 1668 $notice['class'] = 'error'; 1669 } 1670 } 1671 1672 break; 1673 1674 case 'deleted': 1675 $notice = array( 1676 'class' => 'updated', 1677 'message' => '' 1678 ); 1679 1680 if ( ! empty( $_REQUEST['deleted'] ) ) { 1681 $notice['message'] .= sprintf( 1682 _nx( '%s sign-up successfully deleted!', '%s sign-ups successfully deleted!', 1683 absint( $_REQUEST['deleted'] ), 1684 'signup deleted', 1685 'buddypress' 1686 ), 1687 number_format_i18n( absint( $_REQUEST['deleted'] ) ) 1688 ); 1689 } 1690 1691 if ( ! empty( $_REQUEST['notdeleted'] ) ) { 1692 $notice['message'] .= sprintf( 1693 _nx( '%s sign-up was not deleted.', '%s sign-ups were not deleted.', 1694 absint( $_REQUEST['notdeleted'] ), 1695 'signup notdeleted', 1696 'buddypress' 1697 ), 1698 number_format_i18n( absint( $_REQUEST['notdeleted'] ) ) 1699 ); 1700 1701 if ( empty( $_REQUEST['deleted'] ) ) { 1702 $notice['class'] = 'error'; 1703 } 1704 } 1705 1706 break; 1707 } 1708 } 1709 1710 // Errors. 1711 if ( ! empty( $_REQUEST['error'] ) ) { 1712 switch ( $_REQUEST['error'] ) { 1713 case 'do_resend': 1714 $notice = array( 1715 'class' => 'error', 1716 'message' => esc_html__( 'There was a problem sending the activation emails. Please try again.', 'buddypress' ), 1717 ); 1718 break; 1719 1720 case 'do_activate': 1721 $notice = array( 1722 'class' => 'error', 1723 'message' => esc_html__( 'There was a problem activating accounts. Please try again.', 'buddypress' ), 1724 ); 1725 break; 1726 1727 case 'do_delete': 1728 $notice = array( 1729 'class' => 'error', 1730 'message' => esc_html__( 'There was a problem deleting sign-ups. Please try again.', 'buddypress' ), 1731 ); 1732 break; 1733 } 1734 } 1735 1736 return $notice; 1737 } 1738 1739 /** 1740 * Signups admin page router. 1741 * 1742 * Depending on the context, display 1743 * - the list of signups, 1744 * - or the delete confirmation screen, 1745 * - or the activate confirmation screen, 1746 * - or the "resend" email confirmation screen. 1747 * 1748 * Also prepare the admin notices. 1749 * 1750 * @since 2.0.0 1751 */ 1752 public function signups_admin() { 1753 $doaction = bp_admin_list_table_current_bulk_action(); 1754 1755 // Prepare notices for admin. 1756 $notice = $this->get_signup_notice(); 1757 1758 // Display notices. 1759 if ( ! empty( $notice ) ) : 1760 if ( 'updated' === $notice['class'] ) : ?> 1761 1762 <div id="message" class="<?php echo esc_attr( $notice['class'] ); ?>"> 1763 1764 <?php else: ?> 1765 1766 <div class="<?php echo esc_attr( $notice['class'] ); ?>"> 1767 1768 <?php endif; ?> 1769 1770 <p><?php echo $notice['message']; ?></p> 1771 1772 <?php if ( ! empty( $_REQUEST['notactivated'] ) || ! empty( $_REQUEST['notdeleted'] ) || ! empty( $_REQUEST['notsent'] ) ) :?> 1773 1774 <ul><?php $this->signups_display_errors();?></ul> 1775 1776 <?php endif ;?> 1777 1778 </div> 1779 1780 <?php endif; 1781 1782 // Show the proper screen. 1783 switch ( $doaction ) { 1784 case 'activate' : 1785 case 'delete' : 1786 case 'resend' : 1787 $this->signups_admin_manage( $doaction ); 1788 break; 1789 1790 default: 1791 $this->signups_admin_index(); 1792 break; 1793 1794 } 1795 } 1796 1797 /** 1798 * This is the list of the Pending accounts (signups). 1799 * 1800 * @since 2.0.0 1801 * 1802 * @global $plugin_page 1803 * @global $bp_members_signup_list_table 1804 */ 1805 public function signups_admin_index() { 1806 global $plugin_page, $bp_members_signup_list_table; 1807 1808 $usersearch = ! empty( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : ''; 1809 1810 // Prepare the group items for display. 1811 $bp_members_signup_list_table->prepare_items(); 1812 1813 if ( is_network_admin() ) { 1814 $form_url = network_admin_url( 'users.php' ); 1815 } else { 1816 $form_url = bp_get_admin_url( 'users.php' ); 1817 } 1818 1819 $form_url = add_query_arg( 1820 array( 1821 'page' => 'bp-signups', 1822 ), 1823 $form_url 1824 ); 1825 1826 $search_form_url = remove_query_arg( 1827 array( 1828 'action', 1829 'deleted', 1830 'notdeleted', 1831 'error', 1832 'updated', 1833 'delete', 1834 'activate', 1835 'activated', 1836 'notactivated', 1837 'resend', 1838 'resent', 1839 'notresent', 1840 'do_delete', 1841 'do_activate', 1842 'do_resend', 1843 'action2', 1844 '_wpnonce', 1845 'signup_ids' 1846 ), $_SERVER['REQUEST_URI'] 1847 ); 1848 1849 ?> 1850 1851 <div class="wrap"> 1852 <h1><?php _e( 'Users', 'buddypress' ); ?> 1853 1854 <?php if ( current_user_can( 'create_users' ) ) : ?> 1855 1856 <a href="user-new.php" class="add-new-h2"><?php echo esc_html_x( 'Add New', 'user', 'buddypress' ); ?></a> 1857 1858 <?php elseif ( is_multisite() && current_user_can( 'promote_users' ) ) : ?> 1859 1860 <a href="user-new.php" class="add-new-h2"><?php echo esc_html_x( 'Add Existing', 'user', 'buddypress' ); ?></a> 1861 1862 <?php endif; 1863 1864 if ( $usersearch ) { 1865 printf( '<span class="subtitle">' . __( 'Search results for “%s”', 'buddypress' ) . '</span>', esc_html( $usersearch ) ); 1866 } 1867 1868 ?> 1869 </h1> 1870 1871 <?php // Display each signups on its own row. ?> 1872 <?php $bp_members_signup_list_table->views(); ?> 1873 1874 <form id="bp-signups-search-form" action="<?php echo esc_url( $search_form_url ) ;?>"> 1875 <input type="hidden" name="page" value="<?php echo esc_attr( $plugin_page ); ?>" /> 1876 <?php $bp_members_signup_list_table->search_box( __( 'Search Pending Users', 'buddypress' ), 'bp-signups' ); ?> 1877 </form> 1878 1879 <form id="bp-signups-form" action="<?php echo esc_url( $form_url );?>" method="post"> 1880 <?php $bp_members_signup_list_table->display(); ?> 1881 </form> 1882 </div> 1883 <?php 1884 } 1885 1886 /** 1887 * This is the confirmation screen for actions. 1888 * 1889 * @since 2.0.0 1890 * 1891 * @param string $action Delete, activate, or resend activation link. 1892 * @return string 1893 */ 1894 public function signups_admin_manage( $action = '' ) { 1895 if ( ! current_user_can( $this->capability ) || empty( $action ) ) { 1896 die( '-1' ); 1897 } 1898 1899 // Get the user IDs from the URL. 1900 $ids = false; 1901 if ( ! empty( $_POST['allsignups'] ) ) { 1902 $ids = wp_parse_id_list( $_POST['allsignups'] ); 1903 } elseif ( ! empty( $_GET['signup_id'] ) ) { 1904 $ids = absint( $_GET['signup_id'] ); 1905 } 1906 1907 if ( empty( $ids ) ) { 1908 return false; 1909 } 1910 1911 // Query for signups, and filter out those IDs that don't 1912 // correspond to an actual signup. 1913 $signups_query = BP_Signup::get( array( 1914 'include' => $ids, 1915 ) ); 1916 1917 $signups = $signups_query['signups']; 1918 $signup_ids = wp_list_pluck( $signups, 'signup_id' ); 1919 1920 // Set up strings. 1921 switch ( $action ) { 1922 case 'delete' : 1923 $header_text = __( 'Delete Pending Accounts', 'buddypress' ); 1924 if ( 1 == count( $signup_ids ) ) { 1925 $helper_text = __( 'You are about to delete the following account:', 'buddypress' ); 1926 } else { 1927 $helper_text = __( 'You are about to delete the following accounts:', 'buddypress' ); 1928 } 1929 break; 1930 1931 case 'activate' : 1932 $header_text = __( 'Activate Pending Accounts', 'buddypress' ); 1933 if ( 1 == count( $signup_ids ) ) { 1934 $helper_text = __( 'You are about to activate the following account:', 'buddypress' ); 1935 } else { 1936 $helper_text = __( 'You are about to activate the following accounts:', 'buddypress' ); 1937 } 1938 break; 1939 1940 case 'resend' : 1941 $header_text = __( 'Resend Activation Emails', 'buddypress' ); 1942 if ( 1 == count( $signup_ids ) ) { 1943 $helper_text = __( 'You are about to resend an activation email to the following account:', 'buddypress' ); 1944 } else { 1945 $helper_text = __( 'You are about to resend an activation email to the following accounts:', 'buddypress' ); 1946 } 1947 break; 1948 } 1949 1950 // These arguments are added to all URLs. 1951 $url_args = array( 'page' => 'bp-signups' ); 1952 1953 // These arguments are only added when performing an action. 1954 $action_args = array( 1955 'action' => 'do_' . $action, 1956 'signup_ids' => implode( ',', $signup_ids ) 1957 ); 1958 1959 if ( is_network_admin() ) { 1960 $base_url = network_admin_url( 'users.php' ); 1961 } else { 1962 $base_url = bp_get_admin_url( 'users.php' ); 1963 } 1964 1965 $cancel_url = add_query_arg( $url_args, $base_url ); 1966 $action_url = wp_nonce_url( 1967 add_query_arg( 1968 array_merge( $url_args, $action_args ), 1969 $base_url 1970 ), 1971 'signups_' . $action 1972 ); 1973 1974 ?> 1975 1976 <div class="wrap"> 1977 <h1><?php echo esc_html( $header_text ); ?></h1> 1978 <p><?php echo esc_html( $helper_text ); ?></p> 1979 1980 <ol class="bp-signups-list"> 1981 <?php foreach ( $signups as $signup ) : 1982 1983 $last_notified = mysql2date( 'Y/m/d g:i:s a', $signup->date_sent ); ?> 1984 1985 <li> 1986 <?php echo esc_html( $signup->user_name ) ?> - <?php echo sanitize_email( $signup->user_email );?> 1987 1988 <?php if ( 'resend' == $action ) : ?> 1989 1990 <p class="description"> 1991 <?php printf( esc_html__( 'Last notified: %s', 'buddypress'), $last_notified ) ;?> 1992 1993 <?php if ( ! empty( $signup->recently_sent ) ) : ?> 1994 1995 <span class="attention wp-ui-text-notification"> <?php esc_html_e( '(less than 24 hours ago)', 'buddypress' ); ?></span> 1996 1997 <?php endif; ?> 1998 </p> 1999 2000 <?php endif; ?> 2001 2002 </li> 2003 2004 <?php endforeach; ?> 2005 </ol> 2006 2007 <?php if ( 'delete' === $action ) : ?> 2008 2009 <p><strong><?php esc_html_e( 'This action cannot be undone.', 'buddypress' ) ?></strong></p> 2010 2011 <?php endif ; ?> 2012 2013 <a class="button-primary" href="<?php echo esc_url( $action_url ); ?>"><?php esc_html_e( 'Confirm', 'buddypress' ); ?></a> 2014 <a class="button" href="<?php echo esc_url( $cancel_url ); ?>"><?php esc_html_e( 'Cancel', 'buddypress' ) ?></a> 2015 </div> 2016 2017 <?php 2018 } 2019 } 2020 endif; // End class_exists check. 13 require dirname( __FILE__ ) . '/classes/class-bp-members-admin.php'; 2021 14 2022 15 // Load the BP Members admin. -
trunk/src/bp-members/bp-members-loader.php
r10506 r10521 11 11 defined( 'ABSPATH' ) || exit; 12 12 13 /** 14 * Defines the BuddyPress Members Component. 15 */ 16 class BP_Members_Component extends BP_Component { 17 18 /** 19 * Member types. 20 * 21 * @see bp_register_member_type() 22 * 23 * @since 2.2.0 24 * @var array 25 */ 26 public $types = array(); 27 28 /** 29 * Start the members component creation process. 30 * 31 * @since 1.5.0 32 */ 33 public function __construct() { 34 parent::start( 35 'members', 36 __( 'Members', 'buddypress' ), 37 buddypress()->plugin_dir, 38 array( 39 'adminbar_myaccount_order' => 20, 40 'search_query_arg' => 'members_search', 41 ) 42 ); 43 } 44 45 /** 46 * Include bp-members files. 47 * 48 * @see BP_Component::includes() for description of parameters. 49 * 50 * @param array $includes See {@link BP_Component::includes()}. 51 */ 52 public function includes( $includes = array() ) { 53 54 // Always include these files. 55 $includes = array( 56 'actions', 57 'classes', 58 'filters', 59 'screens', 60 'template', 61 'adminbar', 62 'functions', 63 'widgets', 64 'cache', 65 ); 66 67 if ( bp_is_active( 'activity' ) ) { 68 $includes[] = 'activity'; 69 } 70 71 // Include these only if in admin. 72 if ( is_admin() ) { 73 $includes[] = 'admin'; 74 } 75 76 parent::includes( $includes ); 77 } 78 79 /** 80 * Set up bp-members global settings. 81 * 82 * The BP_MEMBERS_SLUG constant is deprecated, and only used here for 83 * backwards compatibility. 84 * 85 * @since 1.5.0 86 * 87 * @see BP_Component::setup_globals() for description of parameters. 88 * 89 * @param array $args See {@link BP_Component::setup_globals()}. 90 */ 91 public function setup_globals( $args = array() ) { 92 global $wpdb; 93 94 $bp = buddypress(); 95 96 /** Component Globals ************************************************ 97 */ 98 99 // Define a slug, as a fallback for backpat. 100 if ( !defined( 'BP_MEMBERS_SLUG' ) ) { 101 define( 'BP_MEMBERS_SLUG', $this->id ); 102 } 103 104 // Override any passed args. 105 $args = array( 106 'slug' => BP_MEMBERS_SLUG, 107 'root_slug' => isset( $bp->pages->members->slug ) ? $bp->pages->members->slug : BP_MEMBERS_SLUG, 108 'has_directory' => true, 109 'directory_title' => _x( 'Members', 'component directory title', 'buddypress' ), 110 'search_string' => __( 'Search Members...', 'buddypress' ), 111 'global_tables' => array( 112 'table_name_last_activity' => bp_core_get_table_prefix() . 'bp_activity', 113 'table_name_signups' => $wpdb->base_prefix . 'signups', // signups is a global WordPress table 114 ) 115 ); 116 117 parent::setup_globals( $args ); 118 119 /** Logged in user *************************************************** 120 */ 121 122 // The core userdata of the user who is currently logged in. 123 $bp->loggedin_user->userdata = bp_core_get_core_userdata( bp_loggedin_user_id() ); 124 125 // Fetch the full name for the logged in user. 126 $bp->loggedin_user->fullname = isset( $bp->loggedin_user->userdata->display_name ) ? $bp->loggedin_user->userdata->display_name : ''; 127 128 // Hits the DB on single WP installs so get this separately. 129 $bp->loggedin_user->is_super_admin = $bp->loggedin_user->is_site_admin = is_super_admin( bp_loggedin_user_id() ); 130 131 // The domain for the user currently logged in. eg: http://example.com/members/andy. 132 $bp->loggedin_user->domain = bp_core_get_user_domain( bp_loggedin_user_id() ); 133 134 /** Displayed user *************************************************** 135 */ 136 137 // The core userdata of the user who is currently being displayed. 138 $bp->displayed_user->userdata = bp_core_get_core_userdata( bp_displayed_user_id() ); 139 140 // Fetch the full name displayed user. 141 $bp->displayed_user->fullname = isset( $bp->displayed_user->userdata->display_name ) ? $bp->displayed_user->userdata->display_name : ''; 142 143 // The domain for the user currently being displayed. 144 $bp->displayed_user->domain = bp_core_get_user_domain( bp_displayed_user_id() ); 145 146 /** Signup *********************************************************** 147 */ 148 149 $bp->signup = new stdClass; 150 151 /** Profiles Fallback ************************************************ 152 */ 153 154 if ( ! bp_is_active( 'xprofile' ) ) { 155 $bp->profile = new stdClass; 156 $bp->profile->slug = 'profile'; 157 $bp->profile->id = 'profile'; 158 } 159 } 160 161 /** 162 * Set up canonical stack for this component. 163 * 164 * @since 2.1.0 165 */ 166 public function setup_canonical_stack() { 167 $bp = buddypress(); 168 169 /** Default Profile Component **************************************** 170 */ 171 172 if ( defined( 'BP_DEFAULT_COMPONENT' ) && BP_DEFAULT_COMPONENT ) { 173 $bp->default_component = BP_DEFAULT_COMPONENT; 174 } else { 175 if ( bp_is_active( 'activity' ) && isset( $bp->pages->activity ) ) { 176 $bp->default_component = bp_get_activity_slug(); 177 } else { 178 $bp->default_component = ( 'xprofile' === $bp->profile->id ) ? 'profile' : $bp->profile->id; 179 } 180 } 181 182 /** Canonical Component Stack **************************************** 183 */ 184 185 if ( bp_displayed_user_id() ) { 186 $bp->canonical_stack['base_url'] = bp_displayed_user_domain(); 187 188 if ( bp_current_component() ) { 189 $bp->canonical_stack['component'] = bp_current_component(); 190 } 191 192 if ( bp_current_action() ) { 193 $bp->canonical_stack['action'] = bp_current_action(); 194 } 195 196 if ( !empty( $bp->action_variables ) ) { 197 $bp->canonical_stack['action_variables'] = bp_action_variables(); 198 } 199 200 // Looking at the single member root/home, so assume the default. 201 if ( ! bp_current_component() ) { 202 $bp->current_component = $bp->default_component; 203 204 // The canonical URL will not contain the default component. 205 } elseif ( bp_is_current_component( $bp->default_component ) && ! bp_current_action() ) { 206 unset( $bp->canonical_stack['component'] ); 207 } 208 209 // If we're on a spammer's profile page, only users with the 'bp_moderate' cap 210 // can view subpages on the spammer's profile. 211 // 212 // users without the cap trying to access a spammer's subnav page will get 213 // redirected to the root of the spammer's profile page. this occurs by 214 // by removing the component in the canonical stack. 215 if ( bp_is_user_spammer( bp_displayed_user_id() ) && ! bp_current_user_can( 'bp_moderate' ) ) { 216 unset( $bp->canonical_stack['component'] ); 217 } 218 } 219 } 220 221 /** 222 * Set up fall-back component navigation if XProfile is inactive. 223 * 224 * @since 1.5.0 225 * 226 * @see BP_Component::setup_nav() for a description of arguments. 227 * 228 * @param array $main_nav Optional. See BP_Component::setup_nav() for 229 * description. 230 * @param array $sub_nav Optional. See BP_Component::setup_nav() for 231 * description. 232 */ 233 public function setup_nav( $main_nav = array(), $sub_nav = array() ) { 234 235 // Bail if XProfile component is active. 236 if ( bp_is_active( 'xprofile' ) ) { 237 return; 238 } 239 240 // Don't set up navigation if there's no member. 241 if ( ! is_user_logged_in() && ! bp_is_user() ) { 242 return; 243 } 244 245 // Determine user to use. 246 if ( bp_displayed_user_domain() ) { 247 $user_domain = bp_displayed_user_domain(); 248 } elseif ( bp_loggedin_user_domain() ) { 249 $user_domain = bp_loggedin_user_domain(); 250 } else { 251 return; 252 } 253 254 $slug = bp_get_profile_slug(); 255 $profile_link = trailingslashit( $user_domain . $slug ); 256 257 // Setup the main navigation. 258 $main_nav = array( 259 'name' => _x( 'Profile', 'Member profile main navigation', 'buddypress' ), 260 'slug' => $slug, 261 'position' => 20, 262 'screen_function' => 'bp_members_screen_display_profile', 263 'default_subnav_slug' => 'public', 264 'item_css_id' => buddypress()->profile->id 265 ); 266 267 // Setup the subnav items for the member profile. 268 $sub_nav[] = array( 269 'name' => _x( 'View', 'Member profile view', 'buddypress' ), 270 'slug' => 'public', 271 'parent_url' => $profile_link, 272 'parent_slug' => $slug, 273 'screen_function' => 'bp_members_screen_display_profile', 274 'position' => 10 275 ); 276 277 parent::setup_nav( $main_nav, $sub_nav ); 278 } 279 280 /** 281 * Set up the title for pages and <title>. 282 */ 283 public function setup_title() { 284 $bp = buddypress(); 285 286 if ( bp_is_my_profile() ) { 287 $bp->bp_options_title = __( 'You', 'buddypress' ); 288 } elseif ( bp_is_user() ) { 289 $bp->bp_options_title = bp_get_displayed_user_fullname(); 290 $bp->bp_options_avatar = bp_core_fetch_avatar( array( 291 'item_id' => bp_displayed_user_id(), 292 'type' => 'thumb', 293 'alt' => sprintf( __( 'Profile picture of %s', 'buddypress' ), $bp->bp_options_title ) 294 ) ); 295 } 296 297 parent::setup_title(); 298 } 299 300 /** 301 * Setup cache groups. 302 * 303 * @since 2.2.0 304 */ 305 public function setup_cache_groups() { 306 307 // Global groups. 308 wp_cache_add_global_groups( array( 309 'bp_last_activity', 310 'bp_member_type' 311 ) ); 312 313 parent::setup_cache_groups(); 314 } 315 } 13 require dirname( __FILE__ ) . '/classes/class-bp-members-component.php'; 316 14 317 15 /** -
trunk/src/bp-members/bp-members-screens.php
r10487 r10521 12 12 // Exit if accessed directly. 13 13 defined( 'ABSPATH' ) || exit; 14 15 require dirname( __FILE__ ) . '/classes/class-bp-members-theme-compat.php'; 16 require dirname( __FILE__ ) . '/classes/class-bp-registration-theme-compat.php'; 14 17 15 18 /** … … 382 385 /** Theme Compatibility *******************************************************/ 383 386 384 /**385 * The main theme compat class for BuddyPress Members.386 *387 * This class sets up the necessary theme compatibility actions to safely output388 * member template parts to the_title and the_content areas of a theme.389 *390 * @since 1.7.0391 */392 class BP_Members_Theme_Compat {393 394 /**395 * Set up the members component theme compatibility.396 *397 * @since 1.7.0398 */399 public function __construct() {400 add_action( 'bp_setup_theme_compat', array( $this, 'is_members' ) );401 }402 403 /**404 * Are we looking at something that needs members theme compatibility?405 *406 * @since 1.7.0407 */408 public function is_members() {409 410 // Bail if not looking at the members component or a user's page.411 if ( ! bp_is_members_component() && ! bp_is_user() ) {412 return;413 }414 415 // Members Directory.416 if ( ! bp_current_action() && ! bp_current_item() ) {417 bp_update_is_directory( true, 'members' );418 419 /**420 * Fires if looking at Members directory when needing theme compat.421 *422 * @since 1.5.0423 */424 do_action( 'bp_members_screen_index' );425 426 add_filter( 'bp_get_buddypress_template', array( $this, 'directory_template_hierarchy' ) );427 add_action( 'bp_template_include_reset_dummy_post_data', array( $this, 'directory_dummy_post' ) );428 add_filter( 'bp_replace_the_content', array( $this, 'directory_content' ) );429 430 // User page.431 } elseif ( bp_is_user() ) {432 433 // If we're on a single activity permalink page, we shouldn't use the members434 // template, so stop here!435 if ( bp_is_active( 'activity' ) && bp_is_single_activity() ) {436 return;437 }438 439 /**440 * Fires if looking at Members user page when needing theme compat.441 *442 * @since 1.5.0443 */444 do_action( 'bp_members_screen_display_profile' );445 446 add_filter( 'bp_get_buddypress_template', array( $this, 'single_template_hierarchy' ) );447 add_action( 'bp_template_include_reset_dummy_post_data', array( $this, 'single_dummy_post' ) );448 add_filter( 'bp_replace_the_content', array( $this, 'single_dummy_content' ) );449 450 }451 }452 453 /** Directory *************************************************************/454 455 /**456 * Add template hierarchy to theme compat for the members directory page.457 *458 * This is to mirror how WordPress has459 * {@link https://codex.wordpress.org/Template_Hierarchy template hierarchy}.460 *461 * @since 1.8.0462 *463 * @param array $templates The templates from bp_get_theme_compat_templates().464 * @return array $templates Array of custom templates to look for.465 */466 public function directory_template_hierarchy( $templates = array() ) {467 468 // Set up the template hierarchy.469 $new_templates = array();470 if ( '' !== bp_get_current_member_type() ) {471 $new_templates[] = 'members/index-directory-type-' . sanitize_file_name( bp_get_current_member_type() ) . '.php';472 }473 $new_templates[] = 'members/index-directory.php';474 475 /**476 * Filters the template hierarchy for theme compat and members directory page.477 *478 * @since 1.8.0479 *480 * @param array $value Array of template paths to add to hierarchy.481 */482 $new_templates = apply_filters( 'bp_template_hierarchy_members_directory', $new_templates );483 484 // Merge new templates with existing stack485 // @see bp_get_theme_compat_templates().486 $templates = array_merge( (array) $new_templates, $templates );487 488 return $templates;489 }490 491 /**492 * Update the global $post with directory data.493 *494 * @since 1.7.0495 */496 public function directory_dummy_post() {497 bp_theme_compat_reset_post( array(498 'ID' => 0,499 'post_title' => bp_get_directory_title( 'members' ),500 'post_author' => 0,501 'post_date' => 0,502 'post_content' => '',503 'post_type' => 'page',504 'post_status' => 'publish',505 'is_page' => true,506 'comment_status' => 'closed'507 ) );508 }509 510 /**511 * Filter the_content with the members index template part.512 *513 * @since 1.7.0514 */515 public function directory_content() {516 return bp_buffer_template_part( 'members/index', null, false );517 }518 519 /** Single ****************************************************************/520 521 /**522 * Add custom template hierarchy to theme compat for member pages.523 *524 * This is to mirror how WordPress has525 * {@link https://codex.wordpress.org/Template_Hierarchy template hierarchy}.526 *527 * @since 1.8.0528 *529 * @param string $templates The templates from530 * bp_get_theme_compat_templates().531 * @return array $templates Array of custom templates to look for.532 */533 public function single_template_hierarchy( $templates ) {534 // Setup some variables we're going to reference in our custom templates.535 $user_nicename = buddypress()->displayed_user->userdata->user_nicename;536 537 /**538 * Filters the template hierarchy for theme compat and member pages.539 *540 * @since 1.8.0541 *542 * @param array $value Array of template paths to add to hierarchy.543 */544 $new_templates = apply_filters( 'bp_template_hierarchy_members_single_item', array(545 'members/single/index-id-' . sanitize_file_name( bp_displayed_user_id() ) . '.php',546 'members/single/index-nicename-' . sanitize_file_name( $user_nicename ) . '.php',547 'members/single/index-action-' . sanitize_file_name( bp_current_action() ) . '.php',548 'members/single/index-component-' . sanitize_file_name( bp_current_component() ) . '.php',549 'members/single/index.php'550 ) );551 552 // Merge new templates with existing stack553 // @see bp_get_theme_compat_templates().554 $templates = array_merge( (array) $new_templates, $templates );555 556 return $templates;557 }558 559 /**560 * Update the global $post with the displayed user's data.561 *562 * @since 1.7.0563 */564 public function single_dummy_post() {565 bp_theme_compat_reset_post( array(566 'ID' => 0,567 'post_title' => bp_get_displayed_user_fullname(),568 'post_author' => 0,569 'post_date' => 0,570 'post_content' => '',571 'post_type' => 'page',572 'post_status' => 'publish',573 'is_page' => true,574 'comment_status' => 'closed'575 ) );576 }577 578 /**579 * Filter the_content with the members' single home template part.580 *581 * @since 1.7.0582 */583 public function single_dummy_content() {584 return bp_buffer_template_part( 'members/single/home', null, false );585 }586 }587 387 new BP_Members_Theme_Compat(); 588 589 /**590 * The main theme compat class for BuddyPress Registration.591 *592 * This class sets up the necessary theme compatibility actions to safely output593 * registration template parts to the_title and the_content areas of a theme.594 *595 * @since 1.7.0596 */597 class BP_Registration_Theme_Compat {598 599 /**600 * Setup the groups component theme compatibility.601 *602 * @since 1.7.0603 */604 public function __construct() {605 add_action( 'bp_setup_theme_compat', array( $this, 'is_registration' ) );606 }607 608 /**609 * Are we looking at either the registration or activation pages?610 *611 * @since 1.7.0612 */613 public function is_registration() {614 615 // Bail if not looking at the registration or activation page.616 if ( ! bp_is_register_page() && ! bp_is_activation_page() ) {617 return;618 }619 620 // Not a directory.621 bp_update_is_directory( false, 'register' );622 623 // Setup actions.624 add_filter( 'bp_get_buddypress_template', array( $this, 'template_hierarchy' ) );625 add_action( 'bp_template_include_reset_dummy_post_data', array( $this, 'dummy_post' ) );626 add_filter( 'bp_replace_the_content', array( $this, 'dummy_content' ) );627 }628 629 /** Template ***********************************************************/630 631 /**632 * Add template hierarchy to theme compat for registration/activation pages.633 *634 * This is to mirror how WordPress has635 * {@link https://codex.wordpress.org/Template_Hierarchy template hierarchy}.636 *637 * @since 1.8.0638 *639 * @param string $templates The templates from bp_get_theme_compat_templates().640 * @return array $templates Array of custom templates to look for.641 */642 public function template_hierarchy( $templates ) {643 $component = sanitize_file_name( bp_current_component() );644 645 /**646 * Filters the template hierarchy for theme compat and registration/activation pages.647 *648 * This filter is a variable filter that depends on the current component649 * being used.650 *651 * @since 1.8.0652 *653 * @param array $value Array of template paths to add to hierarchy.654 */655 $new_templates = apply_filters( "bp_template_hierarchy_{$component}", array(656 "members/index-{$component}.php"657 ) );658 659 // Merge new templates with existing stack660 // @see bp_get_theme_compat_templates().661 $templates = array_merge( (array) $new_templates, $templates );662 663 return $templates;664 }665 666 /**667 * Update the global $post with dummy data.668 *669 * @since 1.7.0670 */671 public function dummy_post() {672 // Registration page.673 if ( bp_is_register_page() ) {674 $title = __( 'Create an Account', 'buddypress' );675 676 if ( 'completed-confirmation' == bp_get_current_signup_step() ) {677 $title = __( 'Check Your Email To Activate Your Account!', 'buddypress' );678 }679 680 // Activation page.681 } else {682 $title = __( 'Activate Your Account', 'buddypress' );683 684 if ( bp_account_was_activated() ) {685 $title = __( 'Account Activated', 'buddypress' );686 }687 }688 689 bp_theme_compat_reset_post( array(690 'ID' => 0,691 'post_title' => $title,692 'post_author' => 0,693 'post_date' => 0,694 'post_content' => '',695 'post_type' => 'page',696 'post_status' => 'publish',697 'is_page' => true,698 'comment_status' => 'closed'699 ) );700 }701 702 /**703 * Filter the_content with either the register or activate templates.704 *705 * @since 1.7.0706 */707 public function dummy_content() {708 if ( bp_is_register_page() ) {709 return bp_buffer_template_part( 'members/register', null, false );710 } else {711 return bp_buffer_template_part( 'members/activate', null, false );712 }713 }714 }715 388 new BP_Registration_Theme_Compat(); -
trunk/src/bp-members/bp-members-template.php
r10459 r10521 12 12 // Exit if accessed directly. 13 13 defined( 'ABSPATH' ) || exit; 14 15 require dirname( __FILE__ ) . '/classes/class-bp-core-members-template.php'; 14 16 15 17 /** … … 282 284 return apply_filters( 'bp_get_activate_slug', $slug ); 283 285 } 284 285 /**286 * The main member template loop class.287 *288 * Responsible for loading a group of members into a loop for display.289 */290 class BP_Core_Members_Template {291 292 /**293 * The loop iterator.294 *295 * @var int296 */297 public $current_member = -1;298 299 /**300 * The number of members returned by the paged query.301 *302 * @var int303 */304 public $member_count;305 306 /**307 * Array of members located by the query.308 *309 * @var array310 */311 public $members;312 313 /**314 * The member object currently being iterated on.315 *316 * @var object317 */318 public $member;319 320 /**321 * A flag for whether the loop is currently being iterated.322 *323 * @var bool324 */325 public $in_the_loop;326 327 /**328 * The type of member being requested. Used for ordering results.329 *330 * @var string331 */332 public $type;333 334 /**335 * The unique string used for pagination queries.336 *337 * @var string338 */339 public $pag_arg;340 341 /**342 * The page number being requested.343 *344 * @var string345 */346 public $pag_page;347 348 /**349 * The number of items being requested per page.350 *351 * @var string352 */353 public $pag_num;354 355 /**356 * An HTML string containing pagination links.357 *358 * @var string359 */360 public $pag_links;361 362 /**363 * The total number of members matching the query parameters.364 *365 * @var int366 */367 public $total_member_count;368 369 /**370 * Constructor method.371 *372 * @see BP_User_Query for an in-depth description of parameters.373 *374 * @param string $type Sort order.375 * @param int $page_number Page of results.376 * @param int $per_page Number of results per page.377 * @param int $max Max number of results to return.378 * @param int $user_id Limit to friends of a user.379 * @param string $search_terms Limit to users matching search terms.380 * @param array $include Limit results by these user IDs.381 * @param bool $populate_extras Fetch optional extras.382 * @param array $exclude Exclude these IDs from results.383 * @param array $meta_key Limit to users with a meta_key.384 * @param array $meta_value Limit to users with a meta_value (with meta_key).385 * @param string $page_arg Optional. The string used as a query parameter in pagination links.386 * Default: 'upage'.387 * @param array|string $member_type Array or comma-separated string of member types to limit results to.388 * @param array|string $member_type__in Array or comma-separated string of member types to limit results to.389 * @param array|string $member_type__not_in Array or comma-separated string of member types to exclude390 * from results.391 */392 function __construct( $type, $page_number, $per_page, $max, $user_id, $search_terms, $include, $populate_extras, $exclude, $meta_key, $meta_value, $page_arg = 'upage', $member_type = '', $member_type__in = '', $member_type__not_in = '' ) {393 394 $this->pag_arg = sanitize_key( $page_arg );395 $this->pag_page = bp_sanitize_pagination_arg( $this->pag_arg, $page_number );396 $this->pag_num = bp_sanitize_pagination_arg( 'num', $per_page );397 $this->type = $type;398 399 if ( !empty( $_REQUEST['letter'] ) )400 $this->members = BP_Core_User::get_users_by_letter( $_REQUEST['letter'], $this->pag_num, $this->pag_page, $populate_extras, $exclude );401 else402 $this->members = bp_core_get_users( array( 'type' => $this->type, 'per_page' => $this->pag_num, 'page' => $this->pag_page, 'user_id' => $user_id, 'include' => $include, 'search_terms' => $search_terms, 'populate_extras' => $populate_extras, 'exclude' => $exclude, 'meta_key' => $meta_key, 'meta_value' => $meta_value, 'member_type' => $member_type, 'member_type__in' => $member_type__in, 'member_type__not_in' => $member_type__not_in ) );403 404 if ( !$max || $max >= (int) $this->members['total'] )405 $this->total_member_count = (int) $this->members['total'];406 else407 $this->total_member_count = (int) $max;408 409 $this->members = $this->members['users'];410 411 if ( $max ) {412 if ( $max >= count( $this->members ) ) {413 $this->member_count = count( $this->members );414 } else {415 $this->member_count = (int) $max;416 }417 } else {418 $this->member_count = count( $this->members );419 }420 421 if ( (int) $this->total_member_count && (int) $this->pag_num ) {422 $pag_args = array(423 $this->pag_arg => '%#%',424 );425 426 if ( defined( 'DOING_AJAX' ) && true === (bool) DOING_AJAX ) {427 $base = remove_query_arg( 's', wp_get_referer() );428 } else {429 $base = '';430 }431 432 /**433 * Defaults to an empty array to make sure paginate_links()434 * won't add the $page_arg to the links which would break435 * pagination in case JavaScript is disabled.436 */437 $add_args = array();438 439 if ( ! empty( $search_terms ) ) {440 $query_arg = bp_core_get_component_search_query_arg( 'members' );441 $add_args[ $query_arg ] = urlencode( $search_terms );442 }443 444 $this->pag_links = paginate_links( array(445 'base' => add_query_arg( $pag_args, $base ),446 'format' => '',447 'total' => ceil( (int) $this->total_member_count / (int) $this->pag_num ),448 'current' => (int) $this->pag_page,449 'prev_text' => _x( '←', 'Member pagination previous text', 'buddypress' ),450 'next_text' => _x( '→', 'Member pagination next text', 'buddypress' ),451 'mid_size' => 1,452 'add_args' => $add_args,453 ) );454 }455 }456 457 /**458 * Whether there are members available in the loop.459 *460 * @see bp_has_members()461 *462 * @return bool True if there are items in the loop, otherwise false.463 */464 function has_members() {465 if ( $this->member_count )466 return true;467 468 return false;469 }470 471 /**472 * Set up the next member and iterate index.473 *474 * @return object The next member to iterate over.475 */476 function next_member() {477 $this->current_member++;478 $this->member = $this->members[$this->current_member];479 480 return $this->member;481 }482 483 /**484 * Rewind the members and reset member index.485 */486 function rewind_members() {487 $this->current_member = -1;488 if ( $this->member_count > 0 ) {489 $this->member = $this->members[0];490 }491 }492 493 /**494 * Whether there are members left in the loop to iterate over.495 *496 * This method is used by {@link bp_members()} as part of the while loop497 * that controls iteration inside the members loop, eg:498 * while ( bp_members() ) { ...499 *500 * @see bp_members()501 *502 * @return bool True if there are more members to show, otherwise false.503 */504 function members() {505 if ( $this->current_member + 1 < $this->member_count ) {506 return true;507 } elseif ( $this->current_member + 1 == $this->member_count ) {508 509 /**510 * Fires right before the rewinding of members listing.511 *512 * @since 1.5.0513 */514 do_action('member_loop_end');515 // Do some cleaning up after the loop.516 $this->rewind_members();517 }518 519 $this->in_the_loop = false;520 return false;521 }522 523 /**524 * Set up the current member inside the loop.525 *526 * Used by {@link bp_the_member()} to set up the current member data527 * while looping, so that template tags used during that iteration make528 * reference to the current member.529 *530 * @see bp_the_member()531 */532 function the_member() {533 534 $this->in_the_loop = true;535 $this->member = $this->next_member();536 537 // Loop has just started.538 if ( 0 == $this->current_member ) {539 540 /**541 * Fires if the current member is the first in the loop.542 *543 * @since 1.5.0544 */545 do_action( 'member_loop_start' );546 }547 548 }549 }550 551 /**552 * Rewind the members and reset member index.553 */554 function bp_rewind_members() {555 global $members_template;556 557 return $members_template->rewind_members();558 }559 286 560 287 /** -
trunk/src/bp-members/bp-members-widgets.php
r10417 r10521 10 10 // Exit if accessed directly. 11 11 defined( 'ABSPATH' ) || exit; 12 13 require dirname( __FILE__ ) . '/classes/class-bp-core-members-widget.php'; 14 require dirname( __FILE__ ) . '/classes/class-bp-core-whos-online-widget.php'; 15 require dirname( __FILE__ ) . '/classes/class-bp-core-recently-active-widget.php'; 12 16 13 17 /** … … 24 28 } 25 29 add_action( 'bp_register_widgets', 'bp_members_register_widgets' ); 26 27 /**28 * Members Widget.29 *30 * @since 1.0.331 */32 class BP_Core_Members_Widget extends WP_Widget {33 34 /**35 * Constructor method.36 */37 public function __construct() {38 39 // Setup widget name & description.40 $name = _x( '(BuddyPress) Members', 'widget name', 'buddypress' );41 $description = __( 'A dynamic list of recently active, popular, and newest members', 'buddypress' );42 43 // Call WP_Widget constructor.44 parent::__construct( false, $name, array(45 'description' => $description,46 'classname' => 'widget_bp_core_members_widget buddypress widget',47 ) );48 49 // Maybe enqueue JS for widget.50 if ( is_active_widget( false, false, $this->id_base ) && ! is_admin() && ! is_network_admin() ) {51 wp_enqueue_script( 'bp-widget-members' );52 }53 }54 55 /**56 * Display the Members widget.57 *58 * @see WP_Widget::widget() for description of parameters.59 *60 * @param array $args Widget arguments.61 * @param array $instance Widget settings, as saved by the user.62 */63 public function widget( $args, $instance ) {64 65 // Get widget settings.66 $settings = $this->parse_settings( $instance );67 68 /**69 * Filters the title of the Members widget.70 *71 * @since 1.8.072 * @since 2.3.0 Added 'instance' and 'id_base' to arguments passed to filter.73 *74 * @param string $title The widget title.75 * @param array $settings The settings for the particular instance of the widget.76 * @param string $id_base Root ID for all widgets of this type.77 */78 $title = apply_filters( 'widget_title', $settings['title'], $settings, $this->id_base );79 $title = $settings['link_title'] ? '<a href="' . bp_get_members_directory_permalink() . '">' . $title . '</a>' : $title;80 81 /**82 * Filters the separator of the member widget links.83 *84 * @since 2.4.085 *86 * @param string $separator Separator string. Default '|'.87 */88 $separator = apply_filters( 'bp_members_widget_separator', '|' );89 90 // Output before widget HTMl, title (and maybe content before & after it).91 echo $args['before_widget']92 . $args['before_title']93 . $title94 . $args['after_title'];95 96 // Setup args for querying members.97 $members_args = array(98 'user_id' => 0,99 'type' => $settings['member_default'],100 'per_page' => $settings['max_members'],101 'max' => $settings['max_members'],102 'populate_extras' => true,103 'search_terms' => false,104 ); ?>105 106 <?php if ( bp_has_members( $members_args ) ) : ?>107 108 <div class="item-options" id="members-list-options">109 <a href="<?php bp_members_directory_permalink(); ?>" id="newest-members" <?php if ( 'newest' === $settings['member_default'] ) : ?>class="selected"<?php endif; ?>><?php esc_html_e( 'Newest', 'buddypress' ); ?></a>110 <span class="bp-separator" role="separator"><?php echo esc_html( $separator ); ?></span>111 <a href="<?php bp_members_directory_permalink(); ?>" id="recently-active-members" <?php if ( 'active' === $settings['member_default'] ) : ?>class="selected"<?php endif; ?>><?php esc_html_e( 'Active', 'buddypress' ); ?></a>112 113 <?php if ( bp_is_active( 'friends' ) ) : ?>114 <span class="bp-separator" role="separator"><?php echo esc_html( $separator ); ?></span>115 <a href="<?php bp_members_directory_permalink(); ?>" id="popular-members" <?php if ( 'popular' === $settings['member_default'] ) : ?>class="selected"<?php endif; ?>><?php esc_html_e( 'Popular', 'buddypress' ); ?></a>116 117 <?php endif; ?>118 119 </div>120 121 <ul id="members-list" class="item-list">122 123 <?php while ( bp_members() ) : bp_the_member(); ?>124 125 <li class="vcard">126 <div class="item-avatar">127 <a href="<?php bp_member_permalink() ?>" title="<?php bp_member_name(); ?>"><?php bp_member_avatar(); ?></a>128 </div>129 130 <div class="item">131 <div class="item-title fn"><a href="<?php bp_member_permalink(); ?>" title="<?php bp_member_name(); ?>"><?php bp_member_name(); ?></a></div>132 <div class="item-meta">133 <span class="activity"><?php134 if ( 'newest' === $settings['member_default'] ) :135 bp_member_registered();136 elseif ( 'active' === $settings['member_default'] ) :137 bp_member_last_active();138 elseif ( 'popular' === $settings['member_default'] ) :139 bp_member_total_friend_count();140 endif; ?></span>141 </div>142 </div>143 </li>144 145 <?php endwhile; ?>146 147 </ul>148 149 <?php wp_nonce_field( 'bp_core_widget_members', '_wpnonce-members', false ); ?>150 151 <input type="hidden" name="members_widget_max" id="members_widget_max" value="<?php echo esc_attr( $settings['max_members'] ); ?>" />152 153 <?php else: ?>154 155 <div class="widget-error">156 <?php esc_html_e( 'No one has signed up yet!', 'buddypress' ); ?>157 </div>158 159 <?php endif; ?>160 161 <?php echo $args['after_widget'];162 }163 164 /**165 * Update the Members widget options.166 *167 * @param array $new_instance The new instance options.168 * @param array $old_instance The old instance options.169 * @return array $instance The parsed options to be saved.170 */171 public function update( $new_instance, $old_instance ) {172 $instance = $old_instance;173 174 $instance['title'] = strip_tags( $new_instance['title'] );175 $instance['max_members'] = strip_tags( $new_instance['max_members'] );176 $instance['member_default'] = strip_tags( $new_instance['member_default'] );177 $instance['link_title'] = (bool) $new_instance['link_title'];178 179 return $instance;180 }181 182 /**183 * Output the Members widget options form.184 *185 * @param array $instance Widget instance settings.186 *187 * @return void188 */189 public function form( $instance ) {190 191 // Get widget settings.192 $settings = $this->parse_settings( $instance );193 $title = strip_tags( $settings['title'] );194 $max_members = strip_tags( $settings['max_members'] );195 $member_default = strip_tags( $settings['member_default'] );196 $link_title = (bool) $settings['link_title']; ?>197 198 <p>199 <label for="<?php echo $this->get_field_id( 'title' ); ?>">200 <?php esc_html_e( 'Title:', 'buddypress' ); ?>201 <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" style="width: 100%" />202 </label>203 </p>204 205 <p>206 <label for="<?php echo $this->get_field_id( 'link_title' ) ?>">207 <input type="checkbox" name="<?php echo $this->get_field_name( 'link_title' ) ?>" id="<?php echo $this->get_field_id( 'link_title' ) ?>" value="1" <?php checked( $link_title ) ?> />208 <?php esc_html_e( 'Link widget title to Members directory', 'buddypress' ); ?>209 </label>210 </p>211 212 <p>213 <label for="<?php echo $this->get_field_id( 'max_members' ); ?>">214 <?php esc_html_e( 'Max members to show:', 'buddypress' ); ?>215 <input class="widefat" id="<?php echo $this->get_field_id( 'max_members' ); ?>" name="<?php echo $this->get_field_name( 'max_members' ); ?>" type="text" value="<?php echo esc_attr( $max_members ); ?>" style="width: 30%" />216 </label>217 </p>218 219 <p>220 <label for="<?php echo $this->get_field_id( 'member_default' ) ?>"><?php esc_html_e( 'Default members to show:', 'buddypress' ); ?></label>221 <select name="<?php echo $this->get_field_name( 'member_default' ) ?>" id="<?php echo $this->get_field_id( 'member_default' ) ?>">222 <option value="newest" <?php if ( 'newest' === $member_default ) : ?>selected="selected"<?php endif; ?>><?php esc_html_e( 'Newest', 'buddypress' ); ?></option>223 <option value="active" <?php if ( 'active' === $member_default ) : ?>selected="selected"<?php endif; ?>><?php esc_html_e( 'Active', 'buddypress' ); ?></option>224 <option value="popular" <?php if ( 'popular' === $member_default ) : ?>selected="selected"<?php endif; ?>><?php esc_html_e( 'Popular', 'buddypress' ); ?></option>225 </select>226 </p>227 228 <?php229 }230 231 /**232 * Merge the widget settings into defaults array.233 *234 * @since 2.3.0235 *236 * @uses bp_parse_args() To merge widget settings into defaults.237 *238 * @param array $instance Widget instance settings.239 * @return array240 */241 public function parse_settings( $instance = array() ) {242 return bp_parse_args( $instance, array(243 'title' => __( 'Members', 'buddypress' ),244 'max_members' => 5,245 'member_default' => 'active',246 'link_title' => false247 ), 'members_widget_settings' );248 }249 }250 251 /**252 * Who's Online Widget.253 *254 * @since 1.0.3255 */256 class BP_Core_Whos_Online_Widget extends WP_Widget {257 258 /**259 * Constructor method.260 */261 public function __construct() {262 $name = _x( "(BuddyPress) Who's Online", 'widget name', 'buddypress' );263 $description = __( 'Profile photos of online users', 'buddypress' );264 parent::__construct( false, $name, array(265 'description' => $description,266 'classname' => 'widget_bp_core_whos_online_widget buddypress widget',267 ) );268 }269 270 /**271 * Display the Who's Online widget.272 *273 * @see WP_Widget::widget() for description of parameters.274 *275 * @param array $args Widget arguments.276 * @param array $instance Widget settings, as saved by the user.277 */278 public function widget( $args, $instance ) {279 280 // Get widget settings.281 $settings = $this->parse_settings( $instance );282 283 /**284 * Filters the title of the Who's Online widget.285 *286 * @since 1.8.0287 * @since 2.3.0 Added 'instance' and 'id_base' to arguments passed to filter.288 *289 * @param string $title The widget title.290 * @param array $settings The settings for the particular instance of the widget.291 * @param string $id_base Root ID for all widgets of this type.292 */293 $title = apply_filters( 'widget_title', $settings['title'], $settings, $this->id_base );294 295 echo $args['before_widget']296 . $args['before_title']297 . $title298 . $args['after_title'];299 300 // Setup args for querying members.301 $members_args = array(302 'user_id' => 0,303 'type' => 'online',304 'per_page' => $settings['max_members'],305 'max' => $settings['max_members'],306 'populate_extras' => true,307 'search_terms' => false,308 ); ?>309 310 <?php if ( bp_has_members( $members_args ) ) : ?>311 312 <div class="avatar-block">313 314 <?php while ( bp_members() ) : bp_the_member(); ?>315 316 <div class="item-avatar">317 <a href="<?php bp_member_permalink(); ?>" title="<?php bp_member_name(); ?>"><?php bp_member_avatar(); ?></a>318 </div>319 320 <?php endwhile; ?>321 322 </div>323 324 <?php else: ?>325 326 <div class="widget-error">327 <?php esc_html_e( 'There are no users currently online', 'buddypress' ); ?>328 </div>329 330 <?php endif; ?>331 332 <?php echo $args['after_widget'];333 }334 335 /**336 * Update the Who's Online widget options.337 *338 * @param array $new_instance The new instance options.339 * @param array $old_instance The old instance options.340 * @return array $instance The parsed options to be saved.341 */342 public function update( $new_instance, $old_instance ) {343 $instance = $old_instance;344 $instance['title'] = strip_tags( $new_instance['title'] );345 $instance['max_members'] = strip_tags( $new_instance['max_members'] );346 347 return $instance;348 }349 350 /**351 * Output the Who's Online widget options form.352 *353 * @param array $instance Widget instance settings.354 * @return void355 */356 public function form( $instance ) {357 358 // Get widget settings.359 $settings = $this->parse_settings( $instance );360 $title = strip_tags( $settings['title'] );361 $max_members = strip_tags( $settings['max_members'] ); ?>362 363 <p>364 <label for="<?php echo $this->get_field_id( 'title' ); ?>">365 <?php esc_html_e( 'Title:', 'buddypress' ); ?>366 <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" style="width: 100%" />367 </label>368 </p>369 370 <p>371 <label for="<?php echo $this->get_field_id( 'max_members' ); ?>">372 <?php esc_html_e( 'Max members to show:', 'buddypress' ); ?>373 <input class="widefat" id="<?php echo $this->get_field_id( 'max_members' ); ?>" name="<?php echo $this->get_field_name( 'max_members' ); ?>" type="text" value="<?php echo esc_attr( $max_members ); ?>" style="width: 30%" />374 </label>375 </p>376 377 <?php378 }379 380 /**381 * Merge the widget settings into defaults array.382 *383 * @since 2.3.0384 *385 * @uses bp_parse_args() To merge widget settings into defaults.386 *387 * @param array $instance Widget instance settings.388 * @return array389 */390 public function parse_settings( $instance = array() ) {391 return bp_parse_args( $instance, array(392 'title' => __( "Who's Online", 'buddypress' ),393 'max_members' => 15,394 ), 'members_widget_settings' );395 }396 }397 398 /**399 * Recently Active Members Widget.400 *401 * @since 1.0.3402 */403 class BP_Core_Recently_Active_Widget extends WP_Widget {404 405 /**406 * Constructor method.407 */408 public function __construct() {409 $name = _x( '(BuddyPress) Recently Active Members', 'widget name', 'buddypress' );410 $description = __( 'Profile photos of recently active members', 'buddypress' );411 parent::__construct( false, $name, array(412 'description' => $description,413 'classname' => 'widget_bp_core_recently_active_widget buddypress widget',414 ) );415 }416 417 /**418 * Display the Recently Active widget.419 *420 * @see WP_Widget::widget() for description of parameters.421 *422 * @param array $args Widget arguments.423 * @param array $instance Widget settings, as saved by the user.424 */425 public function widget( $args, $instance ) {426 427 // Get widget settings.428 $settings = $this->parse_settings( $instance );429 430 /**431 * Filters the title of the Recently Active widget.432 *433 * @since 1.8.0434 * @since 2.3.0 Added 'instance' and 'id_base' to arguments passed to filter.435 *436 * @param string $title The widget title.437 * @param array $settings The settings for the particular instance of the widget.438 * @param string $id_base Root ID for all widgets of this type.439 */440 $title = apply_filters( 'widget_title', $settings['title'], $settings, $this->id_base );441 442 echo $args['before_widget'];443 echo $args['before_title']444 . $title445 . $args['after_title'];446 447 // Setup args for querying members.448 $members_args = array(449 'user_id' => 0,450 'type' => 'active',451 'per_page' => $settings['max_members'],452 'max' => $settings['max_members'],453 'populate_extras' => true,454 'search_terms' => false,455 ); ?>456 457 <?php if ( bp_has_members( $members_args ) ) : ?>458 459 <div class="avatar-block">460 461 <?php while ( bp_members() ) : bp_the_member(); ?>462 463 <div class="item-avatar">464 <a href="<?php bp_member_permalink(); ?>" title="<?php bp_member_name(); ?>"><?php bp_member_avatar(); ?></a>465 </div>466 467 <?php endwhile; ?>468 469 </div>470 471 <?php else: ?>472 473 <div class="widget-error">474 <?php esc_html_e( 'There are no recently active members', 'buddypress' ); ?>475 </div>476 477 <?php endif; ?>478 479 <?php echo $args['after_widget'];480 }481 482 /**483 * Update the Recently Active widget options.484 *485 * @param array $new_instance The new instance options.486 * @param array $old_instance The old instance options.487 * @return array $instance The parsed options to be saved.488 */489 public function update( $new_instance, $old_instance ) {490 $instance = $old_instance;491 $instance['title'] = strip_tags( $new_instance['title'] );492 $instance['max_members'] = strip_tags( $new_instance['max_members'] );493 494 return $instance;495 }496 497 /**498 * Output the Recently Active widget options form.499 *500 * @param array $instance Widget instance settings.501 * @return void502 */503 public function form( $instance ) {504 505 // Get widget settings.506 $settings = $this->parse_settings( $instance );507 $title = strip_tags( $settings['title'] );508 $max_members = strip_tags( $settings['max_members'] ); ?>509 510 <p>511 <label for="<?php echo $this->get_field_id( 'title' ); ?>">512 <?php esc_html_e( 'Title:', 'buddypress' ); ?>513 <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" style="width: 100%" />514 </label>515 </p>516 517 <p>518 <label for="<?php echo $this->get_field_id( 'max_members' ); ?>">519 <?php esc_html_e( 'Max members to show:', 'buddypress' ); ?>520 <input class="widefat" id="<?php echo $this->get_field_id( 'max_members' ); ?>" name="<?php echo $this->get_field_name( 'max_members' ); ?>" type="text" value="<?php echo esc_attr( $max_members ); ?>" style="width: 30%" />521 </label>522 </p>523 524 <?php525 }526 527 /**528 * Merge the widget settings into defaults array.529 *530 * @since 2.3.0531 *532 * @uses bp_parse_args() To merge widget settings into defaults.533 *534 * @param array $instance Widget instance settings.535 * @return array536 */537 public function parse_settings( $instance = array() ) {538 return bp_parse_args( $instance, array(539 'title' => __( 'Recently Active Members', 'buddypress' ),540 'max_members' => 15,541 ), 'recently_active_members_widget_settings' );542 }543 }544 30 545 31 /** -
trunk/src/bp-members/classes/class-bp-core-members-template.php
r10515 r10521 1 1 <?php 2 2 /** 3 * BuddyPress Member Template Tags. 4 * 5 * Functions that are safe to use inside your template files and themes. 3 * BuddyPress Member Template loop class. 6 4 * 7 5 * @package BuddyPress 8 6 * @subpackage Members 9 * @since 1.5.010 7 */ 11 8 12 9 // Exit if accessed directly. 13 10 defined( 'ABSPATH' ) || exit; 14 15 /**16 * Output the profile component slug.17 *18 * @since 2.4.019 *20 * @uses bp_get_profile_slug()21 */22 function bp_profile_slug() {23 echo bp_get_profile_slug();24 }25 /**26 * Return the profile component slug.27 *28 * @since 2.4.029 *30 * @return string31 */32 function bp_get_profile_slug() {33 34 /**35 * Filters the profile component slug.36 *37 * @since 2.4.038 *39 * @param string $slug Profile component slug.40 */41 return apply_filters( 'bp_get_profile_slug', buddypress()->profile->slug );42 }43 44 /**45 * Output the members component slug.46 *47 * @since 1.5.048 *49 * @uses bp_get_members_slug()50 */51 function bp_members_slug() {52 echo bp_get_members_slug();53 }54 /**55 * Return the members component slug.56 *57 * @since 1.5.058 *59 * @return string60 */61 function bp_get_members_slug() {62 63 /**64 * Filters the Members component slug.65 *66 * @since 1.5.067 *68 * @param string $slug Members component slug.69 */70 return apply_filters( 'bp_get_members_slug', buddypress()->members->slug );71 }72 73 /**74 * Output the members component root slug.75 *76 * @since 1.5.077 *78 * @uses bp_get_members_root_slug()79 */80 function bp_members_root_slug() {81 echo bp_get_members_root_slug();82 }83 /**84 * Return the members component root slug.85 *86 * @since 1.5.087 *88 * @return string89 */90 function bp_get_members_root_slug() {91 92 /**93 * Filters the Members component root slug.94 *95 * @since 1.5.096 *97 * @param string $slug Members component root slug.98 */99 return apply_filters( 'bp_get_members_root_slug', buddypress()->members->root_slug );100 }101 102 /**103 * Output the member type base slug.104 *105 * @since 2.5.0106 */107 function bp_members_member_type_base() {108 echo esc_url( bp_get_members_member_type_base() );109 }110 /**111 * Get the member type base slug.112 *113 * The base slug is the string used as the base prefix when generating member type directory URLs.114 * For example, in example.com/members/type/foo/, 'foo' is the member type and 'type' is the115 * base slug.116 *117 * @since 2.5.0118 *119 * @return string120 */121 function bp_get_members_member_type_base() {122 /**123 * Filters the member type URL base.124 *125 * @since 2.3.0126 *127 * @param string $base128 */129 return apply_filters( 'bp_members_member_type_base', _x( 'type', 'member type URL base', 'buddypress' ) );130 }131 132 /**133 * Output member directory permalink.134 *135 * @since 1.5.0136 *137 * @uses bp_get_members_directory_permalink()138 */139 function bp_members_directory_permalink() {140 echo esc_url( bp_get_members_directory_permalink() );141 }142 /**143 * Return member directory permalink.144 *145 * @since 1.5.0146 *147 * @return string148 */149 function bp_get_members_directory_permalink() {150 151 /**152 * Filters the member directory permalink.153 *154 * @since 1.5.0155 *156 * @param string $value Members directory permalink.157 */158 return apply_filters( 'bp_get_members_directory_permalink', trailingslashit( bp_get_root_domain() . '/' . bp_get_members_root_slug() ) );159 }160 161 /**162 * Output member type directory permalink.163 *164 * @since 2.5.0165 *166 * @uses bp_get_member_type_directory_permalink()167 *168 * @param string $member_type Optional. Member type.169 */170 function bp_member_type_directory_permalink( $member_type = '' ) {171 echo esc_url( bp_get_member_type_directory_permalink( $member_type ) );172 }173 /**174 * Return member type directory permalink.175 *176 * @since 2.5.0177 *178 * @param string $member_type Optional. Member type. Defaults to current member type.179 * @return string Member type directory URL on success, an empty string on failure.180 */181 function bp_get_member_type_directory_permalink( $member_type = '' ) {182 183 if ( $member_type ) {184 $_member_type = $member_type;185 } else {186 // Fall back on the current member type.187 $_member_type = bp_get_current_member_type();188 }189 190 $type = bp_get_member_type_object( $_member_type );191 192 // Bail when member type is not found or has no directory.193 if ( ! $type || ! $type->has_directory ) {194 return '';195 }196 197 /**198 * Filters the member type directory permalink.199 *200 * @since 2.5.0201 *202 * @param string $value Member type directory permalink.203 * @param object $type Member type object.204 * @param string $member_type Member type name, as passed to the function.205 */206 return apply_filters( 'bp_get_member_type_directory_permalink', trailingslashit( bp_get_members_directory_permalink() . bp_get_members_member_type_base() . '/' . $type->directory_slug ), $type, $member_type );207 }208 209 /**210 * Output the sign-up slug.211 *212 * @since 1.5.0213 *214 * @uses bp_get_signup_slug()215 */216 function bp_signup_slug() {217 echo bp_get_signup_slug();218 }219 /**220 * Return the sign-up slug.221 *222 * @since 1.5.0223 *224 * @return string225 */226 function bp_get_signup_slug() {227 $bp = buddypress();228 229 if ( !empty( $bp->pages->register->slug ) ) {230 $slug = $bp->pages->register->slug;231 } elseif ( defined( 'BP_REGISTER_SLUG' ) ) {232 $slug = BP_REGISTER_SLUG;233 } else {234 $slug = 'register';235 }236 237 /**238 * Filters the sign-up slug.239 *240 * @since 1.5.0241 *242 * @param string $slug Sign-up slug.243 */244 return apply_filters( 'bp_get_signup_slug', $slug );245 }246 247 /**248 * Output the activation slug.249 *250 * @since 1.5.0251 *252 * @uses bp_get_activate_slug()253 */254 function bp_activate_slug() {255 echo bp_get_activate_slug();256 }257 /**258 * Return the activation slug.259 *260 * @since 1.5.0261 *262 * @return string263 */264 function bp_get_activate_slug() {265 $bp = buddypress();266 267 if ( !empty( $bp->pages->activate->slug ) ) {268 $slug = $bp->pages->activate->slug;269 } elseif ( defined( 'BP_ACTIVATION_SLUG' ) ) {270 $slug = BP_ACTIVATION_SLUG;271 } else {272 $slug = 'activate';273 }274 275 /**276 * Filters the activation slug.277 *278 * @since 1.5.0279 *280 * @param string $slug Activation slug.281 */282 return apply_filters( 'bp_get_activate_slug', $slug );283 }284 11 285 12 /** … … 548 275 } 549 276 } 550 551 /**552 * Rewind the members and reset member index.553 */554 function bp_rewind_members() {555 global $members_template;556 557 return $members_template->rewind_members();558 }559 560 /**561 * Initialize the members loop.562 *563 * Based on the $args passed, bp_has_members() populates the $members_template564 * global, enabling the use of BuddyPress templates and template functions to565 * display a list of members.566 *567 * @global object $members_template {@link BP_Members_Template}568 *569 * @param array|string $args {570 * Arguments for limiting the contents of the members loop. Most arguments571 * are in the same format as {@link BP_User_Query}. However, because572 * the format of the arguments accepted here differs in a number of ways,573 * and because bp_has_members() determines some default arguments in a574 * dynamic fashion, we list all accepted arguments here as well.575 *576 * Arguments can be passed as an associative array, or as a URL query577 * string (eg, 'user_id=4&per_page=3').578 *579 * @type int $type Sort order. Accepts 'active', 'random', 'newest', 'popular',580 * 'online', 'alphabetical'. Default: 'active'.581 * @type int|bool $page Page of results to display. Default: 1.582 * @type int|bool $per_page Number of results per page. Default: 20.583 * @type int|bool $max Maximum number of results to return. Default: false (unlimited).584 * @type string $page_arg The string used as a query parameter in pagination links.585 * Default: 'bpage'.586 * @type array|int|string|bool $include Limit results by a list of user IDs. Accepts an array, a587 * single integer, a comma-separated list of IDs, or false (to588 * disable this limiting). Accepts 'active', 'alphabetical',589 * 'newest', or 'random'. Default: false.590 * @type array|int|string|bool $exclude Exclude users from results by ID. Accepts an array, a single591 * integer, a comma-separated list of IDs, or false (to disable592 * this limiting). Default: false.593 * @type int $user_id If provided, results are limited to the friends of the specified594 * user. When on a user's Friends page, defaults to the ID of the595 * displayed user. Otherwise defaults to 0.596 * @type string|array $member_type Array or comma-separated list of member types to limit597 * results to.598 * @type string|array $member_type__in Array or comma-separated list of member types to limit599 * results to.600 * @type string|array $member_type__not_in Array or comma-separated list of member types to exclude601 * from results.602 * @type string $search_terms Limit results by a search term. Default: value of603 * `$_REQUEST['members_search']` or `$_REQUEST['s']`, if present.604 * Otherwise false.605 * @type string $meta_key Limit results by the presence of a usermeta key.606 * Default: false.607 * @type mixed $meta_value When used with meta_key, limits results by the a matching608 * usermeta value. Default: false.609 * @type bool $populate_extras Whether to fetch optional data, such as friend counts.610 * Default: true.611 * }612 * @return bool Returns true when blogs are found, otherwise false.613 */614 function bp_has_members( $args = '' ) {615 global $members_template;616 617 // Default user ID.618 $user_id = 0;619 620 // User filtering.621 if ( bp_is_user_friends() && ! bp_is_user_friend_requests() ) {622 $user_id = bp_displayed_user_id();623 }624 625 $member_type = bp_get_current_member_type();626 if ( ! $member_type && ! empty( $_GET['member_type'] ) ) {627 if ( is_array( $_GET['member_type'] ) ) {628 $member_type = $_GET['member_type'];629 } else {630 // Can be a comma-separated list.631 $member_type = explode( ',', $_GET['member_type'] );632 }633 }634 635 $search_terms_default = null;636 $search_query_arg = bp_core_get_component_search_query_arg( 'members' );637 if ( ! empty( $_REQUEST[ $search_query_arg ] ) ) {638 $search_terms_default = stripslashes( $_REQUEST[ $search_query_arg ] );639 }640 641 // Type: active ( default ) | random | newest | popular | online | alphabetical.642 $r = bp_parse_args( $args, array(643 'type' => 'active',644 'page' => 1,645 'per_page' => 20,646 'max' => false,647 648 'page_arg' => 'upage', // See https://buddypress.trac.wordpress.org/ticket/3679.649 650 'include' => false, // Pass a user_id or a list (comma-separated or array) of user_ids to only show these users.651 'exclude' => false, // Pass a user_id or a list (comma-separated or array) of user_ids to exclude these users.652 653 'user_id' => $user_id, // Pass a user_id to only show friends of this user.654 'member_type' => $member_type,655 'member_type__in' => '',656 'member_type__not_in' => '',657 'search_terms' => $search_terms_default,658 659 'meta_key' => false, // Only return users with this usermeta.660 'meta_value' => false, // Only return users where the usermeta value matches. Requires meta_key.661 662 'populate_extras' => true // Fetch usermeta? Friend count, last active etc.663 ), 'has_members' );664 665 // Pass a filter if ?s= is set.666 if ( is_null( $r['search_terms'] ) ) {667 if ( !empty( $_REQUEST['s'] ) ) {668 $r['search_terms'] = $_REQUEST['s'];669 } else {670 $r['search_terms'] = false;671 }672 }673 674 // Set per_page to max if max is larger than per_page.675 if ( !empty( $r['max'] ) && ( $r['per_page'] > $r['max'] ) ) {676 $r['per_page'] = $r['max'];677 }678 679 // Query for members and populate $members_template global.680 $members_template = new BP_Core_Members_Template(681 $r['type'],682 $r['page'],683 $r['per_page'],684 $r['max'],685 $r['user_id'],686 $r['search_terms'],687 $r['include'],688 $r['populate_extras'],689 $r['exclude'],690 $r['meta_key'],691 $r['meta_value'],692 $r['page_arg'],693 $r['member_type'],694 $r['member_type__in'],695 $r['member_type__not_in']696 );697 698 /**699 * Filters whether or not BuddyPress has members to iterate over.700 *701 * @since 1.2.4702 *703 * @param bool $value Whether or not there are members to iterate over.704 * @param array $members_template Populated $members_template global.705 */706 return apply_filters( 'bp_has_members', $members_template->has_members(), $members_template );707 }708 709 /**710 * Set up the current member inside the loop.711 *712 * @return object713 */714 function bp_the_member() {715 global $members_template;716 return $members_template->the_member();717 }718 719 /**720 * Check whether there are more members to iterate over.721 *722 * @return bool723 */724 function bp_members() {725 global $members_template;726 return $members_template->members();727 }728 729 /**730 * Output the members pagination count.731 */732 function bp_members_pagination_count() {733 echo bp_get_members_pagination_count();734 }735 /**736 * Generate the members pagination count.737 *738 * @return string739 */740 function bp_get_members_pagination_count() {741 global $members_template;742 743 if ( empty( $members_template->type ) )744 $members_template->type = '';745 746 $start_num = intval( ( $members_template->pag_page - 1 ) * $members_template->pag_num ) + 1;747 $from_num = bp_core_number_format( $start_num );748 $to_num = bp_core_number_format( ( $start_num + ( $members_template->pag_num - 1 ) > $members_template->total_member_count ) ? $members_template->total_member_count : $start_num + ( $members_template->pag_num - 1 ) );749 $total = bp_core_number_format( $members_template->total_member_count );750 751 if ( 'active' == $members_template->type ) {752 if ( 1 == $members_template->total_member_count ) {753 $pag = __( 'Viewing 1 active member', 'buddypress' );754 } else {755 $pag = sprintf( _n( 'Viewing %1$s - %2$s of %3$s active member', 'Viewing %1$s - %2$s of %3$s active members', $members_template->total_member_count, 'buddypress' ), $from_num, $to_num, $total );756 }757 } elseif ( 'popular' == $members_template->type ) {758 if ( 1 == $members_template->total_member_count ) {759 $pag = __( 'Viewing 1 member with friends', 'buddypress' );760 } else {761 $pag = sprintf( _n( 'Viewing %1$s - %2$s of %3$s member with friends', 'Viewing %1$s - %2$s of %3$s members with friends', $members_template->total_member_count, 'buddypress' ), $from_num, $to_num, $total );762 }763 } elseif ( 'online' == $members_template->type ) {764 if ( 1 == $members_template->total_member_count ) {765 $pag = __( 'Viewing 1 online member', 'buddypress' );766 } else {767 $pag = sprintf( _n( 'Viewing %1$s - %2$s of %3$s online member', 'Viewing %1$s - %2$s of %3$s online members', $members_template->total_member_count, 'buddypress' ), $from_num, $to_num, $total );768 }769 } else {770 if ( 1 == $members_template->total_member_count ) {771 $pag = __( 'Viewing 1 member', 'buddypress' );772 } else {773 $pag = sprintf( _n( 'Viewing %1$s - %2$s of %3$s member', 'Viewing %1$s - %2$s of %3$s members', $members_template->total_member_count, 'buddypress' ), $from_num, $to_num, $total );774 }775 }776 777 /**778 * Filters the members pagination count.779 *780 * @since 1.5.0781 *782 * @param string $pag Pagination count string.783 */784 return apply_filters( 'bp_members_pagination_count', $pag );785 }786 787 /**788 * Output the members pagination links.789 */790 function bp_members_pagination_links() {791 echo bp_get_members_pagination_links();792 }793 /**794 * Fetch the members pagination links.795 *796 * @return string797 */798 function bp_get_members_pagination_links() {799 global $members_template;800 801 /**802 * Filters the members pagination link.803 *804 * @since 1.2.0805 *806 * @param string $pag_links HTML markup for pagination links.807 */808 return apply_filters( 'bp_get_members_pagination_links', $members_template->pag_links );809 }810 811 /**812 * Output the ID of the current member in the loop.813 *814 * @uses bp_get_member_user_id()815 */816 function bp_member_user_id() {817 echo bp_get_member_user_id();818 }819 /**820 * Get the ID of the current member in the loop.821 *822 * @return string Member ID.823 */824 function bp_get_member_user_id() {825 global $members_template;826 $member_id = isset( $members_template->member->id ) ? (int) $members_template->member->id : false;827 828 /**829 * Filters the ID of the current member in the loop.830 *831 * @since 1.2.0832 *833 * @param int $member_id ID of the member being iterated over.834 */835 return apply_filters( 'bp_get_member_user_id', $member_id );836 }837 838 /**839 * Output the row class of the current member in the loop.840 *841 * @since 1.7.0842 *843 * @param array $classes Array of custom classes.844 */845 function bp_member_class( $classes = array() ) {846 echo bp_get_member_class( $classes );847 }848 /**849 * Return the row class of the current member in the loop.850 *851 * @since 1.7.0852 *853 * @param array $classes Array of custom classes.854 *855 * @return string Row class of the member856 */857 function bp_get_member_class( $classes = array() ) {858 global $members_template;859 860 // Add even/odd classes, but only if there's more than 1 member.861 if ( $members_template->member_count > 1 ) {862 $pos_in_loop = (int) $members_template->current_member;863 $classes[] = ( $pos_in_loop % 2 ) ? 'even' : 'odd';864 865 // If we've only one member in the loop, don't bother with odd and even.866 } else {867 $classes[] = 'bp-single-member';868 }869 870 // Maybe add 'is-online' class.871 if ( ! empty( $members_template->member->last_activity ) ) {872 873 // Calculate some times.874 $current_time = strtotime( bp_core_current_time() );875 $last_activity = strtotime( $members_template->member->last_activity );876 $still_online = strtotime( '+5 minutes', $last_activity );877 878 // Has the user been active recently?879 if ( $current_time <= $still_online ) {880 $classes[] = 'is-online';881 }882 }883 884 // Add current user class.885 if ( bp_loggedin_user_id() === (int) $members_template->member->id ) {886 $classes[] = 'is-current-user';887 }888 889 /**890 * Filters the determined classes to add to the HTML element.891 *892 * @since 1.7.0893 *894 * @param string $classes Classes to be added to the HTML element.895 */896 $classes = apply_filters( 'bp_get_member_class', $classes );897 $classes = array_merge( $classes, array() );898 $retval = 'class="' . join( ' ', $classes ) . '"';899 900 return $retval;901 }902 903 /**904 * Output nicename of current member in the loop.905 */906 function bp_member_user_nicename() {907 echo bp_get_member_user_nicename();908 }909 /**910 * Get the nicename of the current member in the loop.911 *912 * @return string Members nicename.913 */914 function bp_get_member_user_nicename() {915 global $members_template;916 917 /**918 * Filters the nicename of the current member in the loop.919 *920 * @since 1.2.5921 *922 * @param string $user_nicename Nicename for the current member.923 */924 return apply_filters( 'bp_get_member_user_nicename', $members_template->member->user_nicename );925 }926 927 /**928 * Output login for current member in the loop.929 */930 function bp_member_user_login() {931 echo bp_get_member_user_login();932 }933 /**934 * Get the login of the current member in the loop.935 *936 * @return string Member's login.937 */938 function bp_get_member_user_login() {939 global $members_template;940 941 /**942 * Filters the login of the current member in the loop.943 *944 * @since 1.2.5945 *946 * @param string $user_login Login for the current member.947 */948 return apply_filters( 'bp_get_member_user_login', $members_template->member->user_login );949 }950 951 /**952 * Output the email address for the current member in the loop.953 */954 function bp_member_user_email() {955 echo bp_get_member_user_email();956 }957 /**958 * Get the email address of the current member in the loop.959 *960 * @return string Member's email address.961 */962 function bp_get_member_user_email() {963 global $members_template;964 965 /**966 * Filters the email address of the current member in the loop.967 *968 * @since 1.2.5969 *970 * @param string $user_email Email address for the current member.971 */972 return apply_filters( 'bp_get_member_user_email', $members_template->member->user_email );973 }974 975 /**976 * Check whether the current member in the loop is the logged-in user.977 *978 * @return bool979 */980 function bp_member_is_loggedin_user() {981 global $members_template;982 983 /**984 * Filters whether the current member in the loop is the logged-in user.985 *986 * @since 1.2.5987 *988 * @param bool $value Whether current member in the loop is logged in.989 */990 return apply_filters( 'bp_member_is_loggedin_user', bp_loggedin_user_id() == $members_template->member->id ? true : false );991 }992 993 /**994 * Output a member's avatar.995 *996 * @see bp_get_member_avatar() for description of arguments.997 *998 * @param array|string $args See {@link bp_get_member_avatar()}.999 */1000 function bp_member_avatar( $args = '' ) {1001 1002 /**1003 * Filters a members avatar.1004 *1005 * @since 1.2.01006 *1007 * @param string $value Formatted HTML <img> element, or raw avatar URL based on $html arg.1008 */1009 echo apply_filters( 'bp_member_avatar', bp_get_member_avatar( $args ) );1010 }1011 /**1012 * Get a member's avatar.1013 *1014 * @see bp_core_fetch_avatar() For a description of arguments and1015 * return values.1016 *1017 * @param array|string $args {1018 * Arguments are listed here with an explanation of their defaults.1019 * For more information about the arguments, see1020 * {@link bp_core_fetch_avatar()}.1021 * @type string $alt Default: 'Profile picture of [user name]'.1022 * @type string $class Default: 'avatar'.1023 * @type string $type Default: 'thumb'.1024 * @type int|bool $width Default: false.1025 * @type int|bool $height Default: false.1026 * @type bool $id Currently unused.1027 * @type bool $no_grav Default: false.1028 * }1029 * @return string User avatar string.1030 */1031 function bp_get_member_avatar( $args = '' ) {1032 global $members_template;1033 1034 $fullname = !empty( $members_template->member->fullname ) ? $members_template->member->fullname : $members_template->member->display_name;1035 1036 $defaults = array(1037 'type' => 'thumb',1038 'width' => false,1039 'height' => false,1040 'class' => 'avatar',1041 'id' => false,1042 'alt' => sprintf( __( 'Profile picture of %s', 'buddypress' ), $fullname )1043 );1044 1045 $r = wp_parse_args( $args, $defaults );1046 extract( $r, EXTR_SKIP );1047 1048 /**1049 * Filters a members avatar.1050 *1051 * @since 1.2.01052 *1053 * @param string $value Formatted HTML <img> element, or raw avatar URL based on $html arg.1054 */1055 return apply_filters( 'bp_get_member_avatar', bp_core_fetch_avatar( array( 'item_id' => $members_template->member->id, 'type' => $type, 'alt' => $alt, 'css_id' => $id, 'class' => $class, 'width' => $width, 'height' => $height, 'email' => $members_template->member->user_email ) ) );1056 }1057 1058 /**1059 * Output the permalink for the current member in the loop.1060 */1061 function bp_member_permalink() {1062 echo bp_get_member_permalink();1063 }1064 /**1065 * Get the permalink for the current member in the loop.1066 *1067 * @return string1068 */1069 function bp_get_member_permalink() {1070 global $members_template;1071 1072 /**1073 * Filters the permalink for the current member in the loop.1074 *1075 * @since 1.2.01076 *1077 * @param string $value Permalink for the current member in the loop.1078 */1079 return apply_filters( 'bp_get_member_permalink', bp_core_get_user_domain( $members_template->member->id, $members_template->member->user_nicename, $members_template->member->user_login ) );1080 }1081 1082 /**1083 * Alias of {@link bp_member_permalink()}.1084 */1085 function bp_member_link() { echo bp_get_member_permalink(); }1086 1087 /**1088 * Alias of {@link bp_get_member_permalink()}.1089 */1090 function bp_get_member_link() { return bp_get_member_permalink(); }1091 1092 /**1093 * Output display name of current member in the loop.1094 */1095 function bp_member_name() {1096 1097 /**1098 * Filters the display name of current member in the loop.1099 *1100 * @since 1.2.01101 *1102 * @param string $value Display name for current member.1103 */1104 echo apply_filters( 'bp_member_name', bp_get_member_name() );1105 }1106 /**1107 * Get the display name of the current member in the loop.1108 *1109 * Full name is, by default, pulled from xprofile's Full Name field.1110 * When this field is empty, we try to get an alternative name from the1111 * WP users table, in the following order of preference: display_name,1112 * user_nicename, user_login.1113 *1114 * @return string The user's fullname for display.1115 */1116 function bp_get_member_name() {1117 global $members_template;1118 1119 // Generally, this only fires when xprofile is disabled.1120 if ( empty( $members_template->member->fullname ) ) {1121 // Our order of preference for alternative fullnames.1122 $name_stack = array(1123 'display_name',1124 'user_nicename',1125 'user_login'1126 );1127 1128 foreach ( $name_stack as $source ) {1129 if ( !empty( $members_template->member->{$source} ) ) {1130 // When a value is found, set it as fullname and be done with it.1131 $members_template->member->fullname = $members_template->member->{$source};1132 break;1133 }1134 }1135 }1136 1137 /**1138 * Filters the display name of current member in the loop.1139 *1140 * @since 1.2.01141 *1142 * @param string $fullname Display name for current member.1143 */1144 return apply_filters( 'bp_get_member_name', $members_template->member->fullname );1145 }1146 add_filter( 'bp_get_member_name', 'wp_filter_kses' );1147 add_filter( 'bp_get_member_name', 'stripslashes' );1148 add_filter( 'bp_get_member_name', 'strip_tags' );1149 add_filter( 'bp_get_member_name', 'esc_html' );1150 1151 /**1152 * Output the current member's last active time.1153 *1154 * @param array $args See {@link bp_get_member_last_active()}.1155 */1156 function bp_member_last_active( $args = array() ) {1157 echo bp_get_member_last_active( $args );1158 }1159 /**1160 * Return the current member's last active time.1161 *1162 * @param array $args {1163 * Array of optional arguments.1164 * @type mixed $active_format If true, formatted "active 5 minutes1165 * ago". If false, formatted "5 minutes ago".1166 * If string, should be sprintf'able like1167 * 'last seen %s ago'.1168 * }1169 * @return string1170 */1171 function bp_get_member_last_active( $args = array() ) {1172 global $members_template;1173 1174 // Parse the activity format.1175 $r = bp_parse_args( $args, array(1176 'active_format' => true1177 ) );1178 1179 // Backwards compatibility for anyone forcing a 'true' active_format.1180 if ( true === $r['active_format'] ) {1181 $r['active_format'] = __( 'active %s', 'buddypress' );1182 }1183 1184 // Member has logged in at least one time.1185 if ( isset( $members_template->member->last_activity ) ) {1186 1187 // Backwards compatibility for pre 1.5 'ago' strings.1188 $last_activity = ! empty( $r['active_format'] )1189 ? bp_core_get_last_activity( $members_template->member->last_activity, $r['active_format'] )1190 : bp_core_time_since( $members_template->member->last_activity );1191 1192 // Member has never logged in or been active.1193 } else {1194 $last_activity = __( 'Never active', 'buddypress' );1195 }1196 1197 /**1198 * Filters the current members last active time.1199 *1200 * @since 1.2.01201 *1202 * @param string $last_activity Formatted time since last activity.1203 * @param array $r Array of parsed arguments for query.1204 */1205 return apply_filters( 'bp_member_last_active', $last_activity, $r );1206 }1207 1208 /**1209 * Output the latest update of the current member in the loop.1210 *1211 * @param array|string $args Array of arguments for latest update.1212 */1213 function bp_member_latest_update( $args = '' ) {1214 echo bp_get_member_latest_update( $args );1215 }1216 /**1217 * Get the latest update from the current member in the loop.1218 *1219 * @param array|string $args {1220 * Array of optional arguments.1221 * @type int $length Truncation length. Default: 225.1222 * @type bool $view_link Whether to provide a 'View' link for1223 * truncated entries. Default: false.1224 * }1225 * @return string1226 */1227 function bp_get_member_latest_update( $args = '' ) {1228 global $members_template;1229 1230 $defaults = array(1231 'length' => 225,1232 'view_link' => true1233 );1234 1235 $r = wp_parse_args( $args, $defaults );1236 extract( $r );1237 1238 if ( !bp_is_active( 'activity' ) || empty( $members_template->member->latest_update ) || !$update = maybe_unserialize( $members_template->member->latest_update ) )1239 return false;1240 1241 /**1242 * Filters the excerpt of the latest update for current member in the loop.1243 *1244 * @since 1.2.51245 *1246 * @param string $value Excerpt of the latest update for current member in the loop.1247 */1248 $update_content = apply_filters( 'bp_get_activity_latest_update_excerpt', trim( strip_tags( bp_create_excerpt( $update['content'], $length ) ) ) );1249 1250 $update_content = sprintf( _x( '- "%s"', 'member latest update in member directory', 'buddypress' ), $update_content );1251 1252 // If $view_link is true and the text returned by bp_create_excerpt() is different from the original text (ie it's1253 // been truncated), add the "View" link.1254 if ( $view_link && ( $update_content != $update['content'] ) ) {1255 $view = __( 'View', 'buddypress' );1256 1257 $update_content .= '<span class="activity-read-more"><a href="' . bp_activity_get_permalink( $update['id'] ) . '" rel="nofollow">' . $view . '</a></span>';1258 }1259 1260 /**1261 * Filters the latest update from the current member in the loop.1262 *1263 * @since 1.2.01264 *1265 * @param string $update_content Formatted latest update for current member.1266 */1267 return apply_filters( 'bp_get_member_latest_update', $update_content );1268 }1269 1270 /**1271 * Output a piece of user profile data.1272 *1273 * @see bp_get_member_profile_data() for a description of params.1274 *1275 * @param array|string $args See {@link bp_get_member_profile_data()}.1276 */1277 function bp_member_profile_data( $args = '' ) {1278 echo bp_get_member_profile_data( $args );1279 }1280 /**1281 * Get a piece of user profile data.1282 *1283 * When used in a bp_has_members() loop, this function will attempt1284 * to fetch profile data cached in the template global. It is also safe1285 * to use outside of the loop.1286 *1287 * @param array|string $args {1288 * Array of config parameters.1289 * @type string $field Name of the profile field.1290 * @type int $user_id ID of the user whose data is being fetched.1291 * Defaults to the current member in the loop, or if not1292 * present, to the currently displayed user.1293 * }1294 * @return string|bool Profile data if found, otherwise false.1295 */1296 function bp_get_member_profile_data( $args = '' ) {1297 global $members_template;1298 1299 if ( ! bp_is_active( 'xprofile' ) ) {1300 return false;1301 }1302 1303 // Declare local variables.1304 $data = false;1305 1306 // Guess at default $user_id.1307 $default_user_id = 0;1308 if ( ! empty( $members_template->member->id ) ) {1309 $default_user_id = $members_template->member->id;1310 } elseif ( bp_displayed_user_id() ) {1311 $default_user_id = bp_displayed_user_id();1312 }1313 1314 $defaults = array(1315 'field' => false,1316 'user_id' => $default_user_id,1317 );1318 1319 $r = wp_parse_args( $args, $defaults );1320 1321 // If we're in a members loop, get the data from the global.1322 if ( ! empty( $members_template->member->profile_data ) ) {1323 $profile_data = $members_template->member->profile_data;1324 }1325 1326 // Otherwise query for the data.1327 if ( empty( $profile_data ) && method_exists( 'BP_XProfile_ProfileData', 'get_all_for_user' ) ) {1328 $profile_data = BP_XProfile_ProfileData::get_all_for_user( $r['user_id'] );1329 }1330 1331 // If we're in the members loop, but the profile data has not1332 // been loaded into the global, cache it there for later use.1333 if ( ! empty( $members_template->member ) && empty( $members_template->member->profile_data ) ) {1334 $members_template->member->profile_data = $profile_data;1335 }1336 1337 // Get the data for the specific field requested.1338 if ( ! empty( $profile_data ) && ! empty( $profile_data[ $r['field'] ]['field_type'] ) && ! empty( $profile_data[ $r['field'] ]['field_data'] ) ) {1339 $data = xprofile_format_profile_field( $profile_data[ $r['field'] ]['field_type'], $profile_data[ $r['field'] ]['field_data'] );1340 }1341 1342 /**1343 * Filters resulting piece of member profile data.1344 *1345 * @since 1.2.01346 *1347 * @param string|bool $data Profile data if found, otherwise false.1348 */1349 return apply_filters( 'bp_get_member_profile_data', $data );1350 }1351 1352 /**1353 * Output the 'registered [x days ago]' string for the current member.1354 */1355 function bp_member_registered() {1356 echo bp_get_member_registered();1357 }1358 /**1359 * Get the 'registered [x days ago]' string for the current member.1360 *1361 * @return string1362 */1363 function bp_get_member_registered() {1364 global $members_template;1365 1366 $registered = esc_attr( bp_core_get_last_activity( $members_template->member->user_registered, _x( 'registered %s', 'Records the timestamp that the user registered into the activity stream', 'buddypress' ) ) );1367 1368 /**1369 * Filters the 'registered [x days ago]' string for the current member.1370 *1371 * @since 2.1.01372 *1373 * @param string $registered The 'registered [x days ago]' string.1374 */1375 return apply_filters( 'bp_member_registered', $registered );1376 }1377 1378 /**1379 * Output a random piece of profile data for the current member in the loop.1380 */1381 function bp_member_random_profile_data() {1382 global $members_template;1383 1384 if ( bp_is_active( 'xprofile' ) ) { ?>1385 <?php $random_data = xprofile_get_random_profile_data( $members_template->member->id, true ); ?>1386 <strong><?php echo wp_filter_kses( $random_data[0]->name ) ?></strong>1387 <?php echo wp_filter_kses( $random_data[0]->value ) ?>1388 <?php }1389 }1390 1391 /**1392 * Output hidden input for preserving member search params on form submit.1393 */1394 function bp_member_hidden_fields() {1395 $query_arg = bp_core_get_component_search_query_arg( 'members' );1396 1397 if ( isset( $_REQUEST[ $query_arg ] ) ) {1398 echo '<input type="hidden" id="search_terms" value="' . esc_attr( $_REQUEST[ $query_arg ] ) . '" name="search_terms" />';1399 }1400 1401 if ( isset( $_REQUEST['letter'] ) ) {1402 echo '<input type="hidden" id="selected_letter" value="' . esc_attr( $_REQUEST['letter'] ) . '" name="selected_letter" />';1403 }1404 1405 if ( isset( $_REQUEST['members_search'] ) ) {1406 echo '<input type="hidden" id="search_terms" value="' . esc_attr( $_REQUEST['members_search'] ) . '" name="search_terms" />';1407 }1408 }1409 1410 /**1411 * Output the Members directory search form.1412 */1413 function bp_directory_members_search_form() {1414 1415 $query_arg = bp_core_get_component_search_query_arg( 'members' );1416 1417 if ( ! empty( $_REQUEST[ $query_arg ] ) ) {1418 $search_value = stripslashes( $_REQUEST[ $query_arg ] );1419 } else {1420 $search_value = bp_get_search_default_text( 'members' );1421 }1422 1423 $search_form_html = '<form action="" method="get" id="search-members-form">1424 <label for="members_search"><input type="text" name="' . esc_attr( $query_arg ) . '" id="members_search" placeholder="'. esc_attr( $search_value ) .'" /></label>1425 <input type="submit" id="members_search_submit" name="members_search_submit" value="' . __( 'Search', 'buddypress' ) . '" />1426 </form>';1427 1428 /**1429 * Filters the Members component search form.1430 *1431 * @since 1.9.01432 *1433 * @param string $search_form_html HTML markup for the member search form.1434 */1435 echo apply_filters( 'bp_directory_members_search_form', $search_form_html );1436 }1437 1438 /**1439 * Output the total member count.1440 */1441 function bp_total_site_member_count() {1442 echo bp_get_total_site_member_count();1443 }1444 /**1445 * Get the total site member count.1446 *1447 * @return int1448 */1449 function bp_get_total_site_member_count() {1450 1451 /**1452 * Filters the total site member count.1453 *1454 * @since 1.2.01455 *1456 * @param int $value Number-formatted total site member count.1457 */1458 return apply_filters( 'bp_get_total_site_member_count', bp_core_number_format( bp_core_get_total_member_count() ) );1459 }1460 1461 /** Navigation and other misc template tags ***********************************/1462 1463 /**1464 * Render the navigation markup for the logged-in user.1465 *1466 * Each component adds to this navigation array within its own1467 * [component_name]setup_nav() function.1468 *1469 * This navigation array is the top level navigation, so it contains items such as:1470 * [Blog, Profile, Messages, Groups, Friends] ...1471 *1472 * The function will also analyze the current component the user is in, to1473 * determine whether or not to highlight a particular nav item.1474 *1475 * @todo Move to a back-compat file?1476 * @deprecated Does not seem to be called anywhere in BP core.1477 */1478 function bp_get_loggedin_user_nav() {1479 $bp = buddypress();1480 1481 // Loop through each navigation item.1482 foreach( (array) $bp->bp_nav as $nav_item ) {1483 1484 $selected = '';1485 1486 // If the current component matches the nav item id, then add a highlight CSS class.1487 if ( !bp_is_directory() && !empty( $bp->active_components[bp_current_component()] ) && $bp->active_components[bp_current_component()] == $nav_item['css_id'] ) {1488 $selected = ' class="current selected"';1489 }1490 1491 // If we are viewing another person (current_userid does not equal1492 // loggedin_user->id then check to see if the two users are friends.1493 // if they are, add a highlight CSS class to the friends nav item1494 // if it exists.1495 if ( !bp_is_my_profile() && bp_displayed_user_id() ) {1496 $selected = '';1497 1498 if ( bp_is_active( 'friends' ) ) {1499 if ( $nav_item['css_id'] == $bp->friends->id ) {1500 if ( friends_check_friendship( bp_loggedin_user_id(), bp_displayed_user_id() ) ) {1501 $selected = ' class="current selected"';1502 }1503 }1504 }1505 }1506 1507 // Echo out the final list item.1508 echo apply_filters_ref_array( 'bp_get_loggedin_user_nav_' . $nav_item['css_id'], array( '<li id="li-nav-' . $nav_item['css_id'] . '" ' . $selected . '><a id="my-' . $nav_item['css_id'] . '" href="' . $nav_item['link'] . '">' . $nav_item['name'] . '</a></li>', &$nav_item ) );1509 }1510 1511 // Always add a log out list item to the end of the navigation.1512 $logout_link = '<li><a id="wp-logout" href="' . wp_logout_url( bp_get_root_domain() ) . '">' . __( 'Log Out', 'buddypress' ) . '</a></li>';1513 1514 echo apply_filters( 'bp_logout_nav_link', $logout_link );1515 }1516 1517 /**1518 * Render the navigation markup for the displayed user.1519 */1520 function bp_get_displayed_user_nav() {1521 $bp = buddypress();1522 1523 foreach ( (array) $bp->bp_nav as $user_nav_item ) {1524 if ( empty( $user_nav_item['show_for_displayed_user'] ) && !bp_is_my_profile() )1525 continue;1526 1527 $selected = '';1528 if ( bp_is_current_component( $user_nav_item['slug'] ) ) {1529 $selected = ' class="current selected"';1530 }1531 1532 if ( bp_loggedin_user_domain() ) {1533 $link = str_replace( bp_loggedin_user_domain(), bp_displayed_user_domain(), $user_nav_item['link'] );1534 } else {1535 $link = trailingslashit( bp_displayed_user_domain() . $user_nav_item['link'] );1536 }1537 1538 /**1539 * Filters the navigation markup for the displayed user.1540 *1541 * This is a dynamic filter that is dependent on the navigation tab component being rendered.1542 *1543 * @since 1.1.01544 *1545 * @param string $value Markup for the tab list item including link.1546 * @param array $user_nav_item Array holding parts used to construct tab list item.1547 * Passed by reference.1548 */1549 echo apply_filters_ref_array( 'bp_get_displayed_user_nav_' . $user_nav_item['css_id'], array( '<li id="' . $user_nav_item['css_id'] . '-personal-li" ' . $selected . '><a id="user-' . $user_nav_item['css_id'] . '" href="' . $link . '">' . $user_nav_item['name'] . '</a></li>', &$user_nav_item ) );1550 }1551 }1552 1553 /** Cover image ***************************************************************/1554 1555 /**1556 * Should we use the cover image header1557 *1558 * @since 2.4.01559 *1560 * @return bool True if the displayed user has a cover image,1561 * False otherwise1562 */1563 function bp_displayed_user_use_cover_image_header() {1564 return (bool) bp_is_active( 'xprofile', 'cover_image' ) && ! bp_disable_cover_image_uploads() && bp_attachments_is_wp_version_supported();1565 }1566 1567 /** Avatars *******************************************************************/1568 1569 /**1570 * Output the logged-in user's avatar.1571 *1572 * @see bp_get_loggedin_user_avatar() for a description of params.1573 *1574 * @param array|string $args Array of arguments for logged in user avatar.1575 */1576 function bp_loggedin_user_avatar( $args = '' ) {1577 echo bp_get_loggedin_user_avatar( $args );1578 }1579 /**1580 * Get the logged-in user's avatar.1581 *1582 * @see bp_core_fetch_avatar() For a description of arguments and1583 * return values.1584 *1585 * @param array|string $args {1586 * Arguments are listed here with an explanation of their defaults.1587 * For more information about the arguments, see1588 * {@link bp_core_fetch_avatar()}.1589 * @type string $alt Default: 'Profile picture of [user name]'.1590 * @type bool $html Default: true.1591 * @type string $type Default: 'thumb'.1592 * @type int|bool $width Default: false.1593 * @type int|bool $height Default: false.1594 * }1595 * @return string User avatar string.1596 */1597 function bp_get_loggedin_user_avatar( $args = '' ) {1598 1599 $r = wp_parse_args( $args, array(1600 'item_id' => bp_loggedin_user_id(),1601 'type' => 'thumb',1602 'width' => false,1603 'height' => false,1604 'html' => true,1605 'alt' => sprintf( __( 'Profile picture of %s', 'buddypress' ), bp_get_loggedin_user_fullname() )1606 ) );1607 1608 /**1609 * Filters the logged in user's avatar.1610 *1611 * @since 1.1.01612 *1613 * @param string $value User avatar string.1614 */1615 return apply_filters( 'bp_get_loggedin_user_avatar', bp_core_fetch_avatar( $r ), $r, $args );1616 }1617 1618 /**1619 * Output the displayed user's avatar.1620 *1621 * @see bp_get_displayed_user_avatar() for a description of params.1622 *1623 * @param array|string $args Array of arguments for displayed user avatar.1624 */1625 function bp_displayed_user_avatar( $args = '' ) {1626 echo bp_get_displayed_user_avatar( $args );1627 }1628 /**1629 * Get the displayed user's avatar.1630 *1631 * @see bp_core_fetch_avatar() For a description of arguments and1632 * return values.1633 *1634 * @param array|string $args {1635 * Arguments are listed here with an explanation of their defaults.1636 * For more information about the arguments, see1637 * {@link bp_core_fetch_avatar()}.1638 * @type string $alt Default: 'Profile picture of [user name]'.1639 * @type bool $html Default: true.1640 * @type string $type Default: 'thumb'.1641 * @type int|bool $width Default: false.1642 * @type int|bool $height Default: false.1643 * }1644 * @return string User avatar string.1645 */1646 function bp_get_displayed_user_avatar( $args = '' ) {1647 1648 $r = wp_parse_args( $args, array(1649 'item_id' => bp_displayed_user_id(),1650 'type' => 'thumb',1651 'width' => false,1652 'height' => false,1653 'html' => true,1654 'alt' => sprintf( __( 'Profile picture of %s', 'buddypress' ), bp_get_displayed_user_fullname() )1655 ) );1656 1657 /**1658 * Filters the displayed user's avatar.1659 *1660 * @since 1.1.01661 *1662 * @param string $value User avatar string.1663 */1664 return apply_filters( 'bp_get_displayed_user_avatar', bp_core_fetch_avatar( $r ), $r, $args );1665 }1666 1667 /**1668 * Output the email address of the displayed user.1669 */1670 function bp_displayed_user_email() {1671 echo bp_get_displayed_user_email();1672 }1673 /**1674 * Get the email address of the displayed user.1675 *1676 * @return string1677 */1678 function bp_get_displayed_user_email() {1679 $bp = buddypress();1680 1681 // If displayed user exists, return email address.1682 if ( isset( $bp->displayed_user->userdata->user_email ) )1683 $retval = $bp->displayed_user->userdata->user_email;1684 else1685 $retval = '';1686 1687 /**1688 * Filters the email address of the displayed user.1689 *1690 * @since 1.5.01691 *1692 * @param string $retval Email address for displayed user.1693 */1694 return apply_filters( 'bp_get_displayed_user_email', esc_attr( $retval ) );1695 }1696 1697 /**1698 * Output the "active [x days ago]" string for a user.1699 *1700 * @see bp_get_last_activity() for a description of parameters.1701 *1702 * @param int $user_id See {@link bp_get_last_activity()}.1703 */1704 function bp_last_activity( $user_id = 0 ) {1705 1706 /**1707 * Filters the 'active [x days ago]' string for a user.1708 *1709 * @since 1.0.01710 *1711 * @param string $value Formatted 'active [x days ago]' string.1712 */1713 echo apply_filters( 'bp_last_activity', bp_get_last_activity( $user_id ) );1714 }1715 /**1716 * Get the "active [x days ago]" string for a user.1717 *1718 * @param int $user_id ID of the user. Default: displayed user ID.1719 * @return string1720 */1721 function bp_get_last_activity( $user_id = 0 ) {1722 1723 if ( empty( $user_id ) )1724 $user_id = bp_displayed_user_id();1725 1726 $last_activity = bp_core_get_last_activity( bp_get_user_last_activity( $user_id ), __('active %s', 'buddypress') );1727 1728 /**1729 * Filters the 'active [x days ago]' string for a user.1730 *1731 * @since 1.5.01732 *1733 * @param string $value Formatted 'active [x days ago]' string.1734 */1735 return apply_filters( 'bp_get_last_activity', $last_activity );1736 }1737 1738 /**1739 * Output the calculated first name of the displayed or logged-in user.1740 */1741 function bp_user_firstname() {1742 echo bp_get_user_firstname();1743 }1744 /**1745 * Output the first name of a user.1746 *1747 * Simply takes all the characters before the first space in a name.1748 *1749 * @param string|bool $name Full name to use when generating first name.1750 * Defaults to displayed user's first name, or to1751 * logged-in user's first name if it's unavailable.1752 * @return string1753 */1754 function bp_get_user_firstname( $name = false ) {1755 1756 // Try to get displayed user.1757 if ( empty( $name ) )1758 $name = bp_get_displayed_user_fullname();1759 1760 // Fall back on logged in user.1761 if ( empty( $name ) )1762 $name = bp_get_loggedin_user_fullname();1763 1764 $fullname = (array) explode( ' ', $name );1765 1766 /**1767 * Filters the first name of a user.1768 *1769 * @since 1.2.01770 *1771 * @param string $value First name of user.1772 * @param string $fullname Full name of user.1773 */1774 return apply_filters( 'bp_get_user_firstname', $fullname[0], $fullname );1775 }1776 1777 /**1778 * Output the link for the logged-in user's profile.1779 */1780 function bp_loggedin_user_link() {1781 echo bp_get_loggedin_user_link();1782 }1783 /**1784 * Get the link for the logged-in user's profile.1785 *1786 * @return string1787 */1788 function bp_get_loggedin_user_link() {1789 1790 /**1791 * Filters the link for the logged-in user's profile.1792 *1793 * @since 1.2.41794 *1795 * @param string $value Link for the logged-in user's profile.1796 */1797 return apply_filters( 'bp_get_loggedin_user_link', bp_loggedin_user_domain() );1798 }1799 1800 /**1801 * Output the link for the displayed user's profile.1802 */1803 function bp_displayed_user_link() {1804 echo bp_get_displayed_user_link();1805 }1806 /**1807 * Get the link for the displayed user's profile.1808 *1809 * @return string1810 */1811 function bp_get_displayed_user_link() {1812 1813 /**1814 * Filters the link for the displayed user's profile.1815 *1816 * @since 1.2.41817 *1818 * @param string $value Link for the displayed user's profile.1819 */1820 return apply_filters( 'bp_get_displayed_user_link', bp_displayed_user_domain() );1821 }1822 1823 /**1824 * Alias of {@link bp_displayed_user_domain()}.1825 *1826 * @deprecated1827 */1828 function bp_user_link() { bp_displayed_user_domain(); }1829 1830 /**1831 * Alias of {@link bp_displayed_user_id()}.1832 */1833 function bp_current_user_id() { return bp_displayed_user_id(); }1834 1835 /**1836 * Generate the link for the displayed user's profile.1837 *1838 * @return string1839 */1840 function bp_displayed_user_domain() {1841 $bp = buddypress();1842 1843 /**1844 * Filters the generated link for the displayed user's profile.1845 *1846 * @since 1.0.01847 *1848 * @param string $value Generated link for the displayed user's profile.1849 */1850 return apply_filters( 'bp_displayed_user_domain', isset( $bp->displayed_user->domain ) ? $bp->displayed_user->domain : '' );1851 }1852 1853 /**1854 * Generate the link for the logged-in user's profile.1855 *1856 * @return string1857 */1858 function bp_loggedin_user_domain() {1859 $bp = buddypress();1860 1861 /**1862 * Filters the generated link for the logged-in user's profile.1863 *1864 * @since 1.0.01865 *1866 * @param string $value Generated link for the logged-in user's profile.1867 */1868 return apply_filters( 'bp_loggedin_user_domain', isset( $bp->loggedin_user->domain ) ? $bp->loggedin_user->domain : '' );1869 }1870 1871 /**1872 * Output the displayed user's display name.1873 */1874 function bp_displayed_user_fullname() {1875 echo bp_get_displayed_user_fullname();1876 }1877 /**1878 * Get the displayed user's display name.1879 *1880 * @return string1881 */1882 function bp_get_displayed_user_fullname() {1883 $bp = buddypress();1884 1885 /**1886 * Filters the displayed user's display name.1887 *1888 * @since 1.2.01889 *1890 * @param string $value Displayed user's display name.1891 */1892 return apply_filters( 'bp_displayed_user_fullname', isset( $bp->displayed_user->fullname ) ? $bp->displayed_user->fullname : '' );1893 }1894 1895 /**1896 * Alias of {@link bp_get_displayed_user_fullname()}.1897 */1898 function bp_user_fullname() { echo bp_get_displayed_user_fullname(); }1899 1900 1901 /**1902 * Output the logged-in user's display name.1903 */1904 function bp_loggedin_user_fullname() {1905 echo bp_get_loggedin_user_fullname();1906 }1907 /**1908 * Get the logged-in user's display name.1909 *1910 * @return string1911 */1912 function bp_get_loggedin_user_fullname() {1913 $bp = buddypress();1914 1915 /**1916 * Filters the logged-in user's display name.1917 *1918 * @since 1.0.01919 *1920 * @param string $value Logged-in user's display name.1921 */1922 return apply_filters( 'bp_get_loggedin_user_fullname', isset( $bp->loggedin_user->fullname ) ? $bp->loggedin_user->fullname : '' );1923 }1924 1925 /**1926 * Output the username of the displayed user.1927 */1928 function bp_displayed_user_username() {1929 echo bp_get_displayed_user_username();1930 }1931 /**1932 * Get the username of the displayed user.1933 *1934 * @return string1935 */1936 function bp_get_displayed_user_username() {1937 $bp = buddypress();1938 1939 if ( bp_displayed_user_id() ) {1940 $username = bp_core_get_username( bp_displayed_user_id(), $bp->displayed_user->userdata->user_nicename, $bp->displayed_user->userdata->user_login );1941 } else {1942 $username = '';1943 }1944 1945 /**1946 * Filters the username of the displayed user.1947 *1948 * @since 1.2.01949 *1950 * @param string $username Username of the displayed user.1951 */1952 return apply_filters( 'bp_get_displayed_user_username', $username );1953 }1954 1955 /**1956 * Output the username of the logged-in user.1957 */1958 function bp_loggedin_user_username() {1959 echo bp_get_loggedin_user_username();1960 }1961 /**1962 * Get the username of the logged-in user.1963 *1964 * @return string1965 */1966 function bp_get_loggedin_user_username() {1967 $bp = buddypress();1968 1969 if ( bp_loggedin_user_id() ) {1970 $username = bp_core_get_username( bp_loggedin_user_id(), $bp->loggedin_user->userdata->user_nicename, $bp->loggedin_user->userdata->user_login );1971 } else {1972 $username = '';1973 }1974 1975 /**1976 * Filters the username of the logged-in user.1977 *1978 * @since 1.2.01979 *1980 * @param string $username Username of the logged-in user.1981 */1982 return apply_filters( 'bp_get_loggedin_user_username', $username );1983 }1984 /**1985 * Echo the current member type message.1986 *1987 * @since 2.3.01988 */1989 function bp_current_member_type_message() {1990 echo bp_get_current_member_type_message();1991 }1992 /**1993 * Generate the current member type message.1994 *1995 * @since 2.3.01996 *1997 * @return string1998 */1999 function bp_get_current_member_type_message() {2000 $type_object = bp_get_member_type_object( bp_get_current_member_type() );2001 2002 $message = sprintf( __( 'Viewing members of the type: %s', 'buddypress' ), '<strong>' . $type_object->labels['singular_name'] . '</strong>' );2003 2004 return apply_filters( 'bp_get_current_member_type_message', $message );2005 }2006 2007 /** Signup Form ***************************************************************/2008 2009 /**2010 * Do we have a working custom sign up page?2011 *2012 * @since 1.5.02013 *2014 * @uses bp_get_signup_slug() To make sure there is a slug assigned to the page.2015 * @uses bp_locate_template() To make sure a template exists to provide output.2016 *2017 * @return bool True if page and template exist, false if not.2018 */2019 function bp_has_custom_signup_page() {2020 static $has_page = false;2021 2022 if ( empty( $has_page ) )2023 $has_page = bp_get_signup_slug() && bp_locate_template( array( 'registration/register.php', 'members/register.php', 'register.php' ), false );2024 2025 return (bool) $has_page;2026 }2027 2028 /**2029 * Output the URL to the signup page.2030 */2031 function bp_signup_page() {2032 echo esc_url( bp_get_signup_page() );2033 }2034 /**2035 * Get the URL to the signup page.2036 *2037 * @return string2038 */2039 function bp_get_signup_page() {2040 if ( bp_has_custom_signup_page() ) {2041 $page = trailingslashit( bp_get_root_domain() . '/' . bp_get_signup_slug() );2042 } else {2043 $page = bp_get_root_domain() . '/wp-signup.php';2044 }2045 2046 /**2047 * Filters the URL to the signup page.2048 *2049 * @since 1.1.02050 *2051 * @param string $page URL to the signup page.2052 */2053 return apply_filters( 'bp_get_signup_page', $page );2054 }2055 2056 /**2057 * Do we have a working custom activation page?2058 *2059 * @since 1.5.02060 *2061 * @uses bp_get_activate_slug() To make sure there is a slug assigned to the page.2062 * @uses bp_locate_template() To make sure a template exists to provide output.2063 * @return boolean True if page and template exist, false if not.2064 */2065 function bp_has_custom_activation_page() {2066 static $has_page = false;2067 2068 if ( empty( $has_page ) )2069 $has_page = bp_get_activate_slug() && bp_locate_template( array( 'registration/activate.php', 'members/activate.php', 'activate.php' ), false );2070 2071 return (bool) $has_page;2072 }2073 2074 /**2075 * Output the URL of the activation page.2076 */2077 function bp_activation_page() {2078 echo esc_url( bp_get_activation_page() );2079 }2080 /**2081 * Get the URL of the activation page.2082 *2083 * @return string2084 */2085 function bp_get_activation_page() {2086 if ( bp_has_custom_activation_page() ) {2087 $page = trailingslashit( bp_get_root_domain() . '/' . bp_get_activate_slug() );2088 } else {2089 $page = trailingslashit( bp_get_root_domain() ) . 'wp-activate.php';2090 }2091 2092 /**2093 * Filters the URL of the activation page.2094 *2095 * @since 1.2.02096 *2097 * @param string $page URL to the activation page.2098 */2099 return apply_filters( 'bp_get_activation_page', $page );2100 }2101 2102 /**2103 * Output the username submitted during signup.2104 */2105 function bp_signup_username_value() {2106 echo bp_get_signup_username_value();2107 }2108 /**2109 * Get the username submitted during signup.2110 *2111 * @todo This should be properly escaped.2112 *2113 * @return string2114 */2115 function bp_get_signup_username_value() {2116 $value = '';2117 if ( isset( $_POST['signup_username'] ) )2118 $value = $_POST['signup_username'];2119 2120 /**2121 * Filters the username submitted during signup.2122 *2123 * @since 1.1.02124 *2125 * @param string $value Username submitted during signup.2126 */2127 return apply_filters( 'bp_get_signup_username_value', $value );2128 }2129 2130 /**2131 * Output the user email address submitted during signup.2132 */2133 function bp_signup_email_value() {2134 echo bp_get_signup_email_value();2135 }2136 /**2137 * Get the email address submitted during signup.2138 *2139 * @todo This should be properly escaped.2140 *2141 * @return string2142 */2143 function bp_get_signup_email_value() {2144 $value = '';2145 if ( isset( $_POST['signup_email'] ) )2146 $value = $_POST['signup_email'];2147 2148 /**2149 * Filters the email address submitted during signup.2150 *2151 * @since 1.1.02152 *2153 * @param string $value Email address submitted during signup.2154 */2155 return apply_filters( 'bp_get_signup_email_value', $value );2156 }2157 2158 /**2159 * Output the 'signup_with_blog' value submitted during signup.2160 */2161 function bp_signup_with_blog_value() {2162 echo bp_get_signup_with_blog_value();2163 }2164 /**2165 * Get the 'signup_with_blog' value submitted during signup.2166 *2167 * @return string2168 */2169 function bp_get_signup_with_blog_value() {2170 $value = '';2171 if ( isset( $_POST['signup_with_blog'] ) )2172 $value = $_POST['signup_with_blog'];2173 2174 /**2175 * Filters the 'signup_with_blog' value submitted during signup.2176 *2177 * @since 1.1.02178 *2179 * @param string $value 'signup_with_blog' value submitted during signup.2180 */2181 return apply_filters( 'bp_get_signup_with_blog_value', $value );2182 }2183 2184 /**2185 * Output the 'signup_blog_url' value submitted at signup.2186 */2187 function bp_signup_blog_url_value() {2188 echo bp_get_signup_blog_url_value();