L'appel Ajax renvoie toujours 0

18

J'ai un problème avec AJAX qui retourne toujours 0!

J'ai tout fait par le livre et je ne peux pas comprendre ce qui ne va pas? S'il vous plaît, aidez !!

Voici mon appel 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;

Et la fonction dans functions.php est:

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');
Kuka
la source
Avez-vous essayé de déboguer votre code? Utilisez également admin_url( 'admin-ajax.php' )pour obtenir l'URL AJAX, pas une URL composée.
fuxia

Réponses:

15

Pourriez-vous placer l'action (ajaxConversion) dans vos données et vérifier?

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

});
Jayawi Perera
la source
Cela ajoute toujours un 0 à mon contenu.
Ben Racicot
1
@BenRacicot: Pouvez-vous vérifier si vous avez des instructions qui sortent comme echo, die (), etc. dans votre code PHP?
Jayawi Perera
2
Hey Jay, il s'avère que l'ajout de die (); à mon ajax func l'a corrigé!
Ben Racicot
20

l'utilisation wp_die();à la fin de la fonction AJAX a résolu le problème pour moi.

par exemple

add_action( 'wp_ajax_my_ajax_function', 'my_ajax_function' );

function my_ajax_function(){      
    echo json_encode($myvar);
    wp_die(); 
}
Shoaib Iqbal
la source
merci ... Je ne sais pas pourquoi mais utiliser simplement die () n'a pas fonctionné.
Sagive SEO
10

Pour moi , l'affaire était d'ajouter l' wp_ajax_noprivaction. J'ai testé le script sur un navigateur lorsque j'étais connecté à WP Admin, puis j'ai essayé le même script dans Chrome et j'ai réalisé que le script ne fonctionnait pas. Après avoir mis wp_ajax_nopriv, tout a commencé à fonctionner. :)

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();
}
Alexandar Lazovic
la source
Cela, mon ami, m'a sauvé 2 heures de frustration. Une autre leçon à apprendre lors du déploiement de votre application dans un autre environnement T_T
Tree Nguyen
C'est très vrai ... si vous êtes connecté à l'administrateur, la fonction _nopriv n'est pas appelée
Michal Holub
2

Je recommanderais d'utiliser wp_send_json_success () et wp_send_json_error () côté serveur. Vous n'avez pas à vous soucier de die () etc. et la variable "status" est envoyée automatiquement, c'est beaucoup plus propre de cette façon. Par exemple

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

Se traduira par quelque chose comme ceci:

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

Ainsi, vous pouvez facilement extraire les valeurs de votre appel 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);
         }

    }
}); 

Une autre chose courante que j'ai rencontrée est des fautes de frappe dans le nom de l'action. Ils doivent être wp_ajax_nopriv_ {action} ou wp_ajax_ {action} lorsque vous êtes connecté. Par exemple, wp-ajax_nopriv, est celui que j'ai fait plusieurs fois dans le passé.

td-lambda
la source
0

Pour moi, c'était le fait que j'utilisais returnplutôt que echodans ma fonction PHP. Le changer pour le echocorriger.

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