Как отправить ajax запрос и получить ответ от функции?

1 июн. 2016 г., 03:34:58
Просмотры: 23.5K
Голосов: 3

Я создал функцию внутри плагина. Я хочу вызвать ее с помощью jQuery ajax функции.

Функция определена следующим образом:

add_action( 'wp_ajax_my_test_ajax', 'my_test_ajax' );
add_action( 'wp_ajax_nopriv_my_test_ajax', 'my_test_ajax' );

function  my_test_ajax() {    
    // Создаем массив с заголовком и содержимым
    $resp = array('title' => 'вот заголовок', 'content' => 'вот содержимое') ;        
    wp_send_json($resp) ;
}

Затем я пытаюсь вызвать функцию из JavaScript:

var target = 'http://'  +  window.location.hostname  + '/wp-admin/admin-ajax.php' ;
var data = {
    action: ' my_test_ajax'
} ;
var req = jQuery.post( target , data,  function(resp) { 
    console.log(resp.responseText);
}) ;    
}

Сайт отвечает из admin-ajax.php. Ответ содержит заголовок '200 OK'. Тело ответа - '0'.

В документации WordPress говорится, что такой ответ можно получить, если значение 'action' в теле POST-запроса не соответствует имени функции, привязанной к хукам ajax WordPress. Но насколько я могу судить, у меня с этим все в порядке.

Я уверен, что функция включена в файл моего плагина.

Какие еще минимальные требования нужны, чтобы это заработало?

(Я пока не хочу беспокоиться о nonces или локализации js. Я просто хочу получить ответ от функции, прежде чем продолжить дальнейшую разработку)

0
Все ответы на вопрос 2
0

$.ajax очень прост, и вы можете легко добавить дополнительные параметры в строку data: {action:'my_test_ajax'}, попробуйте так:

var target = 'http://'  +  window.location.hostname  + '/wp-admin/admin-ajax.php';
$.ajax({
    url: ajax,
    data: {action:'my_test_ajax'},
    type: 'post',
    success: function(data){
        console.log(data, data.title, data.content)
    }
});

Убедитесь, что target указывает точно на admin-ajax.php или задайте глобальную переменную (или используйте локализацию скрипта) для хранения пути к admin-ajax.php, который в случае сомнений можно получить через admin_url('admin-ajax.php').

$.ajax по умолчанию парсит JSON-данные. Если вы работаете с другими методами, которые возвращают ответ как есть (в виде строки), просто используйте метод JSON.parse(response). Это связано с тем, что вы используете wp_send_json($resp), который возвращает ответ в формате JSON на стороне сервера.

Вот пример добавления дополнительных данных в запрос:

Используйте метод append для переменной данных или сохраните его коротким и простым, например: data: {action:'my_test_ajax', name: 'dave', network: 'wpse'}. В функции my_test_ajax вы можете получить эти данные через $_REQUEST[tag], например: $_REQUEST['name'].

Метод $.get ( $_GET ):

Этот метод ещё проще и требует меньше кода:

$.get( target = '/wp-admin/admin-ajax.php?action=my_test_ajax', function( data ) {
    console.log( data )
});

Не забывайте использовать $_REQUEST в вашем PHP-скрипте, так как он объединяет все наборы данных $_GET, $_POST и $_COOKIE. Разумеется, если вы уверены в используемом методе, можно обойтись без него.

Надеюсь, это поможет.

1 июн. 2016 г. 04:27:57
0

1) У вас есть лишний пробел в коде, из-за чего он не работает:

action: ' my_test_ajax'
         ^

2) Также вы обязательно должны включить check_admin_referrer() !!!!!!!!!

function my_test_ajax() {  
   check_admin_referrer();
    .........
    .........
}
4 окт. 2016 г. 23:07:20