PluginProbe
Forumax – AI Powered Advanced Community Forum Plugin / 2.4.2
Forumax – AI Powered Advanced Community Forum Plugin v2.4.2
2.4.4 2.4.3 2.4.2 2.4.1 2.4.0 trunk 1.0.8 1.1.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.3.0 1.3.1 1.3.2 1.3.3 1.4.0 1.4.1 2.0.0 2.1.0 All 29 releases
bbp-core / lib / bbpress / includes / users / template.php

template.php in Forumax – AI Powered Advanced Community Forum Plugin 2.4.2, at lib/bbpress/includes/users/template.php

2,438 lines 64.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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_page() || is_single() ) && 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_page() || is_single() ) && 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 }
2438