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


18

У меня проблема с AJAX, возвращающим 0 всегда!

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

Вот мой вызов Ajax:

//Pass data through AJAX
var amountToConvert = price;

jQuery.ajax({
      type:"POST",
      url: "../../wp-admin/admin-ajax.php", // our PHP handler file
      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');

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

Ответы:


15

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

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

});

Это все еще добавляет 0 к моему контенту как-то.
Бен Рацикот

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

2
Эй, Джей, Оказывается, добавив die (); чтобы мой ajax func исправил это!
Бен Рацикот

20

с помощью wp_die(); в конце функции AJAX исправило проблему для меня.

например

add_action( 'wp_ajax_my_ajax_function', 'my_ajax_function' );

function my_ajax_function(){      
    echo json_encode($myvar);
    wp_die(); 
}

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

10

Для меня хитрость заключалась в том, чтобы добавить wp_ajax_noprivдействия. Я протестировал скрипт в одном браузере, когда я вошел в WP Admin, а затем я попробовал тот же скрипт в 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();
}

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

Это очень верно ... если вы вошли в систему с правами администратора, то функция _nopriv не вызывается
Michal Holub

2

Я бы порекомендовал использовать 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_ {action} или wp_ajax_ {action} при входе в систему. Например, wp-ajax_nopriv, это то, что я делал несколько раз в прошлом.


0

Для меня это был факт, что я использовал returnвместо echoсвоей функции PHP. Изменяя это, чтобы echoисправить это.

function doAjax() {
    $result = getPosts();
    echo json_encode($result, true);
    die();
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.