Llamada AJAX retorna 0
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
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.

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

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.

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?

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.

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!

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?

¡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 :)

¡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

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

¡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?

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.
