admin-ajax.php restituisce 0. Come debuggo e risolvo?

24 nov 2015, 21:00:57
Visualizzazioni: 15.6K
Voti: 4

Sto cercando di utilizzare admin-ajax.php per caricare un'immagine da un modulo front-end. Continuo a ricevere 0 con il codice qui sotto e non sono sicuro di come debuggarne o dove sia l'errore.

Ho un input file HTML

<input type="file" name="wh_image_upload" id="wh_image_upload" multiple="false" />

e uno script localizzato per la richiesta AJAX

$img_nonce = wp_create_nonce('image_upload_nonce');
wp_localize_script( 'ajax-script', 'ajax_image', array( 'ajax_url' => admin_url( 'admin-ajax.php' )) );

e la funzione 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

// Featured image upload 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("Image Uploaded! " + data);
            }
        });
    });

Ricevo un messaggio di successo AJAX con risposta 0. Image Uploaded! 0

Aggiornamento Ho aggiornato il mio codice funzionante.

2
Commenti

Se vuoi eseguire ajax solo sul lato admin, rimuovi l'hook nopriv - Il Codex dice: Questo hook è funzionalmente identico a wp_ajax_(action), tuttavia viene utilizzato per gestire le richieste AJAX sul front-end

Howdy_McGee Howdy_McGee
24 nov 2015 21:12:59

Codice funzionante aggiornato nella domanda.

Ohsik Ohsik
25 nov 2015 00:14:49
Tutte le risposte alla domanda 2
10

Abilita il Debug

WordPress ha delle costanti definite nel file wp-config.php che permettono di visualizzare gli errori a schermo e registrarli in un file separato situato in /wp-content/debug.log. Ecco come si presenta:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_DISPLAY', true );
define( 'WP_DEBUG_LOG', true );

Puoi quindi stampare le tue informazioni nel log di debug in punti specifici e capire esattamente dove (o se la funzione viene eseguita) si verifica l'errore:

function write_here_featured_image_upload() {
    error_log( 'Sono entrato nella funzione Ajax senza problemi!' );
    /** ... Resto del tuo codice ... **/
}

Controlla la Console degli Strumenti di Sviluppo

Quasi tutti i browser moderni dispongono di Strumenti per Sviluppatori e una Console dove vengono mostrati gli errori JavaScript. Se vedi un errore nella console degli strumenti di sviluppo, dovrai prima di tutto risolvere quello.


Per quanto riguarda una possibile soluzione, hai questo condizionale che ti impedisce di eseguire ajax sul front-end del sito:

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 funzione is_admin() dice a WordPress di eseguire quelle azioni solo quando ci si trova nel Pannello di Amministrazione / Dashboard, quindi non vedresti mai nulla accadere sul front-end del tuo sito. Prova a rimuovere il condizionale e ad aggiungere direttamente le azioni così:

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
Commenti

Grazie per la risposta, purtroppo rimuovere is_admin() non fa alcuna differenza. Continuo a ottenere 0 come ritorno. Ho attivato tutte e tre le modalità di debug ma non vedo alcun file debug.log creato. Potrebbe essere un problema del Localhost??

Ohsik Ohsik
24 nov 2015 22:47:02

@Ohsik non dovrebbe esserlo. Cosa succede se accedi all'URL direttamente? http://localhost/wp-admin/admin-ajax.php?action=write_here_img_upload&test=true - dovrai aggiungere un die( 'here' ); sopra il tuo controllo nonce per vedere se stai effettivamente entrando nella funzione.

Howdy_McGee Howdy_McGee
24 nov 2015 22:50:07

Ottengo -1 su check_ajax_referer( 'image_upload_nonce', 'security'); accedendo all'URL direttamente

Ohsik Ohsik
24 nov 2015 22:55:36

Sì, ha creato debug.log ma dice solo Made it into the Ajax function safe and sound!. Potresti dirmi come procedere da qui?

Ohsik Ohsik
24 nov 2015 23:00:18

@Ohsik Da qui devi debugare qual è il problema. Potresti loggare i valori di $_POST e $_GET nel file di log: error_log( print_r( $val, 1 ) );. Se dovessi scommettere, direi che $_FILES è vuoto e devi impostare un encrypttype.

Howdy_McGee Howdy_McGee
24 nov 2015 23:04:45

Sì, $_FILES sembra essere vuoto. Significa che c'è qualcosa di sbagliato nel JS?

Ohsik Ohsik
24 nov 2015 23:10:04

Devi aggiungere un enctype al tuo form: Vedi http://stackoverflow.com/a/4526286/800452

Howdy_McGee Howdy_McGee
24 nov 2015 23:11:22

Questo è il problema per me perché in realtà non sto inviando un form. Faccio una richiesta AJAX su $("#wh_image_upload").change. Hai qualche idea?

Ohsik Ohsik
24 nov 2015 23:17:16

Continuiamo questa discussione nella chat.

Howdy_McGee Howdy_McGee
24 nov 2015 23:18:41

action sembra essere passato con data. Ho rimosso action: "write_here_img_upload", in $ajax e aggiunto userFile.append("action", "write_here_img_upload");

Ohsik Ohsik
25 nov 2015 00:07:22
Mostra i restanti 5 commenti
1

Aggiungi questo dentro admin-ajax.php

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

Per favore [modifica] la tua risposta e aggiungi una spiegazione: perché ciò potrebbe risolvere il problema?

fuxia fuxia
16 apr 2020 19:52:58