web-dev-qa-db-de.com

Warum werden meine Rollen in einem Netzwerk mit mehreren Standorten nicht angezeigt?

Mein Netzwerk zeigt Rollen an einigen Standorten und nicht an anderen.

Aus irgendeinem Grund, den ich nicht erklären kann, habe ich beim Hinzufügen eines neuen Benutzers keine Rollen zur Auswahl im Dropdown-Feld einer untergeordneten Site in meinem Netzwerk. Außerdem wird mein neuer Benutzer, der einer Site zugewiesen wurde, nicht in meiner Liste der Benutzer für diese Site angezeigt.

Ist das etwas reparierbar?

Unten ein Bild der aktuellen Situation.

Roles not Showing

Das folgende Bild zeigt die Hauptwebsite mit den richtigen Rollen, die Unterwebsites des Netzwerks jedoch nicht.

Roles showing

15
Geo
  1. Bestimmen Sie Ihre Multisite-Blog-ID. Ich werde 99 als Beispiel verwenden
  2. Gehen Sie in die Datenbank
  3. Gehen Sie zu dieser Tabelle: wp_##_options (wp_99_options) - Sie haben eine Tabelle für jedes Blog
  4. Suchen Sie den Datensatz, in dem option_name = wp_user_roles
  5. Ändern Sie den Text wp_user_roles in wp_##_user_roles ("wp_99_user_roles")

Die Tabelle, die Sie bearbeiten, enthält option_id, blog_id, option_name, option_value, autoload. Jedoch ÄNDERN SIE KEINEN SATZ mit Ausnahme des Datensatzes mit option_name = wp_user_roles. In dieser Tabelle gibt es nur einen einzigen Datensatz.

wp_user_roles wird verwendet, wenn keine Multisite-Installation vorhanden ist, und hier scheint es, als wäre es nur ein Fehler, als die Tabelle erstellt wurde.

Wenn dies das Problem ist, das ich so gut kenne, führen Sie ein Memcache-Setup hinter Ihrer MU-Installation aus? Ich habe festgestellt, dass es anscheinend ein Cache-Problem (in 2.9 beobachtet) für das options-Objekt gibt, bei dem etwas Gutes (wie der wp_user_roles-Schlüssel) im memcache-Array "notoptions" hängen bleibt.

Wenn Sie auf memcache laufen und dies nach einer Möglichkeit klingt, versuchen Sie, sich über 11211 in den Computer einzuloggen. Geben Sie delete blogid:options:notoptions ein, wobei die Blog-ID die ID des Blogs ist, auf dem Sie das Problem sehen. Aktualisieren Sie das Administrationsfenster und prüfen Sie, ob die Dropdown-Liste Rollen enthält. Wenn ja, haben Sie Ihr Problem gefunden.

UPDATE: OK, Sie haben Ihr Problem nicht gefunden - Sie haben keinen Memcache ausgeführt. Ich würde immer noch das Rollenobjekt auschecken und nach einem korrupten oder nicht existierenden suchen. Ich glaube, es ist deine beste Spur. Mit diesem Code können Sie die Optionstabelle sichern:

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/>";
}
2
editor

Ich hatte dieses Problem bei einer Multisite-Installation, nachdem ich WordPress neu installiert und von einem Updraft Plus-Backup wiederhergestellt hatte.

Als ich den user_roles-Datensatz überprüfte, wurde der Optionsname immer noch auf das ursprüngliche vierstellige Präfix gesetzt, z. B. pre1_user_roles, während das Präfix für die zweite Installation so etwas wie pre2_user_roles lautete.

Ich habe dies auf pre2_user_roles aktualisiert und die Optionen wurden sofort wieder auf der Benutzeroptionsseite angezeigt.

1
Richard Hare

DANKE DIR. Dieses Problem umfasst solide 10 Stunden Debugging. Das war ein echter Bär für mich.

Um dies ein wenig zu erweitern, habe ich meiner Site eine Funktion hinzugefügt, mit der Sie dieses Problem beheben können, wenn Sie Sites programmgesteuert erstellen.

Grundsätzlich wird überprüft, ob wp_user_roles im angegebenen Blog festgelegt wurde. Wenn dies der Fall ist, verwendet die Funktion wp_user_roles, um eine neue Option auf die richtige Weise festzulegen.

  /**
   * Sometimes, user roles do not properly get set when a new site is set up
   * To fix this issue, we check to make sure the data is added properly and update if not
   * See 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();
  }
1
Alex Standiford

Ich wollte mich nur für diesen Artikel bedanken, weil ich schon lange nach einer Lösung für dieses Problem gesucht habe.

Das lag einfach daran, dass ich ein Plugin zum Klonen meiner Websites verwendet hatte und den wp_##_user_roles nie richtig aktualisiert habe. Als die Site von wp_13... kopiert wurde, wurde sie auf eine neue Site wp_81... geklont, aber dieser Eintrag blieb bei wp_13 hängen.

0
Joseph Dowdy

Ich möchte nur darauf hinweisen, dass einige Benutzer möglicherweise immer noch eine leere Site-Benutzertabelle haben - speziell für ihre Root-Site. Wenn dieses Problem auftritt, können Sie es folgendermaßen beheben:

  1. Gehe zum Tisch wp_usermeta
  2. Finde alle Einträge mit dem meta_key wp_capabilities
  3. Ändern Sie den meta_key von wp_capabilities zu wp_1_capabilities

Ich glaube, "1" ist immer die ID der Root-Site.

Prost.

0
jamilj