Visualizzare gli errori PHP da admin-ajax.php
Abbiamo alcuni endpoint personalizzati che eseguono varie operazioni, accessibili tramite /wp/wp-admin/admin-ajax.php?action=some_action
Tuttavia, durante lo sviluppo, quando si verifica un errore di sintassi, logico o fatale, riceviamo semplicemente un "500 Internal Server Error"
In tutte le altre pagine del sito, quando c'è un errore, viene mostrato l'errore PHP.
Siamo costretti ad aprire il file di log PHP per vedere l'errore.
C'è qualcosa in WordPress che disabilita la visualizzazione degli errori su questi URL? E se sì, come possiamo evitarlo per consentire la visualizzazione degli errori direttamente nel browser?
WordPress di default nasconde gli errori per le chiamate di richiesta ajax. Questo può essere confermato dal file sorgente wp-includes/load.php#L352
, qui:
if ( defined( 'XMLRPC_REQUEST' ) || defined( 'REST_REQUEST' ) || ( defined( 'WP_INSTALLING' ) && WP_INSTALLING ) || wp_doing_ajax() ) {
@ini_set( 'display_errors', 0 );
}
Vedi che la funzione wp_doing_ajax()
viene utilizzata nell'istruzione condizionale, quindi display_errors
viene impostato.
Per aggirare questo comportamento, è necessario attivare manualmente la segnalazione degli errori all'inizio della tua chiamata di funzione ajax, come suggerito da @Friss.

GRAZIE!!! Ovviamente so che non si dovrebbe mai modificare il core, ma in un ambiente locale solo a scopo di risoluzione dei problemi, quando l'ajax viene chiamato da un plugin che non vuoi modificare o per cui non hai tempo di capire - commentare temporaneamente la riga indicata sopra in /wp-includes/load.php permetterà di visualizzare messaggi di errore più specifici e ti aiuterà a individuare da dove proviene il problema.

C'è un filtro all'inizio di load.php
che lo bypassa:
add_filter( 'enable_wp_debug_mode_checks', '__return_false' );

@Cragmonkey Per favore potresti spiegare come si potrebbe usare quell'hook nella chiamata ajax.

@Rahil Wazir ... Dovresti creare temporaneamente quell'hook in un altro punto del tuo plugin durante il debug.

Ciao, questo attiva effettivamente la segnalazione degli errori - tuttavia, stiamo cercando specificamente di capire PERCHÉ viene disattivata per il file admin-ajax.php
poiché se la impostiamo ad esempio in fondo al wp-config, viene sovrascritta da qualche parte per le chiamate ajax

Puoi provare il WP_Ajax_Response
$response = array(
'what'=>'stuff',
'action'=>'delete_something',
'id'=>new WP_Error('oops','Ho avuto un incidente.'),
'data'=>'Ops, c\'è stato un problema!'
);
$xmlResponse = new WP_Ajax_Response($response);
$xmlResponse->send();
Leggi di più https://codex.wordpress.org/Function_Reference/WP_Ajax_Response
