Người dùng không thể tải lên hình ảnh trên frontend nếu họ không có quyền truy cập vào phụ trợ wp


7

Tôi cho phép người dùng tạo bài đăng và tải lên / đính kèm hình ảnh vào bài đăng đó thông qua lối vào . Điều này hoạt động tốt. Tuy nhiên, khi tôi hạn chế quyền truy cập vào phụ trợ Wordpress (/ wp-admin /) thông qua đoạn mã như thế này

function wpse_11244_restrict_admin() {
    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 );

hoặc (EDIT) với mã chuyển hướng

function redirect_non_admin_users() {
    if ( ! current_user_can( 'manage_options' ) && '/wp-admin/admin-ajax.php' != $_SERVER['PHP_SELF'] ) {
        wp_redirect( home_url() );
        exit;
    }
}
add_action( 'admin_init', 'redirect_non_admin_users' );

Tải lên đa phương tiện không hoạt động nữa (Thông báo "Lỗi"). Vấn đề này đã được thảo luận ở nơi khác :

Tôi phát hiện ra rằng nếu vai trò không có quyền truy cập đó [vào phần phụ trợ], thì nó cũng giết chết khả năng tải lên các tệp của họ ở mặt trước.

Có cách nào để ngăn người dùng truy cập vào phụ trợ mà không làm mất khả năng tải lên hình ảnh của họ trên frontend không?

Cảm ơn bạn!


1
Nó có thể là một lựa chọn tốt hơn để xem xét chuyển hướng mọi người đang cố gắng truy cập bất cứ điều gì /wp-admin/để bạn không bị rối với các quyền.
Howdy_McGee

Vấn đề tương tự, "Lỗi xảy ra trong quá trình tải lên. Vui lòng thử lại sau". (Xem phần Chỉnh sửa của tôi cho đoạn mã chuyển hướng)
SPi

1
Làm thế nào chính xác là bạn đang thực hiện tải lên?
Rarst

Câu trả lời:


1

Đầu tiên, điều quan trọng là phải xem xét lý do tại sao bạn hạn chế quyền truy cập wp-admin. Nếu bạn đang làm điều này chủ yếu cho mục đích thẩm mỹ, thì giải pháp được cung cấp dưới đây là tốt. Tuy nhiên, nếu bạn đang làm điều đó bởi vì bạn không muốn người dùng của mình có thể thực hiện một số chức năng nhất định được cung cấp qua back-end, bạn nên sử dụng API khả năng và vai trò tích hợp của WordPress thay thế. Cung cấp cho người dùng của bạn một vai trò chỉ với những khả năng mà bạn muốn họ có. Mặt khác, việc cấp quyền truy cập vào các hành động Ajax có thể sẽ cho phép họ thực hiện những việc mà bạn đang cố gắng ngăn họ thực hiện.

Điều này đưa chúng tôi đến nguyên nhân của vấn đề của bạn. Ajax có liên quan đến việc tải lên hình ảnh và trình xử lý Ajax ( wp-admin/admin-ajax.php) là back-end về mặt kỹ thuật, ngay cả khi được gọi từ giao diện người dùng. Vì vậy, mã của bạn được nối vào 'admin_init'đang được kích hoạt. Những gì bạn cần làm là kiểm tra xem yêu cầu có phải là yêu cầu Ajax trong hàm đó không và chỉ thoát / chuyển hướng nếu không. Kể từ WP 4.7, bây giờ bạn có thể sử dụng wp_doing_ajax()chức năng này.

function redirect_non_admin_users() {
    if ( wp_doing_ajax() ) {
        return; // Don't block Ajax requests.
    }

    if ( ! current_user_can( 'manage_options' ) && '/wp-admin/admin-ajax.php' != $_SERVER['PHP_SELF'] ) {
        wp_redirect( home_url() );
        exit;
    }
}
add_action( 'admin_init', 'redirect_non_admin_users' );

Nếu bạn chỉ muốn cho phép người dùng của mình truy cập vào tệp đính kèm, có lẽ bạn có thể thay đổi điều kiện này:

    if ( wp_doing_ajax() && isset( $_POST['action'] ) && 'upload-attachment' === $_POST['action'] ) {
        return; // Don't block attachment upload requests.
    }

Tuy nhiên, lưu ý rằng nhiều plugin cũng cung cấp các hành động Ajax của riêng chúng, điều này sẽ bị chặn trong trường hợp này. Vì vậy, bạn sẽ tốt hơn khi sử dụng API vai trò và khả năng, như đã nêu ở trên.


nó chỉ sai chức năng chặn phải dựa trên các khả năng không phải từ nơi yêu cầu đến. Về cơ bản, điều này chỉ lặp lại sai lầm của OP, chỉ là cách khác (quá thoải mái)
Mark Kaplun

@MarkKaplun Tất nhiên rồi. Nhưng trong trường hợp này, chúng tôi không chỉ giới hạn một tính năng cụ thể. Nếu bạn định hạn chế wp-adminhoàn toàn, nhưng vẫn cần cho phép các yêu cầu Ajax, tôi không chắc bạn sẽ làm thế nào khác. Tất nhiên mỗi cuộc gọi lại Ajax nên có kiểm tra khả năng riêng, nhưng đó là một vấn đề riêng biệt theo như tôi có thể thấy. Điều này sẽ không ghi đè bất kỳ kiểm tra khả năng nào mà các cuộc gọi lại Ajax tự thực hiện. Nó hoàn toàn không ảnh hưởng đến các cuộc gọi lại Ajax, chỉ có khả năng truy cập vào back-end. Đó là điều duy nhất mà OP nói rằng họ muốn hạn chế. Không phải các hành động Ajax. :-)
JD

Tôi đoán tôi đã giả định rằng vì OP vẫn cho phép người dùng thực hiện các loại hành động này, nên việc ẩn phần cuối chủ yếu chỉ là tính thẩm mỹ. Tất nhiên, nếu đó không phải là trường hợp thì họ cần phải xem xét kỹ hơn những khả năng họ đang cung cấp cho người dùng.
JD

@MarkKaplun Tôi vừa cập nhật câu trả lời để làm rõ rằng nên sử dụng API vai trò và khả năng nếu bạn đang cố gắng hạn chế quyền truy cập vào các tính năng cụ thể và không chỉ giao diện phụ trợ.
JD

Tôi đoán vấn đề là với việc hạn chế ajax ở nơi đầu tiên. rất nhiều plugin sẽ bị hỏng mà không vui chút nào Đối với việc kiểm tra xem bạn có đang thực hiện AJAX hay không, đối với tôi, đó là một cảm giác an toàn sai lầm có thể khiến bạn trở thành nạn nhân dễ dàng hơn của các cuộc tấn công leo thang đặc quyền. Trên thực tế sẽ đánh giá thấp câu hỏi, nhưng với 5 câu hỏi thì thật vô nghĩa
Mark Kaplun

0

Giữ cho nó đơn giản, có hai plugin mà tôi sử dụng để đạt được cùng một thứ bạn tìm kiếm một cách hiệu quả:

  1. Quản trị viên WP No SHow : https://wordpress.org/plugins/wp-admin-no-show/

  2. Chuyển hướng sau khi đăng nhập : https://wordpress.org/plugins/redirect-after-login/

Tùy chọn đầu tiên cho phép bạn chọn nhiều vai trò và chuyển hướng chúng khi chúng tìm cách truy cập wp-admin Tùy chọn thứ hai cung cấp cho bạn tùy chọn để chuyển hướng các vai trò riêng lẻ khi chúng đăng nhập.

Hi vọng điêu nay co ich.

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.