Ajax запрос в админке возвращает 0 при использовании die()
Итак, я использую такую конфигурацию для AJAX вызова в административной области (подобно этому):
add_action( 'admin_head', 'ajaxPerNgg' );
function ajaxPerNgg(){ ?>
<script type="text/javascript" >
jQuery(document).ready(function() {
jQuery("#message").remove();
jQuery("#errore a#attivo").click(
function(){
var data = {
action: 'my_action'
};
jQuery.post(ajaxurl, data, function(response) {
if(response == "attivato")
jQuery("#errore a#inattivo").attr("id","completato").html("Активировано");
else
jQuery("#errore a#inattivo").attr("id","attivo").html("Активировать сейчас");
});
}
);
});
</script>
<?php }
add_action('wp_ajax_my_action', 'my_action_callback');
function my_action_callback() {
echo 'attivato';
die();
}
Это просто тестовый код, но он всегда возвращает 0 вместо строки "attivato". При этом ajax url определяется правильно, без ошибки 404.
В чем проблема?
Я исправил это, убедившись, что суффикс "wp_ajax_SUFFIX" соответствует действию, поэтому действие в jQuery post также было "SUFFIX". Однако мне не нужно было использовать nopriv... Не уверен, что это решение проблемы автора, так как это действие происходит на странице админки, что по сути означает, что вы авторизованы, и предполагает, что вам не нужно регистрировать обработчик nopriv...

У меня была такая же проблема. Решение:
// Добавляем обработчик для неавторизованных пользователей
add_action('wp_ajax_nopriv_my_action', 'my_action_callback');
// Добавляем обработчик для авторизованных пользователей
add_action('wp_ajax_my_action', 'my_action_callback');
Если не добавить оба варианта (с nopriv и без), обработчик будет работать только для авторизованных или только для неавторизованных пользователей. nopriv предназначен для неавторизованных пользователей, второй вариант — для авторизованных.

Не уверен, что это ваша проблема, но у меня в ответе просто возвращалось "0", и потребовалось много времени, чтобы разобраться. Помимо необходимости добавлять exit
или die
в конце вашей PHP-функции, я обнаружил, что нужно размещать add_action('wp_ajax_...
на верхнем уровне вашего плагина. У меня он был вложен внутри хука admin_menu
, что не работало. Не знаю, является ли ваш код выше частью include внутри функции из основного файла плагина (как у меня было).
