PluginProbe
bbPress / 2.6.19
bbPress v2.6.19
2.6.19 2.6.18 2.6.17 trunk 2.0 2.0-beta-1 2.0-beta-2b 2.0-beta-3 2.0-beta-3b 2.0-rc-2 2.0-rc-3 2.0-rc-4 2.0-rc-5 2.0.1 2.0.2 2.0.3 2.1 2.1-beta-1 2.1-rc1 2.1-rc2 2.1-rc3 2.1-rc4 2.1.1 2.1.2 2.1.3 All 74 releases
bbpress / includes / users / capabilities.php

capabilities.php in bbPress 2.6.19, at includes/users/capabilities.php

963 lines 23.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 Capabilites
5 *
6 * Used to map user capabilities to WordPress's existing capabilities.
7 *
8 * @package bbPress
9 * @subpackage Capabilities
10 */
11
12 /**
13 * Maps primary capabilities
14 *
15 * @since 2.2.0 bbPress (r4244)
16 * @since 2.6.19 bbPress (r7690) Limit super moderator edits to site members and protect peer roles.
17 *
18 * @param array $caps Capabilities for meta capability.
19 * @param string $cap Capability name.
20 * @param int $user_id User id.
21 * @param array $args Arguments.
22 *
23 * @return array Actual capabilities for meta capability
24 */
25 function bbp_map_primary_meta_caps( $caps = array(), $cap = '', $user_id = 0, $args = array() ) {
26
27 // What capability is being checked?
28 switch ( $cap ) {
29 case 'spectate' :
30
31 // Do not allow inactive users.
32 if ( bbp_is_user_inactive( $user_id ) ) {
33 $caps = array( 'do_not_allow' );
34
35 // Default to the current cap.
36 } else {
37 $caps = array( $cap );
38 }
39 break;
40
41 case 'participate' :
42
43 // Do not allow inactive users.
44 if ( bbp_is_user_inactive( $user_id ) ) {
45 $caps = array( 'do_not_allow' );
46
47 // Default to the current cap.
48 } else {
49 $caps = array( $cap );
50 }
51 break;
52
53 case 'moderate' :
54
55 // Do not allow inactive users.
56 if ( bbp_is_user_inactive( $user_id ) ) {
57 $caps = array( 'do_not_allow' );
58
59 // Keymasters can always moderate.
60 } elseif ( bbp_is_user_keymaster( $user_id ) ) {
61 $caps = array( 'spectate' );
62
63 // Check if user can moderate forum.
64 } elseif ( bbp_allow_forum_mods() ) {
65 $caps = array( $cap );
66
67 // Bail if no post to check.
68 if ( empty( $args[0] ) ) {
69 break;
70 }
71
72 // Get the post.
73 $_post = get_post( $args[0] );
74 if ( empty( $_post ) ) {
75 break;
76 }
77
78 // Get forum ID for specific type of post.
79 switch ( $_post->post_type ) {
80
81 // Forum.
82 case bbp_get_forum_post_type() :
83 $forum_id = bbp_get_forum_id( $_post->ID );
84 break;
85
86 // Topic.
87 case bbp_get_topic_post_type() :
88 $forum_id = bbp_get_topic_forum_id( $_post->ID );
89 break;
90
91 // Reply.
92 case bbp_get_reply_post_type() :
93 $forum_id = bbp_get_reply_forum_id( $_post->ID );
94 break;
95
96 // Any other post type defaults to 0.
97 default :
98 $forum_id = 0;
99 break;
100 }
101
102 // Bail if no forum ID.
103 if ( empty( $forum_id ) ) {
104 break;
105 }
106
107 // User is mod of this forum
108 if ( bbp_is_object_of_user( $forum_id, $user_id, '_bbp_moderator_id' ) ) {
109 $caps = array( 'spectate' );
110 }
111 }
112
113 break;
114
115 /** Super Moderators **************************************************/
116
117 case 'edit_user' :
118 case 'promote_user' :
119 $wp_query = bbp_get_wp_query();
120
121 // Moderators can edit users if super moderators is enabled.
122 if ( bbp_allow_super_mods() && ! is_admin() && ! empty( $wp_query->bbp_is_single_user ) && ( true === $wp_query->bbp_is_single_user ) ) {
123
124 // Get the user ID
125 $_user_id = ! empty( $args[0] )
126 ? (int) $args[0]
127 : bbp_get_displayed_user_id();
128
129 // Users can always edit themselves, so only map for others.
130 if ( ! empty( $_user_id ) && ( $_user_id !== $user_id ) ) {
131
132 // Limit edits to site members and protect staff roles from peers.
133 if (
134 ( ! is_multisite() || is_user_member_of_blog( $_user_id ) )
135 && ! bbp_is_user_keymaster( $_user_id )
136 && ! user_can( $_user_id, 'manage_options' )
137 && ! is_super_admin( $_user_id )
138 && ( ( 'edit_user' === $cap ) || ! user_can( $_user_id, 'moderate' ) )
139 ) {
140 $caps = array( 'moderate' );
141 }
142 }
143 }
144
145 break;
146 }
147
148 // Filter & return
149 return (array) apply_filters( 'bbp_map_primary_meta_caps', $caps, $cap, $user_id, $args );
150 }
151
152 /**
153 * Set a user's role in the forums
154 *
155 * @since 2.2.0 bbPress (r4289)
156 *
157 * @param int $user_id
158 *
159 * @return mixed False if no change. String of new role if changed.
160 */
161 function bbp_set_user_role( $user_id = 0, $new_role = '' ) {
162
163 // Validate user id
164 $user_id = bbp_get_user_id( $user_id, false, false );
165 $user = get_userdata( $user_id );
166
167 // User exists
168 if ( ! empty( $user ) ) {
169
170 // Get user forum role
171 $role = bbp_get_user_role( $user_id );
172
173 // User already has this role so no new role is set
174 if ( $new_role === $role ) {
175 $new_role = false;
176
177 // User role is different than the new (valid) role
178 } elseif ( bbp_is_valid_role( $new_role ) ) {
179
180 // Remove the old role
181 if ( ! empty( $role ) ) {
182 $user->remove_role( $role );
183 }
184
185 // Add the new role
186 if ( ! empty( $new_role ) ) {
187 $user->add_role( $new_role );
188 }
189 }
190
191 // User does not exist so return false
192 } else {
193 $new_role = false;
194 }
195
196 // Filter & return
197 return apply_filters( 'bbp_set_user_role', $new_role, $user_id, $user );
198 }
199
200 /**
201 * Return a user's forums role
202 *
203 * @since 2.1.0 bbPress (r3860)
204 *
205 * @param int $user_id
206 *
207 * @return string
208 */
209 function bbp_get_user_role( $user_id = 0 ) {
210
211 // Validate user id
212 $user_id = bbp_get_user_id( $user_id );
213 $user = get_userdata( $user_id );
214 $role = false;
215
216 // User has roles so look for a bbPress one
217 if ( ! empty( $user->roles ) ) {
218
219 // Look for a bbPress role
220 $roles = array_intersect(
221 array_values( $user->roles ),
222 array_keys( bbp_get_dynamic_roles() )
223 );
224
225 // If there's a role in the array, use the first one. This isn't very
226 // smart, but since roles aren't exactly hierarchical, and bbPress
227 // does not yet have a UI for multiple user roles, it's fine for now.
228 if ( ! empty( $roles ) ) {
229 $role = array_shift( $roles );
230 }
231 }
232
233 // Filter & return
234 return apply_filters( 'bbp_get_user_role', $role, $user_id, $user );
235 }
236
237 /**
238 * Return a user's blog role
239 *
240 * @since 2.3.0 bbPress (r4447)
241 *
242 * @param int $user_id
243 *
244 * @return string
245 */
246 function bbp_get_user_blog_role( $user_id = 0 ) {
247
248 // Validate user id
249 $user_id = bbp_get_user_id( $user_id );
250 $user = get_userdata( $user_id );
251 $role = false;
252
253 // User has roles so lets
254 if ( ! empty( $user->roles ) ) {
255
256 // Look for a non bbPress role
257 $roles = array_intersect(
258 array_values( $user->roles ),
259 array_keys( bbp_get_blog_roles() )
260 );
261
262 // If there's a role in the array, use the first one. This isn't very
263 // smart, but since roles aren't exactly hierarchical, and WordPress
264 // does not yet have a UI for multiple user roles, it's fine for now.
265 if ( ! empty( $roles ) ) {
266 $role = array_shift( $roles );
267 }
268 }
269
270 // Filter & return
271 return apply_filters( 'bbp_get_user_blog_role', $role, $user_id, $user );
272 }
273
274 /**
275 * Helper function to save or update user roles and capabilities.
276 *
277 * By default, this is hooked to the `bbp_profile_update` action which fires
278 * after a user profile is updated to avoid being stomped by set_role().
279 *
280 * @since 2.2.0 bbPress (r4330)
281 *
282 * @param int $user_id
283 *
284 * @return void If no user ID passed, invalid request, trying to set own role,
285 * current user cannot promote the passing user, or no role passed
286 */
287 function bbp_profile_update_role( $user_id = 0 ) {
288
289 // Bail if no user ID
290 $user_id = bbp_get_user_id( $user_id, false, false );
291 if ( empty( $user_id ) ) {
292 return;
293 }
294
295 // Bail if not a user profile form post request
296 if ( ! bbp_is_user_profile_form_post_request( $user_id ) ) {
297 return;
298 }
299
300 // Bail if trying to set their own role
301 if ( bbp_is_user_home_edit() ) {
302 return;
303 }
304
305 // Bail if the current user cannot edit the forum role.
306 if ( ! bbp_current_user_can_edit_user_field( 'forum_role', $user_id ) ) {
307 return;
308 }
309
310 // Bail if current user cannot promote the passing user
311 if ( ! current_user_can( 'promote_user', $user_id ) ) {
312 return;
313 }
314
315 // Bail if no role
316 if ( ! isset( $_POST['bbp-forums-role'] ) || ! is_string( $_POST['bbp-forums-role'] ) ) {
317 return;
318 }
319
320 // Forums role we want the user to have.
321 $new_role = sanitize_key( wp_unslash( $_POST['bbp-forums-role'] ) );
322
323 // Bail if the current user cannot assign this forum role.
324 if ( ! array_key_exists( $new_role, bbp_get_user_editable_forum_roles( $user_id ) ) ) {
325 return;
326 }
327
328 // Set the new forums role
329 bbp_set_user_role( $user_id, $new_role );
330 }
331
332 /**
333 * Return the forum roles the current user may assign to another user.
334 *
335 * @since 2.6.17 bbPress (r7514)
336 * @since 2.6.19 bbPress (r7686) Allow site administrators to assign staff roles.
337 *
338 * @param int $user_id User being edited. Defaults to the displayed user.
339 * @return array Filtered array of editable forum roles.
340 */
341 function bbp_get_user_editable_forum_roles( $user_id = 0 ) {
342 $user_id = bbp_get_user_id( $user_id, false, false );
343 $roles = bbp_get_dynamic_roles();
344
345 // Only keymasters and site administrators may assign staff roles.
346 if ( ! bbp_is_user_keymaster() && ! current_user_can( 'manage_options' ) ) {
347 unset(
348 $roles[ bbp_get_keymaster_role() ],
349 $roles[ bbp_get_moderator_role() ]
350 );
351 }
352
353 // Filter & return.
354 return (array) apply_filters( 'bbp_get_user_editable_forum_roles', $roles, $user_id, bbp_get_current_user_id() );
355 }
356
357 /**
358 * Return whether the current user may edit a user-profile field.
359 *
360 * @since 2.6.17 bbPress (r7514)
361 *
362 * @param string $field Profile field group: profile, email, password,
363 * site_role, or forum_role.
364 * @param int $user_id User being edited. Defaults to the displayed user.
365 * @return bool Whether the field may be edited.
366 */
367 function bbp_current_user_can_edit_user_field( $field = 'profile', $user_id = 0 ) {
368 $user_id = bbp_get_user_id( $user_id, false, false );
369 $current_user_id = bbp_get_current_user_id();
370
371 // Default to the general profile-edit capability.
372 $retval = current_user_can( 'edit_user', $user_id );
373
374 // Apply narrower defaults to sensitive field groups.
375 switch ( $field ) {
376 case 'email':
377 case 'password':
378 $retval = ! empty( $user_id )
379 && ! empty( $current_user_id )
380 && $retval
381 && ( ( $user_id === $current_user_id )
382 || bbp_is_user_keymaster( $current_user_id )
383 || current_user_can( 'manage_options' ) );
384 break;
385
386 case 'site_role':
387 $retval = current_user_can( 'promote_users' )
388 && current_user_can( 'promote_user', $user_id );
389 break;
390
391 case 'forum_role':
392 $retval = current_user_can( 'promote_user', $user_id );
393 break;
394 }
395
396 // Filter & return.
397 return (bool) apply_filters( 'bbp_current_user_can_edit_user_field', $retval, $field, $user_id, $current_user_id );
398 }
399
400 /**
401 * Check if a role string is valid
402 *
403 * @since 2.6.5 bbPress (r7087)
404 *
405 * @param string $role
406 *
407 * @return bool True if role is valid. False if role is not valid.
408 */
409 function bbp_is_valid_role( $role = '' ) {
410
411 // Default return value
412 $retval = false;
413
414 // Skip if no role to check
415 if ( ! empty( $role ) && is_string( $role ) ) {
416
417 // Get the dynamic role IDs
418 $roles = array_keys( bbp_get_dynamic_roles() );
419
420 // Skip if no known role IDs
421 if ( ! empty( $roles ) ) {
422
423 // Is role in dynamic roles array?
424 $retval = in_array( $role, $roles, true );
425 }
426 }
427
428 // Filter & return
429 return (bool) apply_filters( 'bbp_is_valid_role', $retval, $role );
430 }
431
432 /**
433 * Add the default role to the current user if needed
434 *
435 * This function will bail if the forum is not global in a multisite
436 * installation of WordPress, or if the user is marked as spam or deleted.
437 *
438 * @since 2.2.0 bbPress (r4185)
439 *
440 * @return void If not multisite, not global, or user is deleted/spammed
441 */
442 function bbp_set_current_user_default_role() {
443
444 /** Sanity ****************************************************************/
445
446 // Bail if deactivating bbPress
447 if ( bbp_is_deactivation() ) {
448 return;
449 }
450
451 // Catch all, to prevent premature user initialization
452 if ( ! did_action( 'set_current_user' ) ) {
453 return;
454 }
455
456 // Bail if not logged in or already a member of this site
457 if ( ! is_user_logged_in() ) {
458 return;
459 }
460
461 // Get the current user ID
462 $user_id = bbp_get_current_user_id();
463
464 // Bail if user already has a forums role
465 if ( bbp_get_user_role( $user_id ) ) {
466 return;
467 }
468
469 // Bail if user is marked as spam or is deleted
470 if ( bbp_is_user_inactive( $user_id ) ) {
471 return;
472 }
473
474 /** Ready *****************************************************************/
475
476 // Load up bbPress once
477 $bbp = bbpress();
478
479 // Get whether or not to add a role to the user account
480 $add_to_site = bbp_allow_global_access();
481
482 // Get the current user's WordPress role. Set to empty string if none found.
483 $user_role = bbp_get_user_blog_role( $user_id );
484
485 // Get the role map
486 $role_map = bbp_get_user_role_map();
487
488 /** Forum Role ************************************************************/
489
490 // Use a mapped role or default role
491 $new_role = empty( $user_role ) || ! isset( $role_map[ $user_role ] )
492 ? bbp_get_default_role()
493 : $role_map[ $user_role ];
494
495 /** Add or Map ************************************************************/
496
497 // Add the user to the site
498 if ( true === $add_to_site ) {
499 bbp_set_user_role( $user_id, $new_role );
500
501 // Don't add the user, but still give them the correct caps dynamically
502 } else {
503 $bbp->current_user->caps[ $new_role ] = true;
504 $bbp->current_user->get_role_caps();
505 }
506 }
507
508 /**
509 * Return a map of WordPress roles to bbPress roles. Used to automatically grant
510 * appropriate bbPress roles to WordPress users that wouldn't already have a
511 * role in the forums. Also guarantees WordPress admins get the Keymaster role.
512 *
513 * @since 2.2.0 bbPress (r4335)
514 *
515 * @return array Filtered array of WordPress roles to bbPress roles
516 */
517 function bbp_get_user_role_map() {
518
519 // Get the default role once here
520 $default_role = bbp_get_default_role();
521
522 // Filter & return
523 return (array) apply_filters(
524 'bbp_get_user_role_map',
525 array(
526 'administrator' => bbp_get_keymaster_role(),
527 'editor' => $default_role,
528 'author' => $default_role,
529 'contributor' => $default_role,
530 'subscriber' => $default_role
531 )
532 );
533 }
534
535 /** User Status ***************************************************************/
536
537 /**
538 * Checks if the user has been marked as a spammer.
539 *
540 * @since 2.0.0 bbPress (r3356)
541 *
542 * @param int $user_id int The ID for the user.
543 * @return bool True if spammer, False if not.
544 */
545 function bbp_is_user_spammer( $user_id = 0 ) {
546
547 // Default to current user
548 if ( empty( $user_id ) && is_user_logged_in() ) {
549 $user_id = bbp_get_current_user_id();
550 }
551
552 // No user to check
553 if ( empty( $user_id ) ) {
554 return false;
555 }
556
557 // Assume user is not spam
558 $is_spammer = false;
559
560 // Get user data
561 $user = get_userdata( $user_id );
562
563 // No user found
564 if ( empty( $user ) ) {
565 $is_spammer = false;
566
567 // Check if spam
568 } elseif ( ! empty( $user->spam ) ) {
569 $is_spammer = true;
570 }
571
572 // Filter & return
573 return (bool) apply_filters( 'bbp_core_is_user_spammer', $is_spammer );
574 }
575
576 /**
577 * Mark a users topics and replies as spam when the user is marked as spam
578 *
579 * @since 2.0.0 bbPress (r3410)
580 *
581 * @param int $user_id Optional. User ID to spam. Defaults to displayed user.
582 *
583 * @return bool If no user ID passed.
584 */
585 function bbp_make_spam_user( $user_id = 0 ) {
586
587 // Use displayed user if it's not yourself
588 if ( empty( $user_id ) && bbp_is_single_user() && ! bbp_is_user_home() ) {
589 $user_id = bbp_get_displayed_user_id();
590 }
591
592 // Bail if no user ID
593 if ( empty( $user_id ) ) {
594 return false;
595 }
596
597 // Bail if user ID is keymaster
598 if ( bbp_is_user_keymaster( $user_id ) ) {
599 return false;
600 }
601
602 // Arm the torpedos
603 $bbp_db = bbp_db();
604
605 // Get the blog IDs of the user to mark as spam
606 $blogs = get_blogs_of_user( $user_id, true );
607
608 // If user has no blogs, they are a guest on this site
609 if ( empty( $blogs ) ) {
610 $blogs[ $bbp_db->blogid ] = array();
611 }
612
613 // Process replies before topics so topic status helpers run last
614 $post_types = array( bbp_get_reply_post_type(), bbp_get_topic_post_type() );
615
616 // Get array of statuses to mark as spam
617 $post_statuses = bbp_get_public_topic_statuses();
618 $post_statuses = "'" . implode( "', '", $post_statuses ) . "'";
619
620 // Loop through blogs and remove their posts
621 foreach ( (array) array_keys( $blogs ) as $blog_id ) {
622
623 // Switch to the site ID
624 bbp_switch_to_site( $blog_id );
625
626 foreach ( $post_types as $post_type ) {
627
628 // Get posts of this type
629 $query = $bbp_db->prepare( "SELECT ID FROM {$bbp_db->posts} WHERE post_author = %d AND post_status IN ( {$post_statuses} ) AND post_type = %s", $user_id, $post_type );
630 $posts = $bbp_db->get_col( $query );
631
632 // Loop through posts and spam them
633 if ( ! empty( $posts ) ) {
634 foreach ( $posts as $post_id ) {
635
636 // The routines for topics and replies are different, so use the
637 // correct one based on the post type
638 switch ( $post_type ) {
639
640 case bbp_get_topic_post_type() :
641 bbp_spam_topic( $post_id );
642 break;
643
644 case bbp_get_reply_post_type() :
645 bbp_spam_reply( $post_id );
646 break;
647 }
648 }
649 }
650 }
651
652 // Switch back to current site
653 bbp_restore_current_site();
654 }
655
656 // Delete user options
657 bbp_delete_user_options( $user_id );
658
659 // Success
660 return true;
661 }
662
663 /**
664 * Mark a users topics and replies as spam when the user is marked as spam
665 *
666 * @since 2.0.0 bbPress (r3410)
667 *
668 * @param int $user_id Optional. User ID to unspam. Defaults to displayed user.
669 *
670 * @return bool If no user ID passed.
671 */
672 function bbp_make_ham_user( $user_id = 0 ) {
673
674 // Use displayed user if it's not yourself
675 if ( empty( $user_id ) && bbp_is_single_user() && ! bbp_is_user_home() ) {
676 $user_id = bbp_get_displayed_user_id();
677 }
678
679 // Bail if no user ID
680 if ( empty( $user_id ) ) {
681 return false;
682 }
683
684 // Bail if user ID is keymaster
685 if ( bbp_is_user_keymaster( $user_id ) ) {
686 return false;
687 }
688
689 // Arm the torpedos
690 $bbp_db = bbp_db();
691
692 // Get the blog IDs of the user to mark as spam
693 $blogs = get_blogs_of_user( $user_id, true );
694
695 // If user has no blogs, they are a guest on this site
696 if ( empty( $blogs ) ) {
697 $blogs[ $bbp_db->blogid ] = array();
698 }
699
700 // Process replies before topics so topic status helpers run last
701 $post_types = array( bbp_get_reply_post_type(), bbp_get_topic_post_type() );
702
703 // Get array of statuses to unmark as spam
704 $post_statuses = array( bbp_get_spam_status_id() );
705 $post_statuses = "'" . implode( "', '", $post_statuses ) . "'";
706
707 // Loop through blogs and remove their posts
708 foreach ( (array) array_keys( $blogs ) as $blog_id ) {
709
710 // Switch to the site ID
711 bbp_switch_to_site( $blog_id );
712
713 foreach ( $post_types as $post_type ) {
714
715 // Get posts of this type
716 $query = $bbp_db->prepare( "SELECT ID FROM {$bbp_db->posts} WHERE post_author = %d AND post_status IN ( {$post_statuses} ) AND post_type = %s", $user_id, $post_type );
717 $posts = $bbp_db->get_col( $query );
718
719 // Loop through posts and unspam them
720 if ( ! empty( $posts ) ) {
721 foreach ( $posts as $post_id ) {
722
723 // The routines for topics and replies are different, so use the
724 // correct one based on the post type
725 switch ( $post_type ) {
726
727 case bbp_get_topic_post_type() :
728 bbp_unspam_topic( $post_id );
729 break;
730
731 case bbp_get_reply_post_type() :
732 bbp_unspam_reply( $post_id );
733 break;
734 }
735 }
736 }
737 }
738
739 // Switch back to current site
740 bbp_restore_current_site();
741 }
742
743 // Update topic & reply counts
744 bbp_update_user_topic_count( $user_id, bbp_get_user_topic_count_raw( $user_id ) );
745 bbp_update_user_reply_count( $user_id, bbp_get_user_reply_count_raw( $user_id ) );
746
747 // Update last posted (to now)
748 bbp_update_user_last_posted( $user_id );
749
750 // Success
751 return true;
752 }
753
754 /**
755 * Checks if the user has been marked as deleted.
756 *
757 * @since 2.0.0 bbPress (r3356)
758 *
759 * @param int $user_id int The ID for the user.
760 * @return bool True if deleted, False if not.
761 */
762 function bbp_is_user_deleted( $user_id = 0 ) {
763
764 // Default to current user
765 if ( empty( $user_id ) && is_user_logged_in() ) {
766 $user_id = bbp_get_current_user_id();
767 }
768
769 // No user to check
770 if ( empty( $user_id ) ) {
771 return false;
772 }
773
774 // Assume user is not deleted
775 $is_deleted = false;
776
777 // Get user data
778 $user = get_userdata( $user_id );
779
780 // No user found
781 if ( empty( $user ) ) {
782 $is_deleted = true;
783
784 // Check if deleted
785 } elseif ( ! empty( $user->deleted ) ) {
786 $is_deleted = true;
787 }
788
789 // Filter & return
790 return (bool) apply_filters( 'bbp_core_is_user_deleted', $is_deleted );
791 }
792
793 /**
794 * Checks if user is active
795 *
796 * @since 2.0.0 bbPress (r3504)
797 *
798 * @param int $user_id The user ID to check
799 * @return bool True if public, false if not
800 */
801 function bbp_is_user_active( $user_id = 0 ) {
802
803 // No user to check
804 $user_id = bbp_get_user_id( $user_id, false, true );
805 if ( empty( $user_id ) ) {
806 return false;
807 }
808
809 // Check spam
810 if ( bbp_is_user_spammer( $user_id ) ) {
811 return false;
812 }
813
814 // Check deleted
815 if ( bbp_is_user_deleted( $user_id ) ) {
816 return false;
817 }
818
819 // Assume true if not spam or deleted
820 return true;
821 }
822
823 /**
824 * Checks if user is not active.
825 *
826 * @since 2.0.0 bbPress (r3504)
827 *
828 * @param int $user_id The user ID to check. Defaults to current user ID
829 * @return bool True if inactive, false if active
830 */
831 function bbp_is_user_inactive( $user_id = 0 ) {
832 return ! bbp_is_user_active( $user_id );
833 }
834
835 /**
836 * Checks if user is a keymaster
837 *
838 * @since 2.3.0 bbPress (r4783)
839 *
840 * @param int $user_id
841 * @return bool True if keymaster, false if not
842 */
843 function bbp_is_user_keymaster( $user_id = 0 ) {
844 $_user_id = bbp_get_user_id( $user_id, false, true );
845 $retval = user_can( $_user_id, 'keep_gate' );
846
847 // Filter & return
848 return (bool) apply_filters( 'bbp_is_user_keymaster', $retval, $_user_id, $user_id );
849 }
850
851 /**
852 * Does a user have a profile for the current site
853 *
854 * @since 2.2.0 bbPress (r4363)
855 *
856 * @param int $user_id User ID to check
857 *
858 * @return bool Whether or not the user has a profile on this blog_id.
859 */
860 function bbp_user_has_profile( $user_id = 0 ) {
861
862 // Assume every user has a profile
863 $retval = true;
864
865 // Validate user ID, default to displayed or current user
866 $user_id = bbp_get_user_id( $user_id, true, true );
867
868 // Try to get this user's data
869 $user = get_userdata( $user_id );
870
871 // No user found, return false
872 if ( empty( $user ) ) {
873 $retval = false;
874
875 // User is inactive, and current user is not a keymaster
876 } elseif ( ! bbp_is_user_keymaster() && bbp_is_user_inactive( $user->ID ) ) {
877 $retval = false;
878 }
879
880 // Filter & return
881 return (bool) apply_filters( 'bbp_show_user_profile', $retval, $user_id );
882 }
883
884 /** Moderators ****************************************************************/
885
886 /**
887 * Add a moderator to an object
888 *
889 * @since 2.6.0 bbPress (r6056)
890 *
891 * @param int $object_id Traditionally a post ID
892 * @param int $user_id User ID
893 * @param string $object_type Type of meta (post,term,user,comment)
894 *
895 * @return bool
896 */
897 function bbp_add_moderator( $object_id = 0, $user_id = 0, $object_type = 'post' ) {
898 return bbp_add_user_to_object( $object_id, $user_id, '_bbp_moderator_id', $object_type );
899 }
900
901 /**
902 * Remove a moderator user ID from an object
903 *
904 * @since 2.6.0 bbPress (r6056)
905 *
906 * @param int $object_id Traditionally a post ID
907 * @param int $user_id User ID
908 * @param string $object_type Type of meta (post,term,user,comment)
909 *
910 * @return bool
911 */
912 function bbp_remove_moderator( $object_id = 0, $user_id = 0, $object_type = 'post' ) {
913 return bbp_remove_user_from_object( $object_id, $user_id, '_bbp_moderator_id', $object_type );
914 }
915
916 /**
917 * Get user IDs of moderators for an object
918 *
919 * @since 2.6.0 bbPress (r6056)
920 *
921 * @param int $object_id Traditionally a post ID
922 * @param string $object_type Type of meta (post,term,user,comment)
923 *
924 * @return array
925 */
926 function bbp_get_moderator_ids( $object_id = 0, $object_type = 'post' ) {
927 return bbp_get_users_for_object( $object_id, '_bbp_moderator_id', $object_type );
928 }
929
930 /**
931 * Get moderators for a specific object ID. Will return global moderators when
932 * object ID is empty.
933 *
934 * @since 2.6.0 bbPress (r6056)
935 *
936 * @param int $object_id Traditionally a post ID
937 * @param string $object_type Type of meta (post,term,user,comment)
938 *
939 * @return array
940 */
941 function bbp_get_moderators( $object_id = 0, $object_type = 'post' ) {
942
943 // Get global moderators
944 if ( empty( $object_id ) ) {
945 $users = get_users(
946 array(
947 'role__in' => bbp_get_moderator_role(),
948 )
949 );
950
951 // Get object moderators
952 } else {
953 $users = get_users(
954 array(
955 'include' => bbp_get_moderator_ids( $object_id, $object_type ),
956 )
957 );
958 }
959
960 // Filter & return
961 return (array) apply_filters( 'bbp_get_moderators', $users, $object_id, $object_type );
962 }
963