Làm cách nào để hạn chế truy cập bảng điều khiển chỉ dành cho Quản trị viên?


19

Làm thế nào chúng tôi sẽ hạn chế quyền truy cập vào khu vực quản trị WP cho tất cả người dùng ngoại trừ quản trị viên?
Người dùng trên trang web của chúng tôi có trang hồ sơ riêng của họ, thực hiện tất cả các chức năng họ cần.

Vì vậy, quản trị viên nên giới hạn cho tất cả ngoại trừ quản trị viên.

Làm thế nào để làm điều đó?


Bạn có nghĩa là có các trang người dùng 'mặt trước' không yêu cầu truy cập bất cứ thứ gì có tại yourdomain.com/wp-admin ?
curtismchale

Đúng chính xác. Có điều gì sai với điều đó?
Robin I Hiệp sĩ

Không chỉ làm rõ.
curtismchale

Câu trả lời:


19

Chúng ta có thể móc vào admin_inithành động và kiểm tra xem người dùng có phải là quản trị viên hay không bằng cách sử dụng current_user_can()chức năng để xem người dùng hiện tại có thể không manage_options, đây là điều mà chỉ quản trị viên mới có thể làm.

Mã này, khi được dán vào tệp tin.php. Sẽ hiển thị thông báo khi người không phải quản trị viên cố gắng truy cập bảng điều khiển:

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

Nếu bạn thích, bạn có thể cung cấp trải nghiệm người dùng tốt hơn bằng cách chuyển hướng người dùng đến trang chủ:

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

Nếu bạn muốn chuyển hướng người dùng đến trang hồ sơ của họ, hãy thay thế home_url()mã ở trên bằng liên kết.


Câu trả lời này không đáp ứng các yêu cầu của câu hỏi. Đầu tiên, bạn đang vô hiệu hóa quyền truy cập vào khu vực quản trị cho người dùng có khả năng "Manage_options" và khả năng này có thể được gán cho nhiều vai trò, không chỉ quản trị viên. Ngoài ra, khả năng "Manage_options" có thể bị xóa khỏi quản trị viên.
cybmeta

@cybmeta kiểm tra manage_optionskhả năng là cách được chấp nhận để kiểm tra cho người dùng quản trị. Ngay cả Mark Jaquith cũng nói như vậy
shea

Người hỏi đã hỏi chính xác để kiểm tra vai trò người dùng quản trị viên và tôi nghĩ điều quan trọng là cung cấp cho anh ta câu trả lời chính xác và giải thích khi nào và tại sao kiểm tra khả năng có thể tốt hơn. Bạn nói manage_optionslà điều mà chỉ "quản trị viên" mới có thể làm và điều đó không đúng, manage_optionslà một khả năng và có thể bị xóa khỏi vai trò quản trị viên hoặc được gán cho các vai trò người dùng khác. Điều quan trọng là phải biết những gì bạn muốn làm và chọn cách tốt nhất. Xem câu trả lời của tôi, tôi giải thích điều này.
cybmeta

Thưa ngài, được +1! :) Đã tìm kiếm điều này trong nhiều giờ! Cũng là một cải tiến nhỏ. Trang web duy nhất kiểm tra của bạn là đủ. Đối với nhiều trang web bạn muốn thay thế manage_optionsbằng manage_network. Cái sau cũng sẽ vô hiệu hóa bảng điều khiển cho "quản trị viên trang" mặc định nhưng để lại quyền truy cập cho Siêu quản trị viên (Quản trị viên mạng).
rkeet

Vấn đề chính với câu trả lời này là nó đụng độ với các cuộc gọi ajax. @cybmeta có câu trả lời đúng dưới đây.
RiotAct


9

Một số câu trả lời được đưa ra có thể tốt trong hầu hết các tình huống nhưng tôi nghĩ không ai trong số họ bảo đảm thực hiện chính xác những gì được hỏi vì không có câu trả lời nào kiểm tra vai trò của người dùng, họ kiểm tra khả năng và khả năng có thể được gán và loại bỏ vai trò của biểu mẫu. Vì vậy, để đưa ra câu trả lời chính xác, phải kiểm tra vai trò của người dùng, không phải khả năng:

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

 }

Nếu bạn muốn kiểm tra xem người dùng có khả năng "Manage_options" hay không, bạn có thể. Trong thực tế, nó là lựa chọn tốt nhất trong hầu hết các trường hợp. Mặc dù khả năng này được liên kết theo mặc định cho người dùng quản trị viên, khả năng này có thể bị xóa khỏi vai trò quản trị viên hoặc nó có thể được gán cho các vai trò người dùng khác. Đó là lý do tại sao, trong hầu hết các trường hợp, kiểm tra những gì người dùng có thể hoặc không thể làm tốt hơn là kiểm tra vai trò của người dùng. Vì vậy, trong hầu hết các trường hợp, việc kiểm tra các khả năng nên là cách được chọn nhưng bạn không hiểu rõ khái niệm này và chọn tùy chọn tốt nhất cho tình huống và mục đích của bạn:

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

 }

Đây là câu trả lời chính xác. Nó không đụng độ với các cuộc gọi ajax.
RiotAct

3

Hãy thử plugin Adminizing .
Bạn có thể khóa mọi thứ khá tốt với điều đó.

Bạn cũng có thể thử thiết lập quyền truy cập thông qua tập tin htaccess


1
+1 cho Quản trị viên. Đó là một con thú của một plugin. Kết hợp với một số plugin quản lý vai trò tùy chỉnh, nó chỉ đơn giản là đá. (Nếu tôi xin lỗi ý kiến ​​cá nhân) :::: Như một lưu ý cuối cùng: vui lòng cung cấp nhiều thông tin hơn chỉ liên kết, nó làm cho Câu trả lời đầy đủ hơn.
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'không phải là một khả năng. Nó hoạt động chỉ để duy trì khả năng tương thích ngược. Kiểm tra 'update_core'hoặc các khả năng quản trị khác.
fuxia

Ngoài ra, các khả năng có thể được gán cho các vai trò, vì vậy nếu bạn muốn cho phép truy cập vào người dùng "quản trị viên", bạn nên kiểm tra vai trò, không phải khả năng.
cybmeta

0

Đặt những dòng này trong của bạn 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
như @toscho nói 'quản trị viên' không phải là một khả năng, thay vào đó hãy sử dụng các khả năng của quản trị viên như 'update_core'
Pierre

0

Hãy thử điều này, không bao giờ thông qua các lỗi đối mặt với người dùng cuối. Chống lại một UX tốt. Mã này chuyển hướng họ đến Trang chủ.

    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

Tôi sẽ sử dụng WP Frontend và thiết lập nó cho mọi người mong đợi quản trị viên.


Vui lòng cung cấp thêm thông tin sau đó một liên kết - nó làm cho câu trả lời đầy đủ hơn
shea
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.