¿Por qué no se ven mis roles en una red Multi-site/Network?
Mi red muestra roles en algunos sitios pero no en otros.
Por alguna razón que no logro explicar, cuando añado un nuevo usuario, no tengo roles para elegir en el menú desplegable de un sub-sitio de mi red. Además, mi nuevo usuario asignado a un sitio no aparece en la lista de usuarios de ese sitio.
¿Esto tiene solución?
A continuación una imagen de la situación actual.
Aquí está la imagen que muestra el sitio principal con los roles correctamente visibles, pero los sub-sitios de la red no los muestran.

- Determina el ID de tu blog Multisite. Usaré el 99 como ejemplo
- Accede a la base de datos
- Ve a esta tabla:
wp_##_options
(wp_99_options) — tendrás una tabla para cada blog - Encuentra el registro donde
option_name
=wp_user_roles
- Cambia el texto
wp_user_roles
porwp_##_user_roles
("wp_99_user_roles")
La tabla que estás editando tendrá option_id
, blog_id
, option_name
, option_value
, autoload
. Sin embargo, NO CAMBIES NINGÚN REGISTRO excepto el registro donde option_name
= wp_user_roles
. Solo habrá un único registro como este en la tabla.
wp_user_roles
se usa cuando no hay una instalación Multisite, y aquí parece que fue simplemente un error cuando se creó la tabla.

¡Gracias! Un consejo que salva vidas aquí. Esta es EXACTAMENTE la respuesta correcta.

NO tenía "wp_user_roles" en mi tabla, lo que hice fue copiar el contenido de wp_4_options>wp_user_roles (un gran objeto json o un array serializado, no lo sé) a un nuevo registro llamado wp_5_options (este era el blog al que le faltaban los roles) y solucionó mi problema. Voté +1 de todos modos porque me puso en el camino correcto.

También resolví ELIMINANDO el registro "wp_##user_roles" de la tabla principal wp_options, porque parece sobrescribir el de wp##_options.

Para las personas que han migrado su sitio y cambiado los prefijos, el error podría ser un "wp_##user_roles" en lugar de "{new_prefix}##_user_roles"

Además, una vez que realices esta actualización... si no parece funcionar, asegúrate de borrar cualquier caché que estés usando, ya que la opción podría estar en caché.

Tuve este problema con una instalación Multisite después de reinstalar WordPress y restaurar desde una copia de seguridad de Updraft Plus.
Cuando revisé el registro user_roles
, el option_name todavía estaba configurado con el prefijo original de cuatro caracteres, como pre1_user_roles
, mientras que el prefijo para la segunda instalación era algo como pre2_user_roles
.
Actualicé esto a pre2_user_roles
y las opciones reaparecieron inmediatamente en la página de opciones de usuario.

Si este es el problema que conozco tan bien, ¿estás ejecutando una configuración de memcache detrás de tu instalación MU? He descubierto que aparentemente hay un problema de caché (observado en la versión 2.9) con el objeto de opciones donde algo importante (como la clave wp_user_roles) queda atascado en el array "notoptions" de memcache.
Si estás usando memcache y esto suena como una posibilidad, intenta conectarte por telnet a la máquina a través del puerto 11211. Escribe delete blogid:options:notoptions
, donde blogid es el ID del blog donde estás viendo el problema. Actualiza el panel de administración y verifica si aparecen los roles en el menú desplegable. Si es así, has encontrado tu problema.
ACTUALIZACIÓN: Vale, parece que no encontraste el problema — no estabas usando memcache. Aún así, recomendaría revisar el objeto de roles, buscando uno corrupto o inexistente. Creo que es tu mejor pista. Puedes usar este código para volcar la tabla de opciones:
global $wpdb;
$array = $wpdb->get_col("SELECT option_name FROM $wpdb->options");
foreach ($array as $key) {
echo $key . ": <code>";
var_dump(get_option($key), true));
echo "</code><br/>";
}

Editor. No sé cómo llegó memcache a mi servidor. No lo estoy usando en absoluto. Tal vez porque instalé w3 cache. Intenté eliminarlo y me dio un mensaje que decía not_found. Seguí adelante y deshabilité el memcache, ya que no lo estoy usando. Todavía tengo el problema.

GRACIAS. Este problema representó unas sólidas 10 horas de depuración. Realmente fue un hueso duro de roer para mí.
Para ampliar un poco, agregué una función a mi sitio que te permitirá resolver este problema si estás creando sitios de manera programática.
Básicamente, esto verificará si wp_user_roles
fue configurado en el blog especificado. Si es así, la función usará wp_user_roles
para establecer una nueva opción de la manera correcta.
/**
* A veces, los roles de usuario no se configuran correctamente cuando se crea un nuevo sitio
* Para solucionar este problema, verificamos que los datos se agreguen correctamente y actualizamos si no es así
* Ver https://wordpress.stackexchange.com/questions/11725/why-are-my-roles-not-visible-in-a-multi-site-network
*/
function maybeAddUserRoles($blog_id){
switch_to_blog($blog_id);
if(get_option('wp_user_roles')){
update_option('wp_'.$blog_id.'_user_roles', get_option('wp_user_roles'));
delete_option('wp_user_roles');
}
restore_current_blog();
}

Solo quería agradecerte por este artículo porque llevaba mucho tiempo buscando una solución a este problema.
Resulta que era simplemente porque había usado un plugin para clonar mis sitios y nunca actualizó correctamente wp_##_user_roles
. Cuando el sitio se copió desde wp_13...
fue clonado a un nuevo sitio wp_81...
pero esta entrada seguía estancada en wp_13
.

Solo quiero señalar que algunas personas pueden aún tener una tabla de usuarios del sitio vacía—específicamente para su sitio principal. Si este problema ocurre, la forma de solucionarlo es haciendo lo siguiente:
- Ir a la tabla wp_usermeta
- Buscar cualquier entrada con el meta_key wp_capabilities
- Cambiar el meta_key de wp_capabilities a wp_1_capabilities
Creo que "1" siempre es el ID del sitio principal.
Saludos.

Instala este plugin: https://wordpress.org/plugins/capability-manager-enhanced/
Ve a tu sitio > Capacidades > Ajustes > Respaldo > Restablecer Roles, haz clic en "Restablecer a valores predeterminados de WordPress" y esto solucionará tu sitio.
Nada más funcionó para mí.
