Ajax запрос всегда возвращает 0

30 авг. 2013 г., 13:23:04
Просмотры: 77.7K
Голосов: 27

У меня проблема с AJAX, который всегда возвращает 0!

Я сделал всё по инструкции и не могу понять, что не так? Пожалуйста, помогите!!

Вот мой Ajax запрос:

//Передача данных через AJAX
var amountToConvert = price;

jQuery.ajax({
      type:"POST",
      url: "../../wp-admin/admin-ajax.php", // наш PHP обработчик
      action: "ajaxConversion",
      data: {
          amount: amountToConvert
      },
      success:function(data){
      alert(data);
      },
      error: function(errorThrown){
          alert(errorThrown);
      } 

  });
return false;

А вот функция в functions.php:

function ajaxConversion(){

$amount = mysql_real_escape_string($_POST['amount']);

echo $amount;

die();
};

add_action('wp_ajax_nopriv_ajaxConversion', 'ajaxConversion');
add_action('wp_ajax_ajaxConversion', 'ajaxConversion');
1
Комментарии

Вы пытались отладить свой код? Также используйте admin_url( 'admin-ajax.php' ) для получения AJAX URL, а не какой-то выдуманный URL.

fuxia fuxia
30 авг. 2013 г. 13:26:36
Все ответы на вопрос 7
1
30

Использование wp_die(); в конце AJAX-функции решило проблему в моём случае.

Например:

add_action( 'wp_ajax_my_ajax_function', 'my_ajax_function' );

function my_ajax_function(){      
    echo json_encode($myvar);
    wp_die(); // Важно вызывать эту функцию для завершения AJAX-запроса
}
8 июл. 2015 г. 10:14:31
Комментарии

спасибо... не знаю почему, но просто die() не сработало.

Sagive Sagive
12 июл. 2015 г. 11:38:32
3
16

Можете ли вы разместить действие (ajaxConversion) в ваших данных и проверить?

jQuery.ajax({
  type:"POST",
  url: ajaxurl,
  data: {
      action: "ajaxConversion",
      amount: amountToConvert
  },
  success:function(data){
  alert(data);
  },
  error: function(errorThrown){
      alert(errorThrown);
  } 

});
30 авг. 2013 г. 13:29:45
Комментарии

Это всё равно добавляет 0 к моему контенту, как-то так.

Ben Racicot Ben Racicot
26 мар. 2014 г. 17:55:08

@BenRacicot : Можешь проверить, есть ли у тебя в PHP коде какие-либо операторы вывода, такие как echo, die() и т.д.?

Jayawi Perera Jayawi Perera
27 мар. 2014 г. 05:26:48

Привет, Jay, Оказалось, что добавление die(); в мою ajax-функцию решило проблему!

Ben Racicot Ben Racicot
27 мар. 2014 г. 15:46:11
2
12

Для меня решением стало добавление действия wp_ajax_nopriv. Я тестировал скрипт в одном браузере, будучи авторизованным в админке WordPress, а затем попробовал тот же скрипт в Chrome и понял, что он не работает. После добавления wp_ajax_nopriv всё заработало. :)

add_action( 'wp_ajax_nopriv_erase_uploaded_images', 'erase_uploaded_images' );
add_action( 'wp_ajax_erase_uploaded_images', 'erase_uploaded_images' );

function erase_uploaded_images() {
    $attach_id = filter_input( INPUT_POST, 'attach_id' );
    wp_delete_attachment( $attach_id );
    if ( isset( $_SESSION['uploaded_images'] ) ) {
        $array_attachments = $_SESSION['uploaded_images'];
        if ( ( $key = array_search( $attach_id, $array_attachments ) ) !== false ) {
            unset( $array_attachments[$key] );
        }
        $_SESSION['uploaded_images'] = $array_attachments;
    }
    wp_die();
}
8 февр. 2016 г. 00:29:17
Комментарии

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

Tree Nguyen Tree Nguyen
1 июн. 2017 г. 06:49:03

Это абсолютно верно... если вы авторизованы в админке, то функция _nopriv не вызывается

Michal Holub Michal Holub
7 нояб. 2017 г. 15:48:30
1
10

Я рекомендую использовать wp_send_json_success() и wp_send_json_error() на стороне сервера. Вам не нужно беспокоиться о die() и т.п., переменная "status" отправляется автоматически, это гораздо чище. Например:

function ajaxConversion(){
    // ...
    wp_send_json_success(array(
      'amount' => $amount
    ));
}

Результат будет примерно таким:

{
 "success":true,
 "data":{"amount":125}
}

Теперь вы можете легко извлечь значения в вашем AJAX-запросе:

jQuery.ajax({
    type       : 'post',
    data       : {
                  action: 'ajaxConversion', 
                  //nonce : ajax.nonce                              
                 },
    dataType   : 'json',
    url        : ajax.ajaxurl,
    success    : function(data){
         if(data.success) {
            alert(data.amount);                         
         } else {
            alert(data.data.message);
         }

    }
}); 

Еще одна распространенная проблема - опечатки в имени действия. Они должны быть wp_ajax_nopriv_{действие} или wp_ajax_{действие} для авторизованных пользователей. Например, wp-ajax_nopriv - одна из ошибок, которую я часто допускал раньше.

18 февр. 2017 г. 21:07:43
Комментарии

это должно быть правильным и принятым ответом. потрясающе!

eballeste eballeste
11 февр. 2020 г. 19:32:59
0

Для меня проблемой было использование return вместо echo в моей PHP-функции. Замена на echo решила проблему.

function doAjax() {
    $result = getPosts();
    echo json_encode($result, true);
    die();
}
29 мар. 2016 г. 22:10:29
0

Вы можете забыть добавить следующую строку:

add_action("wp_ajax_your_ajax_function", "your_ajax_function");

Без этой строки AJAX-запрос не будет выполняться.

Вот ваша AJAX-функция:

function your_ajax_function(){ $result = json_encode($result); echo $result; }

24 дек. 2020 г. 16:50:14
0

Важно: правильно добавить хук действия в functions.php Я столкнулся с такой же проблемой, перепробовал все методы, но упустил простую вещь — подключение файла с действием в functions.php

// Добавляем действия для AJAX-запросов (авторизованных и неавторизованных пользователей)
add_action( 'wp_ajax_nopriv_erase_uploaded_images', 'erase_uploaded_images' );
add_action( 'wp_ajax_erase_uploaded_images', 'erase_uploaded_images' );

// Функция для удаления загруженных изображений
function erase_uploaded_images() {
    // Получаем ID вложения из POST-запроса
    $attach_id = filter_input( INPUT_POST, 'attach_id' );
    // Удаляем вложение
    wp_delete_attachment( $attach_id );
    // Если в сессии есть массив загруженных изображений
    if ( isset( $_SESSION['uploaded_images'] ) ) {
        $array_attachments = $_SESSION['uploaded_images'];
        // Ищем и удаляем ID из массива
        if ( ( $key = array_search( $attach_id, $array_attachments ) ) !== false ) {
            unset( $array_attachments[$key] );
        }
        // Обновляем массив в сессии
        $_SESSION['uploaded_images'] = $array_attachments;
    }
    // Завершаем выполнение AJAX-запроса
    wp_die();
}
29 нояб. 2023 г. 17:39:36