Wie kann ich den Dashboard-Zugriff nur auf Administratoren beschränken?

19

Wie würden wir den Zugriff auf den WP-Administrationsbereich auf alle Benutzer mit Ausnahme von Administratoren beschränken?
Die Benutzer unserer Website haben ihre eigenen Profilseiten, die alle Funktionen erfüllen, die sie benötigen.

Daher sollte der Admin für alle außer Administratoren gesperrt sein.

Wie geht das?

Robin ich Ritter
quelle
Sie meinen, es gibt "nach vorne gerichtete" Benutzerseiten, für die kein Zugriff erforderlich ist. Diese befinden sich unter yourdomain.com/wp-admin .
Curtismchale
Ja genau. Stimmt da etwas nicht
Robin I Knight
Nein, ich kläre nur.
Curtismchale

Antworten:

19

Wir können die admin_initAktion verfolgen und überprüfen, ob der Benutzer ein Administrator ist, indem wir die current_user_can()Funktion verwenden, um festzustellen, ob der aktuelle Benutzer dies kann manage_options, was nur ein Administrator kann.

Dieser Code zeigt beim Einfügen in die Datei functions.php eine Meldung an, wenn ein Nicht-Administrator versucht, auf das Dashboard zuzugreifen:

function wpse_11244_restrict_admin() {

    if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
        return;
    }

    if ( ! current_user_can( 'manage_options' ) ) {
        wp_die( __( 'You are not allowed to access this part of the site' ) );
    }
}

add_action( 'admin_init', 'wpse_11244_restrict_admin', 1 );

Wenn Sie möchten, können Sie die Benutzerfreundlichkeit verbessern, indem Sie den Benutzer stattdessen auf die Startseite umleiten:

function wpse_11244_restrict_admin() {

    if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
        return;
    }

    if ( ! current_user_can( 'manage_options' ) ) {
        wp_redirect( home_url() );
        exit;
    }
}

add_action( 'admin_init', 'wpse_11244_restrict_admin', 1 );

Wenn Sie den Benutzer zu seiner Profilseite umleiten möchten, ersetzen Sie home_url()den obigen Code durch den Link.

shea
quelle
Diese Antwort entspricht nicht den Anforderungen der Frage. Zunächst deaktivieren Sie den Zugriff auf den Administratorbereich für einen Benutzer mit der Funktion "manage_options", und eine Funktion kann mehreren Rollen zugewiesen werden, nicht nur dem Administrator. Darüber hinaus kann die Funktion "manage_options" vom Administrator entfernt werden.
Cybmeta
Die Prüfung der manage_optionsFunktion durch @cybmeta ist die akzeptierte Methode für die Prüfung eines Administratorbenutzers. Sogar Mark Jaquith sagt so
Shea
Der Fragesteller hat genau nach der Überprüfung der Administratorrolle gefragt, und ich halte es für wichtig, ihm die genaue Antwort zu geben und zu erklären, wann und warum die Überprüfung auf Funktionen besser sein kann. Sie sagen manage_options, dass dies nur "Administratoren" können und dass dies nicht der Fall ist, manage_optionses sich um eine Funktion handelt, die aus der Administratorrolle entfernt oder anderen Benutzerrollen zugewiesen werden kann. Wichtig ist, dass Sie wissen, was Sie tun möchten, und den besten Weg wählen. Siehe meine Antwort, ich erkläre das.
Cybmeta
Sie, Sir, bekommen eine +1! :) Hab schon stundenlang danach gesucht! Auch eine kleine Verbesserung. Einzige Seite Ihr Scheck ist ausreichend. Für Multi-Site würden Sie ersetzen möchten manage_optionsmit manage_network. Letzteres würde das Dashboard auch für standardmäßige "Site-Administratoren" deaktivieren, den Zugriff jedoch für Super-Administratoren (Netzwerkadministratoren) freigeben.
Rkeet
Das Hauptproblem bei dieser Antwort ist, dass es zu Konflikten mit Ajax-Aufrufen kommt. @cybmeta hat die richtige Antwort unten.
RiotAct
9

Einige der gegebenen Antworten können in den meisten Situationen in Ordnung sein, aber ich denke, keine von ihnen garantiert, genau das zu tun, was gefragt wird, weil keine der Antworten Benutzerrollen prüft, sie Fähigkeiten überprüfen und Fähigkeiten können Formularrollen zugewiesen und entfernt werden. Um eine genaue Antwort zu geben, müssen die Benutzerrollen überprüft werden, nicht die Funktionen:

add_action( 'admin_init', 'allow_admin_area_to_admins_only');
function allow_admin_area_to_admins_only() {

      if( defined('DOING_AJAX') && DOING_AJAX ) {
            //Allow ajax calls
            return;
      }

      $user = wp_get_current_user();

      if( empty( $user ) || !in_array( "administrator", (array) $user->roles ) ) {
           //Redirect to main page if no user or if the user has no "administrator" role assigned
           wp_redirect( get_site_url( ) );
           exit();
      }

 }

Wenn Sie überprüfen möchten, ob der Benutzer über die Funktion "manage_options" verfügt, können Sie dies tun. Tatsächlich ist es in den meisten Fällen die beste Option. Obwohl diese Funktion standardmäßig Administratorbenutzern zugeordnet ist, kann sie aus der Administratorrolle entfernt oder anderen Benutzerrollen zugewiesen werden. Aus diesem Grund ist es in den meisten Fällen besser, zu überprüfen, was der Benutzer kann oder nicht, als die Benutzerrolle zu überprüfen. In den meisten Fällen sollte die Überprüfung der Fähigkeiten der gewählte Weg sein, aber Sie müssen dieses Konzept klarstellen und die beste Option für Ihre Situation und Ihren Zweck auswählen:

add_action( 'admin_init', 'admin_area_for_manage_options_only');
function admin_area_for_manage_options_only() {

      if( defined('DOING_AJAX') && DOING_AJAX ) {
            //Allow ajax calls
            return;
      }


      if( ! current_user_can( "manage_options" ) ) {
           //Redirect to main page if the user has no "manage_options" capability
           wp_redirect( get_site_url( ) );
           exit();
      }

 }
Cybmeta
quelle
Das ist die richtige Antwort. Es kollidiert nicht mit Ajax-Aufrufen.
RiotAct
3

Probieren Sie das Adminimize- Plugin aus.
Damit können Sie die Dinge ziemlich gut abschließen.

Sie können auch versuchen, den Zugriff über die htaccess-Datei einzurichten

goofydg1
quelle
1
+1 für Adminimize. Das ist ein echtes Plugin. In Verbindung mit einem benutzerdefinierten Rollenmanager-Plug-In wird einfach gerockt. (Wenn ich eine persönliche Meinung entschuldige) :::: Zum Schluss: Bitte geben Sie mehr Informationen als nur Links an, damit die Antwort vollständiger wird.
Brasofilo
2
function wpse_11244_restrict_admin() {
    if (!current_user_can('update_core')) {
        wp_die(__('You are not allowed to access this part of the site'));
    }
}

add_action('admin_init', 'wpse_11244_restrict_admin', 1);
Gabi
quelle
4
'administrator'ist keine Fähigkeit. Es funktioniert nur, um die Abwärtskompatibilität aufrechtzuerhalten. Suchen Sie nach 'update_core'oder nach anderen Administratorfunktionen.
fuxia
Außerdem können Rollen Funktionen zugewiesen werden. Wenn Sie also den Zugriff auf "Administrator" -Benutzer zulassen möchten, sollten Sie nach Rollen und nicht nach Funktionen suchen.
Cybmeta
0

Setzen Sie diese Zeilen in Ihre functions.php

function baw_no_admin_access()
{
 if( !current_user_can( 'administrator' ) ) {
     wp_redirect( home_url() );
     die();
  }
}
add_action( 'admin_init', 'baw_no_admin_access', 1 );
Junaid Munir
quelle
3
Wie @toscho sagte, "Administrator" ist keine Funktion, sondern verwenden Sie Admin-Funktionen wie "update_core"
Pierre
0

Versuchen Sie dies, niemals durch Fehler gegenüber einem Endbenutzer. Gegen eine gute UX. Dieser Code leitet sie zu Home weiter.

    add_action( 'init', 'blockusers_init' );
function blockusers_init() {
if ( is_admin() && ! current_user_can( 'administrator' ) &&
! ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) {
wp_redirect( home_url() );
exit;
}
}
Ahmad Awais
quelle
-1

Ich würde WP Frontend verwenden und es für jeden einstellen, der Administratoren erwartet.

Benny
quelle
Bitte geben Sie mehr Informationen als einen Link - es macht eine Antwort vollständiger
Shea