Perché i ruoli non sono visibili in un Multi-site/Network?
La mia rete mostra i ruoli in alcuni siti ma non in altri.
Per qualche motivo che non riesco a spiegare, quando aggiungo un nuovo utente, non ho ruoli da scegliere nel menu a discesa di un sotto-sito della mia rete. Inoltre, il nuovo utente assegnato a un sito non appare nell'elenco degli utenti per quel sito.
È possibile risolvere questo problema?
Di seguito un'immagine della situazione attuale.
Di seguito è mostrata l'immagine del sito principale con i ruoli correttamente presenti, ma i sotto-siti della rete no.

- Determina l'ID del tuo blog Multisite. Userò 99 come esempio
- Accedi al database
- Vai a questa tabella:
wp_##_options
(wp_99_options) — avrai una tabella per ogni blog - Trova il record dove
option_name
=wp_user_roles
- Cambia il testo
wp_user_roles
inwp_##_user_roles
("wp_99_user_roles")
La tabella che stai modificando avrà option_id
, blog_id
, option_name
, option_value
, autoload
. Tuttavia, NON MODIFICARE NESSUN RECORD eccetto il record dove option_name
= wp_user_roles
. Ci sarà solo un singolo record in questa tabella con queste caratteristiche.
wp_user_roles
viene utilizzato quando non c'è un'installazione Multisite, e in questo caso, sembra che sia stato semplicemente un bug quando la tabella è stata creata.

Grazie! Consigli salvavita qui. Questa è ESATTAMENTE la risposta corretta.

Non avevo "wp_user_roles" nella mia tabella, quello che ho fatto è stato copiare il contenuto di wp_4_options>wp_user_roles (un grande oggetto json o un array serializzato, non lo so) in un nuovo record chiamato wp_5_options (questo era il blog a cui mancavano i ruoli) e ha risolto il mio problema. Voto +1 comunque perché mi ha messo sulla strada giusta

Ho risolto anche ELIMINANDO il record "wp_##user_roles" dalla tabella principale wp_options, perché sembra sovrascrivere quello in wp##_options.

Per le persone che hanno migrato il sito e cambiato i prefissi, l'errore potrebbe essere un "wp_##user_roles" invece di "{new_prefix}##_user_roles"

Inoltre, una volta effettuato questo aggiornamento... se non sembra funzionare assicurati di cancellare qualsiasi cache attiva poiché l'opzione potrebbe essere memorizzata nella cache.

Ho avuto questo problema con un'installazione Multisite dopo aver reinstallato WordPress e ripristinato da un backup di Updraft Plus.
Quando ho controllato il record user_roles
, l'option_name era ancora impostata sul prefisso originale di quattro caratteri, come pre1_user_roles
, mentre il prefisso per la seconda installazione era qualcosa come pre2_user_roles
.
L'ho aggiornato a pre2_user_roles
e le opzioni sono immediatamente riapparse nella pagina delle opzioni utente.

Se questo è il problema che conosco bene, stai utilizzando una configurazione memcache dietro la tua installazione MU? Ho scoperto che apparentemente c'è un problema di cache (osservato nella versione 2.9) per l'oggetto options dove qualcosa di utile (come la chiave wp_user_roles) rimane bloccato nell'array "notoptions" di memcache.
Se stai utilizzando memcache e questa sembra una possibilità, prova a connetterti via telnet alla macchina sulla porta 11211. Digita delete blogid:options:notoptions
, dove blogid è l'id del blog su cui vedi il problema. Aggiorna il pannello di amministrazione e verifica se compaiono i ruoli nel menu a discesa. Se sì, hai trovato il tuo problema.
AGGIORNAMENTO: Ok, quindi non hai trovato il tuo problema - non stavi utilizzando memcache. Consiglio comunque di verificare l'oggetto roles, cercando uno corrotto o inesistente. Credo sia la pista migliore. Puoi usare questo codice per visualizzare il contenuto della tabella options:
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. Non so come memcache sia finito sul mio server. Non lo sto usando affatto. Forse perché ho installato w3 cache. Ho provato a cancellarlo ma mi ha dato un messaggio che diceva not_found. Ho comunque disattivato il memcache, dato che non lo uso. Ho ancora il problema.

GRAZIE. Questo problema rappresenta ben 10 ore di debug. È stata davvero una sfida per me.
Per approfondire un po', ho aggiunto una funzione al mio sito che ti permetterà di risolvere questo problema se stai creando siti in modo programmatico.
Fondamentalmente, questo controllerà se wp_user_roles
è stato impostato nel blog specificato. Se è così, la funzione utilizzerà wp_user_roles
per impostare una nuova opzione nel modo corretto.
/**
* A volte i ruoli utente non vengono impostati correttamente quando viene creato un nuovo sito
* Per risolvere questo problema, verifichiamo che i dati siano aggiunti correttamente e aggiorniamo se necessario
* Vedi 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();
}

Volevo solo ringraziarti per questo articolo perché ho cercato una soluzione a questo problema per molto tempo.
Il problema era semplicemente dovuto al fatto che avevo usato un plugin per clonare i miei siti e non aveva mai aggiornato correttamente la tabella wp_##_user_roles
. Quando il sito è stato copiato da wp_13...
è stato clonato su un nuovo sito wp_81...
ma questa voce era ancora bloccata a wp_13
.

Voglio solo far notare che alcune persone potrebbero ancora avere una tabella degli utenti del sito vuota—specificamente per il loro sito principale. Se questo problema si verifica, il modo per risolverlo è il seguente:
- Vai alla tabella wp_usermeta
- Cerca tutte le voci con il meta_key wp_capabilities
- Cambia il meta_key da wp_capabilities a wp_1_capabilities
Credo che "1" sia sempre l'ID del sito principale.
Saluti.

Il prefisso wp_
viene impostato nel file wp-config.php
e per impostazione predefinita è wp_
. Il numero 1
effettivamente rappresenta il sito principale. Tuttavia non deve necessariamente essere 1
in quanto si tratta di un ID univoco e incrementale che viene generato automaticamente.

Installa questo plugin: https://wordpress.org/plugins/capability-manager-enhanced/
Vai nel tuo sito > Capabilities > Impostazioni > Backup > Ripristina Ruoli, clicca su "Ripristina ai valori predefiniti di WordPress" e risolverà il problema del tuo sito.
Nient'altro ha funzionato per me.
