admin-ajax.php restituisce 0. Come debuggo e risolvo?
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.

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

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 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.

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

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

@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.

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

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

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?

Continuiamo questa discussione nella chat.
