Cum să depanez și să repar problema când admin-ajax.php returnează 0
Încerc să folosesc admin-ajax.php
pentru a încărca imagini dintr-un formular front-end. Tot primesc 0
cu codul de mai jos și nu sunt sigur cum să depanez sau unde greșesc.
Am un input HTML pentru fișier
<input type="file" name="wh_image_upload" id="wh_image_upload" multiple="false" />
și script localizat pentru cererea AJAX
$img_nonce = wp_create_nonce('image_upload_nonce');
wp_localize_script( 'ajax-script', 'ajax_image', array( 'ajax_url' => admin_url( 'admin-ajax.php' )) );
și funcția 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
// Încărcare imagine prin 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("Imagine încărcată! " + data);
}
});
});
Primesc un mesaj de succes AJAX cu răspunsul 0
. Imagine încărcată! 0
Actualizare Am actualizat codul meu funcțional.

Activează depanarea
WordPress are constante definite în wp-config.php
prin care poți afișa erorile pe ecran și le poți înregistra într-un fișier separat localizat la /wp-content/debug.log
. Arată astfel:
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_DISPLAY', true );
define( 'WP_DEBUG_LOG', true );
Apoi poți afișa propriile informații în jurnalul de depanare în anumite puncte pentru a afla exact unde (sau dacă funcția este chiar accesată) apare eroarea:
function write_here_featured_image_upload() {
error_log( 'Am intrat în funcția Ajax fără probleme!' );
/** ... Restul codului tău ... **/
}
Verifică Console Dev Tools
Aproape toate browserele moderne au Instrumente pentru Dezvoltatori și o Consolă unde sunt afișate erorile JavaScript. Dacă vezi o eroare în consola Dev Tools, va trebui să o rezolvi în primul rând.
În ceea ce privește o posibilă soluție, ai această condițională care împiedică rularea ajax în partea frontală a site-ului:
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' );
}
Funcția is_admin()
instruiește WordPress să ruleze acele acțiuni doar când ești în Panoul de Administrare / Dashboard, așa că nu vei vedea nicio acțiune în partea frontală a site-ului. Încearcă să elimini condiționala și să adaugi acțiunile direct:
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' );

Mulțumesc pentru răspuns, din păcate eliminarea lui is_admin()
nu face nicio diferență. Încă primesc 0
ca rezultat. Am activat toate cele trei moduri de depanare dar nu văd niciun fișier debug.log
creat. Lucrul pe Localhost ar putea fi problema??

@Ohsik nu ar trebui să fie. Ce se întâmplă dacă accesezi URL-ul direct? http://localhost/wp-admin/admin-ajax.php?action=write_here_img_upload&test=true
- va trebui să adaugi un die( 'here' );
înainte de verificarea nonce pentru a vedea dacă intri măcar în funcție.

Primesc -1
la check_ajax_referer( 'image_upload_nonce', 'security');
prin accesarea directă a URL-ului

Da, a creat debug.log
dar doar scrie Made it into the Ajax function safe and sound!
. Poți să-mi spui, te rog, unde să merg mai departe de aici?

@Ohsik De aici începi să depanezi care este problema. Poate afișează valorile $_POST
și $_GET
în log: error_log( print_r( $val, 1 ) );
. Dacă aș fi un om care pariază, aș paria că $_FILES
este gol și trebuie să setezi un encrypttype.

Trebuie să adaugi un enctype la formularul tău: Vezi http://stackoverflow.com/a/4526286/800452

Asta e problema pentru mine pentru că de fapt nu trimit un formular. Fac o cerere AJAX la $("#wh_image_upload").change
. Ai vreo idee?

Hai să continuăm discuția în chat.
