La llamada Ajax siempre retorna 0

30 ago 2013, 13:23:04
Vistas: 77.7K
Votos: 27

¡Tengo un problema con AJAX que siempre retorna 0!

¡He seguido todos los pasos correctamente y no puedo descubrir qué está mal! ¡Por favor ayuda!

Aquí está mi llamada Ajax:

//Pasar datos a través de AJAX
var amountToConvert = price;

jQuery.ajax({
      type:"POST",
      url: "../../wp-admin/admin-ajax.php", // nuestro archivo PHP manejador
      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');
1
Comentarios

¿Has intentado depurar tu código? También usa admin_url( 'admin-ajax.php' ) para obtener la URL de AJAX, no una URL inventada.

fuxia fuxia
30 ago 2013 13:26:36
Todas las respuestas a la pregunta 7
1
30

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

Por ejemplo:

add_action( 'wp_ajax_my_ajax_function', 'my_ajax_function' );

function my_ajax_function(){      
    echo json_encode($myvar);
    wp_die(); 
}
8 jul 2015 10:14:31
Comentarios

gracias... no sé por qué pero usar solo die() no funcionó.

Sagive Sagive
12 jul 2015 11:38:32
3
16

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

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

});
30 ago 2013 13:29:45
Comentarios

Esto todavía está añadiendo un 0 a mi contenido de alguna manera.

Ben Racicot Ben Racicot
26 mar 2014 17:55:08

@BenRacicot : ¿Puedes verificar si tienes alguna sentencia que haga output como echo, die(), etc en tu código PHP?

Jayawi Perera Jayawi Perera
27 mar 2014 05:26:48

Hola Jay, ¡resulta que añadir die(); a mi función ajax lo solucionó!

Ben Racicot Ben Racicot
27 mar 2014 15:46:11
2
12

Para mí el truco fue agregar la acción wp_ajax_nopriv. Probé el script en un navegador cuando estaba logueado en el admin de WP, y luego intenté el mismo script en Chrome y me di cuenta de que no funcionaba. Después de agregar 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();
}
8 feb 2016 00:29:17
Comentarios

Esto, amigo mío, me ha ahorrado 2 horas de frustración. Otra lección que aprender cuando despliegas tu aplicación en otro entorno T_T

Tree Nguyen Tree Nguyen
1 jun 2017 06:49:03

Esto es muy cierto... si estás logueado como admin entonces la función _nopriv no es llamada

Michal Holub Michal Holub
7 nov 2017 15:48:30
1
10

Recomiendo usar wp_send_json_success() y wp_send_json_error() en el lado del servidor. No necesitas preocuparte por die() etc y la variable "status" se envía automáticamente, es mucho más limpio 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 puedes extraer fácilmente los valores en tu 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);
         }

    }
}); 

Otro error común que he encontrado son errores tipográficos en el nombre de la acción. Deben ser wp_ajax_nopriv_{action} o wp_ajax_{action} cuando el usuario está conectado. Por ejemplo, wp-ajax_nopriv, es uno que he cometido varias veces en el pasado.

18 feb 2017 21:07:43
Comentarios

esto aquí debería ser la respuesta correcta y aceptada. ¡increíble!

eballeste eballeste
11 feb 2020 19:32:59
0

Para mí fue el hecho de que estaba usando return en lugar de echo en mi función PHP. Cambiarlo a echo lo solucionó.

function doAjax() {
    $result = getPosts();
    echo json_encode($result, true);
    die();
}
29 mar 2016 22:10:29
0

Puede que olvides agregar la siguiente línea:

add_action("wp_ajax_your_ajax_function", "your_ajax_function");

Sin la línea anterior, el ajax no se ejecutará.

Aquí está tu función ajax

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

24 dic 2020 16:50:14
0

Importante: Asegúrate de enganchar las acciones correctamente en functions.php Yo me enfrenté a los mismos problemas, probé todos estos métodos, pero algo simple que olvidé fue requerir mi archivo de acciones en functions.php

// Agregar acciones para usuarios logueados y no logueados
add_action( 'wp_ajax_nopriv_erase_uploaded_images', 'erase_uploaded_images' );
add_action( 'wp_ajax_erase_uploaded_images', 'erase_uploaded_images' );

// Función para eliminar imágenes subidas
function erase_uploaded_images() {
    // Obtener el ID del adjunto a eliminar
    $attach_id = filter_input( INPUT_POST, 'attach_id' );
    
    // Eliminar el adjunto de WordPress
    wp_delete_attachment( $attach_id );
    
    // Si existe la sesión de imágenes subidas
    if ( isset( $_SESSION['uploaded_images'] ) ) {
        $array_attachments = $_SESSION['uploaded_images'];
        
        // Buscar y eliminar el ID de la imagen del array de sesión
        if ( ( $key = array_search( $attach_id, $array_attachments ) ) !== false ) {
            unset( $array_attachments[$key] );
        }
        
        // Actualizar la sesión con el array modificado
        $_SESSION['uploaded_images'] = $array_attachments;
    }
    
    // Terminar la ejecución de WordPress
    wp_die();
}
29 nov 2023 17:39:36