Defina WP_DEBUG condicionalmente / apenas para administradores / erros de log (acrescente arg de consulta para todos os links?)

20

Estou desenvolvendo um site em um servidor ao qual o cliente também tem acesso e o que eu gostaria de fazer é mostrar WP_DEBUGapenas para administradores. Fazendo referência ao artigo do Yoast para contornar isso:

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

seria exibido WP_DEBUGapenas para URLs ?debug=trueanexados a eles, comohttp://domain.com/?debug=true

Eu estava pensando que a barra de depuração poderia conter algumas dessas informações por padrão ( WP_DEBUGativadas ou não ), mas eu estava pensando em loucura, pois não acredito que seja esse o caso.

Então, o que eu achava que seria útil, seria uma verificação para o usuário atual (tendo a manage_optionscapacidade e executando os links através de add_query_arg():

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

mas o que não tenho certeza é: existe um gancho que eu possa usar para efetuar todos os links em um site com isso? Dessa forma, os administradores sempre veem a depuração, o que eu pensei que seria extremamente útil. Obrigado por qualquer ajuda, como sempre!

Zach
fonte
Esta solução alternativa (do Yoast) é extremamente útil para a depuração instantânea. Também habilitei o log que funciona bem. Eu ligeiramente modificada meu código: if ( isset( $_GET['bug'] ) ) então eu visitar link / bug para ver depuração :)?
Jarmerson

Respostas:

18

Eu não acho que exista um gancho de URL universal. Há muitos ganchos e eu posso ter perdido, mas não acho que exista. Você pode olhar através dos ganchos em adambrown.info . Existem muitos ganchos de URL, mas não universais.

Se eu puder sugerir outra solução: Registre os erros nos arquivos.

/**
 * 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);

Esse código é direto do Codex para o arquivo wp-config.php . Se você fizer isso, não precisará se preocupar com malabarismo $_GETou resolver quem é e quem não é um administrador.

Editar:

Eu esqueci uma solução possível. Você pode fazer isso com Javascript. Um script curto pode anexar seu parâmetro a todos os URLs da página, e você pode carregá-lo facilmente apenas para administradores.

Eu ainda sugeriria a solução 'log', pois erros para todos são registrados. Se seu pessoal é como o meu e envia 'relatórios' de erro como " ei, o site está quebrado quando você faz esse formulário ", você apreciará o log. :)

s_ha_dum
fonte
Acho que estou mimado em vê-los na tela :) mas um arquivo de log faz mais sentido aqui. Farei um pouco mais de pesquisa do meu lado, mas essa parece ser a melhor solução que encontrei até agora. Obrigado!
Zach
5
Observe que o log nativo é codificado para registrar em arquivo acessível pela web, o que não é uma boa idéia na produção. É melhor configurar o local do arquivo de log privado (fora da pasta da web) via PHP para sites ao vivo.
Rarst
9

Embora minha primeira abordagem tenha sido a resposta para a lixeira e o s_ha_dums seja uma maneira limpa e provavelmente a melhor de fazer isso, deixe-me oferecer mais um cenário de trabalho:

A seguir, define um cookie válido pelas próximas 24 horas (86400 segundos) quando um administrador efetua login no sistema. No wp-config.php , a constante WP_DEBUGé definida condicionalmente, dependendo da presença e valor do referido cookie.

Advertência: WP_DEBUGa partir de então, será definido truepara todos que fizerem login no mesmo navegador na mesma máquina no mesmo dia.

no functions.php (ou como um 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 );

Consulte: Codex> Referência de ação> wp_login

em wp-config.php :

if ( isset( $_COOKIE['wp_debug'] ) && 'on' === $_COOKIE['wp_debug'] ) {
    define( 'WP_DEBUG', true );
} else {
    define( 'WP_DEBUG', false );
}
Johannes Pille
fonte
Andrew Nacin comentou sobre esse artigo, mencionar que inité tarde demais para ter qualquer efeito. Eu também tentei isso e não funcionou.
Zach
As constantes não podem ser redefinidas. Pode-se modificar o nível de relatório de erros sem tocar constante, mas não é perfeito. Também há muitas coisas acontecendo antes initque são do seu interesse.
Rarst
Acho que a resposta aceita continua sendo a solução mais viável, no entanto, por uma questão de integridade, essa nova abordagem deve fazer o trabalho com avisos de depuração na tela.
Johannes Pille
Solução alternativa muito legal - definitivamente darei uma chance a isto #
Zach
11
@s_ha_dum: Não é como se alguém se lembrasse de todas as respostas - pelo menos eu não (já pesquisei minha própria resposta antes). Este eu me lembro embora. Eu fui o primeiro a responder e escrevi porcaria absoluta. Não foi aplicado. Sigo uma política para não responder, a menos que tenha pelo menos 99,5% de certeza de que estou qualificado (presumo que o mesmo vale para você) - aqui eu estava fora do objetivo. Isso me incomodou a vida, então, poucas horas depois, depois que isso obteve uma resposta aceita, eu ainda estava pensando sobre isso e pensei nisso. Eu também acho que é muito liso - obrigado por perceber.
Johannes Pille 25/03
3

Ele não responde à sua pergunta com precisão, mas por experiência pessoal, achei melhor ativar o modo de depuração combinando o endereço IP em vez do URL.

Isso requer a modificação de links e resolve como identificar o administrador antes que o WP carregue a funcionalidade necessária do usuário.

Rarst
fonte
Na verdade, eu também gosto dessa ideia - então, se eu fizesse algo como pastebin.com/m22KNakh que poderia ... em teoria, funcionar, correto? Executando echo $_SERVER['REMOTE_ADDR']rendimentos ::1esperados no host local? Parece honestamente como um arquivo de log separado e dessa maneira (como os IPs domésticos parecem mudar o tempo todo) pode ser uma boa idéia.
Zach
@ Zach sim, ::1é apenas a versão IPv6 do 127.0.0.1. A criação de IP dinâmico é menos conveniente, mas, de qualquer maneira, eu trato isso apenas como uma técnica temporária de solução de problemas para coisas ao vivo. Não substitui a instalação de depuração local adequada.
Rarst
Ah, obrigado por me avisar. Definitivamente, como as duas opções aqui, eu vou usar a resposta @s_ha_dum (além do seu comentário que eu votei), o que também é ótimo. Mais uma vez obrigado, eu realmente aprecio isso!
Zach
1

Este também é um truque possível, mas você precisa colocar isso no seu wp-config.phpdesde que WP_DEBUGestá definido lá:

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

Adicione ?debugsecret=debugsecretao URL da página que você deseja depurar.

prosti
fonte