26

I have a problem with AJAX returning 0 always!

I have done everything by the book and can't figure out what is wrong? Please help!!

Here is my Ajax call:

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

And the function in functions.php is:

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
  • Have you tried to debug your code? Also use admin_url( 'admin-ajax.php' ) to get the AJAX URL, not some made-up URL.
    – fuxia
    Commented Aug 30, 2013 at 10:26

7 Answers 7

16

Could you place the action (ajaxConversion) in your Data and check?

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

});
3
  • This is still appending a 0 to my content somehow. Commented Mar 26, 2014 at 15:55
  • 1
    @BenRacicot : Can you check if you have any statements that does output like echo, die(), etc in your PHP code? Commented Mar 27, 2014 at 3:26
  • 3
    Hey Jay, Turns out adding die(); to my ajax func fixed it! Commented Mar 27, 2014 at 13:46
30

using wp_die(); at the end of AJAX function fixed the issue for me.

e.g

add_action( 'wp_ajax_my_ajax_function', 'my_ajax_function' );

function my_ajax_function(){      
    echo json_encode($myvar);
    wp_die(); 
}
1
  • thanks... dont know why but using just die() didnt work.
    – Sagive
    Commented Jul 12, 2015 at 8:38
12

For me the trick was to add wp_ajax_nopriv action. I tested the script on one browser when I was logged in WP admin, and then I tried same script in Chrome and realized that the script doesn't work. After I put wp_ajax_nopriv, everything started to work. :)

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
  • This, my friend, has saved me 2 hours of frustrating. Another lesson to learn when deploy your application to another environment T_T Commented Jun 1, 2017 at 3:49
  • This is very true...if you're logged in to admin then _nopriv function is not called Commented Nov 7, 2017 at 13:48
10

I would recommend using wp_send_json_success() and wp_send_json_error() on server side. You don't need to worry about die() etc and the "status" variable is sent automatically, it's much cleaner this way. For example

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

Will result in something like this:

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

So then you can do easily extract the values in your ajax call:

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

    }
}); 

Another common thing i've ran into are typos in the action name. They should be wp_ajax_nopriv_{action} or wp_ajax_{action} when logged in. For example, wp-ajax_nopriv, is one I've done several times in the past.

1
  • 1
    this right here should be the correct and accepted answer. amazing!
    – eballeste
    Commented Feb 11, 2020 at 17:32
1

For me it was the fact that I was using return instead of echo in my PHP function. Changing it to echo fixed it.

function doAjax() {
    $result = getPosts();
    echo json_encode($result, true);
    die();
}
0

You may forget to add below line:

add_action("wp_ajax_your_ajax_function", "your_ajax_function");

Without above line, the ajax it not be fired.

Here is your ajax function

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

0

important think do,hook action correctly add function.php i face same issues ,i try this all methods,but simple think i missed require my action file to functions.php

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

Not the answer you're looking for? Browse other questions tagged or ask your own question.