[wp-trac] [WordPress Trac] #43421: The $capabilities argument in the `add_role()` function is incompatible with `user_can`

WordPress Trac noreply at wordpress.org
Mon Feb 26 17:19:27 UTC 2018


#43421: The $capabilities argument in the `add_role()` function is incompatible
with `user_can`
-----------------------------+-----------------------------
 Reporter:  eclev91          |      Owner:
     Type:  defect (bug)     |     Status:  new
 Priority:  normal           |  Milestone:  Awaiting Review
Component:  Role/Capability  |    Version:  4.9.4
 Severity:  normal           |   Keywords:
  Focuses:                   |
-----------------------------+-----------------------------
 Reproduce:

 Add a role to WP using `add_role()`, and pass it custom capabilities using
 the third argument. Like:

 {{{#!php
 <?php
 $userCaps = [
         'read',
         'my_cap',
 ];
 add_role('my_new_role', 'My New Role', $userCaps);
 }}}

 Create a user of said role. Then:

 {{{#!php
 <?php
 $user = new WP_User($id_of_created_user);
 return user_can($user, 'my_cap'); // returns false, expected return true
 }}}

 If, alternatively, I create my role this way:

 {{{#!php
 <?php
 $userCaps = [
         'read',
         'my_cap',
 ];
 $role = add_role('my_new_role', 'My New Role');
 foreach($userCaps as $cap) {
         $role->add_cap($cap);
 }
 }}}

 And repeat testing, it returns true as expected.

 This has to do with how the caps are saved. The first way, when
 capabilities are retrieved in `WP_User::has_cap()`, they look like this:

 {{{#!php
 <?php
 array(4) {
   [0]=>
   "read",
   [1]=>
   "my_cap",
   ["my_new_role"]=>
   bool(true)
   ["exist"]=>
   bool(true)
 }
 }}}

 And when done via `add_cap`, they look like this:

 {{{#!php
 <?php
 array(4) {
   ["read"]=>
   bool(true)
   ["my_cap"]=>
   bool(true)
   ["my_new_role"]=>
   bool(true)
   ["exist"]=>
   bool(true)
 }
 }}}

 The subsequent `empty` array check is true for the first, and false for
 the second.

--
Ticket URL: <https://core.trac.wordpress.org/ticket/43421>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform


More information about the wp-trac mailing list