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.