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
@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.
Howdy_McGee
Estoy obteniendo -1 en check_ajax_referer( 'image_upload_nonce', 'security'); al acceder a la URL directamente
Ohsik
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
@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.
Howdy_McGee
Necesitas agregar un enctype a tu formulario: Mira http://stackoverflow.com/a/4526286/800452
Howdy_McGee
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?
Ohsik
Continuemos esta discusión en el chat.
Howdy_McGee