2012-02-23 28 views
5

Tôi đã tùy chỉnh một plugin để thực hiện một số cuộc gọi ajax tới admin-ajax.php và nó hoạt động tốt. Tôi sao chép mã trên một trang web khác và nó không còn hoạt động cho những người dùng chưa đăng nhậpKết quả admin-ajax của Wordpress trong Lỗi 302 chuyển hướng

Từ firebug:.

POST http://<subdomain>.<server>/wp-admin/admin-ajax.php 302 Moved Temporarily 1.08s  

GET http://<subdomain>.<server>/ 200 OK 

chỉnh sửa: Câu hỏi đặt ra là những gì có thể một chủ đề có thể làm gì để chuyển hướng yêu cầu ajax. Plugin có hai móc:

add_action('wp_ajax_em_ajax_getEvents', 'em_ajax_getEvents'); // ajax for logged in users 
add_action('wp_ajax_nopriv_em_ajax_getEvents', 'em_ajax_getEvents'); // ajax for not logged in users 

Cả hai đều hoạt động tốt trên hầu hết các trang web, nhưng một chủ đề chuyển hướng yêu cầu từ người dùng không đăng nhập bằng cách nào đó. Vì những hành động này cụ thể đối với các plugin, tôi đang thua lỗ khi bắt đầu tìm kiếm ở đâu.

SOLUTION: Big nhờ Ronald Huereca cho các giải pháp add_action('init', đó là chính xác nơi chuyển hướng vi phạm đã được nối vào, trong một nỗ lực để bảo vệ khu vực admin. Bây giờ tôi chỉ cần tìm một sửa chữa an toàn ở đây mà không thỏa hiệp khu vực quản trị của chủ đề, nhưng cũng không bị ràng buộc các plugin khác từ cho phép người dùng thực hiện yêu cầu ajax ẩn danh.

// stop users accessing the admin 
add_action('init', array($this, 'prevent_admin_access'), 0); 

function prevent_admin_access() {  

    if (strpos(strtolower($_SERVER['REQUEST_URI']), '/wp-admin') !== false) { 
     $current_user = wp_get_current_user(); 

     if(!user_can($current_user->ID, 'administrator') && (!user_can($current_user->ID, 'contributor'))){ 
      wp_redirect(get_option('siteurl')); 
     } 
    } 
} 
+0

Câu hỏi không nói bất cứ điều gì về sự cố. Kỹ lưỡng. – ThinkingMonkey

+0

Xin lỗi, sự cố chỉ là tôi không biết có thể chuyển hướng yêu cầu ajax tới admin-ajax.php Các hành động là của riêng tôi, họ làm việc tốt, vì vậy, nơi có thể một "nhận được trong cách" để gây ra chuyển hướng đó. – Sinetheta

+0

Hãy bỏ qua (xóa bình luận không làm việc; ( –

Trả lời

10

Tôi đã có điều tương tự xảy ra trong một chủ đề. Bộ mã gốc đã cố gắng ngăn người dùng không phải quản trị viên có thể xem/wp-admin/khu vực.

Dưới đây là một ví dụ:

// Block Access to /wp-admin for non admins. 
function custom_blockusers_init() { 
    if (is_user_logged_in() && is_admin() && !current_user_can('administrator')) { 
    wp_redirect(home_url()); 
    exit; 
    } 
} 
add_action('init', 'custom_blockusers_init'); // Hook into 'init' 

tôi sẽ kiểm tra chủ đề của bạn cho mã nguồn tương tự như những gì tôi có.

Khi bạn tìm thấy mã, chỉ cần thêm một điều kiện bổ sung để đảm bảo rằng người dùng không được chuyển hướng nếu hằng số DOING_AJAX được xác định.

+0

Bạn nhấn móng tay trên đầu, nó chính xác là móc mà họ đã sử dụng; Tôi đã bao gồm các chi tiết trong câu hỏi của tôi. Bây giờ tôi chỉ cần nghĩ một cách an toàn để vô hiệu hóa nó mà không ảnh hưởng đến khu vực quản trị của chủ đề ... – Sinetheta

0

thay đổi điều kiện để

!user_can($current_user->ID, 'administrator') && (!user_can($current_user->ID, 'contributor')) && !is_ajax() 

thêm !is_ajax()

0

tôi đã có vấn đề chính xác cùng và điều này đã làm việc cho tôi:

function mt_redirect_admin() { 

if (! current_user_can('manage_options') && (! defined('DOING_AJAX') || ! DOING_AJAX)) { 
wp_redirect(site_url()); 
exit; 
} 
} 

add_action('admin_init', 'mt_redirect_admin', 1); 
3

Tôi biết điều này vẫn còn là một câu hỏi cũ nhưng bạn có thể có một cái nhìn.

LETS DO BỘ LUẬT FASTER NẾU KHÔNG QUAN TÂM VỀ GIẢI THÍCH:

function redirect_non_admin_user(){ 
    if (!defined('DOING_AJAX') && !current_user_can('administrator')){ 
     wp_redirect(site_url()); exit; 
    } 
} 


add_action('admin_init', 'redirect_non_admin_user'); 

GIẢI THÍCH: Lý do cho vấn đề này là một trong hai một số các plugin được cài đặt đang chuyển hướng người dùng quản trị không phải trang chủ hoặc bất kỳ trang khi họ cố gắng truy cập wp-admin như http://localhost/project/wp-admin. Vì vậy, điều này gây ra vấn đề.

SO khi bạn chuyển hướng người quản trị không truy cập vào quản trị viên, bạn có thể sử dụng mã sau.Điều này cũng sẽ hoạt động trong lệnh gọi ajax của quản trị viên trong giao diện người dùng.

Các vấn đề liên quan