After numerous days of trying to track down a problem in code, it turns out that the add_cap is only taking the first two in an array. The first one (editor) will only add delete_others_pages and delete_others_posts to the database. If I use the second method of repeating add_cap then I can get all of the capabilities into the database.
Can someone look at this code and see what is wrong? Why would only the first two items in the array go into the database?
if( $new_roles == 'editor' ) {
$user = new WP_User( $user_id );
$user->add_cap(
'delete_others_pages','delete_others_posts','delete_pages','delete_posts','delete_private_pages','delete_private_posts','delete_published_pages','delete_published_posts','edit_others_pages','edit_others_posts','edit_pages','edit_posts','edit_private_pages','edit_private_posts','edit_published_pages','edit_published_posts','manage_categories','manage_links','moderate_comments','publish_pages','publish_posts','read','read_private_pages','read_private_posts');
}
elseif( $new_roles == 'author' ) {
$user_id = $XF->visitor->get('user_id');
$user = new WP_User( $user_id );
$user->add_cap(
'delete_posts', 'delete_published_posts'
);
$user->add_cap(
'edit_posts', 'edit_published_posts'
);
$user->add_cap(
'publish_posts', 'read', 'upload_files'
);
$user->add_cap(
'upload_files'
);
}
UPDATE CODE to place complete function: Adds arrays now so my initial question is answered but they are added to the wrong users.
public static function set_user_roles(&$classObj, $user_group_id, $secondary_group_ids)
{
/**
* Function set_user_roles(&$classObj, $user_group_id, $secondary_group_ids)
*
* This function sets the current user role based on the secondary group
*/
global $XF, $wp_roles;
$user_groups = explode(',', $secondary_group_ids);
$user_groups[] = $user_group_id;
/**
* Loop through the user_roles and find the WP role equivalent for each
*/
$user_roles = array();
foreach ($user_groups as $user_group) {
$user_roles[] = $XF->options['xf_user_role'][$user_group];
/**
* wp_die( 'This is the role:' . var_dump( $XF->options['xf_user_role'] ) );
*
* Returns:
*
* array(7) { [3]=> string(13) "administrator" [4]=> string(6) "author" [2]=> string(10) "subscriber" [1]=> string(10) "subscriber" [5]=> string(6) "author" [7]=> string(11) "contributor" [6]=> string(6) "editor" }
*/
/**
* wp_die( var_dump( $XF->options['xf_user_role'][$user_group] ) );
*
* Returns for user Ellie who has secondary group related to author
* string(6) "author"
*
* Returns Albert who has secondary group set to editor
* string(6) "editor"
*
* Returns Pascal who has secondary group related to contributor
* string(11) "contributor"
*
* Returns Gracie NO secondary group for registered members.
* NULL
*
*/
$new_roles = $XF->options['xf_user_role'][$user_group];
if ($new_roles == '' || $new_roles == null) {
$user_id = $XF->visitor->get('user_id');
$caps = array('read');
$user = new WP_User($user_id);
foreach ($caps as $cap) {
$user->add_cap($cap);
}
break;
} elseif ($new_roles == 'subscriber') {
$user_id = $XF->visitor->get('user_id');
$caps = array('read');
$user = new WP_User($user_id);
foreach ($caps as $cap) {
$user->add_cap($cap);
}
break;
} elseif ($new_roles == 'contributor') {
$user_id = $XF->visitor->get('user_id');
$caps = array('delete_posts', 'edit_posts', 'read');
$user = new WP_User($user_id);
foreach ($caps as $cap) {
$user->add_cap($cap);
}
break;
} elseif ($new_roles == 'author') {
$user_id = $XF->visitor->get('user_id');
$caps = array(
'delete_posts', 'delete_published_posts', 'edit_posts', 'edit_published_posts', 'publish_posts', 'read', 'upload_files', 'upload_files'
);
$user = new WP_User($user_id);
foreach ($caps as $cap) {
$user->add_cap($cap);
}
break;
} elseif ($new_roles == 'editor') {
$user_id = $XF->visitor->get('user_id');
$caps = array(
'delete_others_pages', 'delete_others_posts', 'delete_pages', 'delete_post', 'delete_private_pages', 'delete_private_posts', 'delete_published_pages', 'delete_published_posts', 'edit_others_pages', 'edit_others_posts', 'edit_pages', 'edit_posts', 'edit_private_pages', 'edit_private_posts', 'edit_published_pages', 'edit_published_posts', 'manage_categories', 'manage_links', 'moderate_comments', 'publish_pages', 'publish_posts', 'read', 'read_private_pages', 'read_private_posts'
);
$user = new WP_User($user_id);
foreach ($caps as $cap) {
$user->add_cap($cap);
}
break;
} elseif ($new_roles == 'administrator') {
$user_id = $XF->visitor->get('user_id');
$caps = array(
'activate_plugins', 'delete_others_pages', 'delete_others_posts', 'delete_pages', 'delete_plugins', 'delete_posts', 'delete_private_pages', 'delete_private_posts', 'delete_published_pages', 'delete_published_posts', 'edit_dashboard', 'edit_files', 'edit_others_pages', 'edit_others_posts', 'edit_pages', 'edit_posts', 'edit_private_pages', 'edit_private_posts', 'edit_published_pages', 'edit_published_posts', 'edit_theme_options', 'export', 'import', 'list_users', 'manage_categories', 'manage_links', 'manage_options', 'moderate_comments', 'promote_users', 'publish_pages', 'publish_posts', 'read_private_pages', 'read_private_posts', 'read', 'remove_users', 'switch_themes', 'upload_files', 'create_product'
);
$user = new WP_User($user_id);
foreach ($caps as $cap) {
$user->add_cap($cap);
}
break;
}
}
}
Update: Capabilities are being added but now all accounts are getting admin capabilities. This is now asked: Editor and contributor roles not correct after adding function
Looking at your code I think you are trying to modify the capabilities of existent roles. Am I right?
To do that you have to run the add_cap for a role object, not for a user object. Also, you must know that add_cap only accept one capability as string:
If you want to add more than one capability you can perform a loop. For example:
The same apply to perform add_cap for a user object: