Admin Ajax возвращает 0

27 апр. 2013 г., 18:02:46
Просмотры: 119K
Голосов: 45

Я относительно новичок в 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();


}
8
Комментарии

Вы проверили, что ajaxurl установлен правильно?

Andrew Bartel Andrew Bartel
27 апр. 2013 г. 18:14:31

Показывает ли консоль браузера какие-либо ошибки? Если да, то какие именно?

s_ha_dum s_ha_dum
27 апр. 2013 г. 18:17:52

jQuery('.cl_link_buttons').val('id').click(function() выглядит подозрительно.

fuxia fuxia
27 апр. 2013 г. 18:26:28

Эндрю, да, я считаю, что это правильно, URL запроса в Chrome Inspector показывает domain/wp-admin/admin-ajax.php

Apina Apina
27 апр. 2013 г. 20:08:37

@s_ha_dum Ошибок не отображается

Apina Apina
27 апр. 2013 г. 20:10:30

@toscho Возможно, это выглядит странно, но это был единственный способ, который я смог придумать для получения ID элемента при клике, и он действительно выполняет свою работу. Код также показывает, что у него есть эти данные, но проблема заключается в получении ответа от PHP.

Apina Apina
27 апр. 2013 г. 20:10:56

Смотрите также как отлаживать AJAX с помощью HTTP.

fuxia fuxia
27 апр. 2013 г. 21:02:54

Нет необходимости использовать return false. Если вы используете jQuery, воспользуйтесь http://api.jquery.com/event.preventdefault/.

Solomon Closson Solomon Closson
26 окт. 2015 г. 19:08:49
Показать остальные 3 комментариев
Все ответы на вопрос 15
2
53

Ответ 0 означает, что либо действие не установлено (в данных ajax), либо функция обратного вызова для этого действия не может быть найдена.

27 июл. 2013 г. 06:00:18
Комментарии

Да, это правильный ответ. Добавление die() в конце просто завершает выполнение скрипта. Этот ответ технически верен, если вы видите 0 в КОНЦЕ вывода, однако если вы получаете только '0', это означает, что ничего не было возвращено, и у вас есть ошибка, как описано в этом ответе.

Hybrid Web Dev Hybrid Web Dev
11 мая 2014 г. 23:26:13

Или вы просто намеренно ничего не возвращали в PHP-коде, обрабатывающем AJAX-запрос. Убедитесь, что вы что-то выводите с помощью echo, в противном случае используйте .always для перехвата результата.

Solomon Closson Solomon Closson
26 окт. 2015 г. 19:12:25
7
33

Что вам нужно сделать, это добавить die(); в конце вашей функции.

Подробнее о причине и дополнительную информацию смотрите здесь: http://codex.wordpress.org/AJAX_in_Plugins

Примечания:

  • Перед выполнением die следует вывести что-нибудь через echo. Это предотвратит ошибки сервера и поможет при отладке.
27 янв. 2014 г. 22:40:58
Комментарии

Это ответ на проблему с WP AJAX 0.

Ben Racicot Ben Racicot
26 мар. 2014 г. 17:59:31

На самом деле, если вы просто добавите die() без вывода чего-либо, это также приведёт к ошибке 500 Internal Server Error и возврату 0 для wp-admin/admin-ajax.php. Вы всегда должны что-то выводить, даже если вы просто устанавливаете значения и ничего не требуется возвращать. В противном случае, если вы ничего не выводите и используете die(), вам придётся использовать .always() для перехвата, потому что это не попадёт в .done(), а окажется в .fail(), так как завершится без вывода чего-либо = Ошибка 500.

Solomon Closson Solomon Closson
26 окт. 2015 г. 19:05:14

У вас есть какие-нибудь ссылки или рабочий код, чтобы мы могли взглянуть? @SolomonClosson

Francisco Corrales Morales Francisco Corrales Morales
26 окт. 2015 г. 19:18:52

Все мои ответы были протестированы в реальных средах. Проверить это очень просто — просто добавьте 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 Solomon Closson
26 окт. 2015 г. 21:33:29

Вы заметите, что появится Failed, а ответом будет 500 Internal Server Error.

Solomon Closson Solomon Closson
26 окт. 2015 г. 21:38:13

Затем добавьте echo в PHP-функцию прямо перед die();, и тогда ответом будет результат echo.

Solomon Closson Solomon Closson
26 окт. 2015 г. 21:39:06

Я проверил это с dataType, установленным в HTML, не уверен, возвращают ли другие типы данных что-то другое, или что происходит, когда он не установлен, так как в этом случае будет предпринята попытка определить тип данных. На мой взгляд, лучше всегда что-то выводить, даже если это строка с текстом 'success' или 'failure'.

Solomon Closson Solomon Closson
26 окт. 2015 г. 21:42:21
Показать остальные 2 комментариев
1

У меня была такая же проблема, и оказалось, что я использовал return вместо echo в своей PHP-функции. После изменения на echo всё заработало.

function doAjax() {
    $result = getPosts();
    echo json_encode($result, true);
    die();
}
29 мар. 2016 г. 22:07:36
Комментарии

Спасибо, чувак! У меня заработало))

Pavel8289 Pavel8289
17 февр. 2021 г. 18:27:39
3

Итак, я разобрался. Проблема была не в самом jQuery, хотя я его и улучшил, а в расположении функции обратного вызова. Я перенёс её в основной файл плагина, и это сработало.

28 апр. 2013 г. 19:10:07
Комментарии

можешь показать, как ты это сделал?

Francisco Corrales Morales Francisco Corrales Morales
27 янв. 2014 г. 22:39:00

У меня такая же проблема, не мог бы ты показать, как ты её исправил?

Jeremy Jeremy
8 мар. 2014 г. 20:31:01

Другой ответ здесь: http://wordpress.stackexchange.com/a/131397 @Jeremy

Francisco Corrales Morales Francisco Corrales Morales
26 мар. 2014 г. 18:22:55
1

У меня была такая же проблема. И я её решил. Вы должны передавать переменную "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
11 мая 2014 г. 22:54:26
Комментарии

OP действительно отправляет параметр action. Хотя это могло сработать для вас, здесь это не было проблемой.

s_ha_dum s_ha_dum
11 мая 2014 г. 23:19:07
7

Попробуйте запустить этот код в консоли

jQuery.post(ajaxurl, {action:'cleanlinks_ajax_get_post_data'}, function(response) {
     console.log (response);
});

Я вижу множество проблем в вашем JavaScript коде, и это может быть причиной.

27 апр. 2013 г. 20:22:22
Комментарии

Вот выводится много вещей, которые я не до конца понимаю. Что я понимаю: ReadyState 4, статус 200, responseText "0".

И затем выводится ответ 0.

Есть ли что-то конкретное, на что мне следует обратить внимание здесь?

Если есть проблемы с кодом, пожалуйста, укажите на них, и я могу разобраться, я всё ещё изучаю jQuery.

Apina Apina
27 апр. 2013 г. 20:34:37

У вас сайт запущен на живом сервере?

Omar Abid Omar Abid
27 апр. 2013 г. 20:35:46

Нет, это localhost

Apina Apina
27 апр. 2013 г. 20:36:13

Сложно сказать. Можешь попробовать выполнить console.info(ajaxurl) и посмотреть, что выведется?

Omar Abid Omar Abid
27 апр. 2013 г. 20:37:08

В ответ приходит /wp-admin/admin-ajax.php

редактирование --

/wp-admin/admin-ajax.php undefined

Apina Apina
27 апр. 2013 г. 20:45:34

Попробуй заменить ajaxurl на 'http://localhost/wp-admin/admin-ajax.php' и посмотри, что получится

Omar Abid Omar Abid
27 апр. 2013 г. 21:57:39

Не прямое решение, но этот ответ определённо стоит проверить в поисках решения для автора вопроса

Nirav Zaveri Nirav Zaveri
7 янв. 2016 г. 12:05:07
Показать остальные 2 комментариев
2
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();
    }
?>
22 мар. 2018 г. 06:01:44
Комментарии

Просто публиковать код нехорошо, не могли бы вы объяснить, что делает этот фрагмент кода?

bravokeyl bravokeyl
22 мар. 2018 г. 06:52:24

важно: $date = isset($_POST['date']) ? $_POST['date'] : 0; И функция die();

Ngocheng Ngocheng
22 мар. 2018 г. 08:35:06
0

Для справки: если вы переходите с разработки шорткодов и получаете корректный ответ через WordPress Ajax-запрос, но к нему добавляется 0, это происходит только потому, что вы используете 'echo' вместо 'return'. Шорткоды никогда не должны использовать 'echo' или выводить что-либо напрямую. Ещё один возможный сценарий.

12 мар. 2021 г. 09:24:06
0

У меня была такая же проблема, и я исправил её, использовав wp_die() в конце своей функции сразу после echo. Не забудьте передать ваше действие в скрипте.

Для уверенности проверьте, должна ли ваша функция использовать wp_ajax_nopriv, как wp_ajax.

18 июл. 2016 г. 18:53:03
0

Для справки, для тех, кто попал сюда по запросу "ajax request is returning 0": Помните, что при добавлении ajax-действия к методу объекта убедитесь, что модификатор доступа метода — public.

add_action( 'wp_ajax_my_action', [$object, 'my_method']);

add_action просто молча игнорирует ситуацию, если не может вызвать ваш метод вне контекста $object.

27 апр. 2017 г. 23:36:01
0

Если вы не используете функцию 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
});
17 окт. 2017 г. 16:26:56
0

Те, кто получают ошибку 0 :), action => 'action'

var data = { 'action': 'firmabilgilerikaydet', 'data': form_data };

$.post(ajaxurl, data, function(response) { alert(response); });
10 нояб. 2019 г. 21:59:08
0

Если вы используете локальный сервер и ваш PHP-код находится в файле плагина, сначала войдите в админ-панель и обновите страницу плагинов. Затем проверьте, активирован ли плагин. После этого перейдите на фронтенд, обновите страницу и попробуйте отправить данные снова.

2 июн. 2020 г. 06:34:17
2
-1
ВЫ ПРОБОВАЛИ:

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 );

Надеюсь, это будет полезно для вас, С наилучшими пожеланиями

22 мар. 2017 г. 10:34:26
Комментарии

Возможно, стоит объяснить почему :)

kaiser kaiser
22 мар. 2017 г. 11:09:46

Ключевым моментом здесь может быть функция ob_clean();. Вы можете попробовать и проверить

Ly Van Vu Ly Van Vu
24 мар. 2017 г. 06:20:43
1
-2

Попробуйте добавить условный оператор if:

function my_function(){
$id = $_POST['variation_id'];

    if(isset($_POST['variation_id'])) { 


// ваш код функции


die();
}
23 сент. 2013 г. 04:33:38
Комментарии

Как это решит проблему? Обратите внимание на принятый ответ и исходный код.

fuxia fuxia
23 сент. 2013 г. 05:28:28