Wordpress admin-ajax приводит к ошибке 302 перенаправления - PullRequest
12 голосов
/ 23 февраля 2012

Я настроил плагин для некоторых вызовов ajax в admin-ajax.php, и он прекрасно работает.Я скопировал код на другой сайт, и он больше не работает для пользователей, которые не вошли в систему.

Из firebug:

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

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

edit : Вопросчто может сделать тема для перенаправления запросов ajax.Плагин имеет две ловушки:

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

Они прекрасно работают на большинстве сайтов, но одна тема перенаправляет запросы от не авторизованных пользователей.Поскольку эти действия специфичны для плагина, я не знаю, с чего начать.

РЕШЕНИЕ: Большое спасибо Рональду Хуереке за add_action( 'init'решение, это именно то, где перенаправляющий нарушитель был подключен в попытке защитить область администратора.Теперь мне просто нужно найти безопасное исправление, которое не нарушает область администрирования темы, но также не мешает другим плагинам разрешать пользователям делать анонимные запросы ajax.

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

Ответы [ 4 ]

18 голосов
/ 24 февраля 2012

У меня было что-то подобное в теме. Оригинальный кодер пытался помешать пользователю без прав администратора видеть область / wp-admin /.

Вот пример:

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

Я бы проверил вашу тему на наличие исходного кода, аналогичного тому, который у меня есть.

Когда вы найдете код, просто добавьте дополнительное условие, чтобы убедиться, что пользователь не перенаправлен, если определена константа DOING_AJAX .

4 голосов
/ 10 марта 2015

Я знаю, что это все еще старый вопрос, но вы можете посмотреть.

ПОЗВОЛЯЕТ КОДУ БЫСТРЕЕ, ЕСЛИ НЕ ЗАИНТЕРЕСОВАНО ПО ОБЪЯСНЕНИЮ:

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

ПОЯСНЕНИЯ: Причиной этой проблемы является то, что либо некоторые из установленных плагинов перенаправляют пользователей без прав администратора на домашнюю страницу, либо на любые страницы, когда они пытаются получить доступ к wp-admin, например http://localhost/project/wp-admin. Так что это вызывает проблемы.

ТАК, когда вы перенаправляете не-администраторов из доступа к администратору, вы можете использовать следующий код. Это также будет работать при вызове администратора ajax во внешнем интерфейсе.

0 голосов
/ 14 октября 2014

У меня была точно такая же проблема, и у меня это сработало:

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 );
0 голосов
/ 25 октября 2013

изменить условие на

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

добавить !is_ajax()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...