Есть ли крючок, который срабатывает перед вызовом ajax?


Я использую стандартный admin-ajax.php способ выполнения ajax. Итак, у меня есть некоторые функции, подобные этой:

add_action( 'wp_ajax_nopriv_ajax_load_data', 'ajax_load_data' );
add_action( 'wp_ajax_ajax_load_data', 'ajax_load_data' );

function ajax_load_data() {
    ...
}

У меня много функций ajax. Есть ли хук WordPress, который срабатывает раньше всех? Моя цель - проверить наличие определенной роли пользователя, чтобы я мог замкнуть все вызовы ajax, поступающие с внешнего интерфейса.

 1
Author: somebodysomewhere, 2017-10-11

1 answers

Если вы заглянете в этот файл wp-admin/admin-ajax.php, где вызываются действия wp_ajax_, вы обнаружите, что действие admin_init вызывается перед ним.

Вот как вернуть другой объект json в зависимости от того, является ли пользователь администратором или нет:

add_action( 'wp_ajax_testing', 'my_ajax' );
add_action( 'admin_init', 'my_ajax_checker', 10, 2);

function my_ajax_checker() {
    if( defined('DOING_AJAX') && DOING_AJAX && current_user_can('manage_options') ) {

        switch($_POST['action']) {
            case 'action1':
            case 'action2':
            case 'action3':
                echo json_encode(array('error' => false));
                die();
        }
    }
}

function my_ajax() {
    echo json_encode(array('error' => true));
    die();
}

В этом примере он проверяет ваши действия, чтобы увидеть, какое действие Ajax вызывается, если вы вошли в систему с помощью одного из ваших действий, он всегда будет возвращать этот ответ json '{error:false}'. Он немедленно завершается, и функция my_ajax никогда не вызывается. Замените ответ тем, что вам нужно.

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

 7
Author: JoeMoe1984, 2017-10-12 04:11:03