admin-ajax.php devuelve 0. ¿Cómo depurarlo y solucionarlo?
Intentando usar admin-ajax.php
para subir imágenes desde un formulario front-end. Sigo obteniendo 0
con el código que tengo y no estoy seguro de cómo depurarlo o dónde está fallando.
Tengo un input file HTML
<input type="file" name="wh_image_upload" id="wh_image_upload" multiple="false" />
y script localizado para la petición AJAX
$img_nonce = wp_create_nonce('image_upload_nonce');
wp_localize_script( 'ajax-script', 'ajax_image', array( 'ajax_url' => admin_url( 'admin-ajax.php' )) );
y función PHP
function write_here_featured_image_upload() {
var_dump($_FILES);
die();
}
add_action( 'wp_ajax_write_here_img_upload', 'write_here_featured_image_upload' );
add_action( 'wp_ajax_nopriv_write_here_img_upload', 'write_here_featured_image_upload' );
JS
// Subida de imagen destacada via AJAX
$("#wh_image_upload").change(function(){
var userFile = new FormData();
var fileInput = $( "#wh_image_upload" )[0].files[0];
//console.log(fileInput);
userFile.append("file", fileInput);
userFile.append("action", "write_here_img_upload");
$.ajax({
type: "POST",
url: ajax_object.ajax_url,
data: userFile,
processData: false,
contentType: false,
error: function(jqXHR, textStatus, errorMessage) {
console.log(errorMessage);
},
success: function(data) {
console.log("¡Imagen subida! " + data);
}
});
});
Obtengo un mensaje de éxito AJAX con respuesta 0
. ¡Imagen subida! 0
Actualización He actualizado mi código funcional.
```
Activar Depuración
WordPress tiene constantes definidas en wp-config.php
donde puedes imprimir errores en pantalla y registrarlos en un archivo separado ubicado en /wp-content/debug.log
. Se ve así:
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_DISPLAY', true );
define( 'WP_DEBUG_LOG', true );
Luego puedes imprimir tu propia información en el registro de depuración en puntos específicos y descubrir exactamente dónde (o si la función incluso se está ejecutando) la función está fallando:
function write_here_featured_image_upload() {
error_log( '¡Llegué a la función Ajax sana y salva!' );
/** ... Resto de tu código ... **/
}
Revisar la Consola de Herramientas de Desarrollo
Casi todos los navegadores modernos tienen Herramientas de Desarrollo y una Consola donde se muestran los errores de JavaScript. Si ves un error en la consola de tus herramientas de desarrollo, deberás solucionarlo primero que nada.
En cuanto a una posible solución, tienes este condicional que evita que se ejecute AJAX en el front-end del sitio web:
if ( is_admin() ) {
add_action( 'wp_ajax_write_here_img_upload', 'write_here_featured_image_upload' );
add_action( 'wp_ajax_nopriv_write_here_img_upload', 'write_here_featured_image_upload' );
}
La función is_admin()
le indica a WordPress que solo ejecute esas acciones cuando esté en el Panel de Administración / Escritorio, por lo que nunca verías que algo suceda en el front-end de tu sitio web. Intenta eliminar el condicional y simplemente agregar las acciones así:
add_action( 'wp_ajax_write_here_img_upload', 'write_here_featured_image_upload' );
add_action( 'wp_ajax_nopriv_write_here_img_upload', 'write_here_featured_image_upload' );

Gracias por la respuesta, desafortunadamente eliminar is_admin()
no hace ninguna diferencia. Sigo obteniendo 0
como retorno. He activado los tres modos de depuración pero no veo que se cree ningún archivo debug.log
. ¿Podría ser un problema por estar trabajando en Localhost?

@Ohsik no debería serlo. ¿Qué ocurre si accedes a la URL directamente? http://localhost/wp-admin/admin-ajax.php?action=write_here_img_upload&test=true
- tendrás que añadir un die( 'here' );
antes de tu verificación de nonce para ver si al menos estás entrando en la función.

Estoy obteniendo -1
en check_ajax_referer( 'image_upload_nonce', 'security');
al acceder a la URL directamente

Sí, creó el archivo debug.log
pero solo dice ¡Llegué a la función Ajax sano y salvo!
. ¿Podrías decirme qué hacer ahora?

@Ohsik A partir de ahí debes depurar cuál es el problema. Tal vez volcar tus valores $_POST
y $_GET
en el registro: error_log( print_r( $val, 1 ) );
. Si tuviera que apostar, diría que $_FILES
está vacío y necesitas establecer un encrypttype.

Necesitas agregar un enctype a tu formulario: Mira http://stackoverflow.com/a/4526286/800452

Ese es el problema para mí porque en realidad no estoy enviando un formulario. Hago una solicitud AJAX en $("#wh_image_upload").change
. ¿Alguna idea?

Continuemos esta discusión en el chat.
