Ограничить вызов функции загрузкой страницы, но не вызовом ajax


Я использую следующее, чтобы запретить Подписчикам (и Клиентам) доступ к административной области моего сайта:

/**
 * Redirect back to homepage and not allow access to WP admin for Subscribers.
 */
function xcsn_redirect_from_admin(){
    if ( ( ! current_user_can( 'edit_posts' ) ) && ( ! is_checkout() ) ){
        wp_redirect( site_url() );
        exit;
    }
}
add_action( 'admin_init', 'xcsn_redirect_from_admin' );

Он отлично работает, за исключением того, что он мешает вызову ajax, который выполняет моя страница оформления заказа (WooCommerce). Вызов останавливается, и проверка не может быть продолжена, если у вас нет привилегий "редактировать сообщения", что, очевидно, противоречит цели.

Мой вопрос: можно ли установить условие, которое будет работать с ранним вызовом, таким как admin_init, что позволит выполнять вызовы ajax, но не позволит загружать серверную часть администратора в виде страницы?

(Извините, если название неясно - его было трудно вместить в одно предложение!)

 1
Author: Pat Gilmour, 2014-08-20

1 answers

Проверьте константу DOING_AJAX. Он всегда определяется, когда кто-то использует API AJAX WordPress.

if ( defined( 'DOING_AJAX' ) && DOING_AJAX )
    return;

if ( is_admin() )
    add_action( 'admin_init', 'xcsn_redirect_from_admin' );
 2
Author: fuxia, 2014-08-20 23:42:33