it-swarm.com.de

Verhindern Sie das Löschen von Benutzerrollen außer Abonnenten

In der Verwaltung meines Blogs möchte ich verhindern, dass Benutzer (einschließlich Administratoren) gelöscht werden, es sei denn, es handelt sich um einfache Abonnenten.

Grundsätzlich möchte ich, dass im Bereich "Benutzer" der Administration die Option "Löschen" nur unter den Abonnenten sichtbar ist, nicht unter den Administratoren, Redakteuren, Autoren oder Mitwirkenden.

Wie kann ich das in meiner functions.php Datei machen (ich bin nicht an einem Plugin interessiert)?

Ich habe die Funktion "remove_cap ('delete_users')" ausprobiert, aber sie hat einen zu großen Umfang, da sie das Löschen eines Benutzers verhindert, während ich das Löschen eines Benutzers ABER der Abonnenten verhindern möchte.

Danke für deine Hilfe.

3
Baylock

Wenn Sie die Löschschaltfläche in der Benutzerliste unter /wp-admin/users.php meinen, wird diese Schaltfläche von der WP_Users_List_Table-Klasse around (derzeit) Zeile 256 erstellt. Wenn Sie ein bisschen weiter nach unten schauen - ein paar Zeilen - sehen Sie einen Filter namens user_row_actions. Damit können Sie den Link "Löschen" ausblenden.

add_filter(
  'user_row_actions',
  function($actions, $user_object) {
    if (1 >= count($user_object->roles) && 'subscriber' !== $user_object->roles[0]) {
      unset($actions['delete']);
    }
    return $actions;
  },
  1,2
);

Minimal getestet, aber ich denke, dass die Logik korrekt ist. Sie sollten den Link "Löschen" für Abonnenten sehen, jedoch nicht für Benutzer mit einer anderen Rolle, einschließlich Benutzer mit "Abonnenten"undeiner anderen Rolle, nur für den Fall, dass Sie diese ungerade Einrichtung haben.

Wenn Sie genau hinschauen und einen schelmischen Verstand haben, werden Sie feststellen, dass Sie jeden gewünschten Benutzer löschen können, indem Sie die Benutzer-ID in der URL ändern. Schau genau hin:

/wp-admin/users.php?action=delete&user=9&_wpnonce=8059e669c1

Der Filter oben verbirgt nur den Link. Der Zugriff auf den Löschbildschirm wird dadurch nicht verhindert. Dazu benötigen wir mehr Code:

add_action(
  'load-users.php',
  function() {
    if (isset($_GET['action']) && 'delete' === $_GET['action']) {
      if (isset($_GET['user'])) {
        $user_object = get_userdata($_GET['user']);
        if (1 >= count($user_object->roles) && 'subscriber' !== $user_object->roles[0]) {
          wp_die('This user cannot be deleted');
        }
      }
    }
  }
);

Selbst wenn dies der Fall ist, kann ein gescheiter Benutzer möglicherweise trotzdem die richtigen Werte für POST durchschieben und einen Benutzer trotzdem löschen, sodass Sie möglicherweise auch ein endgültiges Fail-Safe-Recht vor dem Löschen des Benutzers wünschen.

add_action(
  'delete_user', 
  function($id) {
    $user_object = get_userdata($id);
    if (1 >= count($user_object->roles) && 'subscriber' !== $user_object->roles[0]) {
      wp_die('This user cannot be deleted');
    }
  }
);

Hinweis: Dieser Code wurde in einer MU-Plugin-Datei getestet. Ich denke, es sollte wahrscheinlich mit functions.php funktionieren, aber stellen Sie sicher, dass Sie das überprüfen. In der Praxis würde ich wahrscheinlich versuchen, einen Teil dieser Logik zu extrahieren, damit sie wiederverwendbar ist. Diese Rückrufe sind gefährlich kurz davor, sich zu wiederholen.

5
s_ha_dum

Ok s_ha_dum, ich habe es mit ein paar Änderungen zum Laufen gebracht:

die "Zählung" scheint die Funktion zu ruinieren, aber so hat es wie ein Zauber gewirkt:

function test($actions, $user_object) 
{
    if ( 'subscriber' !== $user_object->roles[0]) {unset($actions['delete']);}
    return $actions;
}
add_filter('user_row_actions','test',1,2);

Vielen Dank für Ihre große Hilfe!

1
Baylock

Ja, wir können es erreichen, indem wir folgen.

add_filter( 'user_row_actions', 'custom_action_function', 1, 2 );
function custom_action_function($actions, $user_object) {
    if ( 1 >= count( $user_object->roles ) && 'subscriber' !== $user_object->roles[0] ) {
      unset( $actions['delete'] );
    }
    return $actions;
}
0
webtechie