La falta de roles múltiples me ha irritado durante mucho tiempo ya que la clase subyacente WP_User admite múltiples roles. Incluso he considerado buscar una solución de software alternativa. @lpryor: después de leer tu publicación, me volví a motivar para implementarla yo mismo.
Tomó un número sorprendentemente corto de líneas, aunque tuve que hackear el archivo users.php ya que era demasiado vago para crear un complemento por separado para hacerlo por mí. Claramente, esta es la manera incorrecta de hacerlo, así que si estoy lo suficientemente motivado en el futuro, podría intentar hacerlo correctamente.
Si no le importa poder actualizar a la última versión de Wordpress (que debería), puede implementar múltiples roles con los fragmentos de código a continuación. Tenga en cuenta que no soy un experto en wordpress. Acabo de abrir los archivos relevantes e hice los cambios sin tratar de entender todas las implicaciones de lo que estaba haciendo. El código me parece razonable pero no confiaría en mi vida.
(Estoy usando 3.2, por lo que sus números de línea pueden variar) En class-wp-users-list-table.php justo antes de la línea 150 agregue algunos como los siguientes:
<div class="alignleft actions">
<label class="screen-reader-text" for="remove_role"><?php _e( 'Remove role …' ) ?></label>
<select name="remove_role" id="remove_role">
<option value=''><?php _e( 'Remove role …' ) ?></option>
<?php wp_dropdown_roles(); ?>
</select>
<?php submit_button( __( 'Remove' ), 'secondary', 'changeit', false ); ?>
</div>
luego cambie la función current_account para parecerse a esto
function current_action() {
if ( isset($_REQUEST['changeit']) ) {
if ( !empty($_REQUEST['new_role']) )
return 'promote';
elseif ( !empty($_REQUEST['remove_role']) )
return 'remove_role';
}
return parent::current_action();
}
Ahora en users.php Comente las líneas 71-76
/*
if ( $id == $current_user->ID && !$wp_roles->role_objects[$_REQUEST['new_role']]->has_cap('promote_users') ) {
$update = 'err_admin_role';
continue;
}
*/
Reemplace set_role en la línea 83 con add_role
$user->add_role($_REQUEST['new_role']);
En la línea 92, agregue lo siguiente (Esto es solo una copia y pegado ligeramente editado de la acción de promoción: no lo he verificado para asegurarme de que la capacidad de promover_usuario sea adecuada para eliminar roles)
case 'remove_role':
check_admin_referer('bulk-users');
if ( ! current_user_can( 'promote_users' ) )
wp_die( __( 'You can’t edit that user.' ) );
if ( empty($_REQUEST['users']) ) {
wp_redirect($redirect);
exit();
}
$editable_roles = get_editable_roles();
if ( empty( $editable_roles[$_REQUEST['remove_role']] ) )
wp_die(__('You can’t remove that role'));
$userids = $_REQUEST['users'];
$update = 'remove_role';
foreach ( $userids as $id ) {
$id = (int) $id;
if ( ! current_user_can('promote_user', $id) )
wp_die(__('You can’t edit that user.'));
// The new role of the current user must also have promote_users caps
// Need to think this through
/*
if ( $id == $current_user->ID && !$wp_roles->role_objects[$_REQUEST['new_role']]->has_cap('promote_users') ) {
$update = 'err_admin_role';
continue;
}
*/
// If the user doesn't already belong to the blog, bail.
if ( is_multisite() && !is_user_member_of_blog( $id ) )
wp_die(__('Cheatin’ uh?'));
$user = new WP_User($id);
$user->remove_role($_REQUEST['remove_role']);
}
wp_redirect(add_query_arg('update', $update, $redirect));
exit();
En la línea 370, agregue lo siguiente
case 'remove_role':
$messages[] = '<div id="message" class="updated"><p>' . __('Removed role.') . '</p></div>';
break;