Capability Manager Enhanced - Version 1.4.6

Version Description

  • Compat : bbPress 2.2 (supports customization of dynamic forum role capabilities)
    • Compat : Press Permit + bbPress - customized role capabilities were not properly maintained on bbPress activation / deactivation, in some scenarios
    • Fixed : Role update and copy failed if currently stored capability array is corrupted
Download this release

Release Info

Developer kevinB
Plugin Icon 128x128 Capability Manager Enhanced
Version 1.4.6
Comparing to
See all releases

Code changes from version 1.4.5 to 1.4.6

Files changed (4) hide show
  1. capsman-enhanced.php +12 -5
  2. includes/admin.php +16 -11
  3. includes/manager.php +73 -12
  4. readme.txt +14 -2
capsman-enhanced.php CHANGED
@@ -3,7 +3,7 @@
3
Plugin Name: Capability Manager Enhanced
4
Plugin URI: http://presspermit.com/capability-manager
5
Description: Manage WordPress role definitions. Organizes available capabilities by post type, status and source.
6
- Version: 1.4.5
7
Author: Jordi Canals, Kevin Behrens
8
Author URI: http://agapetry.net
9
*/
@@ -32,8 +32,8 @@ Author URI: http://agapetry.net
32
*/
33
34
if ( ! defined( 'CAPSMAN_VERSION' ) ) {
35
- define( 'CAPSMAN_VERSION', '1.4.5' );
36
- define( 'CAPSMAN_ENH_VERSION', '1.4.5' );
37
}
38
39
if ( cme_is_plugin_active( 'capsman.php' ) ) {
@@ -80,11 +80,18 @@ if ( cme_is_plugin_active( 'capsman.php' ) ) {
80
}
81
}
82
83
// perf enchancement: display submenu links without loading framework and plugin code
84
function cme_submenus() {
85
- if ( defined( 'PP_VERSION' ) ) // Press Permit integrates into Permissions menu
86
add_action( 'pp_permissions_menu', '_cme_pp_menu' );
87
- else {
88
$menu_caption = ( defined('WPLANG') && WPLANG ) ? __('Capabilities', 'capsman') : __('Role Capabilities', 'capsman');
89
add_users_page( __('Capability Manager', 'capsman'), $menu_caption, 'manage_capabilities', 'capsman', 'cme_fakefunc');
90
}
3
Plugin Name: Capability Manager Enhanced
4
Plugin URI: http://presspermit.com/capability-manager
5
Description: Manage WordPress role definitions. Organizes available capabilities by post type, status and source.
6
+ Version: 1.4.6
7
Author: Jordi Canals, Kevin Behrens
8
Author URI: http://agapetry.net
9
*/
32
*/
33
34
if ( ! defined( 'CAPSMAN_VERSION' ) ) {
35
+ define( 'CAPSMAN_VERSION', '1.4.6' );
36
+ define( 'CAPSMAN_ENH_VERSION', '1.4.6' );
37
}
38
39
if ( cme_is_plugin_active( 'capsman.php' ) ) {
80
}
81
}
82
83
+ add_action( 'plugins_loaded', '_cme_act_pp_active' );
84
+
85
+ function _cme_act_pp_active() {
86
+ if ( defined('PP_VERSION') || defined('PPC_VERSION') )
87
+ define( 'PP_ACTIVE', true );
88
+ }
89
+
90
// perf enchancement: display submenu links without loading framework and plugin code
91
function cme_submenus() {
92
+ if ( defined('PP_ACTIVE') ) { // Press Permit integrates into Permissions menu
93
add_action( 'pp_permissions_menu', '_cme_pp_menu' );
94
+ } else {
95
$menu_caption = ( defined('WPLANG') && WPLANG ) ? __('Capabilities', 'capsman') : __('Role Capabilities', 'capsman');
96
add_users_page( __('Capability Manager', 'capsman'), $menu_caption, 'manage_capabilities', 'capsman', 'cme_fakefunc');
97
}
includes/admin.php CHANGED
@@ -29,11 +29,13 @@
29
$roles = $this->roles;
30
$default = $this->current;
31
32
- if( defined('PP_VERSION') ) {
33
global $wpdb;
34
35
- $pp_supplemental_roles = $wpdb->get_col( "SELECT role_name FROM $wpdb->pp_roles AS r INNER JOIN $wpdb->pp_groups AS g ON g.ID = r.group_id AND r.group_type = 'pp_group' AND r.scope = 'site' WHERE g.metagroup_type = 'wp_role' AND g.metagroup_id = '$default'" );
36
- //dump($pp_supplemental_roles);
37
38
$pp_filtered_types = pp_get_enabled_types('post');
39
$pp_metagroup_caps = array();
@@ -54,7 +56,7 @@ if( defined('PP_VERSION') ) {
54
55
?>
56
<div class="wrap">
57
- <?php if( defined('PP_VERSION') ) :
58
pp_icon();
59
$style = 'style="height:60px;"';
60
?>
@@ -76,7 +78,7 @@ if( defined('PP_VERSION') ) {
76
<dt><?php printf(__('Capabilities for %s', $this->ID), $roles[$default]); ?></dt>
77
<dd>
78
<?php
79
- if ( defined( 'PP_VERSION' ) ) {
80
if ( pp_get_option('display_hints') ) {
81
echo '<div>';
82
_e( 'Use this form to view and modify the capabilities WordPress natively associates with each role. Note:', $this->ID );
@@ -146,6 +148,9 @@ if( defined('PP_VERSION') ) {
146
echo '</div></div>';
147
}
148
149
$current = get_role($default);
150
$rcaps = $current->capabilities;
151
@@ -167,13 +172,13 @@ if( defined('PP_VERSION') ) {
167
168
$cap_properties['edit']['taxonomy'] = array( 'manage_terms' );
169
170
- if ( ! defined( 'PP_VERSION' ) )
171
$cap_properties['edit']['taxonomy'] = array_merge( $cap_properties['edit']['taxonomy'], array( 'edit_terms', 'assign_terms' ) );
172
173
$cap_properties['delete']['type'] = array( 'delete_posts', 'delete_others_posts' );
174
$cap_properties['delete']['type'] = array_merge( $cap_properties['delete']['type'], array( 'delete_published_posts', 'delete_private_posts' ) );
175
176
- if ( ! defined( 'PP_VERSION' ) )
177
$cap_properties['delete']['taxonomy'] = array( 'delete_terms' );
178
else
179
$cap_properties['delete']['taxonomy'] = array();
@@ -219,7 +224,7 @@ if( defined('PP_VERSION') ) {
219
$defined['taxonomy'] = get_taxonomies( array( 'public' => true ), 'object' );
220
221
// Press Permit grants attachment capabilities based on user's capabilities for the parent post
222
- if ( defined( 'PP_VERSION' ) || defined('SCOPER_VERSION') )
223
unset( $defined['type']['attachment'] );
224
225
echo '<ul class="cme-listhoriz">';
@@ -456,7 +461,7 @@ if( defined('PP_VERSION') ) {
456
</table>
457
458
<br />
459
- <?php if ( ! defined('PP_VERSION') || pp_get_option('display_hints') ) :?>
460
<div class="cme-subtext">
461
<?php _e( 'Note: Underscores replace spaces in stored capability name ("edit users" => "edit_users").', 'pp' ); ?>
462
</div>
@@ -467,7 +472,7 @@ if( defined('PP_VERSION') ) {
467
</dl>
468
469
<?php
470
- $support_pp_only_roles = defined('PP_VERSION') && version_compare( PP_VERSION, '1.0-beta1.4', '>=');
471
?>
472
473
<?php if ( $support_pp_only_roles && ! in_array( $default, array( 'subscriber', 'contributor', 'author', 'editor', 'administrator' ) ) ) : ?>
@@ -550,7 +555,7 @@ if( defined('PP_VERSION') ) {
550
</dd>
551
</dl>
552
553
- <?php if ( defined('PP_VERSION') && current_user_can( 'pp_manage_settings' ) ) :?>
554
<dl>
555
<dt><?php _e('Force Type-Specific Capabilities', $this->ID); ?></dt>
556
<dd style="text-align:center;">
29
$roles = $this->roles;
30
$default = $this->current;
31
32
+ if( defined('PP_ACTIVE') ) {
33
global $wpdb;
34
35
+ if ( defined( 'PPC_VERSION' ) )
36
+ $pp_supplemental_roles = $wpdb->get_col( "SELECT role_name FROM $wpdb->ppc_roles AS r INNER JOIN $wpdb->pp_groups AS g ON g.ID = r.group_id AND r.group_type = 'pp_group' WHERE g.metagroup_type = 'wp_role' AND g.metagroup_id = '$default'" );
37
+ else
38
+ $pp_supplemental_roles = $wpdb->get_col( "SELECT role_name FROM $wpdb->pp_roles AS r INNER JOIN $wpdb->pp_groups AS g ON g.ID = r.group_id AND r.group_type = 'pp_group' AND r.scope = 'site' WHERE g.metagroup_type = 'wp_role' AND g.metagroup_id = '$default'" );
39
40
$pp_filtered_types = pp_get_enabled_types('post');
41
$pp_metagroup_caps = array();
56
57
?>
58
<div class="wrap">
59
+ <?php if( defined('PP_ACTIVE') ) :
60
pp_icon();
61
$style = 'style="height:60px;"';
62
?>
78
<dt><?php printf(__('Capabilities for %s', $this->ID), $roles[$default]); ?></dt>
79
<dd>
80
<?php
81
+ if ( defined( 'PP_ACTIVE' ) ) {
82
if ( pp_get_option('display_hints') ) {
83
echo '<div>';
84
_e( 'Use this form to view and modify the capabilities WordPress natively associates with each role. Note:', $this->ID );
148
echo '</div></div>';
149
}
150
151
+ $capsman = ak_get_object('capsman');
152
+ $capsman->reinstate_db_roles();
153
+
154
$current = get_role($default);
155
$rcaps = $current->capabilities;
156
172
173
$cap_properties['edit']['taxonomy'] = array( 'manage_terms' );
174
175
+ if ( ! defined( 'PP_ACTIVE' ) )
176
$cap_properties['edit']['taxonomy'] = array_merge( $cap_properties['edit']['taxonomy'], array( 'edit_terms', 'assign_terms' ) );
177
178
$cap_properties['delete']['type'] = array( 'delete_posts', 'delete_others_posts' );
179
$cap_properties['delete']['type'] = array_merge( $cap_properties['delete']['type'], array( 'delete_published_posts', 'delete_private_posts' ) );
180
181
+ if ( ! defined( 'PP_ACTIVE' ) )
182
$cap_properties['delete']['taxonomy'] = array( 'delete_terms' );
183
else
184
$cap_properties['delete']['taxonomy'] = array();
224
$defined['taxonomy'] = get_taxonomies( array( 'public' => true ), 'object' );
225
226
// Press Permit grants attachment capabilities based on user's capabilities for the parent post
227
+ if ( defined( 'PP_ACTIVE' ) || defined('SCOPER_VERSION') )
228
unset( $defined['type']['attachment'] );
229
230
echo '<ul class="cme-listhoriz">';
461
</table>
462
463
<br />
464
+ <?php if ( ! defined('PP_ACTIVE') || pp_get_option('display_hints') ) :?>
465
<div class="cme-subtext">
466
<?php _e( 'Note: Underscores replace spaces in stored capability name ("edit users" => "edit_users").', 'pp' ); ?>
467
</div>
472
</dl>
473
474
<?php
475
+ $support_pp_only_roles = defined('PP_ACTIVE') && ( defined('PPC_VERSION') || version_compare( PP_VERSION, '1.0-beta1.4', '>=') );
476
?>
477
478
<?php if ( $support_pp_only_roles && ! in_array( $default, array( 'subscriber', 'contributor', 'author', 'editor', 'administrator' ) ) ) : ?>
555
</dd>
556
</dl>
557
558
+ <?php if ( defined('PP_ACTIVE') && current_user_can( 'pp_manage_settings' ) ) :?>
559
<dl>
560
<dt><?php _e('Force Type-Specific Capabilities', $this->ID); ?></dt>
561
<dd style="text-align:center;">
includes/manager.php CHANGED
@@ -31,7 +31,7 @@ include_once ( AK_CLASSES . '/abstract/plugin.php' );
31
add_action( 'init', 'cme_update_pp_usage' ); // update early so resulting post type cap changes are applied for this request's UI construction
32
33
function cme_update_pp_usage() {
34
- if ( defined( 'PP_VERSION' ) && current_user_can( 'pp_manage_settings' ) ) {
35
static $updated;
36
if ( ! empty($updated) ) { return true; }
37
@@ -121,6 +121,8 @@ class CapabilityManager extends akPluginAbstract
121
*/
122
private $max_level;
123
124
/**
125
* Creates some filters at module load time.
126
*
@@ -135,8 +137,37 @@ class CapabilityManager extends akPluginAbstract
135
136
// Users with roles that cannot be managed, are not allowed to be edited.
137
add_filter('map_meta_cap', array(&$this, 'filterUserEdit'), 10, 4);
138
}
139
140
/**
141
* Sets default settings values.
142
*
@@ -192,7 +223,7 @@ class CapabilityManager extends akPluginAbstract
192
$this->setAdminCapability();
193
}
194
195
- if ( defined( 'PP_VERSION' ) ) { // Press Permit integrates into Permissions menu
196
add_action( 'pp_permissions_menu', array( &$this, 'pp_menu' ) );
197
} else {
198
add_users_page( __('Capability Manager', $this->ID), __('Capabilities', $this->ID), 'manage_capabilities', $this->ID, array($this, 'generalManager'));
@@ -356,13 +387,6 @@ class CapabilityManager extends akPluginAbstract
356
}
357
358
$this->current = $post['current'];
359
-
360
- if ( defined( 'PP_VERSION' ) ) { // log customized role caps for subsequent restoration
361
- $plugins = get_option('active_plugins');
362
- $customized_roles = (array) pp_get_option( 'customized_roles' );
363
- $customized_roles[$post['role']] = (object) array( 'caps' => $post['caps'], 'plugins' => $plugins );
364
- pp_update_option( 'customized_roles', $customized_roles );
365
- }
366
367
// Select a new role.
368
if ( ! empty($post['LoadRole']) ) {
@@ -397,6 +421,28 @@ class CapabilityManager extends akPluginAbstract
397
} elseif ( ! empty($post['SaveRole']) ) {
398
$this->saveRoleCapabilities($post['current'], $post['caps'], $post['level']);
399
ak_admin_notify(__('New capabilities saved.', $this->ID));
400
401
// Create New Capability and adds it to current role.
402
} elseif ( ! empty($post['AddCap']) ) {
@@ -420,7 +466,7 @@ class CapabilityManager extends akPluginAbstract
420
ak_admin_error(__('Bad form received.', $this->ID));
421
}
422
423
- if ( ! empty($newrole) && ! empty( $_REQUEST['new_role_pp_only'] ) && defined('PP_VERSION') ) {
424
$pp_only = (array) pp_get_option( 'supplemental_role_defs' );
425
$pp_only[]= $newrole;
426
pp_update_option( 'supplemental_role_defs', $pp_only );
@@ -495,6 +541,13 @@ class CapabilityManager extends akPluginAbstract
495
remove_role($this->current);
496
unset($this->roles[$this->current]);
497
498
ak_admin_notify(sprintf(__('Role has been deleted. %1$d users moved to default role %2$s.', $this->ID), $count, $this->roles[$default]));
499
$this->current = $default;
500
}
@@ -672,6 +725,9 @@ class CapabilityManager extends akPluginAbstract
672
* @return string|false Returns the name of the new role created or false if failed.
673
*/
674
private function createRole( $name, $caps = array() ) {
675
$role = $this->createNewName($name);
676
if ( ! is_array($role) ) {
677
return false;
@@ -695,8 +751,13 @@ class CapabilityManager extends akPluginAbstract
695
private function saveRoleCapabilities( $role_name, $caps, $level ) {
696
$this->generateNames();
697
$role = get_role($role_name);
698
-
699
- $old_caps = array_intersect_key($role->capabilities, $this->capabilities);
700
$new_caps = ( is_array($caps) ) ? array_map('intval', $caps) : array();
701
$new_caps = array_merge($new_caps, ak_level2caps($level));
702
31
add_action( 'init', 'cme_update_pp_usage' ); // update early so resulting post type cap changes are applied for this request's UI construction
32
33
function cme_update_pp_usage() {
34
+ if ( defined( 'PP_ACTIVE' ) && current_user_can( 'pp_manage_settings' ) ) {
35
static $updated;
36
if ( ! empty($updated) ) { return true; }
37
121
*/
122
private $max_level;
123
124
+ private $log_db_role_objects = array();
125
+
126
/**
127
* Creates some filters at module load time.
128
*
137
138
// Users with roles that cannot be managed, are not allowed to be edited.
139
add_filter('map_meta_cap', array(&$this, 'filterUserEdit'), 10, 4);
140
+
141
+ // ensure storage, retrieval of db-stored customizations to bbPress dynamic roles
142
+ global $wpdb;
143
+ $role_key = $wpdb->prefix . 'user_roles';
144
+ add_filter( 'option_' . $role_key, array( &$this, 'log_db_roles' ), 0 );
145
+ add_filter( 'option_' . $role_key, array( &$this, 'reinstate_db_roles' ), 50 );
146
}
147
+
148
+ function log_db_roles( $passthru_roles ) {
149
+ global $wp_roles;
150
+
151
+ $this->log_db_role_objects = $wp_roles->role_objects;
152
+
153
+ return $passthru_roles;
154
+ }
155
+
156
+ // note: this is only applied when accessing the cme role edit form
157
+ function reinstate_db_roles( $passthru_roles = array() ) {
158
+ global $wp_roles;
159
160
+ if ( $this->log_db_role_objects ) {
161
+ $intersect = array_intersect_key( $wp_roles->role_objects, $this->log_db_role_objects );
162
+ foreach( array_keys( $intersect ) as $key ) {
163
+ if ( ! empty( $this->log_db_role_objects[$key]->capabilities ) )
164
+ $wp_roles->role_objects[$key]->capabilities = $this->log_db_role_objects[$key]->capabilities;
165
+ }
166
+ }
167
+
168
+ return $passthru_roles;
169
+ }
170
+
171
/**
172
* Sets default settings values.
173
*
223
$this->setAdminCapability();
224
}
225
226
+ if ( defined( 'PP_ACTIVE' ) ) { // Press Permit integrates into Permissions menu
227
add_action( 'pp_permissions_menu', array( &$this, 'pp_menu' ) );
228
} else {
229
add_users_page( __('Capability Manager', $this->ID), __('Capabilities', $this->ID), 'manage_capabilities', $this->ID, array($this, 'generalManager'));
387
}
388
389
$this->current = $post['current'];
390
391
// Select a new role.
392
if ( ! empty($post['LoadRole']) ) {
421
} elseif ( ! empty($post['SaveRole']) ) {
422
$this->saveRoleCapabilities($post['current'], $post['caps'], $post['level']);
423
ak_admin_notify(__('New capabilities saved.', $this->ID));
424
+
425
+ if ( defined( 'PP_ACTIVE' ) ) { // log customized role caps for subsequent restoration
426
+ if ( function_exists( 'bbp_get_version' ) && version_compare( bbp_get_version(), '2.2', '<' ) ) {
427
+ // for bbPress < 2.2, need to log customization of roles following bbPress activation
428
+ $plugins = get_option('active_plugins');
429
+ foreach( $plugins as $key => $plugin ) {
430
+ if ( false === strpos($plugin, 'bbpress.php' ) )
431
+ unset( $plugins[$key] ); // reduce storage size
432
+ }
433
+ } else {
434
+ $plugins = array(); // back compat
435
+ }
436
+
437
+ if ( ! $customized_roles = get_option( 'pp_customized_roles' ) )
438
+ $customized_roles = array();
439
+
440
+ $customized_roles[$post['role']] = (object) array( 'caps' => $post['caps'], 'plugins' => $plugins );
441
+ update_option( 'pp_customized_roles', $customized_roles );
442
+
443
+ global $wpdb;
444
+ $wpdb->query( "UPDATE $wpdb->options SET autoload = 'no' WHERE option_name = 'pp_customized_roles'" );
445
+ }
446
447
// Create New Capability and adds it to current role.
448
} elseif ( ! empty($post['AddCap']) ) {
466
ak_admin_error(__('Bad form received.', $this->ID));
467
}
468
469
+ if ( ! empty($newrole) && ! empty( $_REQUEST['new_role_pp_only'] ) && defined('PP_ACTIVE') ) {
470
$pp_only = (array) pp_get_option( 'supplemental_role_defs' );
471
$pp_only[]= $newrole;
472
pp_update_option( 'supplemental_role_defs', $pp_only );
541
remove_role($this->current);
542
unset($this->roles[$this->current]);
543
544
+ if ( $customized_roles = get_option( 'pp_customized_roles' ) ) {
545
+ if ( isset( $customized_roles[$this->current] ) ) {
546
+ unset( $customized_roles[$this->current] );
547
+ update_option( 'pp_customized_roles', $customized_roles );
548
+ }
549
+ }
550
+
551
ak_admin_notify(sprintf(__('Role has been deleted. %1$d users moved to default role %2$s.', $this->ID), $count, $this->roles[$default]));
552
$this->current = $default;
553
}
725
* @return string|false Returns the name of the new role created or false if failed.
726
*/
727
private function createRole( $name, $caps = array() ) {
728
+ if ( ! is_array($caps) )
729
+ $caps = array();
730
+
731
$role = $this->createNewName($name);
732
if ( ! is_array($role) ) {
733
return false;
751
private function saveRoleCapabilities( $role_name, $caps, $level ) {
752
$this->generateNames();
753
$role = get_role($role_name);
754
+
755
+ // workaround to ensure db storage of customizations to bbp dynamic roles
756
+ $role->name = $role_name;
757
+
758
+ $stored_role_caps = ( ! empty($role->capabilities) && is_array($role->capabilities) ) ? array_intersect( $role->capabilities, array(true, 1) ) : array();
759
+
760
+ $old_caps = array_intersect_key( $stored_role_caps, $this->capabilities);
761
$new_caps = ( is_array($caps) ) ? array_map('intval', $caps) : array();
762
$new_caps = array_merge($new_caps, ak_level2caps($level));
763
readme.txt CHANGED
@@ -3,8 +3,8 @@ Contributors: txanny, kevinB
3
Help link: http://wordpress.org/tags/capsman-enhanced
4
Tags: roles, capabilities, manager, editor, rights, role, capability, types, taxonomies
5
Requires at least: 3.1
6
- Tested up to: 3.4.1
7
- Stable tag: trunk
8
9
A simple way to manage WordPress roles and capabilities. With this plugin you will be able to easily create and manage roles and capabilities.
10
@@ -79,6 +79,13 @@ Capability Manager Enhanced also adds <a href="http://presspermit.com">Press Per
79
80
== Frequently Asked Questions ==
81
82
= Where can I find more information about this plugin, usage and support ? =
83
84
* If you need help, <a href="http://wordpress.org/tags/capsman-enhanced">ask in the Support forum</a>.
@@ -96,6 +103,11 @@ You should have received a copy of the GNU General Public License along with thi
96
97
== Changelog ==
98
99
= 1.4.5 =
100
* Fixed : Capabilities were needlessly re-saved on role load
101
* Fixed : Capability labels in "Other WordPress" section did not toggle checkbox selection
3
Help link: http://wordpress.org/tags/capsman-enhanced
4
Tags: roles, capabilities, manager, editor, rights, role, capability, types, taxonomies
5
Requires at least: 3.1
6
+ Tested up to: 3.4.2
7
+ Stable tag: 1.4.6
8
9
A simple way to manage WordPress roles and capabilities. With this plugin you will be able to easily create and manage roles and capabilities.
10
79
80
== Frequently Asked Questions ==
81
82
+ = How can I grant capabilities for a custom post type =
83
+ The custom post type must be defined to impose type-specific capability requirements. This is normally done by setting the "capability type" property equal to the post type name.
84
+
85
+ = I have configured a role to edit a custom post type. Why do the users still see "You are not allowed the edit this post?" when they try to save/submit a new post? =
86
+
87
+ Probably because your custom post type definition not having map_meta_cap set true. If you are calling register_post_type manually, just add this property to the options array. Unfortunately, none of the free CPT plugins deal with this important detail.
88
+
89
= Where can I find more information about this plugin, usage and support ? =
90
91
* If you need help, <a href="http://wordpress.org/tags/capsman-enhanced">ask in the Support forum</a>.
103
104
== Changelog ==
105
106
+ = 1.4.6 =
107
+ * Compat : bbPress 2.2 (supports customization of dynamic forum role capabilities)
108
+ * Compat : Press Permit + bbPress - customized role capabilities were not properly maintained on bbPress activation / deactivation, in some scenarios
109
+ * Fixed : Role update and copy failed if currently stored capability array is corrupted
110
+
111
= 1.4.5 =
112
* Fixed : Capabilities were needlessly re-saved on role load
113
* Fixed : Capability labels in "Other WordPress" section did not toggle checkbox selection