PluginProbe
bbPress / 2.2.2
bbPress v2.2.2
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 2.2 2.2.1 2.2.2 All 71 releases
bbpress / includes / core / capabilities.php

capabilities.php in bbPress 2.2.2, at includes/core/capabilities.php

546 lines 14.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * bbPress Capabilites
5 *
6 * The functions in this file are used primarily as convenient wrappers for
7 * capability output in user profiles. This includes mapping capabilities and
8 * groups to human readable strings,
9 *
10 * @package bbPress
11 * @subpackage Capabilities
12 */
13
14 // Exit if accessed directly
15 if ( !defined( 'ABSPATH' ) ) exit;
16
17 /** Mapping *******************************************************************/
18
19 /**
20 * Returns an array of capabilities based on the role that is being requested.
21 *
22 * @since bbPress (r2994)
23 *
24 * @todo Map all of these and deprecate
25 *
26 * @param string $role Optional. Defaults to The role to load caps for
27 * @uses apply_filters() Allow return value to be filtered
28 *
29 * @return array Capabilities for $role
30 */
31 function bbp_get_caps_for_role( $role = '' ) {
32
33 // Which role are we looking for?
34 switch ( $role ) {
35
36 // Keymaster
37 case bbp_get_keymaster_role() :
38 $caps = array(
39
40 // Keymasters only
41 'keep_gate' => true,
42
43 // Primary caps
44 'spectate' => true,
45 'participate' => true,
46 'moderate' => true,
47 'throttle' => true,
48 'view_trash' => true,
49
50 // Forum caps
51 'publish_forums' => true,
52 'edit_forums' => true,
53 'edit_others_forums' => true,
54 'delete_forums' => true,
55 'delete_others_forums' => true,
56 'read_private_forums' => true,
57 'read_hidden_forums' => true,
58
59 // Topic caps
60 'publish_topics' => true,
61 'edit_topics' => true,
62 'edit_others_topics' => true,
63 'delete_topics' => true,
64 'delete_others_topics' => true,
65 'read_private_topics' => true,
66
67 // Reply caps
68 'publish_replies' => true,
69 'edit_replies' => true,
70 'edit_others_replies' => true,
71 'delete_replies' => true,
72 'delete_others_replies' => true,
73 'read_private_replies' => true,
74
75 // Topic tag caps
76 'manage_topic_tags' => true,
77 'edit_topic_tags' => true,
78 'delete_topic_tags' => true,
79 'assign_topic_tags' => true
80 );
81
82 break;
83
84 // Moderator
85 case bbp_get_moderator_role() :
86 $caps = array(
87
88 // Primary caps
89 'spectate' => true,
90 'participate' => true,
91 'moderate' => true,
92 'throttle' => true,
93 'view_trash' => false,
94
95 // Forum caps
96 'publish_forums' => true,
97 'edit_forums' => true,
98 'edit_others_forums' => false,
99 'delete_forums' => false,
100 'delete_others_forums' => false,
101 'read_private_forums' => true,
102 'read_hidden_forums' => true,
103
104 // Topic caps
105 'publish_topics' => true,
106 'edit_topics' => true,
107 'edit_others_topics' => true,
108 'delete_topics' => true,
109 'delete_others_topics' => true,
110 'read_private_topics' => true,
111
112 // Reply caps
113 'publish_replies' => true,
114 'edit_replies' => true,
115 'edit_others_replies' => true,
116 'delete_replies' => true,
117 'delete_others_replies' => true,
118 'read_private_replies' => true,
119
120 // Topic tag caps
121 'manage_topic_tags' => true,
122 'edit_topic_tags' => true,
123 'delete_topic_tags' => true,
124 'assign_topic_tags' => true,
125 );
126
127 break;
128
129 // Spectators can only read
130 case bbp_get_spectator_role() :
131 $caps = array(
132
133 // Primary caps
134 'spectate' => true,
135 'participate' => false,
136 'moderate' => false,
137 'throttle' => false,
138 'view_trash' => false,
139
140 // Forum caps
141 'publish_forums' => false,
142 'edit_forums' => false,
143 'edit_others_forums' => false,
144 'delete_forums' => false,
145 'delete_others_forums' => false,
146 'read_private_forums' => false,
147 'read_hidden_forums' => false,
148
149 // Topic caps
150 'publish_topics' => false,
151 'edit_topics' => false,
152 'edit_others_topics' => false,
153 'delete_topics' => false,
154 'delete_others_topics' => false,
155 'read_private_topics' => false,
156
157 // Reply caps
158 'publish_replies' => false,
159 'edit_replies' => false,
160 'edit_others_replies' => false,
161 'delete_replies' => false,
162 'delete_others_replies' => false,
163 'read_private_replies' => false,
164
165 // Topic tag caps
166 'manage_topic_tags' => false,
167 'edit_topic_tags' => false,
168 'delete_topic_tags' => false,
169 'assign_topic_tags' => false,
170 );
171
172 break;
173
174 // Explicitly blocked
175 case bbp_get_blocked_role() :
176 $caps = array(
177
178 // Primary caps
179 'spectate' => false,
180 'participate' => false,
181 'moderate' => false,
182 'throttle' => false,
183 'view_trash' => false,
184
185 // Forum caps
186 'publish_forums' => false,
187 'edit_forums' => false,
188 'edit_others_forums' => false,
189 'delete_forums' => false,
190 'delete_others_forums' => false,
191 'read_private_forums' => false,
192 'read_hidden_forums' => false,
193
194 // Topic caps
195 'publish_topics' => false,
196 'edit_topics' => false,
197 'edit_others_topics' => false,
198 'delete_topics' => false,
199 'delete_others_topics' => false,
200 'read_private_topics' => false,
201
202 // Reply caps
203 'publish_replies' => false,
204 'edit_replies' => false,
205 'edit_others_replies' => false,
206 'delete_replies' => false,
207 'delete_others_replies' => false,
208 'read_private_replies' => false,
209
210 // Topic tag caps
211 'manage_topic_tags' => false,
212 'edit_topic_tags' => false,
213 'delete_topic_tags' => false,
214 'assign_topic_tags' => false,
215 );
216
217 break;
218
219 // Participant/Default
220 case bbp_get_participant_role() :
221 default :
222 $caps = array(
223
224 // Primary caps
225 'spectate' => true,
226 'participate' => true,
227 'moderate' => false,
228 'throttle' => false,
229 'view_trash' => false,
230
231 // Forum caps
232 'publish_forums' => false,
233 'edit_forums' => false,
234 'edit_others_forums' => false,
235 'delete_forums' => false,
236 'delete_others_forums' => false,
237 'read_private_forums' => true,
238 'read_hidden_forums' => false,
239
240 // Topic caps
241 'publish_topics' => true,
242 'edit_topics' => true,
243 'edit_others_topics' => false,
244 'delete_topics' => false,
245 'delete_others_topics' => false,
246 'read_private_topics' => false,
247
248 // Reply caps
249 'publish_replies' => true,
250 'edit_replies' => true,
251 'edit_others_replies' => false,
252 'delete_replies' => false,
253 'delete_others_replies' => false,
254 'read_private_replies' => false,
255
256 // Topic tag caps
257 'manage_topic_tags' => false,
258 'edit_topic_tags' => false,
259 'delete_topic_tags' => false,
260 'assign_topic_tags' => true,
261 );
262
263 break;
264 }
265
266 return apply_filters( 'bbp_get_caps_for_role', $caps, $role );
267 }
268
269 /**
270 * Adds capabilities to WordPress user roles.
271 *
272 * @since bbPress (r2608)
273 */
274 function bbp_add_caps() {
275
276 // Loop through available roles and add caps
277 foreach( bbp_get_wp_roles()->role_objects as $role ) {
278 foreach ( bbp_get_caps_for_role( $role->name ) as $cap => $value ) {
279 $role->add_cap( $cap, $value );
280 }
281 }
282
283 do_action( 'bbp_add_caps' );
284 }
285
286 /**
287 * Removes capabilities from WordPress user roles.
288 *
289 * @since bbPress (r2608)
290 */
291 function bbp_remove_caps() {
292
293 // Loop through available roles and remove caps
294 foreach( bbp_get_wp_roles()->role_objects as $role ) {
295 foreach ( array_keys( bbp_get_caps_for_role( $role->name ) ) as $cap ) {
296 $role->remove_cap( $cap );
297 }
298 }
299
300 do_action( 'bbp_remove_caps' );
301 }
302
303 /**
304 * Get the $wp_roles global without needing to declare it everywhere
305 *
306 * @since bbPress (r4293)
307 *
308 * @global WP_Roles $wp_roles
309 * @return WP_Roles
310 */
311 function bbp_get_wp_roles() {
312 global $wp_roles;
313
314 // Load roles if not set
315 if ( ! isset( $wp_roles ) )
316 $wp_roles = new WP_Roles();
317
318 return $wp_roles;
319 }
320
321 /** Forum Roles ***************************************************************/
322
323 /**
324 * Add the bbPress roles to the $wp_roles global.
325 *
326 * We do this to avoid adding these values to the database.
327 *
328 * @since bbPress (r4290)
329 */
330 function bbp_add_forums_roles() {
331 $wp_roles = bbp_get_wp_roles();
332
333 foreach( bbp_get_dynamic_roles() as $role_id => $details ) {
334 $wp_roles->roles[$role_id] = $details;
335 $wp_roles->role_objects[$role_id] = new WP_Role( $details['name'], $details['capabilities'] );
336 $wp_roles->role_names[$role_id] = $details['name'];
337 }
338 }
339
340 /**
341 * Helper function to add filter to option_wp_user_roles
342 *
343 * @since bbPress (r4363)
344 *
345 * @see _bbp_reinit_dynamic_roles()
346 *
347 * @global WPDB $wpdb Used to get the database prefix
348 */
349 function bbp_filter_user_roles_option() {
350 global $wpdb;
351
352 $role_key = $wpdb->prefix . 'user_roles';
353
354 add_filter( 'option_' . $role_key, '_bbp_reinit_dynamic_roles' );
355 }
356
357 /**
358 * This is necessary because in a few places (noted below) WordPress initializes
359 * a blog's roles directly from the database option. When this happens, the
360 * $wp_roles global gets flushed, causing a user to magically lose any
361 * dynamically assigned roles or capabilities when $current_user in refreshed.
362 *
363 * Because dynamic multiple roles is a new concept in WordPress, we work around
364 * it here for now, knowing that improvements will come to WordPress core later.
365 *
366 * @see switch_to_blog()
367 * @see restore_current_blog()
368 * @see WP_Roles::_init()
369 *
370 * @since bbPress (r4363)
371 *
372 * @internal Used by bbPress to reinitialize dynamic roles on blog switch
373 *
374 * @param array $roles
375 * @return array Combined array of database roles and dynamic bbPress roles
376 */
377 function _bbp_reinit_dynamic_roles( $roles = array() ) {
378 foreach( bbp_get_dynamic_roles() as $role_id => $details ) {
379 $roles[$role_id] = $details;
380 }
381 return $roles;
382 }
383
384 /**
385 * Fetch a filtered list of forum roles that the current user is
386 * allowed to have.
387 *
388 * Simple function who's main purpose is to allow filtering of the
389 * list of forum roles so that plugins can remove inappropriate ones depending
390 * on the situation or user making edits.
391 *
392 * Specifically because without filtering, anyone with the edit_users
393 * capability can edit others to be administrators, even if they are
394 * only editors or authors. This filter allows admins to delegate
395 * user management.
396 *
397 * @since bbPress (r4284)
398 *
399 * @return array
400 */
401 function bbp_get_dynamic_roles() {
402 return (array) apply_filters( 'bbp_get_dynamic_roles', array(
403
404 // Keymaster
405 bbp_get_keymaster_role() => array(
406 'name' => __( 'Keymaster', 'bbpress' ),
407 'capabilities' => bbp_get_caps_for_role( bbp_get_keymaster_role() )
408 ),
409
410 // Moderator
411 bbp_get_moderator_role() => array(
412 'name' => __( 'Moderator', 'bbpress' ),
413 'capabilities' => bbp_get_caps_for_role( bbp_get_moderator_role() )
414 ),
415
416 // Participant
417 bbp_get_participant_role() => array(
418 'name' => __( 'Participant', 'bbpress' ),
419 'capabilities' => bbp_get_caps_for_role( bbp_get_participant_role() )
420 ),
421
422 // Spectator
423 bbp_get_spectator_role() => array(
424 'name' => __( 'Spectator', 'bbpress' ),
425 'capabilities' => bbp_get_caps_for_role( bbp_get_spectator_role() )
426 ),
427
428 // Blocked
429 bbp_get_blocked_role() => array(
430 'name' => __( 'Blocked', 'bbpress' ),
431 'capabilities' => bbp_get_caps_for_role( bbp_get_blocked_role() )
432 )
433 ) );
434 }
435
436 /**
437 * Removes the bbPress roles from the editable roles array
438 *
439 * This used to use array_diff_assoc() but it randomly broke before 2.2 release.
440 * Need to research what happened, and if there's a way to speed this up.
441 *
442 * @since bbPress (r4303)
443 *
444 * @param array $all_roles All registered roles
445 * @return array
446 */
447 function bbp_filter_blog_editable_roles( $all_roles = array() ) {
448
449 // Loop through bbPress roles
450 foreach ( array_keys( bbp_get_dynamic_roles() ) as $bbp_role ) {
451
452 // Loop through WordPress roles
453 foreach ( array_keys( $all_roles ) as $wp_role ) {
454
455 // If keys match, unset
456 if ( $wp_role == $bbp_role ) {
457 unset( $all_roles[$wp_role] );
458 }
459 }
460 }
461
462 return $all_roles;
463 }
464
465 /**
466 * The keymaster role for bbPress users
467 *
468 * @since bbPress (r4284)
469 *
470 * @uses apply_filters() Allow override of hardcoded keymaster role
471 * @return string
472 */
473 function bbp_get_keymaster_role() {
474 return apply_filters( 'bbp_get_keymaster_role', 'bbp_keymaster' );
475 }
476
477 /**
478 * The moderator role for bbPress users
479 *
480 * @since bbPress (r3410)
481 *
482 * @uses apply_filters() Allow override of hardcoded moderator role
483 * @return string
484 */
485 function bbp_get_moderator_role() {
486 return apply_filters( 'bbp_get_moderator_role', 'bbp_moderator' );
487 }
488
489 /**
490 * The participant role for registered user that can participate in forums
491 *
492 * @since bbPress (r3410)
493 *
494 * @uses apply_filters() Allow override of hardcoded participant role
495 * @return string
496 */
497 function bbp_get_participant_role() {
498 return apply_filters( 'bbp_get_participant_role', 'bbp_participant' );
499 }
500
501 /**
502 * The spectator role is for registered users without any capabilities
503 *
504 * @since bbPress (r3860)
505 *
506 * @uses apply_filters() Allow override of hardcoded spectator role
507 * @return string
508 */
509 function bbp_get_spectator_role() {
510 return apply_filters( 'bbp_get_spectator_role', 'bbp_spectator' );
511 }
512
513 /**
514 * The blocked role is for registered users that cannot spectate or participate
515 *
516 * @since bbPress (r4284)
517 *
518 * @uses apply_filters() Allow override of hardcoded blocked role
519 * @return string
520 */
521 function bbp_get_blocked_role() {
522 return apply_filters( 'bbp_get_blocked_role', 'bbp_blocked' );
523 }
524
525 /** Deprecated ****************************************************************/
526
527 /**
528 * Adds bbPress-specific user roles.
529 *
530 * @since bbPress (r2741)
531 * @deprecated since version 2.2
532 */
533 function bbp_add_roles() {
534 _doing_it_wrong( 'bbp_add_roles', __( 'Editable forum roles no longer exist.', 'bbpress' ), '2.2' );
535 }
536
537 /**
538 * Removes bbPress-specific user roles.
539 *
540 * @since bbPress (r2741)
541 * @deprecated since version 2.2
542 */
543 function bbp_remove_roles() {
544 _doing_it_wrong( 'bbp_remove_roles', __( 'Editable forum roles no longer exist.', 'bbpress' ), '2.2' );
545 }
546