Как отправить ajax запрос и получить ответ от функции?
Я создал функцию внутри плагина. Я хочу вызвать ее с помощью 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. Я просто хочу получить ответ от функции, прежде чем продолжить дальнейшую разработку)
$.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. Разумеется, если вы уверены в используемом методе, можно обойтись без него.
Надеюсь, это поможет.