admin-ajax.php devuelve 0. ¿Cómo depurarlo y solucionarlo?

24 nov 2015, 21:00:57
Vistas: 15.6K
Votos: 4
```html

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.

```
2
Comentarios

Si solo quieres ejecutar ajax en el lado del administrador, elimina el hook nopriv - El Codex dice: Este hook es funcionalmente igual que wp_ajax_(action), pero se usa para manejar solicitudes AJAX en el front-end

Howdy_McGee Howdy_McGee
24 nov 2015 21:12:59

Código actualizado y funcional en la pregunta.

Ohsik Ohsik
25 nov 2015 00:14:49
Todas las respuestas a la pregunta 2
10

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' );
24 nov 2015 21:21:40
Comentarios

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
24 nov 2015 22:47:02

@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 Howdy_McGee
24 nov 2015 22:50:07

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

Ohsik Ohsik
24 nov 2015 22:55:36

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
24 nov 2015 23:00:18

@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 Howdy_McGee
24 nov 2015 23:04:45

Sí, $_FILES parece estar vacío. ¿Significa que hay algo mal en el JS?

Ohsik Ohsik
24 nov 2015 23:10:04

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

Howdy_McGee Howdy_McGee
24 nov 2015 23:11:22

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 Ohsik
24 nov 2015 23:17:16

Continuemos esta discusión en el chat.

Howdy_McGee Howdy_McGee
24 nov 2015 23:18:41

action parece pasarse con data. Eliminé action: "write_here_img_upload", en $ajax y agregué userFile.append("action", "write_here_img_upload");

Ohsik Ohsik
25 nov 2015 00:07:22
Mostrar los 5 comentarios restantes
1

Añade esto dentro de admin-ajax.php

ini_set('display_errors', 1); 
ini_set('display_startup_errors', 1); 
error_reporting(E_ALL);
16 abr 2020 13:42:14
Comentarios

Por favor [edita] tu respuesta y agrega una explicación: ¿por qué esto podría resolver el problema?

fuxia fuxia
16 abr 2020 19:52:58