Llamada AJAX retorna 0

28 abr 2016, 18:25:48
Vistas: 13.5K
Votos: 4

A pesar de muchos posts similares, ninguna de las soluciones propuestas funcionó para mí, así que aquí estamos.

Tengo el siguiente script:

jQuery('#term').keyup(ajaxChange);

function ajaxChange(){
    var newFormChange = jQuery("#term").val();
    alert(newFormChange);
    jQuery.ajax({
        type:"POST",
        action: "my_test_action",
        url: "/wp-admin/admin-ajax.php",
        data: newFormChange,
        success:function(data){
            console.log(data);
        }
    });

    return false;
}

Y el PHP luce así:

function my_test_action() {
    $var = "this is a test";
    wp_send_json($var);

    die();
}

add_action('wp_ajax_my_test_action', 'my_test_action');
add_action('wp_ajax_nopriv_my_test_action', 'my_test_action');

También intenté: echo json_encode($var) o echo $var, en lugar de wp_send_json() pero la función siempre retorna 0 en la consola del navegador.

Mis otras llamadas AJAX funcionan, por ejemplo tengo otra que llama un script PHP que ejecuta una WP Query y muestra algunos posts, funciona bien.

EDIT: Así es como incluyo mi script:

function add_js() {
    if(is_page_template()) {
        wp_enqueue_script('mycustomscript', get_stylesheet_directory_uri().'/js/mycustomscript.js', array('jquery'), '1.0', true);
        wp_localize_script('mycustomscript', 'ajaxurl', admin_url('admin-ajax.php'));
    }
}
add_action('wp_enqueue_scripts', 'add_js');

Creo que el problema viene de la variable newFormChange, porque jQuery(this).serialize(); no funcionó en primer lugar, ya que el formulario no se envía sino que solo cambia uno de sus campos. Así que lo reemplacé por var newFormChange = jQuery("#term").val(); pero quizás hay un problema con url: "/wp-admin/admin-ajax.php"

¿En qué me equivoqué? Gracias

0
Todas las respuestas a la pregunta 3
9

Ten en cuenta que la action debe estar dentro de la clave data. En tu solicitud POST no hay una clave llamada action, por lo tanto, la función de callback nunca se está llamando.

Considera este ejemplo:

jQuery.ajax({
    type:"POST",
    url: "/wp-admin/admin-ajax.php",
    data: { 
        action: "my_test_action",
        form_data : newFormChange
    },
    success: function (data) {
        console.log(data);
    }
});

También ten en cuenta: Nunca uses URLs relativas para Ajax como /wp-admin/admin-ajax.php. Puedes usar wp_localize_script(). Consulta estos ejemplos.

28 abr 2016 18:37:08
Comentarios

¡Bien hecho, funciona! Pero es extraño, tengo otro script donde el action está afuera, ¡y aún así funciona!

Fafanellu Fafanellu
28 abr 2016 18:44:41

De nada :) No, necesitas verificarlo de nuevo. action es algo hecho por WordPress, y el resto de los parámetros pertenecen a jQuery. Puedes ver aquí jQuery Ajax que action no es una clave válida.

Sumit Sumit
28 abr 2016 18:49:35

Si escribo alert(newFormChange) veo algo como "term=anything&action=my_test_action". Entonces, ¿el "action hecho por WP" se pasa como otra variable POST? Tengo una pregunta adicional: si uso $_POST['term'] en my_test_action(), no es reconocido. Aunque esta es la forma correcta de recuperar variables POST con este método. ¿En qué me estoy equivocando?

Fafanellu Fafanellu
28 abr 2016 18:56:06

No estoy seguro de dónde colocaste la alerta, pero si ves term=anything&action=my_test_action en la alerta, eso es una solicitud GET. Por lo tanto, podrás acceder a la variable usando $_GET en lugar de $_POST, pero realmente me pregunto por qué estás viendo una cadena de consulta en lugar de un objeto js.

Sumit Sumit
28 abr 2016 19:56:31

Llamé al método serialize() en newFormChange y luego coloqué la alerta justo después de eso. Lo curioso es que muestra lo que escribí arriba, incluso si action está definido dentro de los datos. Apliqué tus recomendaciones en mis otros scripts y ya no puedo recuperar los datos con $_POST[]. ¡Extraño!

Fafanellu Fafanellu
28 abr 2016 20:15:18

Entendido, era un campo oculto parásito. Lo siento mucho, fue mi error. Aún así, ya no puedo acceder a mis datos $_POST[]. Cuando los datos eran solo "newFormChange" podía acceder a ellos "normalmente". Ahora la única variable a la que puedo acceder es $_POST['newFormChange']. ¿Debo analizarla para recuperar los campos individuales?

Fafanellu Fafanellu
28 abr 2016 20:31:14

¡Exactamente! Tienes que analizarlo. Para ver la estructura de los datos que estás recibiendo solo imprímelos. Por ejemplo, print_r($_POST); y verás cómo puedes acceder a ellos. Si es una cadena de consulta, usa parse_str(). ¡Espero que te ayude :)

Sumit Sumit
28 abr 2016 21:16:49

¡Sí, gracias de nuevo! Estaba pidiendo ayuda en otro lugar sobre este tema específico, y me dijeron que usara serializeArray() para poder obtener mis parámetros $_POST[] correctamente. Sin embargo, todavía no puedo. ¿Tienes algún consejo para esto? Muchas gracias http://wordpress.stackexchange.com/questions/225111/retrieve-post-data-from-ajax-call

Fafanellu Fafanellu
29 abr 2016 20:31:10

¡Dios mío! — Estaba pasando action como su propia propiedad, no dentro de data. ¡Muchísimas gracias!

plushyObject plushyObject
28 abr 2017 20:28:37
Mostrar los 4 comentarios restantes
2

Parece que hay un problema con url: "/wp-admin/admin-ajax.php", en su lugar intenta agregar la ruta completa:

function addajaxurl() {
    wp_localize_script( 'frontend-ajax', 'frontendajax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' )));
}
add_action( 'wp_enqueue_scripts', 'addajaxurl' );

y llama la variable en tu función ajax:

        jQuery.ajax({
            type:"POST",
            url: ajaxurl,
            data: newFormChange,
            success:function(data){
                console.log(data);
            }
        }); 
28 abr 2016 18:34:34
Comentarios

¡gracias, lo probaré! pero mis otras llamadas AJAX sí funcionan, es extraño...! mira mi edición arriba, tengo casi lo mismo que tú. Además, si la URL .php no se encontrara, habría devuelto un error en la consola, ¿no?

Fafanellu Fafanellu
28 abr 2016 18:40:04

Sí, parece que el error está con action, intenta eliminarlo

tam tam
28 abr 2016 18:46:55
0

el problema está en el parámetro action. En tu función javascript prueba con:

var newFormChange = jQuery("#term").val();

    jQuery.ajax({
                    type: "POST",
                    url: "/wp-admin/admin-ajax.php",
                    data: {
                        action: "my_test_action",
                        newFormChange: newFormChange
                    }   ,
                    success: function(data) {
                        console.log(data);
                  alert(data);


                });

También deberías eliminar el die(); de tu función php. Ya está incluido en el wp_send_json.

28 abr 2016 18:52:51