[ Index ]

PHP Cross Reference of BBPress

title

Body

[close]

/src/includes/users/ -> template.php (source)

   1  <?php
   2  
   3  /**
   4   * bbPress User Template Tags
   5   *
   6   * @package bbPress
   7   * @subpackage TemplateTags
   8   */
   9  
  10  // Exit if accessed directly
  11  defined( 'ABSPATH' ) || exit;
  12  
  13  /** User Loop *****************************************************************/
  14  
  15  /**
  16   * Extension of WP_User_Query to allow easy looping
  17   *
  18   * @since 2.6.0 bbPress (r6330)
  19   */
  20  class BBP_User_Query extends WP_User_Query {
  21  
  22      /**
  23       * The amount of users for the current query.
  24       *
  25       * @since 2.6.0 bbPress (r6330)
  26       * @access public
  27       * @var int
  28       */
  29      public $user_count = 0;
  30  
  31      /**
  32       * Index of the current item in the loop.
  33       *
  34       * @since 2.6.0 bbPress (r6330)
  35       * @access public
  36       * @var int
  37       */
  38      public $current_user = -1;
  39  
  40      /**
  41       * Whether the loop has started and the caller is in the loop.
  42       *
  43       * @since 2.6.0 bbPress (r6330)
  44       * @access public
  45       * @var bool
  46       */
  47      public $in_the_loop = false;
  48  
  49      /**
  50       * The current user.
  51       *
  52       * @since 2.6.0 bbPress (r6330)
  53       * @access public
  54       * @var WP_User
  55       */
  56      public $user;
  57  
  58      /**
  59       * PHP5 constructor.
  60       *
  61       * @since 2.6.0 bbPress (r6330)
  62       * @access public
  63       *
  64       * @param null|string|array $query Optional. The query variables.
  65       */
  66  	public function __construct( $query = null ) {
  67          if ( ! empty( $query ) ) {
  68              parent::__construct( $query );
  69              $this->user_count = count( $this->results );
  70          }
  71      }
  72  
  73      /**
  74       * Set up the next user and iterate current user index.
  75       *
  76       * @since 2.6.0 bbPress (r6330)
  77       * @access public
  78       *
  79       * @return WP_User Next user.
  80       */
  81  	public function next_user() {
  82          $this->current_user++;
  83          $this->user = $this->results[ $this->current_user ];
  84  
  85          return $this->user;
  86      }
  87  
  88      /**
  89       * Sets up the current user.
  90       *
  91       * Retrieves the next user, sets up the user, sets the 'in the loop'
  92       * property to true.
  93       *
  94       * @since 2.6.0 bbPress (r6330)
  95       * @access public
  96       *
  97       * @global WP_User $user
  98       */
  99  	public function the_user() {
 100          $this->in_the_loop = true;
 101  
 102          // loop has just started
 103          if ( $this->current_user === -1 ) {
 104  
 105              /**
 106               * Fires once the loop is started.
 107               *
 108               * @since 2.6.0 bbPress (r6330)
 109               *
 110               * @param WP_Query &$this The WP_Query instance (passed by reference).
 111               */
 112              do_action_ref_array( 'loop_start', array( &$this ) );
 113          }
 114  
 115          $this->next_user();
 116      }
 117  
 118      /**
 119       * Determines whether there are more users available in the loop.
 120       *
 121       * Calls the {@see 'loop_end'} action when the loop is complete.
 122       *
 123       * @since 2.6.0 bbPress (r6330)
 124       * @access public
 125       *
 126       * @return bool True if users are available, false if end of loop.
 127       */
 128  	public function have_users() {
 129          if ( ( $this->current_user + 1 ) < $this->user_count ) {
 130              return true;
 131          } elseif ( ( ( $this->current_user + 1 ) === $this->user_count ) && ( $this->user_count > 0 ) ) {
 132  
 133              /**
 134               * Fires once the loop has ended.
 135               *
 136               * @since 2.6.0 bbPress (r6330)
 137               *
 138               * @param WP_Query &$this The WP_Query instance (passed by reference).
 139               */
 140              do_action_ref_array( 'loop_end', array( &$this ) );
 141  
 142              // Do some cleaning up after the loop
 143              $this->rewind_users();
 144          }
 145  
 146          $this->in_the_loop = false;
 147  
 148          return false;
 149      }
 150  
 151      /**
 152       * Rewind the users and reset user index.
 153       *
 154       * @since 2.6.0 bbPress (r6330)
 155       * @access public
 156       */
 157  	public function rewind_users() {
 158          $this->current_user = -1;
 159  
 160          if ( $this->user_count > 0 ) {
 161              $this->user = $this->results[ 0 ];
 162          }
 163      }
 164  }
 165  
 166  /**
 167   * The main user loop.
 168   *
 169   * @since 2.6.0 bbPress (r6330)
 170   *
 171   * @param array $args All the arguments supported by {@link WP_User_Query}
 172   * @return object Multidimensional array of user information
 173   */
 174  function bbp_has_users( $args = array() ) {
 175  
 176      // Parse arguments with default user query for most circumstances
 177      $r = bbp_parse_args( $args, array(
 178          'include'     => array(),
 179          'orderby'     => 'login',
 180          'order'       => 'ASC',
 181          'count_total' => false,
 182          'fields'      => 'all',
 183      ), 'has_users' );
 184  
 185      // Run the query
 186      $bbp             = bbpress();
 187      $bbp->user_query = new BBP_User_Query( $r );
 188  
 189      // Filter & return
 190      return apply_filters( 'bbp_has_users', $bbp->user_query->have_users(), $bbp->user_query );
 191  }
 192  
 193  /**
 194   * Whether there are more users available in the loop
 195   *
 196   * @since 2.6.0 bbPress (r2464)
 197   *
 198   * @return object User information
 199   */
 200  function bbp_users() {
 201      return bbpress()->user_query->have_users();
 202  }
 203  
 204  /**
 205   * Loads up the current user in the loop
 206   *
 207   * @since 2.6.0 bbPress (r2464)
 208   *
 209   * @return object User information
 210   */
 211  function bbp_the_user() {
 212      return bbpress()->user_query->the_user();
 213  }
 214  
 215  /** Users *********************************************************************/
 216  
 217  /**
 218   * Output a validated user id
 219   *
 220   * @since 2.0.0 bbPress (r2729)
 221   *
 222   * @param int $user_id Optional. User id
 223   * @param bool $displayed_user_fallback Fallback on displayed user?
 224   * @param bool $current_user_fallback Fallback on current user?
 225   */
 226  function bbp_user_id( $user_id = 0, $displayed_user_fallback = true, $current_user_fallback = false ) {
 227      echo bbp_get_user_id( $user_id, $displayed_user_fallback, $current_user_fallback );
 228  }
 229      /**
 230       * Return a validated user id
 231       *
 232       * @since 2.0.0 bbPress (r2729)
 233       *
 234       * @param int $user_id Optional. User id
 235       * @param bool $displayed_user_fallback Fallback on displayed user?
 236       * @param bool $current_user_fallback Fallback on current user?
 237       * @return int Validated user id
 238       */
 239  	function bbp_get_user_id( $user_id = 0, $displayed_user_fallback = true, $current_user_fallback = false ) {
 240          $bbp = bbpress();
 241  
 242          // Easy empty checking
 243          if ( ! empty( $user_id ) && is_numeric( $user_id ) ) {
 244              $bbp_user_id = $user_id;
 245  
 246          // Currently inside a user loop
 247          } elseif ( ! empty( $bbp->user_query->in_the_loop ) && isset( $bbp->user_query->user->ID ) ) {
 248              $bbp_user_id = $bbp->user_query->user->ID;
 249  
 250          // Currently viewing or editing a user
 251          } elseif ( ( true === $displayed_user_fallback ) && ! empty( $bbp->displayed_user->ID ) ) {
 252              $bbp_user_id = $bbp->displayed_user->ID;
 253  
 254          // Maybe fallback on the current_user ID
 255          } elseif ( ( true === $current_user_fallback ) && ! empty( $bbp->current_user->ID ) ) {
 256              $bbp_user_id = $bbp->current_user->ID;
 257  
 258          // Failsafe
 259          } else {
 260              $bbp_user_id = 0;
 261          }
 262  
 263          // Filter & return
 264          return (int) apply_filters( 'bbp_get_user_id', (int) $bbp_user_id, $displayed_user_fallback, $current_user_fallback );
 265      }
 266  
 267  /**
 268   * Output ID of current user
 269   *
 270   * @since 2.0.0 bbPress (r2574)
 271   */
 272  function bbp_current_user_id() {
 273      echo bbp_get_current_user_id();
 274  }
 275      /**
 276       * Return ID of current user
 277       *
 278       * @since 2.0.0 bbPress (r2574)
 279       *
 280       * @return int Current user id
 281       */
 282  	function bbp_get_current_user_id() {
 283  
 284          // Filter & return
 285          return (int) apply_filters( 'bbp_get_current_user_id', bbp_get_user_id( 0, false, true ) );
 286      }
 287  
 288  /**
 289   * Output ID of displayed user
 290   *
 291   * @since 2.0.0 bbPress (r2688)
 292   */
 293  function bbp_displayed_user_id() {
 294      echo bbp_get_displayed_user_id();
 295  }
 296      /**
 297       * Return ID of displayed user
 298       *
 299       * @since 2.0.0 bbPress (r2688)
 300       *
 301       * @return int Displayed user id
 302       */
 303  	function bbp_get_displayed_user_id() {
 304  
 305          // Filter & return
 306          return apply_filters( 'bbp_get_displayed_user_id', bbp_get_user_id( 0, true, false ) );
 307      }
 308  
 309  /**
 310   * Output a sanitized user field value
 311   *
 312   * This function relies on the $filter parameter to decide how to sanitize
 313   * the field value that it finds. Since it uses the WP_User object's magic
 314   * __get() method, it can also be used to get user_meta values.
 315   *
 316   * @since 2.0.0 bbPress (r2688)
 317   *
 318   * @param string $field Field to get
 319   * @param string $filter How to filter the field value (null|raw|db|display|edit)
 320   */
 321  function bbp_displayed_user_field( $field = '', $filter = 'display' ) {
 322      echo bbp_get_displayed_user_field( $field, $filter );
 323  }
 324      /**
 325       * Return a sanitized user field value
 326       *
 327       * This function relies on the $filter parameter to decide how to sanitize
 328       * the field value that it finds. Since it uses the WP_User object's magic
 329       * __get() method, it can also be used to get user_meta values.
 330       *
 331       * @since 2.0.0 bbPress (r2688)
 332       *
 333       * @param string $field Field to get
 334       * @param string $filter How to filter the field value (null|raw|db|display|edit)
 335       * @see WP_User::__get() for more on how the value is retrieved
 336       * @see sanitize_user_field() for more on how the value is sanitized
 337       * @return string|bool Value of the field if it exists, else false
 338       */
 339  	function bbp_get_displayed_user_field( $field = '', $filter = 'display' ) {
 340  
 341          // Get the displayed user
 342          $user         = bbpress()->displayed_user;
 343  
 344          // Juggle the user filter property because we don't want to muck up how
 345          // other code might interact with this object.
 346          $old_filter   = $user->filter;
 347          $user->filter = $filter;
 348  
 349          // Get the field value from the WP_User object. We don't need to perform
 350          // an isset() because the WP_User::__get() does it for us.
 351          $value        = $user->$field;
 352  
 353          // Put back the user filter property that was previously juggled above.
 354          $user->filter = $old_filter;
 355  
 356          // Filter & return
 357          return apply_filters( 'bbp_get_displayed_user_field', $value, $field, $filter );
 358      }
 359  
 360  /**
 361   * Output name of current user
 362   *
 363   * @since 2.0.0 bbPress (r2574)
 364   */
 365  function bbp_current_user_name() {
 366      echo esc_attr( bbp_get_current_user_name() );
 367  }
 368      /**
 369       * Return name of current user
 370       *
 371       * @since 2.0.0 bbPress (r2574)
 372       *
 373       * @return string
 374       */
 375  	function bbp_get_current_user_name() {
 376  
 377          // Default current user name
 378          $default = bbp_get_fallback_display_name();
 379  
 380          // Check the $user_identity global
 381          $current_user_name = is_user_logged_in()
 382              ? bbp_get_global_object( 'user_identity', false, $default )
 383              : $default;
 384  
 385          // Filter & return
 386          return apply_filters( 'bbp_get_current_user_name', $current_user_name );
 387      }
 388  
 389  /**
 390   * Output avatar of current user
 391   *
 392   * @since 2.0.0 bbPress (r2574)
 393   *
 394   * @param int $size Size of the avatar. Defaults to 40
 395   */
 396  function bbp_current_user_avatar( $size = 40 ) {
 397      echo bbp_get_current_user_avatar( $size );
 398  }
 399  
 400      /**
 401       * Return avatar of current user
 402       *
 403       * @since 2.0.0 bbPress (r2574)
 404       *
 405       * @param int $size Size of the avatar. Defaults to 40
 406       * @return string Current user avatar
 407       */
 408  	function bbp_get_current_user_avatar( $size = 40 ) {
 409  
 410          $user = bbp_get_current_user_id();
 411          if ( empty( $user ) ) {
 412              $user = bbp_get_current_anonymous_user_data( 'email' );
 413          }
 414  
 415          $avatar = get_avatar( $user, $size );
 416  
 417          // Filter & return
 418          return apply_filters( 'bbp_get_current_user_avatar', $avatar, $size );
 419      }
 420  
 421  /**
 422   * Output link to the profile page of a user
 423   *
 424   * @since 2.0.0 bbPress (r2688)
 425   *
 426   * @param int $user_id Optional. User id
 427   */
 428  function bbp_user_profile_link( $user_id = 0 ) {
 429      echo bbp_get_user_profile_link( $user_id );
 430  }
 431      /**
 432       * Return link to the profile page of a user
 433       *
 434       * @since 2.0.0 bbPress (r2688)
 435       *
 436       * @param int $user_id Optional. User id
 437       * @return string User profile link
 438       */
 439  	function bbp_get_user_profile_link( $user_id = 0 ) {
 440  
 441          // Validate user id
 442          $user_id = bbp_get_user_id( $user_id );
 443          if ( empty( $user_id ) ) {
 444              return false;
 445          }
 446  
 447          // Get the user
 448          $user = get_userdata( $user_id );
 449          if ( empty( $user ) ) {
 450              return false;
 451          }
 452  
 453          // Display Name
 454          $name = ! empty( $user->display_name )
 455              ? $user->display_name
 456              : bbp_get_fallback_display_name();
 457  
 458          // URL
 459          $url = bbp_get_user_profile_url( $user_id );
 460  
 461          // Link
 462          $link = ! empty( $url )
 463              ? '<a href="' . esc_url( $url ) . '">' . esc_html( $name ) . '</a>'
 464              : esc_html( $name );
 465  
 466          // Filter & return
 467          return (string) apply_filters( 'bbp_get_user_profile_link', $link, $user_id );
 468      }
 469  
 470  /**
 471   * Output a users nicename to the screen
 472   *
 473   * @since 2.3.0 bbPress (r4671)
 474   *
 475   * @param int $user_id User ID whose nicename to get
 476   * @param array $args before|after|user_id|force
 477   */
 478  function bbp_user_nicename( $user_id = 0, $args = array() ) {
 479      echo bbp_get_user_nicename( $user_id, $args );
 480  }
 481      /**
 482       * Return a users nicename to the screen
 483       *
 484       * @since 2.3.0 bbPress (r4671)
 485       *
 486       * @param int $user_id User ID whose nicename to get
 487       * @param array $args before|after|user_id|force
 488       * @return string User nicename, maybe wrapped in before/after strings
 489       */
 490  	function bbp_get_user_nicename( $user_id = 0, $args = array() ) {
 491  
 492          // Bail if no user ID passed
 493          $user_id = bbp_get_user_id( $user_id );
 494          if ( empty( $user_id ) ) {
 495              return false;
 496          }
 497  
 498          // Parse default arguments
 499          $r = bbp_parse_args( $args, array(
 500              'user_id' => $user_id,
 501              'before'  => '',
 502              'after'   => '',
 503              'force'   => ''
 504          ), 'get_user_nicename' );
 505  
 506          // Force the nicename (likely from a previous user query)
 507          if ( ! empty( $r['force'] ) ) {
 508              $nicename = (string) $r['force'];
 509  
 510          // Maybe fallback to getting the nicename from user data
 511          } elseif ( ! empty( $r['user_id'] ) ) {
 512              $user     = get_userdata( $r['user_id'] );
 513              $nicename = ! empty( $user )
 514                  ? $user->user_nicename
 515                  : '';
 516  
 517          // Maybe fallback to empty string so filter still applies
 518          } else {
 519              $nicename = '';
 520          }
 521  
 522          // Maybe wrap the nicename
 523          $retval = ! empty( $nicename )
 524              ? $r['before'] . esc_html( $nicename ) . $r['after']
 525              : '';
 526  
 527          // Filter & return
 528          return (string) apply_filters( 'bbp_get_user_nicename', $retval, $user_id, $r, $args );
 529      }
 530  
 531  /**
 532   * Output URL to the profile page of a user
 533   *
 534   * @since 2.0.0 bbPress (r2688)
 535   *
 536   * @param int $user_id Optional. User id
 537   * @param string $user_nicename Optional. User nicename
 538   */
 539  function bbp_user_profile_url( $user_id = 0, $user_nicename = '' ) {
 540      echo esc_url( bbp_get_user_profile_url( $user_id, $user_nicename ) );
 541  }
 542      /**
 543       * Return URL to the profile page of a user
 544       *
 545       * @since 2.0.0 bbPress (r2688)
 546       *
 547       * @param int $user_id Optional. User id
 548       * @param string $user_nicename Optional. User nicename
 549       * @return string User profile url
 550       */
 551  	function bbp_get_user_profile_url( $user_id = 0, $user_nicename = '' ) {
 552  
 553          // Use displayed user ID if there is one, and one isn't requested
 554          $user_id = bbp_get_user_id( $user_id );
 555          if ( empty( $user_id ) ) {
 556              return false;
 557          }
 558  
 559          // Bail if intercepted
 560          $intercept = bbp_maybe_intercept( 'bbp_pre_get_user_profile_url', func_get_args() );
 561          if ( bbp_is_intercepted( $intercept ) ) {
 562              return $intercept;
 563          }
 564  
 565          // Pretty permalinks
 566          if ( bbp_use_pretty_urls() ) {
 567  
 568              // Get username if not passed
 569              if ( empty( $user_nicename ) ) {
 570                  $user_nicename = bbp_get_user_nicename( $user_id );
 571              }
 572  
 573              // Run through home_url()
 574              $url = trailingslashit( bbp_get_root_url() . bbp_get_user_slug() ) . $user_nicename;
 575              $url = user_trailingslashit( $url );
 576              $url = home_url( $url );
 577  
 578          // Unpretty permalinks
 579          } else {
 580              $url = add_query_arg( array(
 581                  bbp_get_user_rewrite_id() => $user_id
 582              ), home_url( '/' ) );
 583          }
 584  
 585          // Filter & return
 586          return apply_filters( 'bbp_get_user_profile_url', $url, $user_id, $user_nicename );
 587      }
 588  
 589  /**
 590   * Output link to the profile edit page of a user
 591   *
 592   * @since 2.0.0 bbPress (r2688)
 593   *
 594   * @param int $user_id Optional. User id
 595   */
 596  function bbp_user_profile_edit_link( $user_id = 0 ) {
 597      echo bbp_get_user_profile_edit_link( $user_id );
 598  }
 599      /**
 600       * Return link to the profile edit page of a user
 601       *
 602       * @since 2.0.0 bbPress (r2688)
 603       *
 604       * @param int $user_id Optional. User id
 605       * @return string User profile edit link
 606       */
 607  	function bbp_get_user_profile_edit_link( $user_id = 0 ) {
 608  
 609          // Validate user id
 610          $user_id = bbp_get_user_id( $user_id );
 611          if ( empty( $user_id ) ) {
 612              return false;
 613          }
 614  
 615          // Get the user
 616          $user = get_userdata( $user_id );
 617          if ( empty( $user ) ) {
 618              return false;
 619          }
 620  
 621          // Display Name
 622          $name = ! empty( $user->display_name )
 623              ? $user->display_name
 624              : bbp_get_fallback_display_name();
 625  
 626          // URL
 627          $url = bbp_get_user_profile_edit_url( $user_id );
 628  
 629          // Link
 630          $link = ! empty( $url )
 631              ? '<a href="' . esc_url( $url ) . '">' . esc_html( $name ) . '</a>'
 632              : esc_html( $name );
 633  
 634          // Filter & return
 635          return (string) apply_filters( 'bbp_get_user_profile_edit_link', $link, $user_id );
 636      }
 637  
 638  /**
 639   * Output URL to the profile edit page of a user
 640   *
 641   * @since 2.0.0 bbPress (r2688)
 642   *
 643   * @param int $user_id Optional. User id
 644   * @param string $user_nicename Optional. User nicename
 645   */
 646  function bbp_user_profile_edit_url( $user_id = 0, $user_nicename = '' ) {
 647      echo esc_url( bbp_get_user_profile_edit_url( $user_id, $user_nicename ) );
 648  }
 649      /**
 650       * Return URL to the profile edit page of a user
 651       *
 652       * @since 2.0.0 bbPress (r2688)
 653       *
 654       * @param int $user_id Optional. User id
 655       * @param string $user_nicename Optional. User nicename
 656       * @return string
 657       */
 658  	function bbp_get_user_profile_edit_url( $user_id = 0, $user_nicename = '' ) {
 659  
 660          $user_id = bbp_get_user_id( $user_id );
 661          if ( empty( $user_id ) ) {
 662              return false;
 663          }
 664  
 665          // Bail if intercepted
 666          $intercept = bbp_maybe_intercept( 'bbp_pre_get_user_profile_edit_url', func_get_args() );
 667          if ( bbp_is_intercepted( $intercept ) ) {
 668              return $intercept;
 669          }
 670  
 671          // Get user profile URL
 672          $profile_url = bbp_get_user_profile_url( $user_id, $user_nicename );
 673  
 674          // Pretty permalinks
 675          if ( bbp_use_pretty_urls() ) {
 676              $url = trailingslashit( $profile_url ) . bbp_get_edit_slug();
 677              $url = user_trailingslashit( $url );
 678  
 679          // Unpretty permalinks
 680          } else {
 681              $url = add_query_arg( array(
 682                  bbp_get_edit_rewrite_id() => '1'
 683              ), $profile_url );
 684          }
 685  
 686          // Filter & return
 687          return apply_filters( 'bbp_get_user_edit_profile_url', $url, $user_id, $user_nicename );
 688      }
 689  
 690  /**
 691   * Output a user's main role for display
 692   *
 693   * @since 2.1.0 bbPress (r3860)
 694   *
 695   * @param int $user_id
 696   */
 697  function bbp_user_display_role( $user_id = 0 ) {
 698      echo esc_attr( bbp_get_user_display_role( $user_id ) );
 699  }
 700      /**
 701       * Return a user's main role for display
 702       *
 703       * @since 2.1.0 bbPress (r3860)
 704       *
 705       * @param int $user_id
 706       * @return string
 707       */
 708  	function bbp_get_user_display_role( $user_id = 0 ) {
 709  
 710          // Validate user id
 711          $user_id = bbp_get_user_id( $user_id );
 712  
 713          // User is not registered
 714          if ( empty( $user_id ) ) {
 715              $role = esc_html__( 'Guest', 'bbpress' );
 716  
 717          // User is not active
 718          } elseif ( bbp_is_user_inactive( $user_id ) ) {
 719              $role = esc_html__( 'Inactive', 'bbpress' );
 720  
 721          // User have a role
 722          } else {
 723              $role_id = bbp_get_user_role( $user_id );
 724              $role    = bbp_get_dynamic_role_name( $role_id );
 725          }
 726  
 727          // No role found so default to generic "Member"
 728          if ( empty( $role ) ) {
 729              $role = esc_html__( 'Member', 'bbpress' );
 730          }
 731  
 732          // Filter & return
 733          return apply_filters( 'bbp_get_user_display_role', $role, $user_id );
 734      }
 735  
 736  /**
 737   * Output the link to the admin section
 738   *
 739   * @since 2.0.0 bbPress (r2827)
 740   *
 741   * @param array $args Optional. See {@link bbp_get_admin_link()}
 742   */
 743  function bbp_admin_link( $args = array() ) {
 744      echo bbp_get_admin_link( $args );
 745  }
 746      /**
 747       * Return the link to the admin section
 748       *
 749       * @since 2.0.0 bbPress (r2827)
 750       *
 751       * @param array $args Optional. This function supports these arguments:
 752       *  - text: The text
 753       *  - before: Before the lnk
 754       *  - after: After the link
 755       * @return The link
 756       */
 757  	function bbp_get_admin_link( $args = array() ) {
 758  
 759          // Bail if user cannot globally moderate
 760          if ( ! current_user_can( 'moderate' ) ) {
 761              return;
 762          }
 763  
 764          if ( ! empty( $args ) && is_string( $args ) && ( false === strpos( $args, '=' ) ) ) {
 765              $args = array( 'text' => $args );
 766          }
 767  
 768          // Parse arguments against default values
 769          $r = bbp_parse_args( $args, array(
 770              'text'   => esc_html__( 'Admin', 'bbpress' ),
 771              'before' => '',
 772              'after'  => ''
 773          ), 'get_admin_link' );
 774  
 775          $retval = $r['before'] . '<a href="' . esc_url( admin_url() ) . '">' . $r['text'] . '</a>' . $r['after'];
 776  
 777          // Filter & return
 778          return apply_filters( 'bbp_get_admin_link', $retval, $r, $args );
 779      }
 780  
 781  /** User IP *******************************************************************/
 782  
 783  /**
 784   * Output the author IP address of a post
 785   *
 786   * @since 2.0.0 bbPress (r3120)
 787   *
 788   * @param array $args Optional. If it is an integer, it is used as post id.
 789   */
 790  function bbp_author_ip( $args = array() ) {
 791      echo bbp_get_author_ip( $args );
 792  }
 793      /**
 794       * Return the author IP address of a post
 795       *
 796       * @since 2.0.0 bbPress (r3120)
 797       *
 798       * @param array $args Optional. If an integer, it is used as reply id.
 799       * @return string Author link of reply
 800       */
 801  	function bbp_get_author_ip( $args = array() ) {
 802  
 803          // Used as post id
 804          $post_id = is_numeric( $args ) ? (int) $args : 0;
 805  
 806          // Parse arguments against default values
 807          $r = bbp_parse_args( $args, array(
 808              'post_id' => $post_id,
 809              'before'  => '<span class="bbp-author-ip">(',
 810              'after'   => ')</span>'
 811          ), 'get_author_ip' );
 812  
 813          // Get the author IP meta value
 814          $author_ip = get_post_meta( $r['post_id'], '_bbp_author_ip', true );
 815          $author_ip = ! empty( $author_ip )
 816              ? $r['before'] . esc_html( $author_ip ) . $r['after']
 817              : '';
 818  
 819          // Filter & return
 820          return apply_filters( 'bbp_get_author_ip', $author_ip, $r, $args );
 821      }
 822  
 823  /** Anonymous Fields **********************************************************/
 824  
 825  /**
 826   * Get the default name that's displayed when a user cannot be identified.
 827   *
 828   * This might happen if a user was deleted but their content was retained, or
 829   * if something went wrong during saving anonymous user data to the database.
 830   *
 831   * @since 2.6.0 bbPress (r6561)
 832   *
 833   * @param int $object_id For additional context only, usually a post ID
 834   *
 835   * @return string
 836   */
 837  function bbp_get_fallback_display_name( $object_id = 0 ) {
 838      $name = esc_html__( 'Anonymous', 'bbpress' );
 839  
 840      // Filter & return
 841      return apply_filters( 'bbp_get_anonymous_name', $name, $object_id );
 842  }
 843  
 844  /**
 845   * Output the author display-name of a topic or reply.
 846   *
 847   * Convenience function to ensure proper template functions are called
 848   * and correct filters are executed. Used primarily to display topic
 849   * and reply author information in the anonymous form template-part.
 850   *
 851   * @since 2.5.0 bbPress (r5119)
 852   *
 853   * @param int $post_id
 854   */
 855  function bbp_author_display_name( $post_id = 0 ) {
 856      echo esc_attr( bbp_get_author_display_name( $post_id ) );
 857  }
 858  
 859      /**
 860       * Return the author display-name of a topic or reply.
 861       *
 862       * Convenience function to ensure proper template functions are called
 863       * and correct filters are executed. Used primarily to display topic
 864       * and reply author information in the anonymous form template-part.
 865       *
 866       * @since 2.5.0 bbPress (r5119)
 867       *
 868       * @param int $post_id
 869       *
 870       * @return string The name of the author
 871       */
 872  	function bbp_get_author_display_name( $post_id = 0 ) {
 873  
 874          // Define local variable(s)
 875          $retval = '';
 876  
 877          // Topic edit
 878          if ( bbp_is_topic_edit() ) {
 879              $retval = bbp_get_topic_author_display_name( $post_id );
 880  
 881          // Reply edit
 882          } elseif ( bbp_is_reply_edit() ) {
 883              $retval = bbp_get_reply_author_display_name( $post_id );
 884  
 885          // Not an edit, so rely on current user cookie data
 886          } else {
 887              $retval = bbp_get_current_anonymous_user_data( 'name' );
 888          }
 889  
 890          // Filter & return
 891          return apply_filters( 'bbp_get_author_display_name', $retval, $post_id );
 892      }
 893  
 894  /**
 895   * Output the author email of a topic or reply.
 896   *
 897   * Convenience function to ensure proper template functions are called
 898   * and correct filters are executed. Used primarily to display topic
 899   * and reply author information in the anonymous user form template-part.
 900   *
 901   * @since 2.5.0 bbPress (r5119)
 902   *
 903   * @param int $post_id
 904   */
 905  function bbp_author_email( $post_id = 0 ) {
 906      echo esc_attr( bbp_get_author_email( $post_id ) );
 907  }
 908  
 909      /**
 910       * Return the author email of a topic or reply.
 911       *
 912       * Convenience function to ensure proper template functions are called
 913       * and correct filters are executed. Used primarily to display topic
 914       * and reply author information in the anonymous user form template-part.
 915       *
 916       * @since 2.5.0 bbPress (r5119)
 917       *
 918       * @param int $post_id
 919       *
 920       * @return string The email of the author
 921       */
 922  	function bbp_get_author_email( $post_id = 0 ) {
 923  
 924          // Define local variable(s)
 925          $retval = '';
 926  
 927          // Topic edit
 928          if ( bbp_is_topic_edit() ) {
 929              $retval = bbp_get_topic_author_email( $post_id );
 930  
 931          // Reply edit
 932          } elseif ( bbp_is_reply_edit() ) {
 933              $retval = bbp_get_reply_author_email( $post_id );
 934  
 935          // Not an edit, so rely on current user cookie data
 936          } else {
 937              $retval = bbp_get_current_anonymous_user_data( 'email' );
 938          }
 939  
 940          // Filter & return
 941          return apply_filters( 'bbp_get_author_email', $retval, $post_id );
 942      }
 943  
 944  /**
 945   * Output the author url of a topic or reply.
 946   *
 947   * Convenience function to ensure proper template functions are called
 948   * and correct filters are executed. Used primarily to display topic
 949   * and reply author information in the anonymous user form template-part.
 950   *
 951   * @since 2.5.0 bbPress (r5119)
 952   *
 953   * @param int $post_id
 954   */
 955  function bbp_author_url( $post_id = 0 ) {
 956      echo esc_attr( bbp_get_author_url( $post_id ) );
 957  }
 958  
 959      /**
 960       * Return the author url of a topic or reply.
 961       *
 962       * Convenience function to ensure proper template functions are called
 963       * and correct filters are executed. Used primarily to display topic
 964       * and reply author information in the anonymous user form template-part.
 965       *
 966       * @since 2.5.0 bbPress (r5119)
 967       *
 968       * @param int $post_id
 969       *
 970       * @return string The url of the author
 971       */
 972  	function bbp_get_author_url( $post_id = 0 ) {
 973  
 974          // Define local variable(s)
 975          $retval = '';
 976  
 977          // Topic edit
 978          if ( bbp_is_topic_edit() ) {
 979              $retval = bbp_get_topic_author_url( $post_id );
 980  
 981          // Reply edit
 982          } elseif ( bbp_is_reply_edit() ) {
 983              $retval = bbp_get_reply_author_url( $post_id );
 984  
 985          // Not an edit, so rely on current user cookie data
 986          } else {
 987              $retval = bbp_get_current_anonymous_user_data( 'url' );
 988          }
 989  
 990          // Filter & return
 991          return apply_filters( 'bbp_get_author_url', $retval, $post_id );
 992      }
 993  
 994  /** Favorites *****************************************************************/
 995  
 996  /**
 997   * Output the link to the user's favorites page (profile page)
 998   *
 999   * @since 2.0.0 bbPress (r2652)
1000   * @since 2.6.0 bbPress (r6308) Add pagination if in the loop
1001   *
1002   * @param int $user_id Optional. User id
1003   */
1004  function bbp_favorites_permalink( $user_id = 0 ) {
1005      echo esc_url( bbp_get_favorites_permalink( $user_id ) );
1006  }
1007      /**
1008       * Return the link to the user's favorites page (profile page)
1009       *
1010       * @since 2.0.0 bbPress (r2652)
1011       * @since 2.6.0 bbPress (r6308) Add pagination if in the loop
1012       *
1013       * @param int $user_id Optional. User id
1014       * @return string Permanent link to user profile page
1015       */
1016  	function bbp_get_favorites_permalink( $user_id = 0 ) {
1017  
1018          // Use displayed user ID if there is one, and one isn't requested
1019          $user_id = bbp_get_user_id( $user_id );
1020          if ( empty( $user_id ) ) {
1021              return false;
1022          }
1023  
1024          // Bail if intercepted
1025          $intercept = bbp_maybe_intercept( 'bbp_pre_get_favorites_permalink', func_get_args() );
1026          if ( bbp_is_intercepted( $intercept ) ) {
1027              return $intercept;
1028          }
1029  
1030          // Get user profile URL & page
1031          $profile_url = bbp_get_user_profile_url( $user_id );
1032          $page        = (int)  bbpress()->topic_query->paged;
1033          $paged       = (bool) bbpress()->topic_query->in_the_loop;
1034  
1035          // Pretty permalinks
1036          if ( bbp_use_pretty_urls() ) {
1037  
1038              // Base URL
1039              $url = trailingslashit( $profile_url ) . bbp_get_user_favorites_slug();
1040  
1041              // Add page
1042              if ( ( true === $paged ) && ( $page > 1 ) ) {
1043                  $url = trailingslashit( $url ) . bbp_get_paged_slug() . '/' . $page;
1044              }
1045  
1046              // Ensure correct trailing slash
1047              $url = user_trailingslashit( $url );
1048  
1049          // Unpretty permalinks
1050          } else {
1051  
1052              // Base arguments
1053              $args = array(
1054                  bbp_get_user_favorites_rewrite_id() => bbp_get_user_favorites_slug(),
1055              );
1056  
1057              // Add page
1058              if ( ( true === $paged ) && ( $page > 1 ) ) {
1059                  $args['page'] = $page;
1060              }
1061  
1062              // Add arguments
1063              $url = add_query_arg( $args, $profile_url );
1064          }
1065  
1066          // Filter & return
1067          return apply_filters( 'bbp_get_favorites_permalink', $url, $user_id );
1068      }
1069  
1070  /**
1071   * Output the link to make a topic favorite/remove a topic from favorites
1072   *
1073   * @since 2.0.0 bbPress (r2652)
1074   * @since 2.6.0 bbPress (r6308) Add 'redirect_to' support
1075   *
1076   * @param array $args See {@link bbp_get_user_favorites_link()}
1077   * @param int $user_id Optional. User id
1078   * @param bool $wrap Optional. If you want to wrap the link in <span id="favorite-toggle">.
1079   */
1080  function bbp_user_favorites_link( $args = array(), $user_id = 0, $wrap = true ) {
1081      echo bbp_get_user_favorites_link( $args, $user_id, $wrap );
1082  }
1083      /**
1084       * User favorites link
1085       *
1086       * Return the link to make a topic favorite/remove a topic from
1087       * favorites
1088       *
1089       * @since 2.0.0 bbPress (r2652)
1090       * @since 2.6.0 bbPress (r6308) Add 'redirect_to' support
1091       *
1092       * @param array $args This function supports these arguments:
1093       *  - subscribe: Favorite text
1094       *  - unsubscribe: Unfavorite text
1095       *  - user_id: User id
1096       *  - topic_id: Topic id
1097       *  - before: Before the link
1098       *  - after: After the link
1099       * @param int $user_id Optional. User id
1100       * @param int $topic_id Optional. Topic id
1101       * @param bool $wrap Optional. If you want to wrap the link in <span id="favorite-toggle">. See ajax_favorite()
1102       * @return string User favorites link
1103       */
1104  	function bbp_get_user_favorites_link( $args = array(), $user_id = 0, $wrap = true ) {
1105  
1106          // Bail if favorites are inactive
1107          if ( ! bbp_is_favorites_active() ) {
1108              return false;
1109          }
1110  
1111          // Parse arguments against default values
1112          $r = bbp_parse_args( $args, array(
1113              'favorite'    => esc_html__( 'Favorite',   'bbpress' ),
1114              'favorited'   => esc_html__( 'Unfavorite', 'bbpress' ),
1115              'user_id'     => 0,
1116              'object_id'   => 0,
1117              'object_type' => 'post',
1118              'before'      => '',
1119              'after'       => '',
1120              'redirect_to' => '',
1121  
1122              // Deprecated. Use object_id.
1123              'forum_id'    => 0,
1124              'topic_id'    => 0
1125          ), 'get_user_favorites_link' );
1126  
1127          // Validate user and object ID's
1128          $user_id     = bbp_get_user_id( $r['user_id'], true, true );
1129          $object_type = sanitize_key( $r['object_type'] );
1130  
1131          // Back-compat for deprecated arguments
1132          if ( ! empty( $r['topic_id'] ) ) {
1133              $object_id = absint( $r['topic_id'] );
1134          } elseif ( ! empty( $r['forum_id'] ) ) {
1135              $object_id = absint( $r['forum_id'] );
1136          } else {
1137              $object_id = absint( $r['object_id'] );
1138          }
1139  
1140          // Bail if empty
1141          if ( empty( $user_id ) || empty( $object_id ) || empty( $object_type ) ) {
1142              return false;
1143          }
1144  
1145          // No link if you can't edit yourself
1146          if ( ! current_user_can( 'edit_user', $user_id ) ) {
1147              return false;
1148          }
1149  
1150          // Decide which link to show
1151          $is_fav = bbp_is_user_favorite( $user_id, $object_id );
1152          if ( ! empty( $is_fav ) ) {
1153              $text   = $r['favorited'];
1154              $q_args = array(
1155                  'action'    => 'bbp_favorite_remove',
1156                  'object_id' => $object_id
1157              );
1158          } else {
1159              $text   = $r['favorite'];
1160              $q_args = array(
1161                  'action'    => 'bbp_favorite_add',
1162                  'object_id' => $object_id
1163              );
1164          }
1165  
1166          // Custom redirect
1167          if ( ! empty( $r['redirect_to'] ) ) {
1168              $q_args['redirect_to'] = urlencode( $r['redirect_to'] );
1169          }
1170  
1171          // URL
1172          $url  = esc_url( wp_nonce_url( add_query_arg( $q_args ), 'toggle-favorite_' . $object_id ) );
1173          $sub  = $is_fav ? ' class="is-favorite"' : '';
1174          $html = sprintf( '%s<span id="favorite-%d"  %s><a href="%s" class="favorite-toggle" data-bbp-object-id="%d" data-bbp-object-type="%s" data-bbp-nonce="%s">%s</a></span>%s', $r['before'], $object_id, $sub, $url, $object_id, $object_type, wp_create_nonce( 'toggle-favorite_' . $object_id ), $text, $r['after'] );
1175  
1176          // Initial output is wrapped in a span, ajax output is hooked to this
1177          if ( ! empty( $wrap ) ) {
1178              $html = '<span id="favorite-toggle">' . $html . '</span>';
1179          }
1180  
1181          // Filter & return
1182          return apply_filters( 'bbp_get_user_favorites_link', $html, $r, $user_id, $object_id );
1183      }
1184  
1185  /** Subscriptions *************************************************************/
1186  
1187  /**
1188   * Output the link to the user's subscriptions page (profile page)
1189   *
1190   * @since 2.0.0 bbPress (r2688)
1191   * @since 2.6.0 bbPress (r6308) Add pagination if in the loop
1192   *
1193   * @param int $user_id Optional. User id
1194   */
1195  function bbp_subscriptions_permalink( $user_id = 0 ) {
1196      echo esc_url( bbp_get_subscriptions_permalink( $user_id ) );
1197  }
1198      /**
1199       * Return the link to the user's subscriptions page (profile page)
1200       *
1201       * @since 2.0.0 bbPress (r2688)
1202       * @since 2.6.0 bbPress (r6308) Add pagination if in the loop
1203       *
1204       * @param int $user_id Optional. User id
1205       * @return string Permanent link to user subscriptions page
1206       */
1207  	function bbp_get_subscriptions_permalink( $user_id = 0 ) {
1208  
1209          // Use displayed user ID if there is one, and one isn't requested
1210          $user_id = bbp_get_user_id( $user_id );
1211          if ( empty( $user_id ) ) {
1212              return false;
1213          }
1214  
1215          // Bail if intercepted
1216          $intercept = bbp_maybe_intercept( 'bbp_pre_get_subscriptions_permalink', func_get_args() );
1217          if ( bbp_is_intercepted( $intercept ) ) {
1218              return $intercept;
1219          }
1220  
1221          // Get user profile URL
1222          $profile_url = bbp_get_user_profile_url( $user_id );
1223          $page        = 0;
1224          $paged       = false;
1225  
1226          // Get pagination data
1227          if ( bbpress()->topic_query->in_the_loop ) {
1228              $page  = (int)  bbpress()->topic_query->paged;
1229              $paged = (bool) bbpress()->topic_query->in_the_loop;
1230  
1231          } elseif ( bbpress()->forum_query->in_the_loop ) {
1232              $page  = (int)  bbpress()->forum_query->paged;
1233              $paged = (bool) bbpress()->forum_query->in_the_loop;
1234          }
1235  
1236          // Pretty permalinks
1237          if ( bbp_use_pretty_urls() ) {
1238  
1239              // Base URL
1240              $url = trailingslashit( $profile_url ) . bbp_get_user_subscriptions_slug();
1241  
1242              // Add page
1243              if ( ( true === $paged ) && ( $page > 1 ) ) {
1244                  $url = trailingslashit( $url ) . bbp_get_paged_slug() . '/' . $page;
1245              }
1246  
1247              // Ensure correct trailing slash
1248              $url = user_trailingslashit( $url );
1249  
1250          // Unpretty permalinks
1251          } else {
1252  
1253              // Base arguments
1254              $args = array(
1255                  bbp_get_user_subscriptions_rewrite_id() => bbp_get_user_subscriptions_slug(),
1256              );
1257  
1258              // Add page
1259              if ( ( true === $paged ) && ( $page > 1 ) ) {
1260                  $args['page'] = $page;
1261              }
1262  
1263              // Add arguments
1264              $url = add_query_arg( $args, $profile_url );
1265          }
1266  
1267          // Filter & return
1268          return apply_filters( 'bbp_get_subscriptions_permalink', $url, $user_id );
1269      }
1270  
1271  /**
1272   * Output the link to subscribe/unsubscribe from a topic
1273   *
1274   * @since 2.0.0 bbPress (r2668)
1275   * @since 2.6.0 bbPress (r6308) Add 'redirect_to' support
1276   *
1277   * @param array $args See {@link bbp_get_user_subscribe_link()}
1278   * @param int $user_id Optional. User id
1279   * @param bool $wrap Optional. If you want to wrap the link in <span id="subscription-toggle">.
1280   */
1281  function bbp_user_subscribe_link( $args = array(), $user_id = 0, $wrap = true ) {
1282      echo bbp_get_user_subscribe_link( $args, $user_id, $wrap );
1283  }
1284      /**
1285       * Return the link to subscribe/unsubscribe from a forum or topic
1286       *
1287       * @since 2.0.0 bbPress (r2668)
1288       * @since 2.6.0 bbPress (r6308) Add 'redirect_to' support
1289       *
1290       * @param array $args This function supports these arguments:
1291       *  - subscribe: Subscribe text
1292       *  - unsubscribe: Unsubscribe text
1293       *  - user_id: User id
1294       *  - topic_id: Topic id
1295       *  - forum_id: Forum id
1296       *  - before: Before the link
1297       *  - after: After the link
1298       * @param int $user_id Optional. User id
1299       * @param bool $wrap Optional. If you want to wrap the link in <span id="subscription-toggle">.
1300       * @return string Permanent link to topic
1301       */
1302  	function bbp_get_user_subscribe_link( $args = array(), $user_id = 0, $wrap = true ) {
1303  
1304          // Bail if subscriptions are inactive
1305          if ( ! bbp_is_subscriptions_active() ) {
1306              return;
1307          }
1308  
1309          // Parse arguments against default values
1310          $r = bbp_parse_args( $args, array(
1311              'subscribe'   => esc_html__( 'Subscribe',   'bbpress' ),
1312              'unsubscribe' => esc_html__( 'Unsubscribe', 'bbpress' ),
1313              'user_id'     => 0,
1314              'object_id'   => 0,
1315              'object_type' => 'post',
1316              'before'      => '',
1317              'after'       => '',
1318              'redirect_to' => '',
1319  
1320              // Deprecated. Use object_id.
1321              'forum_id'    => 0,
1322              'topic_id'    => 0
1323          ), 'get_user_subscribe_link' );
1324  
1325          // Validate user
1326          $user_id     = bbp_get_user_id( $r['user_id'], true, true );
1327          $object_type = sanitize_key( $r['object_type'] );
1328  
1329          // Back-compat for deprecated arguments
1330          if ( ! empty( $r['topic_id'] ) ) {
1331              $object_id = absint( $r['topic_id'] );
1332          } elseif ( ! empty( $r['forum_id'] ) ) {
1333              $object_id = absint( $r['forum_id'] );
1334          } else {
1335              $object_id = absint( $r['object_id'] );
1336          }
1337  
1338          // Bail if anything is missing
1339          if ( empty( $user_id ) || empty( $object_id ) || empty( $object_type ) ) {
1340              return false;
1341          }
1342  
1343          // No link if you can't edit yourself
1344          if ( ! current_user_can( 'edit_user', $user_id ) ) {
1345              return false;
1346          }
1347  
1348          // Decide which link to show
1349          $is_subscribed = bbp_is_user_subscribed( $user_id, $object_id );
1350          if ( ! empty( $is_subscribed ) ) {
1351              $text   = $r['unsubscribe'];
1352              $q_args = array(
1353                  'action'      => 'bbp_unsubscribe',
1354                  'object_id'   => $object_id,
1355                  'object_type' => $object_type
1356              );
1357          } else {
1358              $text   = $r['subscribe'];
1359              $q_args = array(
1360                  'action'      => 'bbp_subscribe',
1361                  'object_id'   => $object_id,
1362                  'object_type' => $object_type
1363              );
1364          }
1365  
1366          // Custom redirect
1367          if ( ! empty( $r['redirect_to'] ) ) {
1368              $q_args['redirect_to'] = urlencode( $r['redirect_to'] );
1369          }
1370  
1371          // URL
1372          $url  = esc_url( wp_nonce_url( add_query_arg( $q_args ), 'toggle-subscription_' . $object_id ) );
1373          $sub  = $is_subscribed ? ' class="is-subscribed"' : '';
1374          $html = sprintf( '%s<span id="subscribe-%d"  %s><a href="%s" class="subscription-toggle" data-bbp-object-id="%d" data-bbp-object-type="%d" data-bbp-nonce="%s">%s</a></span>%s', $r['before'], $object_id, $sub, $url, $object_id, $object_type, wp_create_nonce( 'toggle-subscription_' . $object_id ), $text, $r['after'] );
1375  
1376          // Initial output is wrapped in a span, ajax output is hooked to this
1377          if ( ! empty( $wrap ) ) {
1378              $html = '<span id="subscription-toggle">' . $html . '</span>';
1379          }
1380  
1381          // Filter & return
1382          return apply_filters( 'bbp_get_user_subscribe_link', $html, $r, $user_id, $object_id );
1383      }
1384  
1385  
1386  /** Edit User *****************************************************************/
1387  
1388  /**
1389   * Display profile edit success notice on user edit page
1390   *
1391   * @since 2.0.0 bbPress (r2688)
1392   */
1393  function bbp_notice_edit_user_success() {
1394  
1395      // Bail if no updated argument
1396      if ( empty( $_GET['updated'] ) ) {
1397          return;
1398      }
1399  
1400      // Bail if not on users own profile
1401      if ( ! bbp_is_single_user_edit() ) {
1402          return;
1403      } ?>
1404  
1405      <div class="bbp-template-notice">
1406          <ul>
1407              <li><?php esc_html_e( 'User updated.', 'bbpress' ); ?></li>
1408          </ul>
1409      </div>
1410  
1411      <?php
1412  }
1413  
1414  /**
1415   * Display pending email change notice on user edit page
1416   *
1417   * @since 2.6.0 bbPress (r5660)
1418   */
1419  function bbp_notice_edit_user_pending_email() {
1420  
1421      // Bail if not on users own profile
1422      if ( ! bbp_is_user_home_edit() ) {
1423          return;
1424      }
1425  
1426      // Check for pending email address change
1427      $user_id   = bbp_get_displayed_user_id();
1428      $key       = '_new_email';
1429      $new_email = get_user_meta( $user_id, $key, true );
1430  
1431      // Bail if no pending email address change
1432      if ( empty( $new_email['newemail'] ) ) {
1433          return;
1434      }
1435  
1436      // Build the nonced URL to dismiss the pending change
1437      $user_url = bbp_get_user_profile_edit_url( $user_id );
1438      $nonce    = "dismiss-{$user_id}{$key}";
1439      $args     = array(
1440          'action'  => 'bbp-update-user-email',
1441          'dismiss' => "{$user_id}{$key}"
1442      );
1443  
1444      // Build the variables to pass into printf()
1445      $dismiss_url  = wp_nonce_url( add_query_arg( $args, $user_url ), $nonce );
1446      $dismiss_link = '<a href="' . esc_url( $dismiss_url ) . '">' . esc_html_x( 'Cancel', 'Dismiss pending user email address change', 'bbpress' ) . '</a>';
1447      $coded_email  = '<code>' . esc_html( $new_email['newemail'] ) . '</code>'; ?>
1448  
1449      <div class="bbp-template-notice info">
1450          <ul>
1451              <li><?php printf( esc_html__( 'There is a pending email address change to %1$s. %2$s', 'bbpress' ), $coded_email, $dismiss_link ); ?></li>
1452          </ul>
1453      </div>
1454  
1455      <?php
1456  }
1457  
1458  /**
1459   * Super admin privileges notice
1460   *
1461   * @since 2.0.0 bbPress (r2688)
1462   */
1463  function bbp_notice_edit_user_is_super_admin() {
1464      if ( is_multisite() && ( bbp_is_single_user() || bbp_is_single_user_edit() ) && current_user_can( 'manage_network_options' ) && is_super_admin( bbp_get_displayed_user_id() ) ) : ?>
1465  
1466      <div class="bbp-template-notice important">
1467          <ul>
1468              <li><?php bbp_is_user_home() || bbp_is_user_home_edit() ? esc_html_e( 'You have super admin privileges.', 'bbpress' ) : esc_html_e( 'This user has super admin privileges.', 'bbpress' ); ?></li>
1469          </ul>
1470      </div>
1471  
1472  <?php endif;
1473  }
1474  
1475  /**
1476   * Drop down for selecting the user's display name
1477   *
1478   * @since 2.0.0 bbPress (r2688)
1479   */
1480  function bbp_edit_user_display_name() {
1481      $bbp            = bbpress();
1482      $public_display = array();
1483      $public_display['display_username'] = $bbp->displayed_user->user_login;
1484  
1485      if ( ! empty( $bbp->displayed_user->nickname ) ) {
1486          $public_display['display_nickname']  = $bbp->displayed_user->nickname;
1487      }
1488  
1489      if ( ! empty( $bbp->displayed_user->first_name ) ) {
1490          $public_display['display_firstname'] = $bbp->displayed_user->first_name;
1491      }
1492  
1493      if ( ! empty( $bbp->displayed_user->last_name ) ) {
1494          $public_display['display_lastname']  = $bbp->displayed_user->last_name;
1495      }
1496  
1497      if ( ! empty( $bbp->displayed_user->first_name ) && ! empty( $bbp->displayed_user->last_name ) ) {
1498          $public_display['display_firstlast'] = $bbp->displayed_user->first_name . ' ' . $bbp->displayed_user->last_name;
1499          $public_display['display_lastfirst'] = $bbp->displayed_user->last_name  . ' ' . $bbp->displayed_user->first_name;
1500      }
1501  
1502      // Only add this if it isn't duplicated elsewhere
1503      if ( ! in_array( $bbp->displayed_user->display_name, $public_display, true ) ) {
1504          $public_display = array( 'display_displayname' => $bbp->displayed_user->display_name ) + $public_display;
1505      }
1506  
1507      $public_display = array_map( 'trim', $public_display );
1508      $public_display = array_unique( $public_display ); ?>
1509  
1510      <select name="display_name" id="display_name">
1511  
1512      <?php foreach ( $public_display as $id => $item ) : ?>
1513  
1514          <option id="<?php echo $id; ?>" value="<?php echo esc_attr( $item ); ?>"<?php selected( $bbp->displayed_user->display_name, $item ); ?>><?php echo $item; ?></option>
1515  
1516      <?php endforeach; ?>
1517  
1518      </select>
1519  
1520  <?php
1521  }
1522  
1523  /**
1524   * Output blog role selector (for user edit)
1525   *
1526   * @since 2.0.0 bbPress (r2688)
1527   */
1528  function bbp_edit_user_blog_role() {
1529  
1530      // Bail if no user is being edited
1531      if ( ! bbp_is_single_user_edit() ) {
1532          return;
1533      }
1534  
1535      // Get users current blog role
1536      $user_role  = bbp_get_user_blog_role( bbp_get_displayed_user_id() );
1537  
1538      // Get the blog roles
1539      $blog_roles = bbp_get_blog_roles(); ?>
1540  
1541      <select name="role" id="role">
1542          <option value=""><?php esc_html_e( '&mdash; No role for this site &mdash;', 'bbpress' ); ?></option>
1543  
1544          <?php foreach ( $blog_roles as $role => $details ) : ?>
1545  
1546              <option <?php selected( $user_role, $role ); ?> value="<?php echo esc_attr( $role ); ?>"><?php echo bbp_translate_user_role( $details['name'] ); ?></option>
1547  
1548          <?php endforeach; ?>
1549  
1550      </select>
1551  
1552      <?php
1553  }
1554  
1555  /**
1556   * Output forum role selector (for user edit)
1557   *
1558   * @since 2.2.0 bbPress (r4284)
1559   */
1560  function bbp_edit_user_forums_role() {
1561  
1562      // Bail if no user is being edited
1563      if ( ! bbp_is_single_user_edit() ) {
1564          return;
1565      }
1566  
1567      // Get the user's current forum role
1568      $user_role     = bbp_get_user_role( bbp_get_displayed_user_id() );
1569  
1570      // Get the folum roles
1571      $dynamic_roles = bbp_get_dynamic_roles();
1572  
1573      // Only keymasters can set other keymasters
1574      if ( ! bbp_is_user_keymaster() ) {
1575          unset( $dynamic_roles[ bbp_get_keymaster_role() ] );
1576      } ?>
1577  
1578      <select name="bbp-forums-role" id="bbp-forums-role">
1579          <option value=""><?php esc_html_e( '&mdash; No role for these forums &mdash;', 'bbpress' ); ?></option>
1580  
1581          <?php foreach ( $dynamic_roles as $role => $details ) : ?>
1582  
1583              <option <?php selected( $user_role, $role ); ?> value="<?php echo esc_attr( $role ); ?>"><?php echo bbp_translate_user_role( $details['name'] ); ?></option>
1584  
1585          <?php endforeach; ?>
1586  
1587      </select>
1588  
1589      <?php
1590  }
1591  
1592  /**
1593   * Return user contact methods select box
1594   *
1595   * @since 2.0.0 bbPress (r2688)
1596   * @return string User contact methods
1597   */
1598  function bbp_edit_user_contact_methods() {
1599  
1600      // Get the core WordPress contact methods
1601      $contact_methods = wp_get_user_contact_methods( bbpress()->displayed_user );
1602  
1603      // Filter & return
1604      return (array) apply_filters( 'bbp_edit_user_contact_methods', $contact_methods );
1605  }
1606  
1607  /**
1608   * Output the language chooser (for user edit)
1609   *
1610   * @since 2.6.0 bbPress (r6488)
1611   *
1612   * @param array $args See wp_dropdown_languages()
1613   * @return string
1614   */
1615  function bbp_edit_user_language( $args = array() ) {
1616  
1617      // Bail if no user is being edited
1618      if ( ! bbp_is_single_user_edit() ) {
1619          return;
1620      }
1621  
1622      // Output the dropdown
1623      bbp_user_languages_dropdown( $args );
1624  }
1625  
1626  /** Topics Created ************************************************************/
1627  
1628  /**
1629   * Output the link to the user's topics
1630   *
1631   * @since 2.2.0 bbPress (r4225)
1632   *
1633   * @param int $user_id Optional. User id
1634   */
1635  function bbp_user_topics_created_url( $user_id = 0 ) {
1636      echo esc_url( bbp_get_user_topics_created_url( $user_id ) );
1637  }
1638      /**
1639       * Return the link to the user's topics
1640       *
1641       * @since 2.2.0 bbPress (r4225)
1642       *
1643       * @param int $user_id Optional. User id
1644       * @return string Permanent link to user profile page
1645       */
1646  	function bbp_get_user_topics_created_url( $user_id = 0 ) {
1647  
1648          // Use displayed user ID if there is one, and one isn't requested
1649          $user_id = bbp_get_user_id( $user_id );
1650          if ( empty( $user_id ) ) {
1651              return false;
1652          }
1653  
1654          // Bail if intercepted
1655          $intercept = bbp_maybe_intercept( 'bbp_pre_get_user_topics_created_url', func_get_args() );
1656          if ( bbp_is_intercepted( $intercept ) ) {
1657              return $intercept;
1658          }
1659  
1660          // Get user profile URL
1661          $profile_url = bbp_get_user_profile_url( $user_id );
1662  
1663          // Pretty permalinks
1664          if ( bbp_use_pretty_urls() ) {
1665              $url = trailingslashit( $profile_url ) . bbp_get_topic_archive_slug();
1666              $url = user_trailingslashit( $url );
1667  
1668          // Unpretty permalinks
1669          } else {
1670              $url = add_query_arg( array(
1671                  bbp_get_user_topics_rewrite_id() => '1',
1672              ), $profile_url );
1673          }
1674  
1675          // Filter & return
1676          return apply_filters( 'bbp_get_user_topics_created_url', $url, $user_id );
1677      }
1678  
1679  /** Replies Created ************************************************************/
1680  
1681  /**
1682   * Output the link to the user's replies
1683   *
1684   * @since 2.2.0 bbPress (r4225)
1685   *
1686   * @param int $user_id Optional. User id
1687   */
1688  function bbp_user_replies_created_url( $user_id = 0 ) {
1689      echo esc_url( bbp_get_user_replies_created_url( $user_id ) );
1690  }
1691      /**
1692       * Return the link to the user's replies
1693       *
1694       * @since 2.2.0 bbPress (r4225)
1695       *
1696       * @param int $user_id Optional. User id
1697       * @return string Permanent link to user profile page
1698       */
1699  	function bbp_get_user_replies_created_url( $user_id = 0 ) {
1700  
1701          // Use displayed user ID if there is one, and one isn't requested
1702          $user_id = bbp_get_user_id( $user_id );
1703          if ( empty( $user_id ) ) {
1704              return false;
1705          }
1706  
1707          // Bail if intercepted
1708          $intercept = bbp_maybe_intercept( 'bbp_pre_get_user_replies_created_url', func_get_args() );
1709          if ( bbp_is_intercepted( $intercept ) ) {
1710              return $intercept;
1711          }
1712  
1713          // Get user profile URL
1714          $profile_url = bbp_get_user_profile_url( $user_id );
1715  
1716          // Pretty permalinks
1717          if ( bbp_use_pretty_urls() ) {
1718              $url = trailingslashit( $profile_url ) . bbp_get_reply_archive_slug();
1719              $url = user_trailingslashit( $url );
1720  
1721          // Unpretty permalinks
1722          } else {
1723              $url = add_query_arg( array(
1724                  bbp_get_user_replies_rewrite_id() => '1',
1725              ), $profile_url );
1726          }
1727  
1728          // Filter & return
1729          return apply_filters( 'bbp_get_user_replies_created_url', $url, $user_id );
1730      }
1731  
1732  /** Engagements ***************************************************************/
1733  
1734  /**
1735   * Output the link to the user's engagements
1736   *
1737   * @since 2.6.0 bbPress (r6320)
1738   *
1739   * @param int $user_id Optional. User id
1740   */
1741  function bbp_user_engagements_url( $user_id = 0 ) {
1742      echo esc_url( bbp_get_user_engagements_url( $user_id ) );
1743  }
1744      /**
1745       * Return the link to the user's engagements
1746       *
1747       * @since 2.6.0 bbPress (r6320)
1748       *
1749       * @param int $user_id Optional. User id
1750       * @return string Permanent link to user profile page
1751       */
1752  	function bbp_get_user_engagements_url( $user_id = 0 ) {
1753  
1754          // Use displayed user ID if there is one, and one isn't requested
1755          $user_id = bbp_get_user_id( $user_id );
1756          if ( empty( $user_id ) ) {
1757              return false;
1758          }
1759  
1760          // Bail if intercepted
1761          $intercept = bbp_maybe_intercept( 'bbp_pre_get_user_engagements_url', func_get_args() );
1762          if ( bbp_is_intercepted( $intercept ) ) {
1763              return $intercept;
1764          }
1765  
1766          // Get user profile URL
1767          $profile_url = bbp_get_user_profile_url( $user_id );
1768  
1769          // Pretty permalinks
1770          if ( bbp_use_pretty_urls() ) {
1771              $url = trailingslashit( $profile_url ) . bbp_get_user_engagements_slug();
1772              $url = user_trailingslashit( $url );
1773  
1774          // Unpretty permalinks
1775          } else {
1776              $url = add_query_arg( array(
1777                  bbp_get_user_engagements_rewrite_id() => '1',
1778              ), $profile_url );
1779          }
1780  
1781          // Filter & return
1782          return apply_filters( 'bbp_get_user_engagements_url', $url, $user_id );
1783      }
1784  
1785  /** Language ******************************************************************/
1786  
1787  /**
1788   * Output the select element used to save a user's language
1789   *
1790   * @since 2.6.0 bbPress (r6488)
1791   *
1792   * @param array $args See wp_dropdown_languages()
1793   */
1794  function bbp_user_languages_dropdown( $args = array() ) {
1795      echo bbp_get_user_languages_dropdown( $args );
1796  }
1797  
1798      /**
1799       * Return the select element used to save a user's language.
1800       *
1801       * @since 2.6.0 bbPress (r6488)
1802       *
1803       * @param array $args See wp_dropdown_languages()
1804       * @return string
1805       */
1806  	function bbp_get_user_languages_dropdown( $args = array() ) {
1807  
1808          // Get user language
1809          $user_id = ! empty( $args['user_id'] )
1810              ? bbp_get_user_id( $args['user_id'], false, false )
1811              : bbp_get_displayed_user_id();
1812  
1813          // Get user locale
1814          $user_locale = ! empty( $user_id )
1815              ? get_userdata( $user_id )->locale
1816              : 'site-default';
1817  
1818          // Get all languages
1819          $languages = get_available_languages();
1820  
1821          // No locale for English
1822          if ( 'en_US' === $user_locale ) {
1823              $user_locale = '';
1824  
1825          // Fallback to site-default if there is a mismatch
1826          } elseif ( '' === $user_locale || ! in_array( $user_locale, $languages, true ) ) {
1827              $user_locale = 'site-default';
1828          }
1829  
1830          // Don't pass user ID in
1831          unset( $args['user_id'] );
1832  
1833          // Parse arguments
1834          $r = bbp_parse_args( $args, array(
1835              'name'                        => 'locale',
1836              'id'                          => 'locale',
1837              'selected'                    => $user_locale,
1838              'languages'                   => $languages,
1839              'echo'                        => false,
1840              'show_available_translations' => false,
1841              'show_option_site_default'    => true
1842          ), 'user_languages_dropdown' );
1843  
1844          // Get the markup for the languages drop-down
1845          $retval = wp_dropdown_languages( $r );
1846  
1847          // Filter & return
1848          return apply_filters( 'bbp_get_user_languages_dropdown', $retval, $r, $args );
1849      }
1850  
1851  /** Login *********************************************************************/
1852  
1853  /**
1854   * Handle the login and registration template notices
1855   *
1856   * @since 2.0.0 bbPress (r2970)
1857   */
1858  function bbp_login_notices() {
1859  
1860      // loggedout was passed
1861      if ( ! empty( $_GET['loggedout'] ) && ( 'true' === $_GET['loggedout'] ) ) {
1862          bbp_add_error( 'loggedout', esc_html__( 'You are now logged out.', 'bbpress' ), 'message' );
1863  
1864      // registration is disabled
1865      } elseif ( ! empty( $_GET['registration'] ) && ( 'disabled' === $_GET['registration'] ) ) {
1866          bbp_add_error( 'registerdisabled', esc_html__( 'New user registration is currently not allowed.', 'bbpress' ) );
1867  
1868      // Prompt user to check their email
1869      } elseif ( ! empty( $_GET['checkemail'] ) && in_array( $_GET['checkemail'], array( 'confirm', 'newpass', 'registered' ), true ) ) {
1870  
1871          switch ( $_GET['checkemail'] ) {
1872  
1873              // Email needs confirmation
1874              case 'confirm' :
1875                  bbp_add_error( 'confirm',    esc_html__( 'Check your e-mail for the confirmation link.',     'bbpress' ), 'message' );
1876                  break;
1877  
1878              // User requested a new password
1879              case 'newpass' :
1880                  bbp_add_error( 'newpass',    esc_html__( 'Check your e-mail for your new password.',         'bbpress' ), 'message' );
1881                  break;
1882  
1883              // User is newly registered
1884              case 'registered' :
1885                  bbp_add_error( 'registered', esc_html__( 'Registration complete. Please check your e-mail.', 'bbpress' ), 'message' );
1886                  break;
1887          }
1888      }
1889  }
1890  
1891  /**
1892   * Redirect a user back to their profile if they are already logged in.
1893   *
1894   * This should be used before {@link get_header()} is called in template files
1895   * where the user should never have access to the contents of that file.
1896   *
1897   * @since 2.0.0 bbPress (r2815)
1898   *
1899   * @param string $url The URL to redirect to
1900   */
1901  function bbp_logged_in_redirect( $url = '' ) {
1902  
1903      // Bail if user is not logged in
1904      if ( ! is_user_logged_in() ) {
1905          return;
1906      }
1907  
1908      // Setup the profile page to redirect to
1909      $redirect_to = ! empty( $url ) ? $url : bbp_get_user_profile_url( bbp_get_current_user_id() );
1910  
1911      // Do a safe redirect
1912      bbp_redirect( $redirect_to );
1913  }
1914  
1915  /**
1916   * Output the required hidden fields when logging in
1917   *
1918   * @since 2.0.0 bbPress (r2815)
1919   */
1920  function bbp_user_login_fields() {
1921  ?>
1922  
1923      <input type="hidden" name="user-cookie" value="1" />
1924  
1925      <?php
1926  
1927      // Allow custom login redirection
1928      $redirect_to = apply_filters( 'bbp_user_login_redirect_to', '' );
1929      bbp_redirect_to_field( $redirect_to );
1930  
1931      // Prevent intention hi-jacking of log-in form
1932      wp_nonce_field( 'bbp-user-login' );
1933  }
1934  
1935  /** Register ******************************************************************/
1936  
1937  /**
1938   * Output the required hidden fields when registering
1939   *
1940   * @since 2.0.0 bbPress (r2815)
1941   */
1942  function bbp_user_register_fields() {
1943  ?>
1944  
1945      <input type="hidden" name="action"      value="register" />
1946      <input type="hidden" name="user-cookie" value="1" />
1947  
1948      <?php
1949  
1950      // Allow custom registration redirection
1951      $redirect_to = apply_filters( 'bbp_user_register_redirect_to', '' );
1952      bbp_redirect_to_field( add_query_arg( array( 'checkemail' => 'registered' ), $redirect_to ) );
1953  
1954      // Prevent intention hi-jacking of sign-up form
1955      wp_nonce_field( 'bbp-user-register' );
1956  }
1957  
1958  /** Lost Password *************************************************************/
1959  
1960  /**
1961   * Output the required hidden fields when user lost password
1962   *
1963   * @since 2.0.0 bbPress (r2815)
1964   */
1965  function bbp_user_lost_pass_fields() {
1966  ?>
1967  
1968      <input type="hidden" name="user-cookie" value="1" />
1969  
1970      <?php
1971  
1972      // Allow custom lost pass redirection
1973      $redirect_to = apply_filters( 'bbp_user_lost_pass_redirect_to', get_permalink() );
1974      bbp_redirect_to_field( add_query_arg( array( 'checkemail' => 'confirm' ), $redirect_to ) );
1975  
1976      // Prevent intention hi-jacking of lost pass form
1977      wp_nonce_field( 'bbp-user-lost-pass' );
1978  }
1979  
1980  /** Author Avatar *************************************************************/
1981  
1982  /**
1983   * Output the author link of a post
1984   *
1985   * @since 2.0.0 bbPress (r2875)
1986   *
1987   * @param array $args Optional. If it is an integer, it is used as post id.
1988   */
1989  function bbp_author_link( $args = array() ) {
1990      echo bbp_get_author_link( $args );
1991  }
1992      /**
1993       * Return the author link of the post
1994       *
1995       * @since 2.0.0 bbPress (r2875)
1996       *
1997       * @param array $args Optional. If an integer, it is used as reply id.
1998       * @return string Author link of reply
1999       */
2000  	function bbp_get_author_link( $args = array() ) {
2001  
2002          $post_id = is_numeric( $args ) ? (int) $args : 0;
2003  
2004          // Parse arguments against default values
2005          $r = bbp_parse_args( $args, array(
2006              'post_id'    => $post_id,
2007              'link_title' => '',
2008              'type'       => 'both',
2009              'size'       => 80,
2010              'sep'        => ''
2011          ), 'get_author_link' );
2012  
2013          // Confirmed topic
2014          if ( bbp_is_topic( $r['post_id'] ) ) {
2015              return bbp_get_topic_author_link( $r );
2016  
2017          // Confirmed reply
2018          } elseif ( bbp_is_reply( $r['post_id'] ) ) {
2019              return bbp_get_reply_author_link( $r );
2020          }
2021  
2022          // Default return value
2023          $author_link = '';
2024  
2025          // Neither a reply nor a topic, so could be a revision
2026          if ( ! empty( $r['post_id'] ) ) {
2027  
2028              // Get some useful reply information
2029              $user_id    = get_post_field( 'post_author', $r['post_id'] );
2030              $author_url = bbp_get_user_profile_url( $user_id );
2031              $anonymous  = bbp_is_reply_anonymous( $r['post_id'] );
2032  
2033              // Generate title with the display name of the author
2034              if ( empty( $r['link_title'] ) ) {
2035                  $author = get_the_author_meta( 'display_name', $user_id );
2036                  $title  = empty( $anonymous )
2037                      ? esc_attr__( "View %s's profile",  'bbpress' )
2038                      : esc_attr__( "Visit %s's website", 'bbpress' );
2039  
2040                  $r['link_title'] = sprintf( $title, $author );
2041              }
2042  
2043              // Setup title and author_links array
2044              $author_links = array();
2045              $link_title   = ! empty( $r['link_title'] )
2046                  ? ' title="' . esc_attr( $r['link_title'] ) . '"'
2047                  : '';
2048  
2049              // Get avatar (unescaped, because HTML)
2050              if ( ( 'avatar' === $r['type'] ) || ( 'both' === $r['type'] ) ) {
2051                  $author_links['avatar'] = get_avatar( $user_id, $r['size'] );
2052              }
2053  
2054              // Get display name (escaped, because never HTML)
2055              if ( ( 'name' === $r['type'] ) || ( 'both' === $r['type'] ) ) {
2056                  $author_links['name'] = esc_html( get_the_author_meta( 'display_name', $user_id ) );
2057              }
2058  
2059              // Empty array
2060              $links  = array();
2061              $sprint = '<span %1$s>%2$s</span>';
2062  
2063              // Wrap each link
2064              foreach ( $author_links as $link => $link_text ) {
2065                  $link_class = ' class="bbp-author-' . esc_attr( $link ) . '"';
2066                  $links[]    = sprintf( $sprint, $link_class, $link_text );
2067              }
2068  
2069              // Juggle
2070              $author_links = $links;
2071              unset( $links );
2072  
2073              // Filter sections
2074              $sections    = apply_filters( 'bbp_get_author_links', $author_links, $r, $args );
2075  
2076              // Assemble sections into author link
2077              $author_link = implode( $r['sep'], $sections );
2078  
2079              // Only wrap in link if profile exists
2080              if ( empty( $anonymous ) && bbp_user_has_profile( $user_id ) ) {
2081                  $author_link = sprintf( '<a href="%1$s"%2$s%3$s>%4$s</a>', esc_url( $author_url ), $link_title, ' class="bbp-author-link"', $author_link );
2082              }
2083          }
2084  
2085          // Filter & return
2086          return apply_filters( 'bbp_get_author_link', $author_link, $r, $args );
2087      }
2088  
2089  /** Capabilities **************************************************************/
2090  
2091  /**
2092   * Check if the user can access a specific forum
2093   *
2094   * @since 2.0.0 bbPress (r3127)
2095   *
2096   * @return bool
2097   */
2098  function bbp_user_can_view_forum( $args = array() ) {
2099  
2100      // Parse arguments against default values
2101      $r = bbp_parse_args( $args, array(
2102          'user_id'         => bbp_get_current_user_id(),
2103          'forum_id'        => bbp_get_forum_id(),
2104          'check_ancestors' => false
2105      ), 'user_can_view_forum' );
2106  
2107      // Validate parsed values
2108      $user_id  = bbp_get_user_id( $r['user_id'], false, false );
2109      $forum_id = bbp_get_forum_id( $r['forum_id'] );
2110      $retval   = false;
2111  
2112      // User is a keymaster
2113      if ( ! empty( $user_id ) && bbp_is_user_keymaster( $user_id ) ) {
2114          $retval = true;
2115  
2116      // Forum is public, and user can read forums or is not logged in
2117      } elseif ( bbp_is_forum_public( $forum_id, $r['check_ancestors'] ) ) {
2118          $retval = true;
2119  
2120      // Forum is private, and user can see it
2121      } elseif ( bbp_is_forum_private( $forum_id, $r['check_ancestors'] ) && user_can( $user_id, 'read_forum', $forum_id ) ) {
2122          $retval = true;
2123  
2124      // Forum is hidden, and user can see it
2125      } elseif ( bbp_is_forum_hidden( $forum_id, $r['check_ancestors'] ) && user_can( $user_id, 'read_forum', $forum_id  ) ) {
2126          $retval = true;
2127      }
2128  
2129      // Filter & return
2130      return apply_filters( 'bbp_user_can_view_forum', $retval, $forum_id, $user_id );
2131  }
2132  
2133  /**
2134   * Check if the current user can publish topics
2135   *
2136   * @since 2.0.0 bbPress (r3127)
2137   *
2138   * @return bool
2139   */
2140  function bbp_current_user_can_publish_topics() {
2141  
2142      // Users need to earn access
2143      $retval = false;
2144  
2145      // Always allow keymasters
2146      if ( bbp_is_user_keymaster() ) {
2147          $retval = true;
2148  
2149      // Do not allow anonymous if not enabled
2150      } elseif ( ! is_user_logged_in() && bbp_allow_anonymous() ) {
2151          $retval = true;
2152  
2153      // User is logged in
2154      } elseif ( current_user_can( 'publish_topics' ) ) {
2155          $retval = true;
2156      }
2157  
2158      // Filter & return
2159      return (bool) apply_filters( 'bbp_current_user_can_publish_topics', $retval );
2160  }
2161  
2162  /**
2163   * Check if the current user can publish forums
2164   *
2165   * @since 2.1.0 bbPress (r3549)
2166   *
2167   * @return bool
2168   */
2169  function bbp_current_user_can_publish_forums() {
2170  
2171      // Users need to earn access
2172      $retval = false;
2173  
2174      // Always allow keymasters
2175      if ( bbp_is_user_keymaster() ) {
2176          $retval = true;
2177  
2178      // User is logged in
2179      } elseif ( current_user_can( 'publish_forums' ) ) {
2180          $retval = true;
2181      }
2182  
2183      // Filter & return
2184      return (bool) apply_filters( 'bbp_current_user_can_publish_forums', $retval );
2185  }
2186  
2187  /**
2188   * Check if the current user can publish replies
2189   *
2190   * @since 2.0.0 bbPress (r3127)
2191   *
2192   * @return bool
2193   */
2194  function bbp_current_user_can_publish_replies() {
2195  
2196      // Users need to earn access
2197      $retval = false;
2198  
2199      // Always allow keymasters
2200      if ( bbp_is_user_keymaster() ) {
2201          $retval = true;
2202  
2203      // Do not allow anonymous if not enabled
2204      } elseif ( ! is_user_logged_in() && bbp_allow_anonymous() ) {
2205          $retval = true;
2206  
2207      // User is logged in
2208      } elseif ( current_user_can( 'publish_replies' ) ) {
2209          $retval = true;
2210      }
2211  
2212      // Filter & return
2213      return (bool) apply_filters( 'bbp_current_user_can_publish_replies', $retval );
2214  }
2215  
2216  /** Forms *********************************************************************/
2217  
2218  /**
2219   * The following functions should be turned into mapped meta capabilities in a
2220   * future version. They exist only to remove complex logistical capability
2221   * checks from within template parts.
2222   */
2223  
2224  /**
2225   * Get the forums the current user has the ability to see and post to
2226   *
2227   * @since 2.0.0 bbPress (r3127)
2228   *
2229   * @param array $args
2230   *
2231   * @return array
2232   */
2233  function bbp_get_forums_for_current_user( $args = array() ) {
2234  
2235      // Parse arguments against default values
2236      $r = bbp_parse_args( $args, array(
2237          'post_type'    => bbp_get_forum_post_type(),
2238          'post_status'  => bbp_get_public_status_id(),
2239          'post__not_in' => bbp_exclude_forum_ids( 'array' ),
2240          'numberposts'  => -1
2241      ), 'get_forums_for_current_user' );
2242  
2243      // Get the forums
2244      $forums = get_posts( $r );
2245  
2246      // No availabe forums
2247      if ( empty( $forums ) ) {
2248          $forums = false;
2249      }
2250  
2251      // Filter & return
2252      return apply_filters( 'bbp_get_forums_for_current_user', $forums, $r, $args );
2253  }
2254  
2255  /**
2256   * Performs a series of checks to ensure the current user can create forums.
2257   *
2258   * @since 2.1.0 bbPress (r3549)
2259   *
2260   * @return bool
2261   */
2262  function bbp_current_user_can_access_create_forum_form() {
2263  
2264      // Users need to earn access
2265      $retval = false;
2266  
2267      // Always allow keymasters
2268      if ( bbp_is_user_keymaster() ) {
2269          $retval = true;
2270  
2271      // Looking at a single forum & forum is open
2272      } elseif ( is_singular() && bbp_is_forum_open() ) {
2273          $retval = bbp_current_user_can_publish_forums();
2274  
2275      // User can edit this forum
2276      } else {
2277          $retval = current_user_can( 'edit_forum', bbp_get_forum_id() );
2278      }
2279  
2280      // Filter & return
2281      return (bool) apply_filters( 'bbp_current_user_can_access_create_forum_form', (bool) $retval );
2282  }
2283  
2284  /**
2285   * Performs a series of checks to ensure the current user can create topics.
2286   *
2287   * @since 2.0.0 bbPress (r3127)
2288   *
2289   * @return bool
2290   */
2291  function bbp_current_user_can_access_create_topic_form() {
2292  
2293      // Users need to earn access
2294      $retval = false;
2295  
2296      // Always allow keymasters
2297      if ( bbp_is_user_keymaster() ) {
2298          $retval = true;
2299  
2300      // Looking at a single forum & forum is open
2301      } elseif ( ( bbp_is_single_forum() || is_singular() ) && bbp_is_forum_open() ) {
2302          $retval = bbp_current_user_can_publish_topics();
2303  
2304      // User can edit this topic
2305      } else {
2306          $retval = current_user_can( 'edit_topic', bbp_get_topic_id() );
2307      }
2308  
2309      // Filter & return
2310      return (bool) apply_filters( 'bbp_current_user_can_access_create_topic_form', (bool) $retval );
2311  }
2312  
2313  /**
2314   * Performs a series of checks to ensure the current user can create replies.
2315   *
2316   * @since 2.0.0 bbPress (r3127)
2317   *
2318   * @return bool
2319   */
2320  function bbp_current_user_can_access_create_reply_form() {
2321  
2322      // Users need to earn access
2323      $retval = false;
2324  
2325      // Always allow keymasters
2326      if ( bbp_is_user_keymaster() ) {
2327          $retval = true;
2328  
2329      // Looking at single topic (and singulars), topic is open, and forum is open
2330      } elseif ( ( bbp_is_single_topic() || is_singular() ) && bbp_is_topic_open() && bbp_is_forum_open() && bbp_is_topic_published() ) {
2331          $retval = bbp_current_user_can_publish_replies();
2332  
2333      // User can edit this reply
2334      } elseif ( bbp_get_reply_id() ) {
2335          $retval = current_user_can( 'edit_reply', bbp_get_reply_id() );
2336  
2337      // User can edit this topic
2338      } elseif ( bbp_get_topic_id() ) {
2339          $retval = current_user_can( 'edit_topic', bbp_get_topic_id() );
2340      }
2341  
2342      // Filter & return
2343      return (bool) apply_filters( 'bbp_current_user_can_access_create_reply_form', (bool) $retval );
2344  }
2345  
2346  /**
2347   * Performs a series of checks to ensure the current user should see the
2348   * anonymous user form fields.
2349   *
2350   * @since 2.5.0 bbPress (r5119)
2351   *
2352   * @return bool
2353   */
2354  function bbp_current_user_can_access_anonymous_user_form() {
2355  
2356      // Users need to earn access
2357      $retval = false;
2358  
2359      // User is not logged in, and anonymous posting is allowed
2360      if ( bbp_is_anonymous() ) {
2361          $retval = true;
2362  
2363      // User is editing a topic, and topic is authored by anonymous user
2364      } elseif ( bbp_is_topic_edit() && bbp_is_topic_anonymous() ) {
2365          $retval = true;
2366  
2367      // User is editing a reply, and reply is authored by anonymous user
2368      } elseif ( bbp_is_reply_edit() && bbp_is_reply_anonymous() ) {
2369          $retval = true;
2370      }
2371  
2372      // Filter & return
2373      return (bool) apply_filters( 'bbp_current_user_can_access_anonymous_user_form', (bool) $retval );
2374  }
2375  
2376  /** Moderators ****************************************************************/
2377  
2378  /**
2379   * Output the moderators of a forum
2380   *
2381   * @since 2.6.0 bbPress
2382   *
2383   * @param int   $forum_id Optional. Topic id
2384   * @param array $args     See {@link bbp_get_moderator_list()}
2385   */
2386  function bbp_moderator_list( $forum_id = 0, $args = array() ) {
2387      echo bbp_get_moderator_list( $forum_id, $args );
2388  }
2389  
2390      /**
2391       * Return the moderators for an object
2392       *
2393       * @since 2.6.0 bbPress
2394       *
2395       * @param int   $object_id Optional. Object id
2396       * @param array $args     This function supports these arguments:
2397       *  - before: Before the tag list
2398       *  - sep: Tag separator
2399       *  - after: After the tag list
2400       *
2401       * @return string Moderator list of the object
2402       */
2403  	function bbp_get_moderator_list( $object_id = 0, $args = array() ) {
2404  
2405          // Parse arguments against default values
2406          $r = bbp_parse_args( $args, array(
2407              'before' => '<div class="bbp-moderators"><p>' . esc_html__( 'Moderators:', 'bbpress' ) . '&nbsp;',
2408              'sep'    => ', ',
2409              'after'  => '</p></div>',
2410              'none'   => ''
2411          ), 'get_moderator_list' );
2412  
2413          // Get forum moderators
2414          $user_ids = bbp_get_moderator_ids( $object_id );
2415          if ( ! empty( $user_ids ) ) {
2416  
2417              // In admin, use nicenames
2418              if ( is_admin() ) {
2419                  $users = bbp_get_user_nicenames_from_ids( $user_ids );
2420  
2421              // In theme, use display names & profile links
2422              } else {
2423                  foreach ( $user_ids as $user_id ) {
2424                      $users[] = bbp_get_user_profile_link( $user_id );
2425                  }
2426              }
2427  
2428              $retval = $r['before'] . implode( $r['sep'], $users ) . $r['after'];
2429  
2430          // No forum moderators
2431          } else {
2432              $retval = $r['none'];
2433          }
2434  
2435          // Filter & return
2436          return apply_filters( 'bbp_get_moderator_list', $retval );
2437      }


Generated: Fri Mar 29 01:00:56 2024 Cross-referenced by PHPXref 0.7.1