2012-02-23 14 views
5

Mam dostosowaną wtyczkę do wykonania niektórych wywołań ajaxów do admina-ajax.php i działa świetnie. I skopiowany kod do innego miejsca i już nie działa dla użytkowników, którzy nie są zalogowaniWordpress admin-ajax skutkuje błędem 302 przekierowaniem

Od Firebug.

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

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

edycji: Chodzi o to, co mogłoby tematem ewentualnie zrobić, aby przekierować żądania ajax. Wtyczka ma dwa haki:

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 

Oboje działają dobrze na większości stron, ale jeden motyw przekierowuje żądania od non zalogowanych użytkowników jakoś. Ponieważ te działania są specyficzne dla wtyczki, nie mam pojęcia, od czego zacząć.

ROZWIĄZANIE: Wielkie dzięki Ronald Huereca dla roztworu add_action('init', to jest dokładnie to, gdzie przekierowanie wykraczająca został podpinania się, próbując chronić obszar administracyjny. Teraz potrzebuję znaleźć bezpieczną poprawkę, która nie narusza obszaru administratora tematu, ale także nie ściska innych wtyczek od zezwalania użytkownikom na tworzenie anonimowych zapytań ajaxowych.

// 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

Pytanie nie mówi nic na temat problemu. Opracować. – ThinkingMonkey

+0

Niestety, problemem jest to, że nie mam pojęcia, co może przekierować żądania ajax do admin-ajax.php Działania są moje, działają dobrze, więc gdzie można "wejść w drogę", aby spowodować przekierowanie. – Sinetheta

+0

Proszę zignorować (usuń komentarz nie działa; ( –

Odpowiedz

10

Miałem coś podobnego w temacie. Pierwotny programista próbował uniemożliwić użytkownikowi niebędącemu administratorem wyświetlanie/wp-admin/obszaru.

Oto przykład:

// 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' 

chciałbym sprawdzić motywu kodzie źródłowym podobny do tego, co mam.

Gdy znajdziesz kod, wystarczy dodać dodatkowy tryb warunkowy, aby upewnić się, że użytkownik nie jest przekierowany jeśli DOING_AJAX stała jest zdefiniowana.

+0

Uderzyłeś w gwóźdź w głowę, to był dokładnie ten hak, którego użyli, podałem szczegóły w moim pytaniu. Teraz muszę tylko wymyślić bezpieczny sposób na wyłączenie tego bez kompromisu w obszarze administratora tematu ... – Sinetheta

0

zmiana warunkiem

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

dodać !is_ajax()

0

miałem dokładnie ten sam problem i to pracował dla mnie:

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

wiem, że to wciąż stare pytanie, ale można Spójrz.

zróbmy KOD szybciej, jeśli nie interesuje NA wyjaśnienie:

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

WYJAŚNIENIE: Przyczyną tego problemu jest to, że albo niektóre z zainstalowanych wtyczek są przekierowanie non użytkowników administratora do strony głównej ani żadnych stron, gdy próbują uzyskać dostęp do wp-admin, takich jak http://localhost/project/wp-admin. To powoduje problemy.

TAK, kiedy przekierowywany użytkownik nie ma dostępu do administratora, można użyć następującego kodu. Będzie to również działać w wywołaniu ajax ajax w interfejsie użytkownika.

Powiązane problemy