Bagaimana cara membatasi akses dasbor ke Admin saja?

19

Bagaimana kita membatasi akses ke area admin WP untuk semua pengguna kecuali admin?
Para pengguna di situs kami memiliki halaman profil mereka sendiri yang melakukan semua fungsi yang mereka butuhkan.

Jadi admin harus terlarang untuk semua kecuali admin.

Bagaimana cara melakukannya?

Robin I Knight
sumber
Maksud Anda ada halaman pengguna 'menghadap depan' yang tidak memerlukan akses apa pun yang terletak di yourdomain.com/wp-admin ?
curtismchale
Ya persis. Apakah ada sesuatu yang salah dengan itu?
Robin I Knight
Tidak hanya klarifikasi.
curtismchale

Jawaban:

19

Kami dapat menghubungkan ke admin_inittindakan dan memeriksa apakah pengguna adalah administrator dengan menggunakan current_user_can()fungsi untuk melihat apakah pengguna saat ini dapat manage_options, yang merupakan sesuatu yang hanya dapat dilakukan oleh administrator.

Kode ini, ketika disisipkan ke file functions.php Anda, akan menampilkan pesan ketika non-admin mencoba mengakses dasbor:

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

Jika mau, Anda dapat memberikan pengalaman pengguna yang lebih baik dengan mengarahkan ulang pengguna ke beranda:

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

Jika Anda ingin mengarahkan pengguna ke halaman profil mereka, ganti home_url()kode di atas dengan tautan.

shea
sumber
Jawaban ini tidak memenuhi persyaratan pertanyaan. Pertama, Anda menonaktifkan akses ke area admin ke pengguna dengan kapabilitas "manage_options" dan kapabilitas dapat ditugaskan ke beberapa peran, bukan hanya administrator. Selain itu, kemampuan "manage_options" dapat dihapus dari administrator.
cybmeta
@cybmeta memeriksa manage_optionskemampuan adalah cara yang diterima untuk memeriksa pengguna admin. Bahkan Mark Jaquith mengatakan demikian
shea
Penanya bertanya persis untuk memeriksa peran pengguna admin dan saya pikir penting untuk memberinya jawaban yang tepat dan menjelaskan kapan dan mengapa memeriksa kemampuan bisa lebih baik. Anda katakan manage_optionsadalah sesuatu yang hanya bisa dilakukan oleh "administrator" dan itu tidak benar, manage_optionsadalah kemampuan dan dapat dihapus dari peran admin atau ditugaskan ke peran pengguna lain. Yang penting adalah mengetahui apa yang ingin Anda lakukan dan memilih cara terbaik. Lihat jawaban saya, saya jelaskan ini.
cybmeta
Anda pak, dapatkan +1! :) Sudah mencari ini selama berjam-jam! Juga sedikit peningkatan. Situs tunggal cek Anda sudah cukup. Untuk multi-situs yang Anda ingin mengganti manage_optionsdengan manage_network. Yang terakhir akan menonaktifkan dasbor juga untuk "administrator situs" default tetapi meninggalkan akses yang tersedia untuk Super Administrator (Admin jaringan).
rkeet
Masalah utama dengan jawaban ini adalah bahwa ia berbenturan dengan panggilan ajax. @cybmeta memiliki jawaban yang benar di bawah ini.
RiotAct
9

Beberapa jawaban yang diberikan bisa baik-baik saja di sebagian besar situasi tetapi saya pikir tidak ada satupun dari mereka yang memberikan garansi untuk melakukan apa yang diminta karena tidak ada jawaban yang memeriksa peran pengguna, mereka memeriksa kemampuan dan kemampuan yang dapat ditetapkan dan dihapus dari peran formulir. Jadi, untuk memberikan jawaban yang tepat, peran pengguna harus diperiksa, bukan kemampuan:

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

 }

Jika Anda ingin memastikan bahwa pengguna memiliki kemampuan "manage_options", Anda bisa. Bahkan, ini adalah opsi terbaik dalam banyak kasus. Meskipun kemampuan ini dikaitkan secara default ke pengguna administrator, kemampuan dapat dihapus dari peran admin atau dapat ditugaskan ke peran pengguna lain. Itulah sebabnya, dalam kebanyakan kasus, memeriksa apa yang bisa atau tidak bisa dilakukan pengguna lebih baik daripada memeriksa peran pengguna. Jadi, dalam banyak kasus memeriksa kemampuan harus menjadi cara yang dipilih tetapi Anda harus memiliki konsep ini jelas dan memilih opsi terbaik untuk situasi dan tujuan Anda:

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
sumber
Ini jawaban yang benar. Itu tidak berbenturan dengan panggilan ajax.
RiotAct
3

Coba plugin Adminimize .
Anda dapat mengunci semuanya dengan cukup baik dengan itu.

Anda juga dapat mencoba mengatur akses melalui file htaccess

goofydg1
sumber
1
+1 untuk Adminimize. Itu binatang plugin. Ditambah dengan beberapa plugin role manager kustom, itu hanya batu. (Jika saya minta pendapat pribadi) :::: Sebagai catatan terakhir: tolong beri lebih banyak informasi daripada hanya tautan, itu membuat Jawabannya lebih lengkap.
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
sumber
4
'administrator'bukan kemampuan. Ini berfungsi hanya untuk menjaga kompatibilitas ke belakang. Periksa 'update_core'atau kemampuan admin lainnya.
fuxia
Selain itu, kapabilitas dapat ditetapkan ke peran, jadi jika Anda ingin mengizinkan akses ke pengguna "administrator", Anda harus memeriksa peran, bukan kapabilitas.
cybmeta
0

Masukkan baris ini di 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
sumber
3
seperti @toscho mengatakan 'administrator' bukan kemampuan, alih-alih gunakan kemampuan admin seperti 'update_core'
Pierre
0

Coba ini, jangan pernah melalui kesalahan di hadapan pengguna akhir. Melawan UX yang bagus. Kode ini mengarahkan mereka ke Beranda.

    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
sumber
-1

Saya akan menggunakan WP Frontend dan mengaturnya untuk semua orang mengharapkan admin.

Benny
sumber
Tolong berikan lebih banyak informasi daripada tautan - itu membuat jawaban lebih lengkap
shea