Cómo Editar Múltiples Roles de Usuario en la Hoja

Cuando usas la ” Hoja de Usuarios de WordPress”, ves una columna para editar el rol de usuario. Por defecto, WordPress asigna un rol a cada usuario. Pero algunos sitios web utilizan un plugin para asignar múltiples roles a cada usuario.

En este caso, te mostraremos cómo editar múltiples roles por usuario en la Hoja de Usuarios de WordPress.

Esto se basa en el plugin “Multiple Roles”.

Obtén el plugin

Puedes descargarlo como plugin de WordPress. Sólo tienes que instalar el zip en tu sitio y funcionará automáticamente.

Nota. Necesitas tener la Hoja de Usuarios de WordPress activa, es un plugin premium que proporciona la hoja de usuarios. Este plugin gratuito es una extensión de la hoja de cálculo de usuarios.

Si eres un desarrollador, puedes leer este post para entender qué hace el plugin y cómo está codificado.

1- Registrar la nueva columna en la hoja de cálculo

Este fragmento es muy simple. Usamos el gancho before_init para modificar el objeto de la hoja.

Hacemos la modificación sólo si el proveedor de la hoja = ‘usuario’ (Hoja de Usuarios).

Registramos una nueva columna pasando la clave de la columna (wpse_multiple_roles), la clave de la hoja de cálculo (usuario) y la configuración de la columna.

add_action('vg_sheet_editor/editor/before_init', 'register_columns');
function register_columns($editor) {
  if ($editor->args['provider'] === 'user') {
    $editor->args['columns']->register_item('wpse_multiple_roles, 'user', array(
      'data_type' => 'meta_data',
      'supports_formulas' => true,
    ));
  }
}

Esto añadirá una celda de texto a la hoja de cálculo y podremos editarla y guardarla.

2- Modifica los datos antes de guardar la celda

Por defecto, la Hoja guarda la celda como texto simple. En este caso, el plugin “Multiple Roles” requiere los roles como array. Así que necesitamos modificar el valor antes de guardarlo en la base de datos.

add_filter('vg_sheet_editor/provider/user/update_item_meta', 'filter_cell_data_for_saving', 10, 3);
function filter_cell_data_for_saving($new_value, $id, $key) {
  global $wpdb;
  if ($key === 'wpse_multiple_roles') {
    $roles = array_fill_keys(array_values(array_map('trim', explode(',', $new_value))), 1);
    // We can't save empty roles, the user must have one role at least
    if (!empty($roles)) {
      update_user_meta($id, $wpdb->prefix . 'capabilities', $roles);
    }
    $new_value = '';
  }

  return $new_value;
}

El filtro “vg_sheet_editor/provider/user/update_item_meta” se ejecuta antes de guardar cada campo meta. En el interior comprobamos si la clave de campo es igual a la columna “Multiple Roles”, convertimos la cadena de “role1, role2, role3” en un array como este, y guardamos el campo directamente. Devolvemos una cadena vacía, así que la Hoja guarda el campo falso de “roles múltiples” como vacío porque nunca lo usaremos:

array(
"editor" => 1,
"author" => 1,
)

3- Modifica los datos de lectura

Ahora tenemos que hacer lo contrario. Obtenemos los datos de la base de datos como array y necesitamos convertirlos en una cadena con roles separados por comas.

add_filter('vg_sheet_editor/provider/user/get_item_meta', 'filter_cell_data_for_readings', 10, 5);
function filter_cell_data_for_readings($value, $id, $key, $single, $context) {
  global $wpdb;
  if ($context !== 'read') {
    return $value;
  }

  if ($key === 'wpse_multiple_roles') {
    $roles = get_user_meta($id, $wpdb->prefix . 'capabilities', true);
    $value = ( is_array($roles) ) ? implode(', ', array_keys($roles)) : '';
  }

  return $value;
}

Estamos haciendo algo similar al paso anterior. Usamos un filtro para modificar el valor, y si el contexto no es “leído” (este filtro es para leer datos, pero podríamos estar leyendo datos en un contexto de almacenamiento), obtenemos los datos sin procesar de la base de datos, los convertimos en cadena y devolvemos la cadena.