Cum să depanez și să repar problema când admin-ajax.php returnează 0

24 nov. 2015, 21:00:57
Vizualizări: 15.6K
Voturi: 4

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

2
Comentarii

Dacă dorești să rulezi doar pe partea de administrare a site-ului, elimină hook-ul nopriv - Codex spune: Acest hook este funcțional la fel ca wp_ajax_(action), dar este folosit pentru a gestiona cererile AJAX pe partea de front-end

Howdy_McGee Howdy_McGee
24 nov. 2015 21:12:59

Codul funcțional actualizat în întrebare.

Ohsik Ohsik
25 nov. 2015 00:14:49
Toate răspunsurile la întrebare 2
10

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

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

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

Howdy_McGee Howdy_McGee
24 nov. 2015 22:50:07

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

Ohsik Ohsik
24 nov. 2015 22:55:36

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

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

Howdy_McGee Howdy_McGee
24 nov. 2015 23:04:45

Da, $_FILES pare să fie gol. înseamnă că e ceva greșit în JS?

Ohsik Ohsik
24 nov. 2015 23:10:04

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

Howdy_McGee Howdy_McGee
24 nov. 2015 23:11:22

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?

Ohsik Ohsik
24 nov. 2015 23:17:16

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

Howdy_McGee Howdy_McGee
24 nov. 2015 23:18:41

action pare a fi transmis cu data. Am eliminat action: "write_here_img_upload", din $ajax și am adăugat userFile.append("action", "write_here_img_upload");

Ohsik Ohsik
25 nov. 2015 00:07:22
Arată celelalte 5 comentarii
1

Adaugă acest cod în fișierul admin-ajax.php

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

Te rog [editează] răspunsul tău și adaugă o explicație: de ce ar putea soluționa problema?

fuxia fuxia
16 apr. 2020 19:52:58