La falta de roles múltiples me ha irritado durante mucho tiempo, ya que la clase WP_User subyacente admite varios roles. Incluso he considerado buscar una solución de software alternativa. @lpryor - después de leer tu publicación, me motivaron a implementarla yo mismo.
Me 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 separado para hacerlo por mí. Claramente, esta es la forma incorrecta de hacerlo, por lo que si estoy lo suficientemente motivado en el futuro, puedo intentar hacerlo correctamente.
Si no te importa poder actualizar a la última versión de Wordpress (que deberías), puedes implementar múltiples roles con los fragmentos de código a continuación. Por favor, 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 lo confiaría en mi vida.
(Estoy usando 3.2, por lo que sus números de línea pueden variar)
En la clase-wp-users-list-table.php
Justo antes de la línea 150 agregue algo como lo siguiente:
<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 cambia la función current_account para que se parezca 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
Comenta 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 el 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 una copia ligeramente editadas de la acción de promoción. No he comprobado que la capacidad de promoción_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;