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ć?

Robin I Knight
źródło
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.

shea
źródło
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();
      }

 }
cybmeta
źródło
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

goofydg1
źródło
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);
Gabi
źródło
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 );
Junaid Munir
źródło
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;
}
}
Ahmad Awais
źródło
-1

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

Benny
źródło
Podaj więcej informacji niż link - dzięki temu odpowiedź będzie bardziej kompletna
shea