[ Index ]

PHP Cross Reference of BuddyPress

title

Body

[close]

/src/bp-members/ -> bp-members-template.php (source)

   1  <?php
   2  /**
   3   * BuddyPress Member Template Tags.
   4   *
   5   * Functions that are safe to use inside your template files and themes.
   6   *
   7   * @package BuddyPress
   8   * @subpackage MembersTemplate
   9   * @since 1.5.0
  10   */
  11  
  12  // Exit if accessed directly.
  13  defined( 'ABSPATH' ) || exit;
  14  
  15  /**
  16   * Output the profile component slug.
  17   *
  18   * @since 2.4.0
  19   */
  20  function bp_profile_slug() {
  21      echo bp_get_profile_slug();
  22  }
  23      /**
  24       * Return the profile component slug.
  25       *
  26       * @since 2.4.0
  27       *
  28       * @return string
  29       */
  30  	function bp_get_profile_slug() {
  31  
  32          /**
  33           * Filters the profile component slug.
  34           *
  35           * @since 2.4.0
  36           *
  37           * @param string $slug Profile component slug.
  38           */
  39          return apply_filters( 'bp_get_profile_slug', buddypress()->profile->slug );
  40      }
  41  
  42  /**
  43   * Output the members component slug.
  44   *
  45   * @since 1.5.0
  46   */
  47  function bp_members_slug() {
  48      echo bp_get_members_slug();
  49  }
  50      /**
  51       * Return the members component slug.
  52       *
  53       * @since 1.5.0
  54       *
  55       * @return string
  56       */
  57  	function bp_get_members_slug() {
  58  
  59          /**
  60           * Filters the Members component slug.
  61           *
  62           * @since 1.5.0
  63           *
  64           * @param string $slug Members component slug.
  65           */
  66          return apply_filters( 'bp_get_members_slug', buddypress()->members->slug );
  67      }
  68  
  69  /**
  70   * Output the members component root slug.
  71   *
  72   * @since 1.5.0
  73   */
  74  function bp_members_root_slug() {
  75      echo bp_get_members_root_slug();
  76  }
  77      /**
  78       * Return the members component root slug.
  79       *
  80       * @since 1.5.0
  81       *
  82       * @return string
  83       */
  84  	function bp_get_members_root_slug() {
  85  
  86          /**
  87           * Filters the Members component root slug.
  88           *
  89           * @since 1.5.0
  90           *
  91           * @param string $root_slug Members component root slug.
  92           */
  93          return apply_filters( 'bp_get_members_root_slug', buddypress()->members->root_slug );
  94      }
  95  
  96  /**
  97   * Output the member type base slug.
  98   *
  99   * @since 2.5.0
 100   */
 101  function bp_members_member_type_base() {
 102      echo esc_url( bp_get_members_member_type_base() );
 103  }
 104      /**
 105       * Get the member type URL base.
 106       *
 107       * The base slug is the string used as the base prefix when generating member type directory URLs.
 108       * For example, in example.com/members/type/foo/, 'foo' is the member type and 'type' is the
 109       * base slug.
 110       *
 111       * @since 2.5.0
 112       *
 113       * @return string
 114       */
 115  	function bp_get_members_member_type_base() {
 116  
 117          /**
 118           * Filters the member type URL base.
 119           *
 120           * @since 2.3.0
 121           *
 122           * @param string $base Base slug for the member type.
 123           */
 124          return apply_filters( 'bp_members_member_type_base', _x( 'type', 'member type URL base', 'buddypress' ) );
 125      }
 126  
 127  /**
 128   * Output member directory permalink.
 129   *
 130   * @since 1.5.0
 131   */
 132  function bp_members_directory_permalink() {
 133      echo esc_url( bp_get_members_directory_permalink() );
 134  }
 135      /**
 136       * Return member directory permalink.
 137       *
 138       * @since 1.5.0
 139       *
 140       * @return string
 141       */
 142  	function bp_get_members_directory_permalink() {
 143  
 144          /**
 145           * Filters the member directory permalink.
 146           *
 147           * @since 1.5.0
 148           *
 149           * @param string $value Members directory permalink.
 150           */
 151          return apply_filters( 'bp_get_members_directory_permalink', trailingslashit( bp_get_root_domain() . '/' . bp_get_members_root_slug() ) );
 152      }
 153  
 154  /**
 155   * Output member type directory permalink.
 156   *
 157   * @since 2.5.0
 158   *
 159   * @param string $member_type Optional. Member type. Defaults to current member type.
 160   */
 161  function bp_member_type_directory_permalink( $member_type = '' ) {
 162      echo esc_url( bp_get_member_type_directory_permalink( $member_type ) );
 163  }
 164      /**
 165       * Return member type directory permalink.
 166       *
 167       * @since 2.5.0
 168       *
 169       * @param string $member_type Optional. Member type. Defaults to current member type.
 170       * @return string Member type directory URL on success, an empty string on failure.
 171       */
 172  	function bp_get_member_type_directory_permalink( $member_type = '' ) {
 173  
 174          if ( $member_type ) {
 175              $_member_type = $member_type;
 176          } else {
 177              // Fall back on the current member type.
 178              $_member_type = bp_get_current_member_type();
 179          }
 180  
 181          $type = bp_get_member_type_object( $_member_type );
 182  
 183          // Bail when member type is not found or has no directory.
 184          if ( ! $type || ! $type->has_directory ) {
 185              return '';
 186          }
 187  
 188          /**
 189           * Filters the member type directory permalink.
 190           *
 191           * @since 2.5.0
 192           *
 193           * @param string $value       Member type directory permalink.
 194           * @param object $type        Member type object.
 195           * @param string $member_type Member type name, as passed to the function.
 196           */
 197          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 );
 198      }
 199  
 200  /**
 201   * Output the sign-up slug.
 202   *
 203   * @since 1.5.0
 204   */
 205  function bp_signup_slug() {
 206      echo bp_get_signup_slug();
 207  }
 208      /**
 209       * Return the sign-up slug.
 210       *
 211       * @since 1.5.0
 212       *
 213       * @global BuddyPress $bp The one true BuddyPress instance.
 214       *
 215       * @return string
 216       */
 217  	function bp_get_signup_slug() {
 218          $bp = buddypress();
 219  
 220          if ( ! empty( $bp->pages->register->slug ) ) {
 221              $slug = $bp->pages->register->slug;
 222          } elseif ( defined( 'BP_REGISTER_SLUG' ) ) {
 223              $slug = BP_REGISTER_SLUG;
 224          } else {
 225              $slug = 'register';
 226          }
 227  
 228          /**
 229           * Filters the sign-up slug.
 230           *
 231           * @since 1.5.0
 232           *
 233           * @param string $slug Sign-up slug.
 234           */
 235          return apply_filters( 'bp_get_signup_slug', $slug );
 236      }
 237  
 238  /**
 239   * Output the activation slug.
 240   *
 241   * @since 1.5.0
 242   */
 243  function bp_activate_slug() {
 244      echo bp_get_activate_slug();
 245  }
 246      /**
 247       * Return the activation slug.
 248       *
 249       * @since 1.5.0
 250       *
 251       * @global BuddyPress $bp The one true BuddyPress instance.
 252       *
 253       * @return string
 254       */
 255  	function bp_get_activate_slug() {
 256          $bp = buddypress();
 257  
 258          if ( ! empty( $bp->pages->activate->slug ) ) {
 259              $slug = $bp->pages->activate->slug;
 260          } elseif ( defined( 'BP_ACTIVATION_SLUG' ) ) {
 261              $slug = BP_ACTIVATION_SLUG;
 262          } else {
 263              $slug = 'activate';
 264          }
 265  
 266          /**
 267           * Filters the activation slug.
 268           *
 269           * @since 1.5.0
 270           *
 271           * @param string $slug Activation slug.
 272           */
 273          return apply_filters( 'bp_get_activate_slug', $slug );
 274      }
 275  
 276  /**
 277   * Output the members invitation pane slug.
 278   *
 279   * @since 8.0.0
 280   */
 281  function bp_members_invitations_slug() {
 282      echo bp_get_members_invitations_slug();
 283  }
 284      /**
 285       * Return the members invitations root slug.
 286       *
 287       * @since 8.0.0
 288       *
 289       * @return string
 290       */
 291  	function bp_get_members_invitations_slug() {
 292  
 293          /**
 294           * Filters the Members invitations pane root slug.
 295           *
 296           * @since 8.0.0
 297           *
 298           * @param string $slug Members invitations pane root slug.
 299           */
 300          return apply_filters( 'bp_get_members_invitations_slug', _x( 'invitations', 'Member profile invitations pane URL base', 'buddypress' ) );
 301      }
 302  
 303  /**
 304   * Initialize the members loop.
 305   *
 306   * Based on the $args passed, bp_has_members() populates the $members_template
 307   * global, enabling the use of BuddyPress templates and template functions to
 308   * display a list of members.
 309   *
 310   * @since 1.2.0
 311   * @since 7.0.0 Added `xprofile_query` parameter. Added `user_ids` parameter.
 312   * @since 10.0.0 Added `date_query` parameter.
 313   *
 314   * @global BP_Core_Members_Template $members_template
 315   *
 316   * @param array|string $args {
 317   *     Arguments for limiting the contents of the members loop. Most arguments
 318   *     are in the same format as {@link BP_User_Query}. However, because
 319   *     the format of the arguments accepted here differs in a number of ways,
 320   *     and because bp_has_members() determines some default arguments in a
 321   *     dynamic fashion, we list all accepted arguments here as well.
 322   *
 323   *     Arguments can be passed as an associative array, or as a URL query
 324   *     string (eg, 'user_id=4&per_page=3').
 325   *
 326   *     @type int                   $type                Sort order. Accepts 'active', 'random', 'newest', 'popular',
 327   *                                                      'online', 'alphabetical'. Default: 'active'.
 328   *     @type int|bool              $page                Page of results to display. Default: 1.
 329   *     @type int|bool              $per_page            Number of results per page. Default: 20.
 330   *     @type int|bool              $max                 Maximum number of results to return. Default: false (unlimited).
 331   *     @type string                $page_arg            The string used as a query parameter in pagination links.
 332   *                                                      Default: 'bpage'.
 333   *     @type array|int|string|bool $include             Limit results by a list of user IDs. Accepts an array, a
 334   *                                                      single integer, a comma-separated list of IDs, or false (to
 335   *                                                      disable this limiting). Accepts 'active', 'alphabetical',
 336   *                                                      'newest', or 'random'. Default: false.
 337   *     @type array|int|string|bool $exclude             Exclude users from results by ID. Accepts an array, a single
 338   *                                                      integer, a comma-separated list of IDs, or false (to disable
 339   *                                                      this limiting). Default: false.
 340   *     @type array|string|bool     $user_ids            An array or comma-separated list of IDs, or false (to
 341   *                                                      disable this limiting). Default: false.
 342   *     @type int                   $user_id             If provided, results are limited to the friends of the specified
 343   *                                                      user. When on a user's Friends page, defaults to the ID of the
 344   *                                                      displayed user. Otherwise defaults to 0.
 345   *     @type string|array          $member_type         Array or comma-separated list of member types to limit
 346   *                                                      results to.
 347   *     @type string|array          $member_type__in     Array or comma-separated list of member types to limit
 348   *                                                      results to.
 349   *     @type string|array          $member_type__not_in Array or comma-separated list of member types to exclude
 350   *                                                      from results.
 351   *     @type string                $search_terms        Limit results by a search term. Default: value of
 352   *                                                      `$_REQUEST['members_search']` or `$_REQUEST['s']`, if present.
 353   *                                                      Otherwise false.
 354   *     @type string                $meta_key            Limit results by the presence of a usermeta key.
 355   *                                                      Default: false.
 356   *     @type mixed                 $meta_value          When used with meta_key, limits results by the a matching
 357   *                                                      usermeta value. Default: false.
 358   *     @type array                 $xprofile_query      Filter results by xprofile data. Requires the xprofile
 359   *                                                      component. See {@see BP_XProfile_Query} for details.
 360   *     @type array                 $date_query          Filter results by member last activity date. See first parameter of
 361   *                                                      {@link WP_Date_Query::__construct()} for syntax. Only applicable if
 362   *                                                      $type is either 'active', 'random', 'newest', or 'online'.
 363   *     @type bool                  $populate_extras     Whether to fetch optional data, such as friend counts.
 364   *                                                      Default: true.
 365   * }
 366   * @return bool Returns true when blogs are found, otherwise false.
 367   */
 368  function bp_has_members( $args = '' ) {
 369      global $members_template;
 370  
 371      // Default user ID.
 372      $user_id = 0;
 373  
 374      // User filtering.
 375      if ( bp_is_user_friends() && ! bp_is_user_friend_requests() ) {
 376          $user_id = bp_displayed_user_id();
 377      }
 378  
 379      $member_type = bp_get_current_member_type();
 380      if ( ! $member_type && ! empty( $_GET['member_type'] ) ) {
 381          if ( is_array( $_GET['member_type'] ) ) {
 382              $member_type = $_GET['member_type'];
 383          } else {
 384              // Can be a comma-separated list.
 385              $member_type = explode( ',', $_GET['member_type'] );
 386          }
 387      }
 388  
 389      $search_terms_default = null;
 390      $search_query_arg = bp_core_get_component_search_query_arg( 'members' );
 391      if ( ! empty( $_REQUEST[ $search_query_arg ] ) ) {
 392          $search_terms_default = stripslashes( $_REQUEST[ $search_query_arg ] );
 393      }
 394  
 395      // Type: active ( default ) | random | newest | popular | online | alphabetical.
 396      $r = bp_parse_args(
 397          $args,
 398          array(
 399              'type'                => 'active',
 400              'page'                => 1,
 401              'per_page'            => 20,
 402              'max'                 => false,
 403  
 404              'page_arg'            => 'upage',  // See https://buddypress.trac.wordpress.org/ticket/3679.
 405  
 406              'include'             => false,    // Pass a user_id or a list (comma-separated or array) of user_ids to only show these users.
 407              'exclude'             => false,    // Pass a user_id or a list (comma-separated or array) of user_ids to exclude these users.
 408              'user_ids'            => false,
 409  
 410              'user_id'             => $user_id, // Pass a user_id to only show friends of this user.
 411              'member_type'         => $member_type,
 412              'member_type__in'     => '',
 413              'member_type__not_in' => '',
 414              'search_terms'        => $search_terms_default,
 415  
 416              'meta_key'            => false,    // Only return users with this usermeta.
 417              'meta_value'          => false,    // Only return users where the usermeta value matches. Requires meta_key.
 418  
 419              'xprofile_query'      => false,
 420              'date_query'          => false,    // Filter members by last activity.
 421              'populate_extras'     => true,     // Fetch usermeta? Friend count, last active etc.
 422          ),
 423          'has_members'
 424      );
 425  
 426      // Pass a filter if ?s= is set.
 427      if ( is_null( $r['search_terms'] ) ) {
 428          if ( !empty( $_REQUEST['s'] ) ) {
 429              $r['search_terms'] = $_REQUEST['s'];
 430          } else {
 431              $r['search_terms'] = false;
 432          }
 433      }
 434  
 435      // Set per_page to max if max is larger than per_page.
 436      if ( !empty( $r['max'] ) && ( $r['per_page'] > $r['max'] ) ) {
 437          $r['per_page'] = $r['max'];
 438      }
 439  
 440      // Query for members and populate $members_template global.
 441      $members_template = new BP_Core_Members_Template( $r );
 442  
 443      /**
 444       * Filters whether or not BuddyPress has members to iterate over.
 445       *
 446       * @since 1.2.4
 447       * @since 2.6.0 Added the `$r` parameter
 448       *
 449       * @param bool                     $value            Whether or not there are members to iterate over.
 450       * @param BP_Core_Members_Template $members_template Populated $members_template global.
 451       * @param array                    $r                Array of arguments passed into the BP_Core_Members_Template class.
 452       */
 453      return apply_filters( 'bp_has_members', $members_template->has_members(), $members_template, $r );
 454  }
 455  
 456  /**
 457   * Set up the current member inside the loop.
 458   *
 459   * @since 1.2.0
 460   *
 461   * @global BP_Core_Members_Template $members_template
 462   *
 463   * @return object
 464   */
 465  function bp_the_member() {
 466      global $members_template;
 467      return $members_template->the_member();
 468  }
 469  
 470  /**
 471   * Check whether there are more members to iterate over.
 472   *
 473   * @since 1.2.0
 474   *
 475   * @global BP_Core_Members_Template $members_template
 476   *
 477   * @return bool
 478   */
 479  function bp_members() {
 480      global $members_template;
 481      return $members_template->members();
 482  }
 483  
 484  /**
 485   * Output the members pagination count.
 486   *
 487   * @since 1.2.0
 488   */
 489  function bp_members_pagination_count() {
 490      echo bp_get_members_pagination_count();
 491  }
 492      /**
 493       * Generate the members pagination count.
 494       *
 495       * @since 1.5.0
 496       *
 497       * @global BP_Core_Members_Template $members_template
 498       *
 499       * @return string
 500       */
 501  	function bp_get_members_pagination_count() {
 502          global $members_template;
 503  
 504          if ( empty( $members_template->type ) ) {
 505              $members_template->type = '';
 506          }
 507  
 508          $start_num = intval( ( $members_template->pag_page - 1 ) * $members_template->pag_num ) + 1;
 509          $from_num  = bp_core_number_format( $start_num );
 510          $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 ) );
 511          $total     = bp_core_number_format( $members_template->total_member_count );
 512  
 513          if ( 'active' == $members_template->type ) {
 514              if ( 1 == $members_template->total_member_count ) {
 515                  $pag = __( 'Viewing 1 active member', 'buddypress' );
 516              } else {
 517                  /* translators: 1: active member from number. 2: active member to number. 3: total active members. */
 518                  $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 );
 519              }
 520          } elseif ( 'popular' == $members_template->type ) {
 521              if ( 1 == $members_template->total_member_count ) {
 522                  $pag = __( 'Viewing 1 member with friends', 'buddypress' );
 523              } else {
 524                  /* translators: 1: member with friends from number. 2: member with friends to number. 3: total members with friends. */
 525                  $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 );
 526              }
 527          } elseif ( 'online' == $members_template->type ) {
 528              if ( 1 == $members_template->total_member_count ) {
 529                  $pag = __( 'Viewing 1 online member', 'buddypress' );
 530              } else {
 531                  /* translators: 1: online member from number. 2: online member to number. 3: total online members. */
 532                  $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 );
 533              }
 534          } else {
 535              if ( 1 == $members_template->total_member_count ) {
 536                  $pag = __( 'Viewing 1 member', 'buddypress' );
 537              } else {
 538                  /* translators: 1: member from number. 2: member to number. 3: total members. */
 539                  $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 );
 540              }
 541          }
 542  
 543          /**
 544           * Filters the members pagination count.
 545           *
 546           * @since 1.5.0
 547           *
 548           * @param string $pag Pagination count string.
 549           */
 550          return apply_filters( 'bp_members_pagination_count', $pag );
 551      }
 552  
 553  /**
 554   * Output the members pagination links.
 555   *
 556   * @since 1.2.0
 557   */
 558  function bp_members_pagination_links() {
 559      echo bp_get_members_pagination_links();
 560  }
 561      /**
 562       * Fetch the members pagination links.
 563       *
 564       * @since 1.2.0
 565       *
 566       * @global BP_Core_Members_Template $members_template
 567       *
 568       * @return string
 569       */
 570  	function bp_get_members_pagination_links() {
 571          global $members_template;
 572  
 573          /**
 574           * Filters the members pagination link.
 575           *
 576           * @since 1.2.0
 577           *
 578           * @param string $pag_links HTML markup for pagination links.
 579           */
 580          return apply_filters( 'bp_get_members_pagination_links', $members_template->pag_links );
 581      }
 582  
 583  /**
 584   * Output the ID of the current member in the loop.
 585   *
 586   * @since 1.2.0
 587   */
 588  function bp_member_user_id() {
 589      echo bp_get_member_user_id();
 590  }
 591      /**
 592       * Get the ID of the current member in the loop.
 593       *
 594       * @since 1.2.0
 595       *
 596       * @global BP_Core_Members_Template $members_template
 597       *
 598       * @return int Member ID.
 599       */
 600  	function bp_get_member_user_id() {
 601          global $members_template;
 602  
 603          $member_id = isset( $members_template->member->id )
 604              ? (int) $members_template->member->id
 605              : 0;
 606  
 607          /**
 608           * Filters the ID of the current member in the loop.
 609           *
 610           * @since 1.2.0
 611           *
 612           * @param int $member_id ID of the member being iterated over.
 613           */
 614          return apply_filters( 'bp_get_member_user_id', (int) $member_id );
 615      }
 616  
 617  /**
 618   * Output the row class of the current member in the loop.
 619   *
 620   * @since 1.7.0
 621   *
 622   * @param array $classes Array of custom classes.
 623   */
 624  function bp_member_class( $classes = array() ) {
 625      echo bp_get_member_class( $classes );
 626  }
 627      /**
 628       * Return the row class of the current member in the loop.
 629       *
 630       * @since 1.7.0
 631       *
 632       * @global BP_Core_Members_Template $members_template
 633       *
 634       * @param array $classes Array of custom classes.
 635       *
 636       * @return string Row class of the member
 637       */
 638  	function bp_get_member_class( $classes = array() ) {
 639          global $members_template;
 640  
 641          // Add even/odd classes, but only if there's more than 1 member.
 642          if ( $members_template->member_count > 1 ) {
 643              $pos_in_loop = (int) $members_template->current_member;
 644              $classes[]   = ( $pos_in_loop % 2 ) ? 'even' : 'odd';
 645  
 646              // If we've only one member in the loop, don't bother with odd and even.
 647          } else {
 648              $classes[] = 'bp-single-member';
 649          }
 650  
 651          // Maybe add 'is-online' class.
 652          if ( ! empty( $members_template->member->last_activity ) ) {
 653  
 654              // Calculate some times.
 655              $current_time  = bp_core_current_time( true, 'timestamp' );
 656              $last_activity = strtotime( $members_template->member->last_activity );
 657              $still_online  = strtotime( '+5 minutes', $last_activity );
 658  
 659              // Has the user been active recently?
 660              if ( $current_time <= $still_online ) {
 661                  $classes[] = 'is-online';
 662              }
 663          }
 664  
 665          // Add current user class.
 666          if ( bp_loggedin_user_id() === (int) $members_template->member->id ) {
 667              $classes[] = 'is-current-user';
 668          }
 669  
 670          // Add current user member types.
 671          if ( $member_types = bp_get_member_type( $members_template->member->id, false ) ) {
 672              foreach ( $member_types as $member_type ) {
 673                  $classes[] = sprintf( 'member-type-%s', esc_attr( $member_type ) );
 674              }
 675          }
 676  
 677          /**
 678           * Filters the determined classes to add to the HTML element.
 679           *
 680           * @since 1.7.0
 681           *
 682           * @param string $classes Classes to be added to the HTML element.
 683           */
 684          $classes = apply_filters( 'bp_get_member_class', $classes );
 685          $classes = array_merge( $classes, array() );
 686          $retval  = 'class="' . join( ' ', $classes ) . '"';
 687  
 688          return $retval;
 689      }
 690  
 691  /**
 692   * Output nicename of current member in the loop.
 693   *
 694   * @since 1.2.5
 695   */
 696  function bp_member_user_nicename() {
 697      echo bp_get_member_user_nicename();
 698  }
 699      /**
 700       * Get the nicename of the current member in the loop.
 701       *
 702       * @since 1.2.5
 703       *
 704       * @global BP_Core_Members_Template $members_template
 705       *
 706       * @return string Members nicename.
 707       */
 708  	function bp_get_member_user_nicename() {
 709          global $members_template;
 710  
 711          /**
 712           * Filters the nicename of the current member in the loop.
 713           *
 714           * @since 1.2.5
 715           *
 716           * @param string $user_nicename Nicename for the current member.
 717           */
 718          return apply_filters( 'bp_get_member_user_nicename', $members_template->member->user_nicename );
 719      }
 720  
 721  /**
 722   * Output login for current member in the loop.
 723   *
 724   * @since 1.2.5
 725   */
 726  function bp_member_user_login() {
 727      echo bp_get_member_user_login();
 728  }
 729      /**
 730       * Get the login of the current member in the loop.
 731       *
 732       * @since 1.2.5
 733       *
 734       * @global BP_Core_Members_Template $members_template
 735       *
 736       * @return string Member's login.
 737       */
 738  	function bp_get_member_user_login() {
 739          global $members_template;
 740  
 741          /**
 742           * Filters the login of the current member in the loop.
 743           *
 744           * @since 1.2.5
 745           *
 746           * @param string $user_login Login for the current member.
 747           */
 748          return apply_filters( 'bp_get_member_user_login', $members_template->member->user_login );
 749      }
 750  
 751  /**
 752   * Output the email address for the current member in the loop.
 753   *
 754   * @since 1.2.5
 755   */
 756  function bp_member_user_email() {
 757      echo bp_get_member_user_email();
 758  }
 759      /**
 760       * Get the email address of the current member in the loop.
 761       *
 762       * @since 1.2.5
 763       *
 764       * @global BP_Core_Members_Template $members_template
 765       *
 766       * @return string Member's email address.
 767       */
 768  	function bp_get_member_user_email() {
 769          global $members_template;
 770  
 771          /**
 772           * Filters the email address of the current member in the loop.
 773           *
 774           * @since 1.2.5
 775           *
 776           * @param string $user_email Email address for the current member.
 777           */
 778          return apply_filters( 'bp_get_member_user_email', $members_template->member->user_email );
 779      }
 780  
 781  /**
 782   * Check whether the current member in the loop is the logged-in user.
 783   *
 784   * @since 1.2.5
 785   * @since 10.0.0 Updated to get member ID from `bp_get_member_user_id`.
 786   *
 787   * @return bool
 788   */
 789  function bp_member_is_loggedin_user() {
 790  
 791      /**
 792       * Filters whether the current member in the loop is the logged-in user.
 793       *
 794       * @since 1.2.5
 795       *
 796       * @param bool $value Whether current member in the loop is logged in.
 797       */
 798      return apply_filters( 'bp_member_is_loggedin_user', ( bp_loggedin_user_id() === bp_get_member_user_id() ) );
 799  }
 800  
 801  /**
 802   * Output a member's avatar.
 803   *
 804   * @since 1.2.0
 805   *
 806   * @see bp_get_member_avatar() for description of arguments.
 807   *
 808   * @param array|string $args See {@link bp_get_member_avatar()}.
 809   */
 810  function bp_member_avatar( $args = '' ) {
 811  
 812      /**
 813       * Filters a members avatar.
 814       *
 815       * @since 1.2.0
 816       * @since 2.6.0 Added the `$args` parameter.
 817       *
 818       * @param string       $value Formatted HTML <img> element, or raw avatar URL based on $html arg.
 819       * @param array|string $args  See {@link bp_get_member_avatar()}.
 820       */
 821      echo apply_filters( 'bp_member_avatar', bp_get_member_avatar( $args ), $args );
 822  }
 823      /**
 824       * Get a member's avatar.
 825       *
 826       * @since 1.2.0
 827       *
 828       * @global BP_Core_Members_Template $members_template
 829       *
 830       * @see bp_core_fetch_avatar() For a description of arguments and
 831       *      return values.
 832       *
 833       * @param array|string $args  {
 834       *     Arguments are listed here with an explanation of their defaults.
 835       *     For more information about the arguments, see
 836       *     {@link bp_core_fetch_avatar()}.
 837       *     @type string   $alt     Default: 'Profile picture of [user name]'.
 838       *     @type string   $class   Default: 'avatar'.
 839       *     @type string   $type    Default: 'thumb'.
 840       *     @type int|bool $width   Default: false.
 841       *     @type int|bool $height  Default: false.
 842       *     @type bool     $no_grav Default: false.
 843       *     @type bool     $id      Currently unused.
 844       * }
 845       * @return string User avatar string.
 846       */
 847  	function bp_get_member_avatar( $args = '' ) {
 848          global $members_template;
 849  
 850          $fullname = ! empty( $members_template->member->fullname )
 851              ? $members_template->member->fullname
 852              : $members_template->member->display_name;
 853  
 854          $r = bp_parse_args(
 855              $args,
 856              array(
 857                  'type'    => 'thumb',
 858                  'width'   => false,
 859                  'height'  => false,
 860                  'class'   => 'avatar',
 861                  'id'      => false,
 862                  'no_grav' => false,
 863                  /* translators: %s: member name */
 864                  'alt'     => sprintf( __( 'Profile picture of %s', 'buddypress' ), $fullname ),
 865              )
 866          );
 867  
 868          $avatar = bp_core_fetch_avatar(
 869              array(
 870                  'email'   => bp_get_member_user_email(),
 871                  'item_id' => bp_get_member_user_id(),
 872                  'type'    => $r['type'],
 873                  'alt'     => $r['alt'],
 874                  'no_grav' => $r['no_grav'],
 875                  'css_id'  => $r['id'],
 876                  'class'   => $r['class'],
 877                  'width'   => $r['width'],
 878                  'height'  => $r['height'],
 879              )
 880          );
 881  
 882          /**
 883           * Filters a member's avatar.
 884           *
 885           * @since 1.2.0
 886           * @since 2.6.0 Added the `$r` parameter.
 887           *
 888           * @param string $value Formatted HTML <img> element, or raw avatar URL based on $html arg.
 889           * @param array  $r     Array of parsed arguments. See {@link bp_get_member_avatar()}.
 890           */
 891          return apply_filters( 'bp_get_member_avatar', $avatar, $r );
 892      }
 893  
 894  /**
 895   * Output the permalink for the current member in the loop.
 896   *
 897   * @since 1.2.0
 898   */
 899  function bp_member_permalink() {
 900      echo esc_url( bp_get_member_permalink() );
 901  }
 902      /**
 903       * Get the permalink for the current member in the loop.
 904       *
 905       * @since 1.2.0
 906       *
 907       * @global BP_Core_Members_Template $members_template
 908       *
 909       * @return string
 910       */
 911  	function bp_get_member_permalink() {
 912          global $members_template;
 913  
 914          $permalink = bp_core_get_user_domain(
 915              $members_template->member->id,
 916              $members_template->member->user_nicename,
 917              $members_template->member->user_login
 918          );
 919  
 920          /**
 921           * Filters the permalink for the current member in the loop.
 922           *
 923           * @since 1.2.0
 924           *
 925           * @param string $permalink Permalink for the current member in the loop.
 926           */
 927          return apply_filters( 'bp_get_member_permalink', $permalink );
 928      }
 929  
 930      /**
 931       * Alias of {@link bp_member_permalink()}.
 932       *
 933       * @since 1.2.0
 934       */
 935  	function bp_member_link() {
 936          echo esc_url( bp_get_member_permalink() );
 937      }
 938  
 939      /**
 940       * Alias of {@link bp_get_member_permalink()}.
 941       *
 942       * @since 1.2.0
 943       */
 944  	function bp_get_member_link() {
 945          return bp_get_member_permalink();
 946      }
 947  
 948  /**
 949   * Output display name of current member in the loop.
 950   *
 951   * @since 1.2.0
 952   */
 953  function bp_member_name() {
 954  
 955      /**
 956       * Filters the display name of current member in the loop.
 957       *
 958       * @since 1.2.0
 959       *
 960       * @param string $value Display name for current member.
 961       */
 962      echo apply_filters( 'bp_member_name', bp_get_member_name() );
 963  }
 964      /**
 965       * Get the display name of the current member in the loop.
 966       *
 967       * Full name is, by default, pulled from xprofile's Full Name field.
 968       * When this field is empty, we try to get an alternative name from the
 969       * WP users table, in the following order of preference: display_name,
 970       * user_nicename, user_login.
 971       *
 972       * @since 1.2.0
 973       *
 974       * @global BP_Core_Members_Template $members_template
 975       *
 976       * @return string The user's fullname for display.
 977       */
 978  	function bp_get_member_name() {
 979          global $members_template;
 980  
 981          // Generally, this only fires when xprofile is disabled.
 982          if ( empty( $members_template->member->fullname ) ) {
 983              // Our order of preference for alternative fullnames.
 984              $name_stack = array(
 985                  'display_name',
 986                  'user_nicename',
 987                  'user_login'
 988              );
 989  
 990              foreach ( $name_stack as $source ) {
 991                  if ( ! empty( $members_template->member->{$source} ) ) {
 992                      // When a value is found, set it as fullname and be done with it.
 993                      $members_template->member->fullname = $members_template->member->{$source};
 994                      break;
 995                  }
 996              }
 997          }
 998  
 999          /**
1000           * Filters the display name of current member in the loop.
1001           *
1002           * @since 1.2.0
1003           *
1004           * @param string $fullname Display name for current member.
1005           */
1006          return apply_filters( 'bp_get_member_name', $members_template->member->fullname );
1007      }
1008      add_filter( 'bp_get_member_name', 'wp_filter_kses' );
1009      add_filter( 'bp_get_member_name', 'stripslashes'   );
1010      add_filter( 'bp_get_member_name', 'strip_tags'     );
1011      add_filter( 'bp_get_member_name', 'esc_html'       );
1012  
1013  /**
1014   * Output the current member's last active time.
1015   *
1016   * @since 1.2.0
1017   *
1018   * @param array $args {@see bp_get_member_last_active()}.
1019   */
1020  function bp_member_last_active( $args = array() ) {
1021      echo bp_get_member_last_active( $args );
1022  }
1023      /**
1024       * Return the current member's last active time.
1025       *
1026       * @since 1.2.0
1027       * @since 2.7.0 Added 'relative' as a parameter to $args.
1028       *
1029       * @global BP_Core_Members_Template $members_template
1030       *
1031       * @param array $args {
1032       *     Array of optional arguments.
1033       *     @type mixed $active_format If true, formatted "active 5 minutes ago". If false, formatted "5 minutes
1034       *                                ago". If string, should be sprintf'able like 'last seen %s ago'.
1035       *     @type bool  $relative      If true, will return relative time "5 minutes ago". If false, will return
1036       *                                date from database. Default: true.
1037       * }
1038       * @return string
1039       */
1040  	function bp_get_member_last_active( $args = array() ) {
1041          global $members_template;
1042  
1043          // Parse the activity format.
1044          $r = bp_parse_args(
1045              $args,
1046              array(
1047                  'active_format' => true,
1048                  'relative'      => true,
1049              )
1050          );
1051  
1052          // Backwards compatibility for anyone forcing a 'true' active_format.
1053          if ( true === $r['active_format'] ) {
1054              /* translators: %s: last activity timestamp (e.g. "Active 1 hour ago") */
1055              $r['active_format'] = __( 'Active %s', 'buddypress' );
1056          }
1057  
1058          // Member has logged in at least one time.
1059          if ( isset( $members_template->member->last_activity ) ) {
1060              // We do not want relative time, so return now.
1061              // @todo Should the 'bp_member_last_active' filter be applied here?
1062              if ( ! $r['relative'] ) {
1063                  return esc_attr( $members_template->member->last_activity );
1064              }
1065  
1066              // Backwards compatibility for pre 1.5 'ago' strings.
1067              $last_activity = ! empty( $r['active_format'] )
1068                  ? bp_core_get_last_activity( $members_template->member->last_activity, $r['active_format'] )
1069                  : bp_core_time_since( $members_template->member->last_activity );
1070  
1071          // Member has never logged in or been active.
1072          } else {
1073              $last_activity = __( 'Never active', 'buddypress' );
1074          }
1075  
1076          /**
1077           * Filters the current members last active time.
1078           *
1079           * @since 1.2.0
1080           *
1081           * @param string $last_activity Formatted time since last activity.
1082           * @param array  $r             Array of parsed arguments for query.
1083           */
1084          return apply_filters( 'bp_member_last_active', $last_activity, $r );
1085      }
1086  
1087  /**
1088   * Output the latest update of the current member in the loop.
1089   *
1090   * @since 1.2.0
1091   *
1092   * @param array|string $args {@see bp_get_member_latest_update()}.
1093   */
1094  function bp_member_latest_update( $args = '' ) {
1095      echo bp_get_member_latest_update( $args );
1096  }
1097      /**
1098       * Get the latest update from the current member in the loop.
1099       *
1100       * @since 1.2.0
1101       *
1102       * @global BP_Core_Members_Template $members_template
1103       *
1104       * @param array|string $args {
1105       *     Array of optional arguments.
1106       *     @type int  $length    Truncation length. Default: 225.
1107       *     @type bool $view_link Whether to provide a 'View' link for
1108       *                           truncated entries. Default: false.
1109       * }
1110       * @return string
1111       */
1112  	function bp_get_member_latest_update( $args = '' ) {
1113          global $members_template;
1114  
1115          $defaults = array(
1116              'length'    => 225,
1117              'view_link' => true,
1118          );
1119  
1120          $r = bp_parse_args(
1121              $args,
1122              $defaults
1123          );
1124  
1125          extract( $r );
1126  
1127          if ( !bp_is_active( 'activity' ) || empty( $members_template->member->latest_update ) || !$update = maybe_unserialize( $members_template->member->latest_update ) )
1128              return false;
1129  
1130          /**
1131           * Filters the excerpt of the latest update for current member in the loop.
1132           *
1133           * @since 1.2.5
1134           * @since 2.6.0 Added the `$r` parameter.
1135           *
1136           * @param string $value Excerpt of the latest update for current member in the loop.
1137           * @param array  $r     Array of parsed arguments.
1138           */
1139          $update_content = apply_filters( 'bp_get_activity_latest_update_excerpt', trim( strip_tags( bp_create_excerpt( $update['content'], $length ) ) ), $r );
1140  
1141          /* translators: %s: the member latest activity update */
1142          $update_content = sprintf( _x( '- &quot;%s&quot;', 'member latest update in member directory', 'buddypress' ), $update_content );
1143  
1144          // If $view_link is true and the text returned by bp_create_excerpt() is different from the original text (ie it's
1145          // been truncated), add the "View" link.
1146          if ( $view_link && ( $update_content != $update['content'] ) ) {
1147              $view = __( 'View', 'buddypress' );
1148  
1149              $update_content .= '<span class="activity-read-more"><a href="' . bp_activity_get_permalink( $update['id'] ) . '" rel="nofollow">' . $view . '</a></span>';
1150          }
1151  
1152          /**
1153           * Filters the latest update from the current member in the loop.
1154           *
1155           * @since 1.2.0
1156           * @since 2.6.0 Added the `$r` parameter.
1157           *
1158           * @param string $update_content Formatted latest update for current member.
1159           * @param array  $r              Array of parsed arguments.
1160           */
1161          return apply_filters( 'bp_get_member_latest_update', $update_content, $r );
1162      }
1163  
1164  /**
1165   * Output a piece of user profile data.
1166   *
1167   * @since 1.2.0
1168   *
1169   * @see bp_get_member_profile_data() for a description of params.
1170   *
1171   * @param array|string $args See {@link bp_get_member_profile_data()}.
1172   */
1173  function bp_member_profile_data( $args = '' ) {
1174      echo bp_get_member_profile_data( $args );
1175  }
1176      /**
1177       * Get a piece of user profile data.
1178       *
1179       * When used in a bp_has_members() loop, this function will attempt
1180       * to fetch profile data cached in the template global. It is also safe
1181       * to use outside of the loop.
1182       *
1183       * @since 1.2.0
1184       *
1185       * @global BP_Core_Members_Template $members_template
1186       *
1187       * @param array|string $args {
1188       *     Array of config parameters.
1189       *     @type string $field   Name of the profile field.
1190       *     @type int    $user_id ID of the user whose data is being fetched.
1191       *                           Defaults to the current member in the loop, or if not
1192       *                           present, to the currently displayed user.
1193       * }
1194       * @return string|bool Profile data if found, otherwise false.
1195       */
1196  	function bp_get_member_profile_data( $args = '' ) {
1197          global $members_template;
1198  
1199          if ( ! bp_is_active( 'xprofile' ) ) {
1200              return false;
1201          }
1202  
1203          // Declare local variables.
1204          $data = false;
1205  
1206          // Guess at default $user_id.
1207          $default_user_id = 0;
1208          if ( ! empty( $members_template->member->id ) ) {
1209              $default_user_id = $members_template->member->id;
1210          } elseif ( bp_displayed_user_id() ) {
1211              $default_user_id = bp_displayed_user_id();
1212          }
1213  
1214          $defaults = array(
1215              'field'   => false,
1216              'user_id' => $default_user_id,
1217          );
1218  
1219          $r = bp_parse_args(
1220              $args,
1221              $defaults
1222          );
1223  
1224          // If we're in a members loop, get the data from the global.
1225          if ( ! empty( $members_template->member->profile_data ) ) {
1226              $profile_data = $members_template->member->profile_data;
1227          }
1228  
1229          // Otherwise query for the data.
1230          if ( empty( $profile_data ) && method_exists( 'BP_XProfile_ProfileData', 'get_all_for_user' ) ) {
1231              $profile_data = BP_XProfile_ProfileData::get_all_for_user( $r['user_id'] );
1232          }
1233  
1234          // If we're in the members loop, but the profile data has not
1235          // been loaded into the global, cache it there for later use.
1236          if ( ! empty( $members_template->member ) && empty( $members_template->member->profile_data ) ) {
1237              $members_template->member->profile_data = $profile_data;
1238          }
1239  
1240          // Get the data for the specific field requested.
1241          if ( ! empty( $profile_data ) && ! empty( $profile_data[ $r['field'] ]['field_type'] ) && ! empty( $profile_data[ $r['field'] ]['field_data'] ) ) {
1242              $data = xprofile_format_profile_field( $profile_data[ $r['field'] ]['field_type'], $profile_data[ $r['field'] ]['field_data'] );
1243          }
1244  
1245          /**
1246           * Filters resulting piece of member profile data.
1247           *
1248           * @since 1.2.0
1249           * @since 2.6.0 Added the `$r` parameter.
1250           *
1251           * @param string|bool $data Profile data if found, otherwise false.
1252           * @param array       $r    Array of parsed arguments.
1253           */
1254          $data = apply_filters( 'bp_get_member_profile_data', $data, $r );
1255  
1256          /**
1257           * Filters the resulting piece of member profile data by field type.
1258           *
1259           * This is a dynamic filter based on field type of the current field requested.
1260           *
1261           * @since 2.7.0
1262           *
1263           * @param string|bool $data Profile data if found, otherwise false.
1264           * @param array       $r    Array of parsed arguments.
1265           */
1266          if ( ! empty( $profile_data[ $r['field'] ]['field_type'] ) ) {
1267              $data = apply_filters( 'bp_get_member_profile_data_' . $profile_data[ $r['field'] ]['field_type'], $data, $r );
1268          }
1269  
1270          return $data;
1271      }
1272  
1273  /**
1274   * Output the 'registered [x days ago]' string for the current member.
1275   *
1276   * @since 1.2.0
1277   * @since 2.7.0 Added $args as a parameter.
1278   *
1279   * @param array $args Optional. {@see bp_get_member_registered()}.
1280   */
1281  function bp_member_registered( $args = array() ) {
1282      echo bp_get_member_registered( $args );
1283  }
1284      /**
1285       * Get the 'registered [x days ago]' string for the current member.
1286       *
1287       * @since 1.2.0
1288       * @since 2.7.0 Added `$args` as a parameter.
1289       *
1290       * @global BP_Core_Members_Template $members_template
1291       *
1292       * @param array $args {
1293       *     Array of optional parameters.
1294       *     @type bool $relative Optional. If true, returns relative registered date. eg. registered 5 months ago.
1295       *                          If false, returns registered date value from database.
1296       * }
1297       * @return string
1298       */
1299  	function bp_get_member_registered( $args = array() ) {
1300          global $members_template;
1301  
1302          $r = bp_parse_args(
1303              $args,
1304              array(
1305                  'relative' => true,
1306              )
1307          );
1308  
1309          // We do not want relative time, so return now.
1310          // @todo Should the 'bp_member_registered' filter be applied here?
1311          if ( ! $r['relative'] ) {
1312              return esc_attr( $members_template->member->user_registered );
1313          }
1314  
1315          /* translators: %s: last activity timestamp (e.g. "active 1 hour ago") */
1316          $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' ) ) );
1317  
1318          /**
1319           * Filters the 'registered [x days ago]' string for the current member.
1320           *
1321           * @since 2.1.0
1322           *
1323           * @param string $registered The 'registered [x days ago]' string.
1324           * @param array  $r          Array of parsed arguments.
1325           */
1326          return apply_filters( 'bp_member_registered', $registered, $r );
1327      }
1328  
1329  /**
1330   * Output a random piece of profile data for the current member in the loop.
1331   *
1332   * @since 1.2.0
1333   * @since 10.0.0 Updated to get member ID using `bp_get_member_user_id`.
1334   */
1335  function bp_member_random_profile_data() {
1336      if ( bp_is_active( 'xprofile' ) ) { ?>
1337          <?php $random_data = xprofile_get_random_profile_data( bp_get_member_user_id(), true ); ?>
1338              <strong><?php echo wp_filter_kses( $random_data[0]->name ) ?></strong>
1339              <?php echo wp_filter_kses( $random_data[0]->value ) ?>
1340      <?php }
1341  }
1342  
1343  /**
1344   * Output hidden input for preserving member search params on form submit.
1345   *
1346   * @since 1.2.0
1347   */
1348  function bp_member_hidden_fields() {
1349      $query_arg = bp_core_get_component_search_query_arg( 'members' );
1350  
1351      if ( isset( $_REQUEST[ $query_arg ] ) ) {
1352          echo '<input type="hidden" id="search_terms" value="' . esc_attr( $_REQUEST[ $query_arg ] ) . '" name="search_terms" />';
1353      }
1354  
1355      if ( isset( $_REQUEST['letter'] ) ) {
1356          echo '<input type="hidden" id="selected_letter" value="' . esc_attr( $_REQUEST['letter'] ) . '" name="selected_letter" />';
1357      }
1358  
1359      if ( isset( $_REQUEST['members_search'] ) ) {
1360          echo '<input type="hidden" id="search_terms" value="' . esc_attr( $_REQUEST['members_search'] ) . '" name="search_terms" />';
1361      }
1362  }
1363  
1364  /**
1365   * Output the Members directory search form.
1366   *
1367   * @since 1.0.0
1368   */
1369  function bp_directory_members_search_form() {
1370  
1371      $query_arg = bp_core_get_component_search_query_arg( 'members' );
1372  
1373      if ( ! empty( $_REQUEST[ $query_arg ] ) ) {
1374          $search_value = stripslashes( $_REQUEST[ $query_arg ] );
1375      } else {
1376          $search_value = bp_get_search_default_text( 'members' );
1377      }
1378  
1379      $search_form_html = '<form action="" method="get" id="search-members-form">
1380          <label for="members_search"><input type="text" name="' . esc_attr( $query_arg ) . '" id="members_search" placeholder="'. esc_attr( $search_value ) .'" /></label>
1381          <input type="submit" id="members_search_submit" name="members_search_submit" value="' . __( 'Search', 'buddypress' ) . '" />
1382      </form>';
1383  
1384      /**
1385       * Filters the Members component search form.
1386       *
1387       * @since 1.9.0
1388       *
1389       * @param string $search_form_html HTML markup for the member search form.
1390       */
1391      echo apply_filters( 'bp_directory_members_search_form', $search_form_html );
1392  }
1393  
1394  /**
1395   * Output the total member count.
1396   *
1397   * @since 1.2.0
1398   */
1399  function bp_total_site_member_count() {
1400      echo bp_get_total_site_member_count();
1401  }
1402      /**
1403       * Get the total site member count.
1404       *
1405       * @since 1.2.0
1406       *
1407       * @return string
1408       */
1409  	function bp_get_total_site_member_count() {
1410  
1411          /**
1412           * Filters the total site member count.
1413           *
1414           * @since 1.2.0
1415           *
1416           * @param string $value Number-formatted total site member count.
1417           */
1418          return apply_filters( 'bp_get_total_site_member_count', bp_core_number_format( bp_core_get_total_member_count() ) );
1419      }
1420  
1421  /** Navigation and other misc template tags ***********************************/
1422  
1423  /**
1424   * Render the navigation markup for the logged-in user.
1425   *
1426   * Each component adds to this navigation array within its own
1427   * [component_name]setup_nav() function.
1428   *
1429   * This navigation array is the top level navigation, so it contains items such as:
1430   *      [Blog, Profile, Messages, Groups, Friends] ...
1431   *
1432   * The function will also analyze the current component the user is in, to
1433   * determine whether or not to highlight a particular nav item.
1434   *
1435   * @since 1.1.0
1436   *
1437   * @global BuddyPress $bp The one true BuddyPress instance.
1438   *
1439   * @todo Move to a back-compat file?
1440   * @deprecated Does not seem to be called anywhere in BP core.
1441   */
1442  function bp_get_loggedin_user_nav() {
1443      $bp = buddypress();
1444  
1445      // Loop through each navigation item.
1446      foreach ( (array) $bp->members->nav->get_primary() as $nav_item ) {
1447  
1448          $selected = '';
1449  
1450          // If the current component matches the nav item id, then add a highlight CSS class.
1451          if ( ! bp_is_directory() && ! empty( $bp->active_components[ bp_current_component() ] ) && $bp->active_components[ bp_current_component() ] == $nav_item->css_id ) {
1452              $selected = ' class="current selected"';
1453          }
1454  
1455          // If we are viewing another person (current_userid does not equal
1456          // loggedin_user->id then check to see if the two users are friends.
1457          // if they are, add a highlight CSS class to the friends nav item
1458          // if it exists.
1459          if ( !bp_is_my_profile() && bp_displayed_user_id() ) {
1460              $selected = '';
1461  
1462              if ( bp_is_active( 'friends' ) ) {
1463                  if ( $nav_item->css_id == $bp->friends->id ) {
1464                      if ( friends_check_friendship( bp_loggedin_user_id(), bp_displayed_user_id() ) ) {
1465                          $selected = ' class="current selected"';
1466                      }
1467                  }
1468              }
1469          }
1470  
1471          // Echo out the final list item.
1472          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 ) );
1473      }
1474  
1475      // Always add a log out list item to the end of the navigation.
1476      $logout_link = '<li><a id="wp-logout" href="' .  wp_logout_url( bp_get_root_domain() ) . '">' . __( 'Log Out', 'buddypress' ) . '</a></li>';
1477  
1478      echo apply_filters( 'bp_logout_nav_link', $logout_link );
1479  }
1480  
1481  /**
1482   * Output the contents of the current user's home page.
1483   *
1484   * @since 2.6.0
1485   */
1486  function bp_displayed_user_front_template_part() {
1487      $located = bp_displayed_user_get_front_template();
1488  
1489      if ( false !== $located ) {
1490          $slug = str_replace( '.php', '', $located );
1491          $name = null;
1492  
1493          /**
1494           * Let plugins adding an action to bp_get_template_part get it from here
1495           *
1496           * @param string $slug Template part slug requested.
1497           * @param string $name Template part name requested.
1498           */
1499          do_action( 'get_template_part_' . $slug, $slug, $name );
1500  
1501          load_template( $located, true );
1502      }
1503  
1504      return $located;
1505  }
1506  
1507  /**
1508   * Locate a custom user front template if it exists.
1509   *
1510   * @since 2.6.0
1511   *
1512   * @param  object|null $displayed_user Optional. Falls back to current user if not passed.
1513   * @return string|bool                 Path to front template on success; boolean false on failure.
1514   */
1515  function bp_displayed_user_get_front_template( $displayed_user = null ) {
1516      if ( ! is_object( $displayed_user ) || empty( $displayed_user->id ) ) {
1517          $displayed_user = bp_get_displayed_user();
1518      }
1519  
1520      if ( ! isset( $displayed_user->id ) ) {
1521          return false;
1522      }
1523  
1524      if ( isset( $displayed_user->front_template ) ) {
1525          return $displayed_user->front_template;
1526      }
1527  
1528      // Init the hierarchy.
1529      $template_names = array(
1530          'members/single/front-id-' . (int) $displayed_user->id . '.php',
1531          'members/single/front-nicename-' . sanitize_file_name( $displayed_user->userdata->user_nicename ) . '.php',
1532      );
1533  
1534      /**
1535       * Check for member types and add it to the hierarchy
1536       *
1537       * Make sure to register your member
1538       * type using the hook 'bp_register_member_types'
1539       */
1540      if ( bp_get_member_types() ) {
1541          $displayed_user_member_type = bp_get_member_type( $displayed_user->id );
1542          if ( ! $displayed_user_member_type ) {
1543              $displayed_user_member_type = 'none';
1544          }
1545  
1546          $template_names[] = 'members/single/front-member-type-' . sanitize_file_name( $displayed_user_member_type ) . '.php';
1547      }
1548  
1549      // Add The generic template to the end of the hierarchy.
1550      $template_names[] = 'members/single/front.php';
1551  
1552      /**
1553       * Filters the hierarchy of user front templates corresponding to a specific user.
1554       *
1555       * @since 2.6.0
1556       *
1557       * @param array $template_names Array of template paths.
1558       */
1559      $template_names = apply_filters( 'bp_displayed_user_get_front_template', $template_names );
1560  
1561      return bp_locate_template( $template_names, false, true );
1562  }
1563  
1564  /**
1565   * Check if the displayed user has a custom front template.
1566   *
1567   * @since 2.6.0
1568   */
1569  function bp_displayed_user_has_front_template() {
1570      $displayed_user = bp_get_displayed_user();
1571  
1572      return ! empty( $displayed_user->front_template );
1573  }
1574  
1575  /**
1576   * Render the navigation markup for the displayed user.
1577   *
1578   * @since 1.1.0
1579   *
1580   * @global BuddyPress $bp The one true BuddyPress instance.
1581   */
1582  function bp_get_displayed_user_nav() {
1583      $bp = buddypress();
1584  
1585      foreach ( $bp->members->nav->get_primary() as $user_nav_item ) {
1586          if ( empty( $user_nav_item->show_for_displayed_user ) && ! bp_is_my_profile() ) {
1587              continue;
1588          }
1589  
1590          $selected = '';
1591          if ( bp_is_current_component( $user_nav_item->slug ) ) {
1592              $selected = ' class="current selected"';
1593          }
1594  
1595          if ( bp_loggedin_user_domain() ) {
1596              $link = str_replace( bp_loggedin_user_domain(), bp_displayed_user_domain(), $user_nav_item->link );
1597          } else {
1598              $link = trailingslashit( bp_displayed_user_domain() . $user_nav_item->link );
1599          }
1600  
1601          /**
1602           * Filters the navigation markup for the displayed user.
1603           *
1604           * This is a dynamic filter that is dependent on the navigation tab component being rendered.
1605           *
1606           * @since 1.1.0
1607           *
1608           * @param string $value         Markup for the tab list item including link.
1609           * @param array  $user_nav_item Array holding parts used to construct tab list item.
1610           *                              Passed by reference.
1611           */
1612          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 ) );
1613      }
1614  }
1615  
1616  /** Cover image ***************************************************************/
1617  
1618  /**
1619   * Should we use the cover image header
1620   *
1621   * @since 2.4.0
1622   *
1623   * @return bool True if the displayed user has a cover image,
1624   *              False otherwise
1625   */
1626  function bp_displayed_user_use_cover_image_header() {
1627      return (bool) bp_is_active( 'members', 'cover_image' ) && ! bp_disable_cover_image_uploads();
1628  }
1629  
1630  /** Avatars *******************************************************************/
1631  
1632  /**
1633   * Output the logged-in user's avatar.
1634   *
1635   * @since 1.1.0
1636   *
1637   * @see bp_get_loggedin_user_avatar() for a description of params.
1638   *
1639   * @param array|string $args {@see bp_get_loggedin_user_avatar()}.
1640   */
1641  function bp_loggedin_user_avatar( $args = '' ) {
1642      echo bp_get_loggedin_user_avatar( $args );
1643  }
1644      /**
1645       * Get the logged-in user's avatar.
1646       *
1647       * @since 1.1.0
1648       *
1649       * @see bp_core_fetch_avatar() For a description of arguments and
1650       *      return values.
1651       *
1652       * @param array|string $args  {
1653       *     Arguments are listed here with an explanation of their defaults.
1654       *     For more information about the arguments, see
1655       *     {@link bp_core_fetch_avatar()}.
1656       *     @type string   $alt    Default: 'Profile picture of [user name]'.
1657       *     @type bool     $html   Default: true.
1658       *     @type string   $type   Default: 'thumb'.
1659       *     @type int|bool $width  Default: false.
1660       *     @type int|bool $height Default: false.
1661       * }
1662       * @return string User avatar string.
1663       */
1664  	function bp_get_loggedin_user_avatar( $args = '' ) {
1665  
1666          $r = bp_parse_args(
1667              $args,
1668              array(
1669                  'item_id' => bp_loggedin_user_id(),
1670                  'type'    => 'thumb',
1671                  'width'   => false,
1672                  'height'  => false,
1673                  'html'    => true,
1674                  /* translators: %s: member name */
1675                  'alt'     => sprintf( __( 'Profile picture of %s', 'buddypress' ), bp_get_loggedin_user_fullname() )
1676              )
1677          );
1678  
1679          /**
1680           * Filters the logged in user's avatar.
1681           *
1682           * @since 1.1.0
1683           *
1684           * @param string $value User avatar string.
1685           * @param array  $r     Array of parsed arguments.
1686           * @param array  $args  Array of initial arguments.
1687           */
1688          return apply_filters( 'bp_get_loggedin_user_avatar', bp_core_fetch_avatar( $r ), $r, $args );
1689      }
1690  
1691  /**
1692   * Output the displayed user's avatar.
1693   *
1694   * @since 1.1.0
1695   *
1696   * @see bp_get_displayed_user_avatar() for a description of params.
1697   *
1698   * @param array|string $args {@see bp_get_displayed_user_avatar()}.
1699   */
1700  function bp_displayed_user_avatar( $args = '' ) {
1701      echo bp_get_displayed_user_avatar( $args );
1702  }
1703      /**
1704       * Get the displayed user's avatar.
1705       *
1706       * @since 1.1.0
1707       *
1708       * @see bp_core_fetch_avatar() For a description of arguments and
1709       *      return values.
1710       *
1711       * @param array|string $args  {
1712       *     Arguments are listed here with an explanation of their defaults.
1713       *     For more information about the arguments, see
1714       *     {@link bp_core_fetch_avatar()}.
1715       *     @type string   $alt    Default: 'Profile picture of [user name]'.
1716       *     @type bool     $html   Default: true.
1717       *     @type string   $type   Default: 'thumb'.
1718       *     @type int|bool $width  Default: false.
1719       *     @type int|bool $height Default: false.
1720       * }
1721       * @return string User avatar string.
1722       */
1723  	function bp_get_displayed_user_avatar( $args = '' ) {
1724  
1725          $r = bp_parse_args(
1726              $args,
1727              array(
1728                  'item_id' => bp_displayed_user_id(),
1729                  'type'    => 'thumb',
1730                  'width'   => false,
1731                  'height'  => false,
1732                  'html'    => true,
1733                  /* translators: %s: member name */
1734                  'alt'     => sprintf( __( 'Profile picture of %s', 'buddypress' ), bp_get_displayed_user_fullname() )
1735              )
1736          );
1737  
1738          /**
1739           * Filters the displayed user's avatar.
1740           *
1741           * @since 1.1.0
1742           *
1743           * @param string $value User avatar string.
1744           * @param array  $r     Array of parsed arguments.
1745           * @param array  $args  Array of initial arguments.
1746           */
1747          return apply_filters( 'bp_get_displayed_user_avatar', bp_core_fetch_avatar( $r ), $r, $args );
1748      }
1749  
1750  /**
1751   * Output the email address of the displayed user.
1752   *
1753   * @since 1.5.0
1754   */
1755  function bp_displayed_user_email() {
1756      echo bp_get_displayed_user_email();
1757  }
1758      /**
1759       * Get the email address of the displayed user.
1760       *
1761       * @since 1.5.0
1762       *
1763       * @global BuddyPress $bp The one true BuddyPress instance.
1764       *
1765       * @return string
1766       */
1767  	function bp_get_displayed_user_email() {
1768          $bp = buddypress();
1769  
1770          // If displayed user exists, return email address.
1771          if ( isset( $bp->displayed_user->userdata->user_email ) ) {
1772              $retval = $bp->displayed_user->userdata->user_email;
1773          } else {
1774              $retval = '';
1775          }
1776  
1777          /**
1778           * Filters the email address of the displayed user.
1779           *
1780           * @since 1.5.0
1781           *
1782           * @param string $retval Email address for displayed user.
1783           */
1784          return apply_filters( 'bp_get_displayed_user_email', esc_attr( $retval ) );
1785      }
1786  
1787  /**
1788   * Output the "active [x days ago]" string for a user.
1789   *
1790   * @since 1.0.0
1791   *
1792   * @see bp_get_last_activity() for a description of parameters.
1793   *
1794   * @param int $user_id See {@link bp_get_last_activity()}.
1795   */
1796  function bp_last_activity( $user_id = 0 ) {
1797      echo bp_get_last_activity( $user_id );
1798  }
1799      /**
1800       * Get the "active [x days ago]" string for a user.
1801       *
1802       * @since 1.5.0
1803       *
1804       * @param int $user_id ID of the user. Default: displayed user ID.
1805       * @return string
1806       */
1807  	function bp_get_last_activity( $user_id = 0 ) {
1808  
1809          if ( empty( $user_id ) ) {
1810              $user_id = bp_displayed_user_id();
1811          }
1812  
1813          /* translators: %s: last activity timestamp (e.g. "Active 1 hour ago") */
1814          $last_activity = bp_core_get_last_activity( bp_get_user_last_activity( $user_id ), __( 'Active %s', 'buddypress') );
1815  
1816          /**
1817           * Filters the 'active [x days ago]' string for a user.
1818           *
1819           * @since 1.5.0
1820           * @since 2.6.0 Added the `$user_id` parameter.
1821           *
1822           * @param string $value   Formatted 'active [x days ago]' string.
1823           * @param int    $user_id ID of the user.
1824           */
1825          return apply_filters( 'bp_get_last_activity', $last_activity, $user_id );
1826      }
1827  
1828  /**
1829   * Output the calculated first name of the displayed or logged-in user.
1830   *
1831   * @since 1.2.0
1832   */
1833  function bp_user_firstname() {
1834      echo bp_get_user_firstname();
1835  }
1836      /**
1837       * Output the first name of a user.
1838       *
1839       * Simply takes all the characters before the first space in a name.
1840       *
1841       * @since 1.2.0
1842       *
1843       * @param string|bool $name Full name to use when generating first name.
1844       *                          Defaults to displayed user's first name, or to
1845       *                          logged-in user's first name if it's unavailable.
1846       * @return string
1847       */
1848  	function bp_get_user_firstname( $name = false ) {
1849  
1850          // Try to get displayed user.
1851          if ( empty( $name ) ) {
1852              $name = bp_get_displayed_user_fullname();
1853          }
1854  
1855          // Fall back on logged in user.
1856          if ( empty( $name ) ) {
1857              $name = bp_get_loggedin_user_fullname();
1858          }
1859  
1860          $fullname = (array) explode( ' ', $name );
1861  
1862          /**
1863           * Filters the first name of a user.
1864           *
1865           * @since 1.2.0
1866           *
1867           * @param string $value    First name of user.
1868           * @param string $fullname Full name of user.
1869           */
1870          return apply_filters( 'bp_get_user_firstname', $fullname[0], $fullname );
1871      }
1872  
1873  /**
1874   * Output the link for the logged-in user's profile.
1875   *
1876   * @since 1.2.4
1877   */
1878  function bp_loggedin_user_link() {
1879      echo esc_url( bp_get_loggedin_user_link() );
1880  }
1881      /**
1882       * Get the link for the logged-in user's profile.
1883       *
1884       * @since 1.0.0
1885       *
1886       * @return string
1887       */
1888  	function bp_get_loggedin_user_link() {
1889  
1890          /**
1891           * Filters the link for the logged-in user's profile.
1892           *
1893           * @since 1.2.4
1894           *
1895           * @param string $value Link for the logged-in user's profile.
1896           */
1897          return apply_filters( 'bp_get_loggedin_user_link', bp_loggedin_user_domain() );
1898      }
1899  
1900  /**
1901   * Output the link for the displayed user's profile.
1902   *
1903   * @since 1.2.4
1904   */
1905  function bp_displayed_user_link() {
1906      echo esc_url( bp_get_displayed_user_link() );
1907  }
1908      /**
1909       * Get the link for the displayed user's profile.
1910       *
1911       * @since 1.0.0
1912       *
1913       * @return string
1914       */
1915  	function bp_get_displayed_user_link() {
1916  
1917          /**
1918           * Filters the link for the displayed user's profile.
1919           *
1920           * @since 1.2.4
1921           *
1922           * @param string $value Link for the displayed user's profile.
1923           */
1924          return apply_filters( 'bp_get_displayed_user_link', bp_displayed_user_domain() );
1925      }
1926  
1927      /**
1928       * Alias of {@link bp_displayed_user_domain()}.
1929       *
1930       * @deprecated
1931       */
1932  	function bp_user_link() {
1933          bp_displayed_user_domain();
1934      }
1935  
1936  /**
1937   * Alias of {@link bp_displayed_user_id()}.
1938   *
1939   * @since 1.0.0
1940   */
1941  function bp_current_user_id() {
1942      return bp_displayed_user_id();
1943  }
1944  
1945  /**
1946   * Generate the link for the displayed user's profile.
1947   *
1948   * @since 1.0.0
1949   *
1950   * @global BuddyPress $bp The one true BuddyPress instance.
1951   *
1952   * @return string
1953   */
1954  function bp_displayed_user_domain() {
1955      $bp = buddypress();
1956  
1957      /**
1958       * Filters the generated link for the displayed user's profile.
1959       *
1960       * @since 1.0.0
1961       *
1962       * @param string $value Generated link for the displayed user's profile.
1963       */
1964      return apply_filters( 'bp_displayed_user_domain', isset( $bp->displayed_user->domain ) ? $bp->displayed_user->domain : '' );
1965  }
1966  
1967  /**
1968   * Generate the link for the logged-in user's profile.
1969   *
1970   * @since 1.0.0
1971   *
1972   * @global BuddyPress $bp The one true BuddyPress instance.
1973   *
1974   * @return string
1975   */
1976  function bp_loggedin_user_domain() {
1977      $bp = buddypress();
1978  
1979      /**
1980       * Filters the generated link for the logged-in user's profile.
1981       *
1982       * @since 1.0.0
1983       *
1984       * @param string $value Generated link for the logged-in user's profile.
1985       */
1986      return apply_filters( 'bp_loggedin_user_domain', isset( $bp->loggedin_user->domain ) ? $bp->loggedin_user->domain : '' );
1987  }
1988  
1989  /**
1990   * Output the displayed user's display name.
1991   *
1992   * @since 1.0.0
1993   */
1994  function bp_displayed_user_fullname() {
1995      echo bp_get_displayed_user_fullname();
1996  }
1997      /**
1998       * Get the displayed user's display name.
1999       *
2000       * @since 1.2.0
2001       *
2002       * @global BuddyPress $bp The one true BuddyPress instance.
2003       *
2004       * @return string
2005       */
2006  	function bp_get_displayed_user_fullname() {
2007          $bp = buddypress();
2008  
2009          /**
2010           * Filters the displayed user's display name.
2011           *
2012           * @since 1.2.0
2013           *
2014           * @param string $value Displayed user's display name.
2015           */
2016          return apply_filters( 'bp_displayed_user_fullname', isset( $bp->displayed_user->fullname ) ? $bp->displayed_user->fullname : '' );
2017      }
2018  
2019      /**
2020       * Alias of {@link bp_get_displayed_user_fullname()}.
2021       *
2022       * @since 1.0.0
2023       */
2024  	function bp_user_fullname() { echo bp_get_displayed_user_fullname(); }
2025  
2026  
2027  /**
2028   * Output the logged-in user's display name.
2029   *
2030   * @since 1.0.0
2031   */
2032  function bp_loggedin_user_fullname() {
2033      echo bp_get_loggedin_user_fullname();
2034  }
2035      /**
2036       * Get the logged-in user's display name.
2037       *
2038       * @since 1.0.0
2039       *
2040       * @global BuddyPress $bp The one true BuddyPress instance.
2041       *
2042       * @return string
2043       */
2044  	function bp_get_loggedin_user_fullname() {
2045          $bp = buddypress();
2046  
2047          /**
2048           * Filters the logged-in user's display name.
2049           *
2050           * @since 1.0.0
2051           *
2052           * @param string $value Logged-in user's display name.
2053           */
2054          return apply_filters( 'bp_get_loggedin_user_fullname', isset( $bp->loggedin_user->fullname ) ? $bp->loggedin_user->fullname : '' );
2055      }
2056  
2057  /**
2058   * Output the username of the displayed user.
2059   *
2060   * @since 1.2.0
2061   */
2062  function bp_displayed_user_username() {
2063      echo bp_get_displayed_user_username();
2064  }
2065      /**
2066       * Get the username of the displayed user.
2067       *
2068       * @since 1.2.0
2069       *
2070       * @global BuddyPress $bp The one true BuddyPress instance.
2071       *
2072       * @return string
2073       */
2074  	function bp_get_displayed_user_username() {
2075          $bp = buddypress();
2076  
2077          if ( bp_displayed_user_id() ) {
2078              $username = bp_core_get_username( bp_displayed_user_id(), $bp->displayed_user->userdata->user_nicename, $bp->displayed_user->userdata->user_login );
2079          } else {
2080              $username = '';
2081          }
2082  
2083          /**
2084           * Filters the username of the displayed user.
2085           *
2086           * @since 1.2.0
2087           *
2088           * @param string $username Username of the displayed user.
2089           */
2090          return apply_filters( 'bp_get_displayed_user_username', $username );
2091      }
2092  
2093  /**
2094   * Output the username of the logged-in user.
2095   *
2096   * @since 1.2.0
2097   */
2098  function bp_loggedin_user_username() {
2099      echo bp_get_loggedin_user_username();
2100  }
2101      /**
2102       * Get the username of the logged-in user.
2103       *
2104       * @since 1.2.0
2105       *
2106       * @global BuddyPress $bp The one true BuddyPress instance.
2107       *
2108       * @return string
2109       */
2110  	function bp_get_loggedin_user_username() {
2111          $bp = buddypress();
2112  
2113          if ( bp_loggedin_user_id() ) {
2114              $username = bp_core_get_username( bp_loggedin_user_id(), $bp->loggedin_user->userdata->user_nicename, $bp->loggedin_user->userdata->user_login );
2115          } else {
2116              $username = '';
2117          }
2118  
2119          /**
2120           * Filters the username of the logged-in user.
2121           *
2122           * @since 1.2.0
2123           *
2124           * @param string $username Username of the logged-in user.
2125           */
2126          return apply_filters( 'bp_get_loggedin_user_username', $username );
2127      }
2128  
2129  /**
2130   * Echo the current member type message.
2131   *
2132   * @since 2.3.0
2133   */
2134  function bp_current_member_type_message() {
2135      echo bp_get_current_member_type_message();
2136  }
2137      /**
2138       * Generate the current member type message.
2139       *
2140       * @since 2.3.0
2141       *
2142       * @return string
2143       */
2144  	function bp_get_current_member_type_message() {
2145          $type_object = bp_get_member_type_object( bp_get_current_member_type() );
2146  
2147          /* translators: %s: member type singular name */
2148          $message = sprintf( __( 'Viewing members of the type: %s', 'buddypress' ), '<strong>' . $type_object->labels['singular_name'] . '</strong>' );
2149  
2150          /**
2151           * Filters the current member type message.
2152           *
2153           * @since 2.3.0
2154           *
2155           * @param string $message Message to filter.
2156           */
2157          return apply_filters( 'bp_get_current_member_type_message', $message );
2158      }
2159  
2160  /**
2161   * Output member type directory link.
2162   *
2163   * @since 7.0.0
2164   *
2165   * @param string $member_type Unique member type identifier as used in bp_register_member_type().
2166   */
2167  function bp_member_type_directory_link( $member_type = '' ) {
2168      echo bp_get_member_type_directory_link( $member_type );
2169  }
2170      /**
2171       * Return member type directory link.
2172       *
2173       * @since 7.0.0
2174       *
2175       * @param string $member_type Unique member type identifier as used in bp_register_member_type().
2176       * @return string
2177       */
2178  	function bp_get_member_type_directory_link( $member_type = '' ) {
2179          if ( empty( $member_type ) ) {
2180              return '';
2181          }
2182  
2183          $member_type_object = bp_get_member_type_object( $member_type );
2184  
2185          if ( ! isset( $member_type_object->labels['name'] ) ) {
2186              return '';
2187          }
2188  
2189          $member_type_text = $member_type_object->labels['name'];
2190          if ( isset( $member_type_object->labels['singular_name'] ) && $member_type_object->labels['singular_name'] ) {
2191              $member_type_text = $member_type_object->labels['singular_name'];
2192          }
2193  
2194          if ( empty( $member_type_object->has_directory ) ) {
2195              return esc_html( $member_type_text );
2196          }
2197  
2198          return sprintf(
2199              '<a href="%1$s">%2$s</a>',
2200              esc_url( bp_get_member_type_directory_permalink( $member_type ) ),
2201              esc_html( $member_type_text )
2202          );
2203      }
2204  
2205  /**
2206   * Output a comma-delimited list of member types.
2207   *
2208   * @since 7.0.0
2209   *
2210   * @see bp_get_member_type_list() For additional information on default arguments.
2211   *
2212   * @param int   $user_id User ID.
2213   * @param array $r       Optional. Member type list arguments. Default empty array.
2214   */
2215  function bp_member_type_list( $user_id = 0, $r = array() ) {
2216      echo bp_get_member_type_list( $user_id, $r );
2217  }
2218      /**
2219       * Return a comma-delimited list of member types.
2220       *
2221       * @since 7.0.0
2222       *
2223       * @param int          $user_id User ID. Defaults to displayed user ID if on a member page.
2224       * @param array|string $r       {
2225       *     Array of parameters. All items are optional.
2226       *     @type string $parent_element     Element to wrap around the list. Defaults to 'p'.
2227       *     @type array  $parent_attr        Element attributes for parent element. Defaults to
2228       *                                      array( 'class' => 'bp-member-type-list' ).
2229       *     @type array  $label              Plural and singular labels to use before the list. Defaults to
2230       *                                      array( 'plural' => 'Member Types:', 'singular' => 'Member Type:' ).
2231       *     @type string $label_element      Element to wrap around the label. Defaults to 'strong'.
2232       *     @type array  $label_attr         Element attributes for label element. Defaults to array().
2233       *     @type bool   $show_all           Whether to show all registered group types. Defaults to 'false'. If
2234       *                                      'false', only shows member types with the 'show_in_list' parameter set to
2235       *                                      true. See bp_register_member_type() for more info.
2236       *     @type string $list_element       Element to wrap around the comma separated list of membet types. Defaults to ''.
2237       *     @type string $list_element_attr  Element attributes for list element. Defaults to array().
2238       * }
2239       * @return string
2240       */
2241  	function bp_get_member_type_list( $user_id = 0, $r = array() ) {
2242          if ( empty( $user_id ) ) {
2243              $user_id = bp_displayed_user_id();
2244          }
2245  
2246          $r = bp_parse_args(
2247              $r,
2248              array(
2249                  'parent_element'    => 'p',
2250                  'parent_attr'       => array(
2251                      'class' => 'bp-member-type-list',
2252                  ),
2253                  'label'             => array(),
2254                  'label_element'     => 'strong',
2255                  'label_attr'        => array(),
2256                  'show_all'          => false,
2257                  'list_element'      => '',
2258                  'list_element_attr' => array(),
2259              ),
2260              'member_type_list'
2261          );
2262  
2263          // Should the label be output?
2264          $has_label = ! empty( $r['label'] );
2265  
2266          $labels = bp_parse_args(
2267              $r['label'],
2268              array(
2269                  'plural'   => __( 'Member Types:', 'buddypress' ),
2270                  'singular' => __( 'Member Type:', 'buddypress' ),
2271              )
2272          );
2273  
2274          $retval = '';
2275          $types  = bp_get_member_type( $user_id, false );
2276  
2277          if ( $types ) {
2278              // Make sure we can show the type in the list.
2279              if ( false === $r['show_all'] ) {
2280                  $types = array_intersect( bp_get_member_types( array( 'show_in_list' => true ) ), $types );
2281                  if ( empty( $types ) ) {
2282                      return $retval;
2283                  }
2284              }
2285  
2286              $before = $after = $label = '';
2287              $count  = count( $types );
2288  
2289              if ( 1 === $count ) {
2290                  $label_text = $labels['singular'];
2291              } else {
2292                  $label_text = $labels['plural'];
2293              }
2294  
2295              // Render parent element.
2296              if ( ! empty( $r['parent_element'] ) ) {
2297                  $parent_elem = new BP_Core_HTML_Element( array(
2298                      'element' => $r['parent_element'],
2299                      'attr'    => $r['parent_attr'],
2300                  ) );
2301  
2302                  // Set before and after.
2303                  $before = $parent_elem->get( 'open_tag' );
2304                  $after  = $parent_elem->get( 'close_tag' );
2305              }
2306  
2307              // Render label element.
2308              if ( ! empty( $r['label_element'] ) ) {
2309                  $label = new BP_Core_HTML_Element( array(
2310                      'element'    => $r['label_element'],
2311                      'attr'       => $r['label_attr'],
2312                      'inner_html' => esc_html( $label_text ),
2313                  ) );
2314                  $label = $label->contents() . ' ';
2315  
2316              // No element, just the label.
2317              } elseif ( $has_label ) {
2318                  $label = esc_html( $label_text );
2319              }
2320  
2321              // The list of types.
2322              $list = implode( ', ', array_map( 'bp_get_member_type_directory_link', $types ) );
2323  
2324              // Render the list of types element.
2325              if ( ! empty( $r['list_element'] ) ) {
2326                  $list_element = new BP_Core_HTML_Element( array(
2327                      'element'    => $r['list_element'],
2328                      'attr'       => $r['list_element_attr'],
2329                      'inner_html' => $list,
2330                  ) );
2331  
2332                  $list = $list_element->contents();
2333              }
2334  
2335              // Comma-delimit each type into the group type directory link.
2336              $label .= $list;
2337  
2338              // Retval time!
2339              $retval = $before . $label . $after;
2340          }
2341  
2342          return $retval;
2343      }
2344  
2345  /** Signup Form ***************************************************************/
2346  
2347  /**
2348   * Do we have a working custom sign up page?
2349   *
2350   * @since 1.5.0
2351   *
2352   * @return bool True if page and template exist, false if not.
2353   */
2354  function bp_has_custom_signup_page() {
2355      static $has_page = false;
2356  
2357      if ( empty( $has_page ) ) {
2358          $has_page = bp_get_signup_slug() && bp_locate_template( array( 'registration/register.php', 'members/register.php', 'register.php' ), false );
2359      }
2360  
2361      return (bool) $has_page;
2362  }
2363  
2364  /**
2365   * Output the URL to the signup page.
2366   *
2367   * @since 1.0.0
2368   */
2369  function bp_signup_page() {
2370      echo esc_url( bp_get_signup_page() );
2371  }
2372      /**
2373       * Get the URL to the signup page.
2374       *
2375       * @since 1.1.0
2376       *
2377       * @return string
2378       */
2379  	function bp_get_signup_page() {
2380          if ( bp_has_custom_signup_page() ) {
2381              $page = trailingslashit( bp_get_root_domain() . '/' . bp_get_signup_slug() );
2382          } else {
2383              $page = bp_get_root_domain() . '/wp-signup.php';
2384          }
2385  
2386          /**
2387           * Filters the URL to the signup page.
2388           *
2389           * @since 1.1.0
2390           *
2391           * @param string $page URL to the signup page.
2392           */
2393          return apply_filters( 'bp_get_signup_page', $page );
2394      }
2395  
2396  /**
2397   * Do we have a working custom activation page?
2398   *
2399   * @since 1.5.0
2400   *
2401   * @return bool True if page and template exist, false if not.
2402   */
2403  function bp_has_custom_activation_page() {
2404      static $has_page = false;
2405  
2406      if ( empty( $has_page ) ) {
2407          $has_page = bp_get_activate_slug() && bp_locate_template( array( 'registration/activate.php', 'members/activate.php', 'activate.php' ), false );
2408      }
2409  
2410      return (bool) $has_page;
2411  }
2412  
2413  /**
2414   * Output the URL of the activation page.
2415   *
2416   * @since 1.0.0
2417   */
2418  function bp_activation_page() {
2419      echo esc_url( bp_get_activation_page() );
2420  }
2421      /**
2422       * Get the URL of the activation page.
2423       *
2424       * @since 1.2.0
2425       *
2426       * @return string
2427       */
2428  	function bp_get_activation_page() {
2429          if ( bp_has_custom_activation_page() ) {
2430              $page = trailingslashit( bp_get_root_domain() . '/' . bp_get_activate_slug() );
2431          } else {
2432              $page = trailingslashit( bp_get_root_domain() ) . 'wp-activate.php';
2433          }
2434  
2435          /**
2436           * Filters the URL of the activation page.
2437           *
2438           * @since 1.2.0
2439           *
2440           * @param string $page URL to the activation page.
2441           */
2442          return apply_filters( 'bp_get_activation_page', $page );
2443      }
2444  
2445  /**
2446   * Get the activation key from the current request URL.
2447   *
2448   * @since 3.0.0
2449   *
2450   * @return string
2451   */
2452  function bp_get_current_activation_key() {
2453      $key = '';
2454  
2455      if ( bp_is_current_component( 'activate' ) ) {
2456          if ( isset( $_GET['key'] ) ) {
2457              $key = wp_unslash( $_GET['key'] );
2458          } else {
2459              $key = bp_current_action();
2460          }
2461      }
2462  
2463      /**
2464       * Filters the activation key from the current request URL.
2465       *
2466       * @since 3.0.0
2467       *
2468       * @param string $key Activation key.
2469       */
2470      return apply_filters( 'bp_get_current_activation_key', $key );
2471  }
2472  
2473  /**
2474   * Output the username submitted during signup.
2475   *
2476   * @since 1.1.0
2477   */
2478  function bp_signup_username_value() {
2479      echo bp_get_signup_username_value();
2480  }
2481      /**
2482       * Get the username submitted during signup.
2483       *
2484       * @since 1.1.0
2485       *
2486       * @todo This should be properly escaped.
2487       *
2488       * @return string
2489       */
2490  	function bp_get_signup_username_value() {
2491          $value = '';
2492          if ( isset( $_POST['signup_username'] ) )
2493              $value = $_POST['signup_username'];
2494  
2495          /**
2496           * Filters the username submitted during signup.
2497           *
2498           * @since 1.1.0
2499           *
2500           * @param string $value Username submitted during signup.
2501           */
2502          return apply_filters( 'bp_get_signup_username_value', $value );
2503      }
2504  
2505  /**
2506   * Output the user email address submitted during signup.
2507   *
2508   * @since 1.1.0
2509   */
2510  function bp_signup_email_value() {
2511      echo bp_get_signup_email_value();
2512  }
2513      /**
2514       * Get the email address submitted during signup.
2515       *
2516       * @since 1.1.0
2517       *
2518       * @todo This should be properly escaped.
2519       *
2520       * @return string
2521       */
2522  	function bp_get_signup_email_value() {
2523          $value = '';
2524          if ( isset( $_POST['signup_email'] ) ) {
2525              $value = $_POST['signup_email'];
2526          } else if ( bp_get_members_invitations_allowed() ) {
2527              $invite = bp_get_members_invitation_from_request();
2528              if ( $invite ) {
2529                  $value = $invite->invitee_email;
2530              }
2531          }
2532  
2533          /**
2534           * Filters the email address submitted during signup.
2535           *
2536           * @since 1.1.0
2537           *
2538           * @param string $value Email address submitted during signup.
2539           */
2540          return apply_filters( 'bp_get_signup_email_value', $value );
2541      }
2542  
2543  /**
2544   * Output the 'signup_with_blog' value submitted during signup.
2545   *
2546   * @since 1.1.0
2547   */
2548  function bp_signup_with_blog_value() {
2549      echo bp_get_signup_with_blog_value();
2550  }
2551      /**
2552       * Get the 'signup_with_blog' value submitted during signup.
2553       *
2554       * @since 1.1.0
2555       *
2556       * @return string
2557       */
2558  	function bp_get_signup_with_blog_value() {
2559          $value = '';
2560          if ( isset( $_POST['signup_with_blog'] ) )
2561              $value = $_POST['signup_with_blog'];
2562  
2563          /**
2564           * Filters the 'signup_with_blog' value submitted during signup.
2565           *
2566           * @since 1.1.0
2567           *
2568           * @param string $value 'signup_with_blog' value submitted during signup.
2569           */
2570          return apply_filters( 'bp_get_signup_with_blog_value', $value );
2571      }
2572  
2573  /**
2574   * Output the 'signup_blog_url' value submitted at signup.
2575   *
2576   * @since 1.1.0
2577   */
2578  function bp_signup_blog_url_value() {
2579      echo bp_get_signup_blog_url_value();
2580  }
2581      /**
2582       * Get the 'signup_blog_url' value submitted at signup.
2583       *
2584       * @since 1.1.0
2585       *
2586       * @todo Should be properly escaped.
2587       *
2588       * @return string
2589       */
2590  	function bp_get_signup_blog_url_value() {
2591          $value = '';
2592          if ( isset( $_POST['signup_blog_url'] ) )
2593              $value = $_POST['signup_blog_url'];
2594  
2595          /**
2596           * Filters the 'signup_blog_url' value submitted during signup.
2597           *
2598           * @since 1.1.0
2599           *
2600           * @param string $value 'signup_blog_url' value submitted during signup.
2601           */
2602          return apply_filters( 'bp_get_signup_blog_url_value', $value );
2603      }
2604  
2605  /**
2606   * Output the base URL for subdomain installations of WordPress Multisite.
2607   *
2608   * @since 2.1.0
2609   */
2610  function bp_signup_subdomain_base() {
2611      echo bp_signup_get_subdomain_base();
2612  }
2613      /**
2614       * Return the base URL for subdomain installations of WordPress Multisite.
2615       *
2616       * Replaces bp_blogs_get_subdomain_base()
2617       *
2618       * @since 2.1.0
2619       *
2620       * @global WP_Network $current_site
2621       *
2622       * @return string The base URL - eg, 'example.com' for site_url() example.com or www.example.com.
2623       */
2624  	function bp_signup_get_subdomain_base() {
2625          global $current_site;
2626  
2627          // In case plugins are still using this filter.
2628          $subdomain_base = apply_filters( 'bp_blogs_subdomain_base', preg_replace( '|^www\.|', '', $current_site->domain ) . $current_site->path );
2629  
2630          /**
2631           * Filters the base URL for subdomain installations of WordPress Multisite.
2632           *
2633           * @since 2.1.0
2634           *
2635           * @param string $subdomain_base The base URL - eg, 'example.com' for
2636           *                               site_url() example.com or www.example.com.
2637           */
2638          return apply_filters( 'bp_signup_subdomain_base', $subdomain_base );
2639      }
2640  
2641  /**
2642   * Output the 'signup_blog_titl' value submitted at signup.
2643   *
2644   * @since 1.1.0
2645   */
2646  function bp_signup_blog_title_value() {
2647      echo bp_get_signup_blog_title_value();
2648  }
2649      /**
2650       * Get the 'signup_blog_title' value submitted at signup.
2651       *
2652       * @since 1.1.0
2653       *
2654       * @todo Should be properly escaped.
2655       *
2656       * @return string
2657       */
2658  	function bp_get_signup_blog_title_value() {
2659          $value = '';
2660          if ( isset( $_POST['signup_blog_title'] ) )
2661              $value = $_POST['signup_blog_title'];
2662  
2663          /**
2664           * Filters the 'signup_blog_title' value submitted during signup.
2665           *
2666           * @since 1.1.0
2667           *
2668           * @param string $value 'signup_blog_title' value submitted during signup.
2669           */
2670          return apply_filters( 'bp_get_signup_blog_title_value', $value );
2671      }
2672  
2673  /**
2674   * Output the 'signup_blog_privacy' value submitted at signup.
2675   *
2676   * @since 1.1.0
2677   */
2678  function bp_signup_blog_privacy_value() {
2679      echo bp_get_signup_blog_privacy_value();
2680  }
2681      /**
2682       * Get the 'signup_blog_privacy' value submitted at signup.
2683       *
2684       * @since 1.1.0
2685       *
2686       * @todo Should be properly escaped.
2687       *
2688       * @return string
2689       */
2690  	function bp_get_signup_blog_privacy_value() {
2691          $value = '';
2692          if ( isset( $_POST['signup_blog_privacy'] ) )
2693              $value = $_POST['signup_blog_privacy'];
2694  
2695          /**
2696           * Filters the 'signup_blog_privacy' value submitted during signup.
2697           *
2698           * @since 1.1.0
2699           *
2700           * @param string $value 'signup_blog_privacy' value submitted during signup.
2701           */
2702          return apply_filters( 'bp_get_signup_blog_privacy_value', $value );
2703      }
2704  
2705  /**
2706   * Output the avatar dir used during signup.
2707   *
2708   * @since 1.1.0
2709   */
2710  function bp_signup_avatar_dir_value() {
2711      echo bp_get_signup_avatar_dir_value();
2712  }
2713      /**
2714       * Get the avatar dir used during signup.
2715       *
2716       * @since 1.1.0
2717       *
2718       * @global BuddyPress $bp The one true BuddyPress instance.
2719       *
2720       * @return string
2721       */
2722  	function bp_get_signup_avatar_dir_value() {
2723          $bp = buddypress();
2724  
2725          // Check if signup_avatar_dir is passed.
2726          if ( !empty( $_POST['signup_avatar_dir'] ) )
2727              $signup_avatar_dir = $_POST['signup_avatar_dir'];
2728  
2729          // If not, check if global is set.
2730          elseif ( !empty( $bp->signup->avatar_dir ) )
2731              $signup_avatar_dir = $bp->signup->avatar_dir;
2732  
2733          // If not, set false.
2734          else
2735              $signup_avatar_dir = false;
2736  
2737          /**
2738           * Filters the avatar dir used during signup.
2739           *
2740           * @since 1.1.0
2741           *
2742           * @param string|bool $signup_avatar_dir Avatar dir used during signup or false.
2743           */
2744          return apply_filters( 'bp_get_signup_avatar_dir_value', $signup_avatar_dir );
2745      }
2746  
2747  /**
2748   * Determines whether privacy policy acceptance is required for registration.
2749   *
2750   * @since 4.0.0
2751   *
2752   * @return bool
2753   */
2754  function bp_signup_requires_privacy_policy_acceptance() {
2755  
2756      // Default to true when a published Privacy Policy page exists.
2757      $privacy_policy_url = get_privacy_policy_url();
2758      $required           = ! empty( $privacy_policy_url );
2759  
2760      /**
2761       * Filters whether privacy policy acceptance is required for registration.
2762       *
2763       * @since 4.0.0
2764       *
2765       * @param bool $required Whether privacy policy acceptance is required.
2766       */
2767      return (bool) apply_filters( 'bp_signup_requires_privacy_policy_acceptance', $required );
2768  }
2769  
2770  /**
2771   * Output the current signup step.
2772   *
2773   * @since 1.1.0
2774   */
2775  function bp_current_signup_step() {
2776      echo bp_get_current_signup_step();
2777  }
2778      /**
2779       * Get the current signup step.
2780       *
2781       * @since 1.1.0
2782       *
2783       * @global BuddyPress $bp The one true BuddyPress instance.
2784       *
2785       * @return string
2786       */
2787  	function bp_get_current_signup_step() {
2788          return (string) buddypress()->signup->step;
2789      }
2790  
2791  /**
2792   * Output the user avatar during signup.
2793   *
2794   * @since 1.1.0
2795   *
2796   * @see bp_get_signup_avatar() for description of arguments.
2797   *
2798   * @param array|string $args See {@link bp_get_signup_avatar(}.
2799   */
2800  function bp_signup_avatar( $args = '' ) {
2801      echo bp_get_signup_avatar( $args );
2802  }
2803      /**
2804       * Get the user avatar during signup.
2805       *
2806       * @since 1.1.0
2807       *
2808       * @global BuddyPress $bp The one true BuddyPress instance.
2809       *
2810       * @see bp_core_fetch_avatar() for description of arguments.
2811       *
2812       * @param array|string $args {
2813       *     Array of optional arguments.
2814       *     @type int    $size  Height/weight in pixels. Default: value of
2815       *                         bp_core_avatar_full_width().
2816       *     @type string $class CSS class. Default: 'avatar'.
2817       *     @type string $alt   HTML 'alt' attribute. Default: 'Your Avatar'.
2818       * }
2819       * @return string
2820       */
2821  	function bp_get_signup_avatar( $args = '' ) {
2822          $bp = buddypress();
2823          $r  = bp_parse_args(
2824              $args,
2825              array(
2826                  'size'  => bp_core_avatar_full_width(),
2827                  'class' => 'avatar',
2828                  'alt'   => __( 'Your Profile Photo', 'buddypress' ),
2829              )
2830          );
2831  
2832          extract( $r, EXTR_SKIP );
2833  
2834          $signup_avatar_dir = bp_get_signup_avatar_dir_value();
2835  
2836          // Avatar DIR is found.
2837          if ( $signup_avatar_dir ) {
2838              $gravatar_img = bp_core_fetch_avatar( array(
2839                  'item_id'    => $signup_avatar_dir,
2840                  'object'     => 'signup',
2841                  'avatar_dir' => 'avatars/signups',
2842                  'type'       => 'full',
2843                  'width'      => $size,
2844                  'height'     => $size,
2845                  'alt'        => $alt,
2846                  'class'      => $class,
2847              ) );
2848  
2849              // No avatar DIR was found.
2850          } else {
2851  
2852              // Set default gravatar type.
2853              if ( empty( $bp->grav_default->user ) ) {
2854                  $default_grav = 'wavatar';
2855              } elseif ( 'mystery' === $bp->grav_default->user ) {
2856                  $default_grav = $bp->plugin_url . 'bp-core/images/mystery-man.jpg';
2857              } else {
2858                  $default_grav = $bp->grav_default->user;
2859              }
2860  
2861              /**
2862               * Filters the base Gravatar url used for signup avatars when no avatar dir found.
2863               *
2864               * @since 1.0.2
2865               *
2866               * @param string $value Gravatar url to use.
2867               */
2868              $gravatar_url    = apply_filters( 'bp_gravatar_url', '//www.gravatar.com/avatar/' );
2869              $md5_lcase_email = md5( strtolower( bp_get_signup_email_value() ) );
2870              $gravatar_img    = '<img src="' . $gravatar_url . $md5_lcase_email . '?d=' . $default_grav . '&amp;s=' . $size . '" width="' . $size . '" height="' . $size . '" alt="' . $alt . '" class="' . $class . '" />';
2871          }
2872  
2873          /**
2874           * Filters the user avatar during signup.
2875           *
2876           * @since 1.1.0
2877           *
2878           * @param string $gravatar_img Avatar HTML image tag.
2879           * @param array  $args         Array of parsed args for avatar query.
2880           */
2881          return apply_filters( 'bp_get_signup_avatar', $gravatar_img, $args );
2882      }
2883  
2884  /**
2885   * Output whether signup is allowed.
2886   *
2887   * @since 1.1.0
2888   *
2889   * @todo Remove this function. Echoing a bool is pointless.
2890   */
2891  function bp_signup_allowed() {
2892      echo bp_get_signup_allowed();
2893  }
2894      /**
2895       * Is user signup allowed?
2896       *
2897       * @since 1.1.0
2898       *
2899       * @return bool
2900       */
2901  	function bp_get_signup_allowed() {
2902  
2903          /**
2904           * Filters whether or not new signups are allowed.
2905           *
2906           * @since 1.5.0
2907           *
2908           * @param bool $signup_allowed Whether or not new signups are allowed.
2909           */
2910          return apply_filters( 'bp_get_signup_allowed', (bool) bp_get_option( 'users_can_register' ) );
2911      }
2912  
2913  /**
2914   * Are users allowed to invite users to join this site?
2915   *
2916   * @since 8.0.0
2917   *
2918   * @return bool
2919   */
2920  function bp_get_members_invitations_allowed() {
2921      /**
2922       * Filters whether or not community invitations are allowed.
2923       *
2924       * @since 8.0.0
2925       *
2926       * @param bool $allowed Whether or not community invitations are allowed.
2927       */
2928      return apply_filters( 'bp_get_members_invitations_allowed', bp_is_active( 'members', 'invitations' ) && (bool) bp_get_option( 'bp-enable-members-invitations' ) );
2929  }
2930  
2931  /**
2932   * Are membership requests required for joining this site?
2933   *
2934   * @since 10.0.0
2935   *
2936   * @param bool $context "raw" to fetch value from database,
2937   *                      "site" to take "anyone can register" setting into account.
2938   * @return bool
2939   */
2940  function bp_get_membership_requests_required( $context = 'site' ) {
2941      if ( 'raw' === $context ) {
2942          $retval = bp_is_active( 'members', 'membership_requests' ) && (bool) bp_get_option( 'bp-enable-membership-requests' );
2943      } else {
2944          $retval = bp_is_active( 'members', 'membership_requests' ) && ! bp_get_signup_allowed() && (bool) bp_get_option( 'bp-enable-membership-requests' );
2945      }
2946  
2947      /**
2948       * Filters whether or not prospective members may submit network membership requests.
2949       *
2950       * @since 10.0.0
2951       *
2952       * @param bool $retval Whether or not membership requests are required.
2953       * @param bool $retval Whether this is the value stored in the database ('raw')
2954       *                     or whether the site's "anyone can register" setting is
2955       *                     being considered ('site' or anything else).
2956       */
2957      return apply_filters( 'bp_get_membership_requests_required', $retval, $context );
2958  }
2959  
2960  /**
2961   * Should the system create and allow access
2962   * to the Register and Activate pages?
2963   *
2964   * @since 10.0.0
2965   *
2966   * @return bool
2967   */
2968  function bp_allow_access_to_registration_pages() {
2969      $retval = bp_get_signup_allowed() || bp_get_members_invitations_allowed() || bp_get_membership_requests_required();
2970  
2971      /**
2972       * Filters whether or not the system should create and allow access
2973       * to the Register and Activate pages.
2974       *
2975       * @since 10.0.0
2976       *
2977       * @param bool $retval Whether or not to allow access to
2978       *                     the Register and Activate pages.
2979       */
2980      return apply_filters( 'bp_allow_access_to_registration_pages', $retval );
2981  }
2982  
2983  /**
2984   * Hook member activity feed to <head>.
2985   *
2986   * @since 1.5.0
2987   */
2988  function bp_members_activity_feed() {
2989      if ( !bp_is_active( 'activity' ) || !bp_is_user() )
2990          return; ?>
2991  
2992      <link rel="alternate" type="application/rss+xml" title="<?php bloginfo( 'name' ) ?> | <?php bp_displayed_user_fullname() ?> | <?php _e( 'Activity RSS Feed', 'buddypress' ) ?>" href="<?php bp_member_activity_feed_link() ?>" />
2993  
2994  <?php
2995  }
2996  add_action( 'bp_head', 'bp_members_activity_feed' );
2997  
2998  /**
2999   * Output a link to a members component subpage.
3000   *
3001   * @since 1.5.0
3002   *
3003   * @see bp_get_members_component_link() for description of parameters.
3004   *
3005   * @param string      $component See {@bp_get_members_component_link()}.
3006   * @param string      $action See {@bp_get_members_component_link()}.
3007   * @param string      $query_args See {@bp_get_members_component_link()}.
3008   * @param string|bool $nonce See {@bp_get_members_component_link()}.
3009   */
3010  function bp_members_component_link( $component, $action = '', $query_args = '', $nonce = false ) {
3011      echo esc_url( bp_get_members_component_link( $component, $action, $query_args, $nonce ) );
3012  }
3013      /**
3014       * Generate a link to a members component subpage.
3015       *
3016       * @since 1.5.0
3017       *
3018       * @global BuddyPress $bp The one true BuddyPress instance.
3019       *
3020       * @param string       $component  ID of the component (eg 'friends').
3021       * @param string       $action     Optional. 'action' slug (eg 'invites').
3022       * @param array|string $query_args Optional. Array of URL params to add to the
3023       *                                 URL. See {@link add_query_arg()} for format.
3024       * @param array|bool   $nonce      Optional. If provided, the URL will be passed
3025       *                                 through wp_nonce_url() with $nonce as the
3026       *                                 action string.
3027       * @return string
3028       */
3029  	function bp_get_members_component_link( $component, $action = '', $query_args = '', $nonce = false ) {
3030          // Must be displayed user.
3031          if ( ! bp_displayed_user_id() ) {
3032              return;
3033          }
3034  
3035          $bp = buddypress();
3036  
3037          if ( 'xprofile' === $component ) {
3038              $component = 'profile';
3039          }
3040  
3041          // Append $action to $url if there is no $type.
3042          if ( ! empty( $action ) ) {
3043              $url = bp_displayed_user_domain() . $bp->{$component}->slug . '/' . $action;
3044          } else {
3045              $url = bp_displayed_user_domain() . $bp->{$component}->slug;
3046          }
3047  
3048          // Add a slash at the end of our user url.
3049          $url = trailingslashit( $url );
3050  
3051          // Add possible query arg.
3052          if ( ! empty( $query_args ) && is_array( $query_args ) ) {
3053              $url = add_query_arg( $query_args, $url );
3054          }
3055  
3056          // To nonce, or not to nonce...
3057          if ( true === $nonce ) {
3058              $url = wp_nonce_url( $url );
3059          } elseif ( is_string( $nonce ) ) {
3060              $url = wp_nonce_url( $url, $nonce );
3061          }
3062  
3063          // Return the url, if there is one.
3064          if ( ! empty( $url ) ) {
3065              return $url;
3066          }
3067      }
3068  
3069  
3070  /**
3071   * Render an avatar delete link.
3072   *
3073   * @since 1.1.0
3074   * @since 6.0.0 Moved from /bp-xprofile/bp-xprofile-template.php to this file.
3075   */
3076  function bp_avatar_delete_link() {
3077      echo bp_get_avatar_delete_link();
3078  }
3079      /**
3080       * Return an avatar delete link.
3081       *
3082       * @since 1.1.0
3083       * @since 6.0.0 Moved from /bp-xprofile/bp-xprofile-template.php to this file.
3084       *
3085       * @return string
3086       */
3087  	function bp_get_avatar_delete_link() {
3088  
3089          /**
3090           * Filters the link used for deleting an avatar.
3091           *
3092           * @since 1.1.0
3093           *
3094           * @param string $value Nonced URL used for deleting an avatar.
3095           */
3096          return apply_filters( 'bp_get_avatar_delete_link', wp_nonce_url( bp_displayed_user_domain() . bp_get_profile_slug() . '/change-avatar/delete-avatar/', 'bp_delete_avatar_link' ) );
3097      }
3098  
3099  
3100  /** The Members Invitations Loop ******************************************************************/
3101  
3102  /**
3103   * Initialize the community invitations loop.
3104   *
3105   * Based on the $args passed, bp_has_invitations() populates
3106   * buddypress()->invitations->query_loop global, enabling the use of BP
3107   * templates and template functions to display a list of invitations.
3108   *
3109   * @since 8.0.0
3110   *
3111   * @global BuddyPress $bp The one true BuddyPress instance.
3112   *
3113   * @param array|string $args {
3114   *     Arguments for limiting the contents of the invitations loop. Can be
3115   *     passed as an associative array, or as a URL query string.
3116   *
3117   *     See {@link BP_Invitations_Invitation::get()} for detailed
3118   *     information on the arguments.  In addition, also supports:
3119   *
3120   *     @type int    $max      Optional. Max items to display. Default: false.
3121   *     @type string $page_arg URL argument to use for pagination.
3122   *                            Default: 'ipage'.
3123   * }
3124   * @return bool
3125   */
3126  function bp_has_members_invitations( $args = '' ) {
3127      $bp = buddypress();
3128  
3129      // Get the user ID.
3130      if ( bp_displayed_user_id() ) {
3131          $user_id = bp_displayed_user_id();
3132      } else {
3133          $user_id = bp_loggedin_user_id();
3134      }
3135  
3136      // Set the search terms (by default an empty string to get all notifications).
3137      $search_terms = '';
3138  
3139      if ( isset( $_REQUEST['s'] ) ) {
3140          $search_terms = stripslashes( $_REQUEST['s'] );
3141      }
3142  
3143      // Parse the args.
3144      $r = bp_parse_args(
3145          $args,
3146          array(
3147              'id'            => false,
3148              'inviter_id'    => $user_id,
3149              'invitee_email' => false,
3150              'item_id'       => false,
3151              'type'          => 'invite',
3152              'invite_sent'   => 'all',
3153              'accepted'      => 'pending',
3154              'search_terms'  => $search_terms,
3155              'order_by'      => 'date_modified',
3156              'sort_order'    => 'DESC',
3157              'page'          => 1,
3158              'per_page'      => 25,
3159              'fields'        => 'all',
3160  
3161              // These are additional arguments that are not available in
3162              // BP_Invitations_Invitation::get().
3163              'page_arg'      => 'ipage',
3164          ),
3165          'has_members_invitations'
3166      );
3167  
3168      // Get the notifications.
3169      $query_loop = new BP_Members_Invitations_Template( $r );
3170  
3171      // Setup the global query loop.
3172      $bp->members->invitations->query_loop = $query_loop;
3173  
3174      /**
3175       * Filters whether or not the user has network invitations to display.
3176       *
3177       * @since 8.0.0
3178       *
3179       * @param bool                      $value      Whether or not there are network invitations to display.
3180       * @param BP_Notifications_Template $query_loop BP_Members_Invitations_Template object instance.
3181       * @param array                     $r          Array of arguments passed into the BP_Members_Invitations_Template class.
3182       */
3183      return apply_filters( 'bp_has_members_invitations', $query_loop->has_invitations(), $query_loop, $r );
3184  }
3185  
3186  /**
3187   * Get the network invitations returned by the template loop.
3188   *
3189   * @since 8.0.0
3190   *
3191   * @global BuddyPress $bp The one true BuddyPress instance.
3192   *
3193   * @return array List of network invitations.
3194   */
3195  function bp_the_members_invitations() {
3196      return buddypress()->members->invitations->query_loop->invitations();
3197  }
3198  
3199  /**
3200   * Get the current network invitation object in the loop.
3201   *
3202   * @since 8.0.0
3203   *
3204   * @global BuddyPress $bp The one true BuddyPress instance.
3205   *
3206   * @return object The current network invitation within the loop.
3207   */
3208  function bp_the_members_invitation() {
3209      return buddypress()->members->invitations->query_loop->the_invitation();
3210  }
3211  
3212  /**
3213   * Output the pagination count for the current network invitations loop.
3214   *
3215   * @since 8.0.0
3216   */
3217  function bp_members_invitations_pagination_count() {
3218      echo bp_get_members_invitations_pagination_count();
3219  }
3220      /**
3221       * Return the pagination count for the current network invitation loop.
3222       *
3223       * @since 8.0.0
3224       *
3225       * @global BuddyPress $bp The one true BuddyPress instance.
3226       *
3227       * @return string HTML for the pagination count.
3228       */
3229  	function bp_get_members_invitations_pagination_count() {
3230          $bp         = buddypress();
3231          $query_loop = $bp->members->invitations->query_loop;
3232          $start_num  = intval( ( $query_loop->pag_page - 1 ) * $query_loop->pag_num ) + 1;
3233          $from_num   = bp_core_number_format( $start_num );
3234          $to_num     = bp_core_number_format( ( $start_num + ( $query_loop->pag_num - 1 ) > $query_loop->total_invitation_count ) ? $query_loop->total_invitation_count : $start_num + ( $query_loop->pag_num - 1 ) );
3235          $total      = bp_core_number_format( $query_loop->total_invitation_count );
3236  
3237          if ( 1 == $query_loop->total_invitation_count ) {
3238              $pag = __( 'Viewing 1 invitation', 'buddypress' );
3239          } else {
3240              /* translators: 1: Invitations from number. 2: Invitations to number. 3: Total invitations. */
3241              $pag = sprintf( _nx( 'Viewing %1$s - %2$s of %3$s invitation', 'Viewing %1$s - %2$s of %3$s invitations', $query_loop->total_invitation_count, 'Community invites pagination', 'buddypress' ), $from_num, $to_num, $total );
3242          }
3243  
3244          /**
3245           * Filters the pagination count for the current network invitation loop.
3246           *
3247           * @since 8.0.0
3248           *
3249           * @param string $pag HTML for the pagination count.
3250           */
3251          return apply_filters( 'bp_get_members_invitations_pagination_count', $pag );
3252      }
3253  
3254  /**
3255   * Output the pagination links for the current network invitation loop.
3256   *
3257   * @since 8.0.0
3258   */
3259  function bp_members_invitations_pagination_links() {
3260      echo bp_get_members_invitations_pagination_links();
3261  }
3262      /**
3263       * Return the pagination links for the current network invitations loop.
3264       *
3265       * @since 8.0.0
3266       *
3267       * @global BuddyPress $bp The one true BuddyPress instance.
3268       *
3269       * @return string HTML for the pagination links.
3270       */
3271  	function bp_get_members_invitations_pagination_links() {
3272          $bp = buddypress();
3273  
3274          /**
3275           * Filters the pagination links for the current network invitations loop.
3276           *
3277           * @since 8.0.0
3278           *
3279           * @param string $pag_links HTML for the pagination links.
3280           */
3281          return apply_filters( 'bp_get_members_invitations_pagination_links', $bp->members->invitations->query_loop->pag_links );
3282      }
3283  
3284  /**
3285   * Output the requested property of the invitation currently being iterated on.
3286   *
3287   * @since 8.0.0
3288   *
3289   * @param string $property The name of the property to display.
3290   * @param string $context  The context of display.
3291   *                         Possible values are 'attribute' and 'html'.
3292   */
3293  function bp_the_members_invitation_property( $property = '', $context = 'html' ) {
3294      if ( ! $property ) {
3295          return;
3296      }
3297  
3298      /**
3299       * Use this filter to sanitize the output.
3300       *
3301       * @since 8.0.0
3302       *
3303       * @param int|string $value    The value for the requested property.
3304       * @param string     $property The name of the requested property.
3305       * @param string     $context  The context of display.
3306       */
3307      echo apply_filters( 'bp_the_members_invitation_property', bp_get_the_members_invitation_property( $property ), $property, $context );
3308  }
3309      /**
3310       * Return the value for a property of the network invitation currently being iterated on.
3311       *
3312       * @since 8.0.0
3313       *
3314       * @return int ID of the current network invitation.
3315       */
3316  	function bp_get_the_members_invitation_property( $property = 'id' ) {
3317  
3318          switch ( $property ) {
3319              case 'id':
3320              case 'user_id':
3321              case 'item_id':
3322              case 'secondary_item_id':
3323              case 'invite_sent':
3324              case 'accepted':
3325                  $value = 0;
3326                  break;
3327              case 'invitee_email':
3328              case 'type':
3329              case 'content':
3330              case 'date_modified':
3331                  $value = '';
3332                  break;
3333              default:
3334                  // A known property has not been specified.
3335                  $property = null;
3336                  $value = '';
3337                  break;
3338          }
3339  
3340          if ( isset( buddypress()->members->invitations->query_loop->invitation->{$property} ) ) {
3341              $value = buddypress()->members->invitations->query_loop->invitation->{$property};
3342          }
3343  
3344          /**
3345           * Filters the property of the network invitation currently being iterated on.
3346           *
3347           * @since 8.0.0
3348           *
3349           * @param int|string $value Property value of the network invitation being iterated on.
3350           */
3351          return apply_filters( 'bp_get_the_members_invitation_property_' . $property, $value );
3352      }
3353  
3354  /**
3355   * Output the action links for the current invitation.
3356   *
3357   * @since 8.0.0
3358   *
3359   * @param array|string $args Array of arguments.
3360   */
3361  function bp_the_members_invitation_action_links( $args = '' ) {
3362      echo bp_get_the_members_invitation_action_links( $args );
3363  }
3364      /**
3365       * Return the action links for the current invitation.
3366       *
3367       * @since 8.0.0
3368       *
3369       * @param array|string $args {
3370       *     @type string $before  HTML before the links.
3371       *     @type string $after   HTML after the links.
3372       *     @type string $sep     HTML between the links.
3373       *     @type array  $links   Array of links to implode by 'sep'.
3374       *     @type int    $user_id User ID to fetch action links for. Defaults to displayed user ID.
3375       * }
3376       * @return string HTML links for actions to take on single notifications.
3377       */
3378  	function bp_get_the_members_invitation_action_links( $args = '' ) {
3379          // Set default user ID to use.
3380          $inviter_id = isset( $args['inviter_id'] ) ? $args['inviter_id'] : bp_displayed_user_id();
3381  
3382          // Parse.
3383          $r = bp_parse_args(
3384              $args,
3385              array(
3386                  'before' => '',
3387                  'after'  => '',
3388                  'sep'    => ' | ',
3389                  'links'  => array(
3390                      bp_get_the_members_invitation_resend_link( $inviter_id ),
3391                      bp_get_the_members_invitation_delete_link( $inviter_id )
3392                  )
3393              )
3394          );
3395  
3396          // Build the links.
3397          $retval = $r['before'] . implode( $r['sep'], $r['links'] ) . $r['after'];
3398  
3399          /**
3400           * Filters the action links for the current invitation.
3401           *
3402           * @since 8.0.0
3403           *
3404           * @param string $retval HTML links for actions to take on single invitation.
3405           * @param array  $r      Array of parsed arguments.
3406           */
3407          return apply_filters( 'bp_get_the_members_invitation_action_links', $retval, $r );
3408      }
3409  
3410  /**
3411   * Output the resend link for the current invitation.
3412   *
3413   * @since 8.0.0
3414   *
3415   * @param int $user_id The user ID.
3416   */
3417  function bp_the_members_invitations_resend_link( $user_id = 0 ) {
3418      echo bp_get_the_members_invitation_delete_link( $user_id );
3419  }
3420      /**
3421       * Return the resend link for the current notification.
3422       *
3423       * @since 8.0.0
3424       *
3425       * @param int $user_id The user ID.
3426       * @return string
3427       */
3428  	function bp_get_the_members_invitation_resend_link( $user_id = 0 ) {
3429          // Set default user ID to use.
3430          $user_id = 0 === $user_id ? bp_displayed_user_id() : $user_id;
3431  
3432          // Don't allow resending of accepted invitations.
3433          if ( bp_get_the_members_invitation_property( 'accepted' ) ) {
3434              return;
3435          }
3436  
3437          $retval = sprintf( '<a href="%1$s" class="resend secondary confirm bp-tooltip">%2$s</a>', esc_url( bp_get_the_members_invitations_resend_url( $user_id ) ), __( 'Resend', 'buddypress' ) );
3438  
3439          /**
3440           * Filters the resend link for the current invitation.
3441           *
3442           * @since 8.0.0
3443           *
3444           * @param string $retval  HTML for the delete link for the current notification.
3445           * @param int    $user_id The user ID.
3446           */
3447          return apply_filters( 'bp_get_the_members_invitation_resend_link', $retval, $user_id );
3448      }
3449  
3450  /**
3451   * Output the URL used for resending a single invitation.
3452   *
3453   * Since this function directly outputs a URL, it is escaped.
3454   *
3455   * @since 8.0.0
3456   *
3457   * @param int $user_id The user ID.
3458   */
3459  function bp_the_members_invitations_resend_url( $user_id = 0 ) {
3460      echo esc_url( bp_get_the_members_invitations_resend_url( $user_id ) );
3461  }
3462      /**
3463       * Return the URL used for resending a single invitation.
3464       *
3465       * @since 8.0.0
3466       *
3467       * @param int $user_id The user ID.
3468       * @return string
3469       */
3470  	function bp_get_the_members_invitations_resend_url( $user_id = 0 ) {
3471          // Set default user ID to use.
3472          $user_id = 0 === $user_id ? bp_displayed_user_id() : $user_id;
3473          $link = bp_get_members_invitations_list_invites_permalink( $user_id );
3474  
3475          // Get the ID.
3476          $id = bp_get_the_members_invitation_property( 'id' );
3477  
3478          // Get the args to add to the URL.
3479          $args = array(
3480              'action'        => 'resend',
3481              'invitation_id' => $id
3482          );
3483  
3484          // Add the args.
3485          $url = add_query_arg( $args, $link );
3486  
3487          // Add the nonce.
3488          $url = wp_nonce_url( $url, 'bp_members_invitation_resend_' . $id );
3489  
3490          /**
3491           * Filters the URL used for resending a single invitation.
3492           *
3493           * @since 8.0.0
3494           *
3495           * @param string $url     URL used for deleting a single invitation.
3496           * @param int    $user_id The user ID.
3497           */
3498          return apply_filters( 'bp_get_the_members_invitations_resend_url', $url, $user_id );
3499      }
3500  
3501  /**
3502   * Output the delete link for the current invitation.
3503   *
3504   * @since 8.0.0
3505   *
3506   * @param int $user_id The user ID.
3507   */
3508  function bp_the_members_invitations_delete_link( $user_id = 0 ) {
3509      echo bp_get_the_members_invitation_delete_link( $user_id );
3510  }
3511      /**
3512       * Return the delete link for the current invitation.
3513       *
3514       * @since 8.0.0
3515       *
3516       * @param int $user_id The user ID.
3517       * @return string
3518       */
3519  	function bp_get_the_members_invitation_delete_link( $user_id = 0 ) {
3520          // Set default user ID to use.
3521          $user_id = 0 === $user_id ? bp_displayed_user_id() : $user_id;
3522  
3523          // Modify the message for accepted/not accepted invitatons.
3524          if ( bp_get_the_members_invitation_property( 'accepted' ) ) {
3525              $message = __( 'Delete', 'buddypress' );
3526          } else {
3527              $message = __( 'Cancel', 'buddypress' );
3528          }
3529  
3530          $retval = sprintf(
3531              '<a href="%1$s" class="delete secondary confirm bp-tooltip">%2$s</a>',
3532              esc_url( bp_get_the_members_invitations_delete_url( $user_id ) ),
3533              esc_html( $message )
3534          );
3535  
3536          /**
3537           * Filters the delete link for the current invitation.
3538           *
3539           * @since 8.0.0
3540           *
3541           * @param string $retval  HTML for the delete link for the current notification.
3542           * @param int    $user_id The user ID.
3543           */
3544          return apply_filters( 'bp_get_the_members_invitation_delete_link', $retval, $user_id );
3545      }
3546  
3547  /**
3548   * Output the URL used for deleting a single invitation.
3549   *
3550   * Since this function directly outputs a URL, it is escaped.
3551   *
3552   * @since 8.0.0
3553   *
3554   * @param int $user_id The user ID.
3555   */
3556  function bp_the_members_invitations_delete_url( $user_id = 0 ) {
3557      echo esc_url( bp_get_the_members_invitations_delete_url( $user_id ) );
3558  }
3559      /**
3560       * Return the URL used for deleting a single invitation.
3561       *
3562       * @since 8.0.0
3563       *
3564       * @param int $user_id The user ID.
3565       * @return string
3566       */
3567  	function bp_get_the_members_invitations_delete_url( $user_id = 0 ) {
3568          // Set default user ID to use.
3569          $user_id = 0 === $user_id ? bp_displayed_user_id() : $user_id;
3570          $link = bp_get_members_invitations_list_invites_permalink( $user_id );
3571  
3572          // Get the ID.
3573          $id = bp_get_the_members_invitation_property( 'id' );
3574  
3575          // Get the args to add to the URL.
3576          $args = array(
3577              'action'        => 'cancel',
3578              'invitation_id' => $id
3579          );
3580  
3581          // Add the args.
3582          $url = add_query_arg( $args, $link );
3583  
3584          // Add the nonce.
3585          $url = wp_nonce_url( $url, 'bp_members_invitations_cancel_' . $id );
3586  
3587          /**
3588           * Filters the URL used for deleting a single invitation.
3589           *
3590           * @since 8.0.0
3591           *
3592           * @param string $url     URL used for deleting a single invitation.
3593           * @param int    $user_id The user ID.
3594           */
3595          return apply_filters( 'bp_get_the_members_invitations_delete_url', $url, $user_id );
3596      }
3597  
3598  /**
3599   * Output the members invitations list permalink for a user.
3600   *
3601   * @since 8.0.0
3602   *
3603   * @param int $user_id The user ID.
3604   */
3605  function bp_members_invitations_list_invites_permalink( $user_id = 0 ) {
3606      echo bp_get_members_invitations_list_invites_permalink( $user_id );
3607  }
3608      /**
3609       * Return the members invitations list permalink for a user.
3610       *
3611       * @since 8.0.0
3612       *
3613       * @return string Members invitations list permalink for a user.
3614       */
3615      function bp_get_members_invitations_list_invites_permalink( $user_id = 0 ) {
3616          if ( 0 === $user_id ) {
3617              $user_id = bp_loggedin_user_id();
3618              $domain  = bp_loggedin_user_domain();
3619          } else {
3620              $domain = bp_core_get_user_domain( (int) $user_id );
3621          }
3622  
3623          $retval = trailingslashit( $domain . bp_get_members_invitations_slug() . '/list-invites' );
3624  
3625          /**
3626           * Filters the members invitations list permalink for a user.
3627           *
3628           * @since 8.0.0
3629           *
3630           * @param string $retval  Permalink for the sent invitation list screen.
3631           * @param int    $user_id The user ID.
3632           */
3633          return apply_filters( 'bp_get_members_invitations_list_invites_permalink', $retval, $user_id );
3634      }
3635  
3636  /**
3637   * Output the send invitation permalink for a user.
3638   *
3639   * @since 8.0.0
3640   *
3641   * @param int $user_id The user ID.
3642   */
3643  function bp_members_invitations_send_invites_permalink( $user_id = 0 ) {
3644      echo bp_get_members_invitations_send_invites_permalink( $user_id );
3645  }
3646      /**
3647       * Return the send invitations permalink.
3648       *
3649       * @since 8.0.0
3650       *
3651       * @param int $user_id The user ID.
3652       * @return string      The send invitations permalink.
3653       */
3654      function bp_get_members_invitations_send_invites_permalink( $user_id = 0 ) {
3655          if ( 0 === $user_id ) {
3656              $user_id = bp_loggedin_user_id();
3657              $domain  = bp_loggedin_user_domain();
3658          } else {
3659              $domain = bp_core_get_user_domain( (int) $user_id );
3660          }
3661  
3662          $retval = trailingslashit( $domain . bp_get_members_invitations_slug() . '/send-invites' );
3663  
3664          /**
3665           * Filters the send invitations permalink.
3666           *
3667           * @since 8.0.0
3668           *
3669           * @param string $retval  Permalink for the sent invitation list screen.
3670           * @param int    $user_id The user ID.
3671           */
3672          return apply_filters( 'bp_get_members_invitations_send_invites_permalink', $retval, $user_id );
3673      }
3674  
3675  /**
3676   * Output the dropdown for bulk management of invitations.
3677   *
3678   * @since 8.0.0
3679   */
3680  function bp_members_invitations_bulk_management_dropdown() {
3681      ?>
3682      <label class="bp-screen-reader-text" for="invitation-select">
3683          <?php
3684          esc_html_e( 'Select Bulk Action', 'buddypress' );
3685          ?>
3686      </label>
3687  
3688      <select name="invitation_bulk_action" id="invitation-select">
3689          <option value="" selected="selected"><?php esc_html_e( 'Bulk Actions', 'buddypress' ); ?></option>
3690          <option value="resend"><?php echo esc_html_x( 'Resend', 'button', 'buddypress' ); ?></option>
3691          <option value="cancel"><?php echo esc_html_x( 'Cancel', 'button', 'buddypress' ); ?></option>
3692      </select>
3693  
3694      <input type="submit" id="invitation-bulk-manage" class="button action" value="<?php echo esc_attr_x( 'Apply', 'button', 'buddypress' ); ?>">
3695      <?php
3696  }


Generated: Tue Mar 19 01:01:09 2024 Cross-referenced by PHPXref 0.7.1