webentwicklung-frage-antwort-db.com.de

Problem mit benutzerdefinierten Rollen in Multisite

Also bin ich mit Custom Roles durch die Hölle gegangen. Ich werde versuchen, so beschreibend wie möglich zu sein, um mein Problem hervorzuheben. Bevor es jemand erwähnt - ich möchte die Verwendung eines Plugins vermeiden, da dies für mich ein Übermaß an dem ist, was ich für ein einfaches Problem halte.

Was ich möchte: 3 Rollen - Admin, Kleiner Admin, Benutzer

Was ich ursprünglich versucht habe: Ich habe die beiden Rollen Author & Contributor entfernt, um Administrator, Editor und Abonnent zu verlassen. Das hat problemlos geklappt. Ich habe ein Problem mit dem nächsten Stück - die verbleibenden Rollen umzubenennen.

Ich habe ursprünglich nur den häufigsten Vorschlag gemacht

global $wp_roles;
$wp_roles->roles['editor']['name'] = 'Lesser Admin';
$wp_roles->role_names['editor'] = 'Lesser Admin';

für die letzten beiden Rollen (Ich habe Admin gleich gehalten, weil es nah genug war). Aber das hat nicht funktioniert. Egal welche Hooks ich daran angehängt habe (ich habe es unter add_action('init',...) gestellt, aber das hat nicht funktioniert.

Also habe ich versucht, ausgefallen zu sein und meinen eigenen Code geschrieben, um damit umzugehen.

function permissionsModification(){
    $blogs = wp_get_sites();
    $current_blog = get_current_blog_id();

    foreach($blogs as $blog):

        switch_to_blog($blog['blog_id']);

        if(get_role('author') !== null)
            remove_role('author');

        if(get_role('contributor') !== null)
            remove_role('contributor');

        $toChange = array(
            'editor' => array('lesser', 'Lesser Admin'), 
            'subscriber' => array('user', 'User')
        );
        foreach($toChange as $old => $new):

            $role = get_role($old);
            if($role !== null):

                if(get_role($new[0]) === null)
                    add_role($new[0], $new[1], $role->capabilities);

                $users = get_users(array('role'=>$old));
                foreach($users as $user):
                    $user->remove_role($old);
                    $user->add_role($new[0]);
                endforeach;

                $opt = get_option('default_role');
                if($opt === $old)
                    set_option('default_role', 'administrator');

                remove_role($old);
            endif;

        endforeach;

    endforeach;

    switch_to_blog($current_blog);
}
add_action('init','permissionsModification');

Die gute Nachricht: Es ist gelungen, die Rollen umzubenennen, und die alten Rollen waren weg.

Schlechte Nachrichten: Es tritt ein äußerst seltsamer Fehler auf. Ich erhalte überall in der Capabilities.php die Fehlermeldung "Undefined Index: Name". Ich durchsuchte die Datenbank (habe phpMyAdmin-Zugriff) und stellte fest, dass auf einer der Websites die Abonnentenrolle noch vorhanden war! Ich dachte, es könnte etwas mit den Standardrollen zu tun haben. Da Registrierungen verboten sind, habe ich den Administrator zum Testen eingestellt, aber immer noch keine Würfel (obwohl dies die Standardrolle war).

Wenn Sie das Netzwerkadministrator-Bedienfeld anzeigen, wird ein "leerer" Bereich angezeigt, in dem sich eine Rolle befinden soll. Wenn Sie das Element überprüfen, hat es den Wert subscriber. Daher bin ich mir ziemlich sicher, dass der Name der Abonnentenrolle gelöscht wurde, und daher kommen die Fehler.

Nun, der interessante Teil - ich habe diesen Code Zeile für Zeile durchlaufen, wobei print_r überall durchwühlt ist - und die Abonnentenrolle wird tatsächlich gelöscht. Aber ich habe keine Ahnung, wie es wieder hinzugefügt wird. Ich frage mich, ob dies mit der Tatsache zusammenhängt, dass es sich um ein WordPress mit mehreren Sites handelt, da die Abonnentenrolle nur in einer Tabelle vorhanden ist. Aber ich bin immer noch ein bisschen verloren, wie man es repariert.

Jeder Rat wäre sehr dankbar.

6
Marco

Dank Kaiser konnte ich es herausfinden. Ich musste zwei Dinge tun, um diese Arbeit zu machen.

Zuerst bemerkte ich, dass das Deaktivieren des WP User Avatar-Plugins dazu führte, dass die Fehler verschwanden. Ich habe nachgeschaut und festgestellt, dass die Einstellung "Abonnenten und Mitwirkenden erlauben, ihre Avatare zu bearbeiten" aktiviert ist. Durch Deaktivieren und Speichern für jede Site wurden die Fehler behoben.

Das andere, was ich tun musste, war, dass die Änderung nicht auf andere Sites übertragen werden konnte (obwohl die Fehler beseitigt waren), also habe ich die gesamte Funktion vom Thema auf ein Plugin im mu-plugins-Ordner verschoben. Dadurch wurde es die ganze Zeit (und für jede Site) ausgeführt, sodass alle Änderungen ohne Fehler auftraten.

1
Marco