Admin Ajax возвращает 0
Я относительно новичок в jQuery и особенно в AJAX. У меня возникла небольшая проблема с возвращаемым значением, которое всегда равно 0, хотя я думаю, что это на самом деле сообщение об успехе, и оно ничего не возвращает.
Я просмотрел все возможные источники в Google, и у меня есть функция die() в PHP-обработчике, и я полагаю, что add_actions прописаны правильно.
Я работаю на локальном хосте, хотя я сомневаюсь, что это влияет на результат, и всё это происходит в админке, не во фронтенде. Я также проверил, что js подключен и локализован.
Я получаю сообщение 200 OK в инструментах разработчика Chrome.
Я также протестировал базовый AJAX из http://codex.wordpress.org/AJAX_in_Plugins, и он тоже вернул 0, что заставляет меня думать, что проблема может быть в чём-то другом, не в коде, приведённом ниже.
Сейчас я просто пытаюсь заставить его что-нибудь отправить обратно в jQuery. Буду благодарен за любую помощь.
jQuery код
jQuery(document).ready(function(){
jQuery('.cl_link_buttons').val('id').click(function() {
var currentid = jQuery(this).attr('id');
//вывести алерт
console.log(currentid);
jQuery.ajax ( data = {
action: 'cleanlinks_ajax_get_post_data',
url: ajaxurl,
type: 'POST',
dataType: 'text',
"currentid" : currentid
});
jQuery.post(ajaxurl, data, function(response) {
var dataz = response;
alert( dataz );
console.log (dataz); //показать json в консоли
});
return false;
}); //конец события click
}); //конец doc ready
PHP код
add_action("wp_ajax_cleanlinks_ajax_get_post_data", "cleanlinks_ajax_get_post_data");
add_action("wp_ajax_nopriv_cleanlinks_ajax_get_post_data", "cleanlinks_ajax_get_post_data");
function cleanlinks_ajax_get_post_data() {
$from_ajax = $_POST['currentid'];
echo "сделать" . $from_ajax . "что-то";
die();
}
Да, это правильный ответ. Добавление die() в конце просто завершает выполнение скрипта. Этот ответ технически верен, если вы видите 0 в КОНЦЕ вывода, однако если вы получаете только '0', это означает, что ничего не было возвращено, и у вас есть ошибка, как описано в этом ответе.
Hybrid Web Dev
Что вам нужно сделать, это добавить die(); в конце вашей функции.
Подробнее о причине и дополнительную информацию смотрите здесь: http://codex.wordpress.org/AJAX_in_Plugins
Примечания:
- Перед выполнением
dieследует вывести что-нибудь черезecho. Это предотвратит ошибки сервера и поможет при отладке.
На самом деле, если вы просто добавите die() без вывода чего-либо, это также приведёт к ошибке 500 Internal Server Error и возврату 0 для wp-admin/admin-ajax.php. Вы всегда должны что-то выводить, даже если вы просто устанавливаете значения и ничего не требуется возвращать. В противном случае, если вы ничего не выводите и используете die(), вам придётся использовать .always() для перехвата, потому что это не попадёт в .done(), а окажется в .fail(), так как завершится без вывода чего-либо = Ошибка 500.
Solomon Closson
У вас есть какие-нибудь ссылки или рабочий код, чтобы мы могли взглянуть? @SolomonClosson
Francisco Corrales Morales
Все мои ответы были протестированы в реальных средах. Проверить это очень просто — просто добавьте die(); в ajax-функцию в файле functions.php, не выводя перед этим ничего, и вызовите действие через ajax, например: var testing = $.ajax( ... ); testing.fail(function(response) { console.log('Failed ' + response); }); testing.done(function(response) { console.log('Success ' + response); }); testing.always(function(response) { console.log('Ajax Request complete: ' + response); });
Solomon Closson
Вы заметите, что появится Failed, а ответом будет 500 Internal Server Error.
Solomon Closson
Затем добавьте echo в PHP-функцию прямо перед die();, и тогда ответом будет результат echo.
Solomon Closson
Я проверил это с dataType, установленным в HTML, не уверен, возвращают ли другие типы данных что-то другое, или что происходит, когда он не установлен, так как в этом случае будет предпринята попытка определить тип данных. На мой взгляд, лучше всегда что-то выводить, даже если это строка с текстом 'success' или 'failure'.
Solomon Closson
Другой ответ здесь: http://wordpress.stackexchange.com/a/131397 @Jeremy
Francisco Corrales Morales
У меня была такая же проблема. И я её решил. Вы должны передавать переменную "action", как в примере:
var dataString = {lat: '55.56', lng: '25.35', action:'report_callback'};
$.ajax({
url: "http://domain.net/wp-admin/admin-ajax.php",
type: "POST",
//иногда можно попробовать этот метод для отправки переменной action
//action : 'report_callback',
data:dataString,
success: function(data){
console.log(data);
},
error: function() {
console.log("Ошибка");
}
});
Потому что в wp-admin/admin-ajax.php есть обработчик для переменной action:
if ( empty( $_REQUEST['action'] ) ) {...}
Строка 26
Вот выводится много вещей, которые я не до конца понимаю. Что я понимаю: ReadyState 4, статус 200, responseText "0".
И затем выводится ответ 0.
Есть ли что-то конкретное, на что мне следует обратить внимание здесь?
Если есть проблемы с кодом, пожалуйста, укажите на них, и я могу разобраться, я всё ещё изучаю jQuery.
Apina
Сложно сказать. Можешь попробовать выполнить console.info(ajaxurl) и посмотреть, что выведется?
Omar Abid
В ответ приходит /wp-admin/admin-ajax.php
редактирование --
/wp-admin/admin-ajax.php undefined
Apina
Попробуй заменить ajaxurl на 'http://localhost/wp-admin/admin-ajax.php' и посмотри, что получится
Omar Abid
jQuery(document).ready(function(){
jQuery('.cl_link_buttons').val('id').click(function() {
$.ajax({
type:'POST',
url: ajaxurl,
data: {
action : 'ajax_filter',
currentid : 'currentid'
},
success: function (result) {
console.log(result);
$result = $(result);
$result.fadeIn('7000');
$("#showresults").html(result);
},
error: function (xhr, status) {
alert("Извините, произошла ошибка!");
},
complete: function (xhr, status) {
$('#showresults').slideDown('slow')
}
});
});
});
//PHP функция
<?php
add_action( 'wp_ajax_nopriv_ajax_filter', 'ajax_filter' );
add_action( 'wp_ajax_ajax_filter', 'ajax_filter' );
function ajax_filter(){
$date = isset($_POST['date']) ? $_POST['date'] : 0;
echo $date;
die();
}
?>
Для справки: если вы переходите с разработки шорткодов и получаете корректный ответ через WordPress Ajax-запрос, но к нему добавляется 0, это происходит только потому, что вы используете 'echo' вместо 'return'. Шорткоды никогда не должны использовать 'echo' или выводить что-либо напрямую. Ещё один возможный сценарий.
У меня была такая же проблема, и я исправил её, использовав wp_die() в конце своей функции сразу после echo. Не забудьте передать ваше действие в скрипте.
Для уверенности проверьте, должна ли ваша функция использовать wp_ajax_nopriv, как wp_ajax.
Для справки, для тех, кто попал сюда по запросу "ajax request is returning 0":
Помните, что при добавлении ajax-действия к методу объекта убедитесь, что модификатор доступа метода — public.
add_action( 'wp_ajax_my_action', [$object, 'my_method']);
add_action просто молча игнорирует ситуацию, если не может вызвать ваш метод вне контекста $object.
Если вы не используете функцию wp_localize_script() для установки ajax url, admin ajax возвращает 0. Я думаю, это баг WordPress. Вот пример:
wp_enqueue_script( 'search_js', get_template_directory_uri() . '/js/search.js', array( 'jquery' ), null, true );
wp_localize_script( 'search_js', 'ajaxurl', admin_url( 'admin-ajax.php' ) );
Файл JavaScript (search.js):
$('#search_input').autocomplete({
source: function(request, response) {
$.ajax({
type: 'POST',
dataType: 'json',
url: ajaxurl,
data: 'action=my_custom_action_search&search_criteria=' + request.term,
success: function(data) {
response(data);
},
error: function(errorThrown){
console.log(errorThrown);
}
});
},
minLength: 3
});
Если вы используете локальный сервер и ваш PHP-код находится в файле плагина, сначала войдите в админ-панель и обновите страницу плагинов. Затем проверьте, активирован ли плагин. После этого перейдите на фронтенд, обновите страницу и попробуйте отправить данные снова.
ВЫ ПРОБОВАЛИ:
add_action('init', 'ly_form_ajax_init');
function ly_form_ajax_init() {
wp_register_script('ly-form-ajax-script', plugins_url().'/ly-form/js/ly-script.js' , array('jquery'));
wp_enqueue_script('ly-form-ajax-script');
wp_localize_script('ly-form-ajax-script', 'ly_form_ajax_object', array(
'ajaxurl' => admin_url('admin-ajax.php'),
'redirecturl' => home_url(),
'loadingmessage' => __('')
));
}
// Действие: contact_ajax
add_action( 'wp_ajax_contact_ajax', 'my_function' );
add_action( 'wp_ajax_nopriv_contact_ajax', 'my_function' );
function my_function(){
ob_clean();
echo "http://sanvatvungcao.com";
wp_die();
}
/**
* Шорткод на странице выглядит так: [ly-form]
* @param type $atts
* @param type $content
* @return string
*/
function ly_form_shortcode($atts, $content = "") {
echo html_form_code();
}
add_shortcode('ly-form', 'ly_form_shortcode');
// HTML форма будет отображаться
function html_form_code() {
$html = "";
$html.= '';
$html.= '';
$html.= ' Фамилия *
';
$html.= ' Имя *
';
$html.= ' Адрес *
';
$html.= ' Email *
';
$html.= ' Содержание * dg
';
$html.= ' ';
$html.= '';
$html.= '';
$html.= '';
return $html;
}
И ВОТ js (ly-script.js):
( function( $ ) {
$(document).ready(function () {
// Выполнение AJAX отправки формы
$('form.ly-form-ex').on('submit', function(e){
e.preventDefault();
$('#loading').html('загрузка...');
var dataString = {action:'contact_ajax'};
$.ajax({
type: "POST",
url: ly_form_ajax_object.ajaxurl,
data: dataString,
success: function (data) {
$('#loading').html(data);
},
error: function (errorThrown) {
alert(errorThrown);
}
});
});
}); // конец ready
} )( jQuery );
Надеюсь, это будет полезно для вас, С наилучшими пожеланиями