Définir WP_DEBUG sous condition / pour les administrateurs uniquement / consigner les erreurs (ajouter l'argument de requête pour tous les liens?)

20

Je suis en train de développer un site sur un serveur auquel le client a également accès et ce que j'aimerais faire, c'est montrer WP_DEBUGuniquement aux administrateurs. Référencer l'article de Yoast sur un moyen de contourner cela:

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

s'afficherait WP_DEBUGuniquement pour les URL qui s'y sont ?debug=truejointes, commehttp://domain.com/?debug=true

Je pensais que la barre de débogage pouvait contenir certaines de ces informations par défaut (qu'elles soient WP_DEBUGactivées ou non ), mais je pensais à la folie car je ne pense pas que ce soit le cas.

Donc, ce que je pensais serait utile, ce serait une vérification pour l'utilisateur actuel (avoir la manage_optionscapacité et ensuite exécuter des liens via add_query_arg():

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

mais ce dont je ne suis pas sûr, c'est - y a-t-il un crochet que je peux utiliser pour effectuer tous les liens sur un site avec cela? De cette façon, les administrateurs voient toujours le débogage que je pensais être extrêmement utile. Merci pour toute aide, comme toujours!

Zach
la source
Cette solution de contournement (de Yoast) est extrêmement utile pour le débogage à la volée. J'ai également activé la journalisation qui fonctionne bien. J'ai légèrement modifié mon code: if ( isset( $_GET['bug'] ) ) je visite donc le lien /? Bug pour voir le débogage :)
Jarmerson

Réponses:

18

Je ne pense pas qu'il existe un crochet URL universel. Il y a beaucoup de crochets et je l'ai peut-être manqué, mais je ne pense pas qu'il y en ait un. Vous pouvez regarder à travers les crochets sur adambrown.info . Il existe de nombreux crochets URL, mais pas universels.

Si je peux suggérer une autre solution: consigner les erreurs dans un fichier.

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

Ce code provient directement du Codex pour le fichier wp-config.php . Si vous faites cela, vous n'aurez pas à vous soucier de jongler $_GETou de trier qui est et qui n'est pas un administrateur.

Éditer:

J'ai oublié une solution possible. Vous pouvez le faire avec Javascript. Un script court pourrait attacher votre paramètre à toutes les URL de la page, et vous pouvez facilement charger le script uniquement pour les administrateurs.

Je suggérerais toujours la solution «log» car les erreurs pour tout le monde sont enregistrées. Si vos gens sont comme les miens et envoient des "rapports" d'erreur comme " hé, le site est cassé quand vous faites ce formulaire " vous apprécierez le journal. :)

s_ha_dum
la source
Je suppose que je suis juste gâté de les voir à l'écran :) mais un fichier journal a plus de sens ici. Fera un peu plus de recherche de mon côté, mais cela semble être la meilleure solution que j'ai trouvée jusqu'à présent. Merci!
Zach
5
Notez que la journalisation native est codée en dur pour se connecter à un fichier accessible sur le Web, ce qui n'est pas une si bonne idée en production. Il est préférable de configurer l'emplacement du fichier journal privé (hors dossier Web) via des moyens PHP pour les sites en direct.
Rarst
9

Même si ma première approche a été pour la poubelle et que la réponse s_ha_dums est une façon propre et probablement la meilleure de procéder, permettez-moi de vous proposer un scénario de travail supplémentaire:

Ce qui suit définit un cookie qui est valide pour les prochaines 24 heures (86 400 secondes) lorsqu'un administrateur se connecte au système. Dans wp-config.php , la constante WP_DEBUGest conditionnellement définie en fonction de la présence et de la valeur dudit cookie.

Avertissement: WP_DEBUGsera ensuite défini pour trueque tout le monde se connecte à partir du même navigateur sur la même machine le même jour.

dans functions.php (ou en tant que 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 );

Voir: Codex> Référence d'action> wp_login

dans wp-config.php :

if ( isset( $_COOKIE['wp_debug'] ) && 'on' === $_COOKIE['wp_debug'] ) {
    define( 'WP_DEBUG', true );
} else {
    define( 'WP_DEBUG', false );
}
Johannes Pille
la source
Andrew Nacin a commenté cet article, mentionnant qu'il initest trop tard pour avoir un effet. J'ai aussi essayé ça et ça n'a pas marché.
Zach
Les constantes ne peuvent pas être redéfinies. On pourrait modifier le niveau de rapport d'erreurs sans toucher à la constante mais ce n'est pas parfait. Il y a aussi beaucoup de choses qui se produisent avant initqui sont intéressantes.
Rarst
Je pense que la réponse acceptée reste la solution la plus viable, néanmoins, par souci d'exhaustivité, cette nouvelle approche devrait faire le travail avec des avis de débogage à l'écran.
Johannes Pille
Ah solution de contournement très cool - va certainement donner un coup de feu
Zach
1
@s_ha_dum: Ce n'est pas comme si l'on se souvenait de chaque réponse - du moins je ne le fais pas (j'ai googlé ma propre réponse auparavant). Celui-là, je m'en souviens. J'étais le premier à répondre et j'avais écrit de la merde absolue. Ne s'appliquait pas du tout. Je suis une politique de ne pas répondre à moins que je sois au moins à 99,5% certain que je suis qualifié (je suppose que c'est la même chose pour vous) - ici, j'étais loin de l'objectif. Cela me dérangeait pour les vivants, donc quelques heures plus tard, après que cela eut obtenu une réponse acceptée, je réfléchissais toujours à celle-ci et trouvais ce qui précède. Moi aussi, je pense que c'est assez lisse - merci de l'avoir remarqué.
Johannes Pille
3

Cela ne répond pas précisément à votre question, mais d'après mon expérience personnelle, j'ai trouvé qu'il était préférable d'activer le mode de débogage en faisant correspondre l'adresse IP au lieu de l'URL.

Cela nécessite de modifier les liens et résout comment identifier l'administrateur avant que WP ne charge les fonctionnalités utilisateur requises.

Rarst
la source
En fait, j'aime aussi cette idée - donc si je faisais quelque chose comme pastebin.com/m22KNakh qui pourrait ... en théorie fonctionner, n'est-ce pas? Exécuter des echo $_SERVER['REMOTE_ADDR']rendements ::1attendus sur localhost? Cela ressemble honnêtement à un fichier journal séparé et de cette façon (comme les adresses IP personnelles semblent changer tout le temps) peut être une bonne idée.
Zach
@Zach ouais, ::1c'est juste une version IPv6 de 127.0.0.1. L'IP dynamique est moins pratique, mais de toute façon je ne traite cela que comme une technique de dépannage temporaire pour les choses en direct. Ne remplace pas la configuration de débogage locale appropriée.
Rarst
Ah merci de me l'avoir fait savoir. Certainement comme les deux options ici, je vais aller avec la réponse @s_ha_dum (en plus de votre commentaire que j'ai surévalué) qui est également génial. Merci encore, je l'apprécie vraiment!
Zach
1

C'est aussi une astuce possible, mais vous devez mettre cela dans votre wp-config.phppuisque WP_DEBUGc'est défini ici:

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

Ajoutez ?debugsecret=debugsecretà l'URL de la page que vous souhaitez déboguer.

prosti
la source