Definire WP_DEBUG in modo condizionale / solo per gli amministratori / errori di registro (aggiungere la query arg per tutti i collegamenti?)


20

Sto sviluppando un sito su un server a cui anche il client ha accesso e quello che mi piacerebbe fare è mostrare WP_DEBUGsolo agli amministratori. Riferimento articolo di Yoast su un modo per aggirare questo:

if ( isset($_GET['debug']) && $_GET['debug'] == 'true')
    define('WP_DEBUG', true);

mostrerebbe WP_DEBUGsolo per gli URL che sono ?debug=trueallegati a loro, comehttp://domain.com/?debug=true

Stavo pensando che la barra di debug potesse contenere alcune di queste informazioni per impostazione predefinita (indipendentemente dal fatto che fosse WP_DEBUGattivata), ma stavo pensando alla follia perché non credo che sia il caso.

Quindi, quello che stavo pensando sarebbe utile, sarebbe un controllo per l'utente corrente (avendo la manage_optionscapacità e quindi eseguire i collegamenti attraverso add_query_arg():

function zs_admin_debug() {
    if (!current_user_can('manage_options')) {
        add_query_arg('debug','true');
    }
}

ma ciò di cui non sono sicuro è: esiste un hook che posso usare per effettuare tutti i collegamenti su un sito con questo? In questo modo, gli amministratori vedono sempre il debug che pensavo sarebbe estremamente utile. Grazie per l'aiuto come sempre!


Questa soluzione alternativa (Yoast) è estremamente utile per il debug al volo. Ho anche abilitato la registrazione che funziona bene. Ho leggermente modificato il mio codice: if ( isset( $_GET['bug'] ) ) quindi visito link /? Bug per vedere il debug :)
— Jarmerson

Risposte:


18

Non credo che ci sia un hook URL universale. Ci sono molti ganci e potrei averlo perso, ma non credo che ce ne sia uno. Puoi guardare attraverso i ganci su adambrown.info . Esistono molti hook URL, ma non universali.

Se posso suggerire un'altra soluzione: registra gli errori in un file.

/**
 * This will log all errors notices and warnings to a file called debug.log in
 * wp-content (if Apache does not have write permission, you may need to create
 * the file first and set the appropriate permissions (i.e. use 666) ) 
 */
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
@ini_set('display_errors',0);

Quel codice è direttamente dal Codice per il file wp-config.php . Se lo fai, non dovrai preoccuparti di destreggiarti $_GETo risolvere chi è e chi non è un amministratore.

Modificare:

Ho dimenticato una possibile soluzione. Puoi farlo con Javascript. Uno script breve può associare il parametro a tutti gli URL nella pagina e puoi caricare facilmente lo script solo per gli amministratori.

Suggerirei comunque la soluzione "log" poiché vengono registrati errori per tutti. Se la tua gente è come la mia e invia "rapporti" di errore come " ehi, il sito viene interrotto quando compili quel modulo " apprezzerai il registro. :)


Immagino di avere solo l'imbarazzo di vederli sullo schermo :) ma un file di registro ha più senso qui. Farà un po 'più di ricerca da parte mia, ma questa sembra essere la migliore soluzione che ho trovato finora. Grazie!
— Zach,

5
Si noti che la registrazione nativa è hardcoded per accedere a file accessibili dal web, che non è una buona idea in produzione. È meglio configurare la posizione del file di registro privato (fuori dalla cartella Web) tramite mezzi PHP per i siti live.
— Rarst

9

Anche se il mio primo approccio è stato per il bidone della spazzatura e s_ha_dums la risposta è un modo pulito, e probabilmente il migliore, per farlo, lasciatemi offrire un altro scenario di lavoro:

Quanto segue imposta un cookie valido per le successive 24 ore (86400 secondi) quando un amministratore accede al sistema. In wp-config.php , la costante WP_DEBUGè definita in modo condizionale in base alla presenza e al valore di detto cookie.

Avvertenza: WP_DEBUGin seguito verrà impostato su trueper tutti gli utenti che accedono dallo stesso browser sullo stesso computer lo stesso giorno.

in Functions.php (o come plugin):

function wpse_69549_admin_debug( $user_login, $user )
{
    if ( in_array( 'administrator', $user->roles ) ) {
        setcookie( 'wp_debug', 'on', time() + 86400, '/', get_site_option( 'siteurl' ) );
    }
}
add_action( 'wp_login', 'wpse_69549_admin_debug', 10, 2 );

Vedi: Codice> Riferimento azione> wp_login

in wp-config.php :

if ( isset( $_COOKIE['wp_debug'] ) && 'on' === $_COOKIE['wp_debug'] ) {
    define( 'WP_DEBUG', true );
} else {
    define( 'WP_DEBUG', false );
}

Andrew Nacin ha commentato quell'articolo, menzionando che initè troppo tardi per avere alcun effetto. Ho anche provato questo e non ha funzionato.
— Zach,

Le costanti non possono essere ridefinite. Si potrebbe modificare il livello di segnalazione degli errori senza toccare la costante, ma non è perfetto. Inoltre ci sono molte cose che accadono prima initche siano di interesse.
— Rarst

Penso che la risposta accettata rimanga la soluzione più praticabile, tuttavia, per completezza, questo nuovo approccio dovrebbe fare il lavoro con avvisi di debug sullo schermo.
— Johannes Pille,

Ah, una soluzione molto interessante - sicuramente ci proverò
— Zach,

1
@s_ha_dum: non è come se si ricordasse ogni risposta, almeno io (ho cercato su Google la mia risposta prima). Questo mi ricordo però. Sono stato il primo a rispondere e ho scritto una schifezza assoluta. Non si applica affatto. Seguo una politica per non rispondere a meno che non sia sicuro almeno al 99,5% di essere qualificato (presumo che lo stesso valga per te) - qui ero stato ben lontano dall'obiettivo. Questo mi ha infastidito, quindi poche ore dopo, dopo che questa aveva ottenuto una risposta accettata, stavo ancora pensando a questa e ho pensato a quanto sopra. Anch'io penso che sia piuttosto lucido - grazie per averlo notato.
— Johannes Pille,

3

Non risponde esattamente alla tua domanda, ma per esperienza personale ho scoperto che è meglio abilitare la modalità debug abbinando l'indirizzo IP anziché l'URL.

Ciò richiede la modifica dei collegamenti e risolve il modo in cui identificare l'amministratore prima che WP carichi la funzionalità utente richiesta.


In realtà mi piace anche questa idea - quindi se avessi fatto qualcosa come pastebin.com/m22KNakh che poteva ... in teoria funzionare, giusto? Eseguendo i echo $_SERVER['REMOTE_ADDR']rendimenti ::1previsti su localhost? Onestamente sembra un file di registro separato e in questo modo (poiché gli IP di casa sembrano cambiare continuamente) potrebbe essere una buona idea.
— Zach,

@Zach yeah, ::1è solo la versione IPv6 di 127.0.0.1. L'IP dinamico è meno conveniente, ma in ogni caso lo considero solo una tecnica di risoluzione temporanea dei contenuti live. Non sostituisce la corretta configurazione di debug locale.
— Rarst

Ah grazie per avermelo fatto notare. Sicuramente come entrambe le opzioni qui, vado con la risposta @s_ha_dum (oltre al tuo commento che ho votato) che è anche fantastico. Grazie ancora, lo apprezzo davvero!
— Zach,

1

Anche questo è un trucco possibile, ma devi metterlo nel tuo wp-config.phppoiché WP_DEBUGè definito lì:

if ( isset( $_GET['debugsecret'] ) && 'debugsecret' == $_GET['debugsecret'] ) {
      define( 'WP_DEBUG', true );         
}

Aggiungi ?debugsecret=debugsecretall'URL della pagina che desideri eseguire il debug.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.