La llamada Ajax siempre devuelve 0

18

¡Tengo un problema con AJAX devolviendo 0 siempre!

He hecho todo por el libro y no puedo entender qué está mal. ¡¡Por favor ayuda!!

Aquí está mi llamada 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;

Y la función en functions.php es:

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
fuente
¿Has intentado depurar tu código? También se usa admin_url( 'admin-ajax.php' )para obtener la URL AJAX, no alguna URL inventada.
fuxia

Respuestas:

15

¿Podría colocar la acción (ajaxConversion) en sus Datos y verificar?

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

});
Jayawi Perera
fuente
Esto todavía agrega un 0 a mi contenido de alguna manera.
Ben Racicot
1
@BenRacicot: ¿Puede verificar si tiene alguna declaración que genere como echo, die (), etc. en su código PHP?
Jayawi Perera
2
Hola Jay, resulta que agrega die (); a mi func ajax lo arregló!
Ben Racicot
20

usar wp_die();al final de la función AJAX solucionó el problema para mí.

p.ej

add_action( 'wp_ajax_my_ajax_function', 'my_ajax_function' );

function my_ajax_function(){      
    echo json_encode($myvar);
    wp_die(); 
}
Shoaib Iqbal
fuente
gracias ... no sé por qué, pero usar solo die () no funcionó.
Sagive SEO
10

Para mí, el truco era agregar wp_ajax_noprivacción. Probé el script en un navegador cuando inicié sesión en WP admin, y luego probé el mismo script en Chrome y me di cuenta de que el script no funciona. Después de que puse wp_ajax_nopriv, todo comenzó a funcionar. :)

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
fuente
Esto, mi amigo, me ha ahorrado 2 horas de frustración. Otra lección para aprender cuando implemente su aplicación en otro entorno T_T
Tree Nguyen
Esto es muy cierto ... si ha iniciado sesión en admin, entonces no se llama a la función _nopriv
Michal Holub
2

Recomendaría usar wp_send_json_success () y wp_send_json_error () en el lado del servidor. No necesita preocuparse por die (), etc. y la variable "estado" se envía automáticamente, es mucho más limpia de esta manera. Por ejemplo

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

Resultará en algo como esto:

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

Entonces, puede extraer fácilmente los valores en su llamada 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);
         }

    }
}); 

Otra cosa común con la que me he encontrado son errores tipográficos en el nombre de la acción. Deben ser wp_ajax_nopriv_ {action} o wp_ajax_ {action} cuando inicie sesión. Por ejemplo, wp-ajax_nopriv, es uno que he hecho varias veces en el pasado.

td-lambda
fuente
0

Para mí fue el hecho de que estaba usando en returnlugar de echoen mi función PHP. Cambiándolo a echoarreglado.

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