Jak ograniczyć dostęp do pulpitu nawigacyjnego tylko administratorom?


19

W jaki sposób ograniczamy dostęp do obszaru administracyjnego WP wszystkim użytkownikom z wyjątkiem administratorów?
Użytkownicy naszej witryny mają własne strony profilowe, które wykonują wszystkie potrzebne im funkcje.

Więc admin powinien być niedostępny dla wszystkich oprócz adminów.

Jak to zrobić?


Masz na myśli strony użytkowników, które nie wymagają dostępu do niczego, co znajduje się na twojadomena.com/wp-admin ?
Curtismchale,

Tak, dokładnie. Czy coś jest z tym nie tak?
Robin I Knight

Nie, tylko wyjaśniam.
curtismchale,

Odpowiedzi:


19

Możemy podpiąć się do admin_initakcji i sprawdzić, czy użytkownik jest administratorem, używając current_user_can()funkcji, aby sprawdzić, czy manage_optionsmoże to zrobić bieżący użytkownik , co może zrobić tylko administrator.

Ten kod po wklejeniu do pliku functions.php wyświetli komunikat, gdy nie-administrator spróbuje uzyskać dostęp do pulpitu nawigacyjnego:

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 );

Jeśli wolisz, możesz zapewnić lepszą obsługę, przekierowując użytkownika na stronę główną:

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 );

Jeśli chcesz przekierować użytkownika na stronę jego profilu, zastąp home_url()powyższy kod linkiem.


Ta odpowiedź nie spełnia wymagań pytania. Po pierwsze, wyłączasz dostęp do obszaru administracyjnego użytkownikowi z funkcją „manage_options”, a funkcję można przypisać do wielu ról, nie tylko administratora. Dodatkowo funkcję „manage_options” można usunąć od administratora.
cybmeta

Sprawdzanie manage_optionszdolności @cybmeta jest akceptowanym sposobem sprawdzania użytkownika administratora. Nawet Mark Jaquith tak mówi
shea

Pytający pytał dokładnie o sprawdzenie roli administratora i myślę, że ważne jest, aby udzielić mu dokładnej odpowiedzi i wyjaśnić, kiedy i dlaczego sprawdzanie zdolności może być lepsze. Mówi się, że manage_optionsjest to coś, co mogą zrobić tylko „administratorzy”, a to nieprawda, manage_optionsjest to zdolność, którą można usunąć z roli administratora lub przypisać innym rolom użytkownika. Ważne jest, aby wiedzieć, co chcesz zrobić i wybrać najlepszy sposób. Zobacz moją odpowiedź, wyjaśniam to.
cybmeta

Proszę pana, zdobądź +1! :) Szukałem tego przez wiele godzin! Również niewielka poprawa. Pojedyncza strona czek jest wystarczający. Dla multi-witryny, którą chcesz zamienić manage_optionsz manage_network. Ten ostatni wyłączyłby pulpit także dla domyślnych „administratorów strony”, ale pozostawiłby dostęp do superadministratorów (administratorów sieci).
rekeet

Głównym problemem z tą odpowiedzią jest to, że koliduje ona z wywołaniami ajax. @cybmeta ma poprawną odpowiedź poniżej.
RiotAct


9

Niektóre z udzielonych odpowiedzi mogą być w większości przypadków w porządku, ale myślę, że żadna z nich nie gwarantuje dokładnie tego, o co proszono, ponieważ żadna z odpowiedzi nie sprawdza ról użytkownika, sprawdza możliwości i możliwości, które można przypisać i usunąć z ról. Aby dać dokładną odpowiedź, należy sprawdzić role użytkowników, a nie możliwości:

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();
      }

 }

Jeśli chcesz sprawdzić, czy użytkownik ma funkcję „manage_options”, możesz to zrobić. W rzeczywistości jest to najlepsza opcja w większości przypadków. Chociaż ta funkcja jest domyślnie powiązana z użytkownikami administratora, można ją usunąć z roli administratora lub przypisać do innych ról użytkowników. Dlatego w większości przypadków sprawdzanie, co użytkownik może zrobić, a czego nie, jest lepsze niż sprawdzenie roli użytkownika. Tak więc w większości przypadków sprawdzanie możliwości powinno być wybranym sposobem, ale musisz jasno określić tę koncepcję i wybrać najlepszą opcję dla swojej sytuacji i celu:

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();
      }

 }

To jest poprawna odpowiedź. Nie koliduje z wywołaniami ajax.
RiotAct

3

Wypróbuj wtyczkę Adminimize .
Dzięki temu możesz całkiem dobrze zablokować sytuację.

Możesz także spróbować skonfigurować dostęp poprzez plik htaccess


1
+1 dla Adminimize. To bestia wtyczki. W połączeniu z wtyczką niestandardowego menedżera ról po prostu się buja. (Jeśli wybaczam sobie osobistą opinię) :::: Na koniec: podaj więcej informacji niż tylko linki, dzięki czemu Odpowiedź będzie bardziej kompletna.
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);

4
'administrator'nie jest zdolnością. Działa tylko w celu zachowania kompatybilności wstecznej. Sprawdź 'update_core'lub inne możliwości administracyjne.
fuxia

Można także przypisywać funkcje do ról, więc jeśli chcesz zezwolić na dostęp użytkownikowi „administratorowi”, powinieneś sprawdzić role, a nie możliwości.
cybmeta

0

Umieść te linie w swoim 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 );

3
jak @toscho powiedział, że „administrator” nie ma możliwości, zamiast tego użyj funkcji administratora, takich jak „update_core”
Pierre

0

Spróbuj tego, nigdy przez błędy w obliczu użytkownika końcowego. Przeciw dobrym UX. Ten kod przekierowuje je do strony głównej.

    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;
}
}

-1

Chciałbym użyć WP Frontend i ustawić go dla wszystkich, którzy oczekują administratorów.


Podaj więcej informacji niż link - dzięki temu odpowiedź będzie bardziej kompletna
shea
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.