WP_DEBUG bedingt definieren / nur für Administratoren / Fehler protokollieren (Abfrage-Argument für alle Links anhängen?)

20

Ich entwickle eine Site auf einem Server, auf den auch der Client zugreifen kann. Ich möchte sie WP_DEBUGnur Administratoren zeigen. Verweise auf Yoasts Artikel , um dies zu umgehen :

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

würde WP_DEBUGnur für URLs anzeigen, die ?debug=truean sie angehängt sind, wiehttp://domain.com/?debug=true

Ich dachte, dass die Debug-Leiste einige dieser Informationen standardmäßig enthalten könnte (unabhängig davon, ob sie aktiviert sind oder nicht WP_DEBUG), aber ich war verrückt, da ich nicht glaube, dass dies der Fall ist.

Also, was ich dachte, wäre nützlich, wäre eine Überprüfung für den aktuellen Benutzer (mit der manage_optionsFähigkeit und dann Links durchlaufen add_query_arg():

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

Aber ich bin mir nicht sicher, ob es einen Haken gibt, mit dem ich alle Links auf einer Site mit diesem bewirken kann. Auf diese Weise sehen Administratoren immer das Debugging, was ich für äußerst nützlich hielt. Vielen Dank für jede Hilfe wie immer!

Zach
quelle
Diese (Yoasts) Problemumgehung ist äußerst nützlich für das Debuggen im laufenden Betrieb. Ich habe auch die Protokollierung aktiviert, die gut funktioniert. Ich habe meinen Code leicht geändert: if ( isset( $_GET['bug'] ) ) so dass ich link /? Bug
besuche

Antworten:

18

Ich glaube nicht, dass es einen universellen URL-Hook gibt. Es gibt viele Haken und ich habe es vielleicht verpasst, aber ich glaube nicht, dass es einen gibt. Sie können bei adambrown.info durch die Haken schauen . Es gibt viele URL-Hooks, aber keine universellen.

Wenn ich eine andere Lösung vorschlagen kann: Protokollieren Sie die Fehler in einer Datei.

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

Dieser Code stammt direkt aus dem Codex für die Datei wp-config.php . Wenn Sie das tun, müssen Sie sich keine Gedanken darüber machen $_GET, wer ein Administrator ist und wer nicht.

Bearbeiten:

Ich habe eine mögliche Lösung vergessen. Sie können dies mit Javascript tun. Ein kurzes Skript könnte Ihren Parameter an alle URLs auf der Seite anhängen, und Sie können das Skript ziemlich einfach nur für Administratoren laden.

Ich würde immer noch die "Protokoll" -Lösung vorschlagen, da Fehler für alle protokolliert werden. Wenn Ihre Leute wie ich sind und Fehlerberichte wie " Hey, die Seite ist kaputt, wenn Sie dieses Formular ausfüllen " senden , werden Sie das Protokoll zu schätzen wissen. :)

s_ha_dum
quelle
Ich glaube, ich bin nur verwöhnt, sie auf dem Bildschirm zu sehen :), aber eine Protokolldatei ist hier sinnvoller. Ich werde ein bisschen mehr Nachforschungen anstellen, aber dies scheint die beste Lösung zu sein, die mir bisher begegnet ist. Vielen Dank!
Zach
5
Beachten Sie, dass die systemeigene Protokollierung für die Protokollierung in einer Datei, auf die über das Web zugegriffen werden kann, fest codiert ist. Dies ist in der Produktion keine gute Idee. Für Live-Sites ist es besser, den Speicherort der privaten Protokolldatei (außerhalb des Webordners) über PHP zu konfigurieren.
Rarst
9

Obwohl mein erster Ansatz für die Mülltonne war und die Antwort von s_ha_dums eine saubere und wahrscheinlich beste Lösung ist, möchte ich noch ein weiteres Arbeitsszenario anbieten:

Im Folgenden wird ein Cookie festgelegt, das für die nächsten 24 Stunden (86400 Sekunden) gültig ist, wenn sich ein Administrator beim System anmeldet. In wp-config.php wird die Konstante WP_DEBUGabhängig vom Vorhandensein und Wert des Cookies bedingt definiert.

Vorsichtsmaßnahme: WP_DEBUGwird danach truefür alle festgelegt, die sich am selben Tag über denselben Browser auf demselben Computer anmelden.

in functions.php (oder als 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 );

Siehe: Codex> Aktionsreferenz> wp_login

in der wp-config.php :

if ( isset( $_COOKIE['wp_debug'] ) && 'on' === $_COOKIE['wp_debug'] ) {
    define( 'WP_DEBUG', true );
} else {
    define( 'WP_DEBUG', false );
}
Johannes Pille
quelle
Andrew Nacin hat diesen Artikel kommentiert und erwähnt, dass inites zu spät ist, um etwas zu bewirken. Ich habe es auch versucht und es hat nicht funktioniert.
Zach
Konstanten können nicht neu definiert werden. Man könnte den Fehlerbericht ändern, ohne die Konstante zu berühren, aber es ist nicht perfekt. Es gibt auch eine Menge Dinge, die vorher initvon Interesse sind.
Rarst
Ich denke, die akzeptierte Antwort ist nach wie vor die praktikabelste Lösung. Der Vollständigkeit halber sollte dieser neue Ansatz den Job mit Debug-Benachrichtigungen auf dem Bildschirm erledigen.
Johannes Pille
Ah sehr cool Workaround - wird auf jeden Fall eine
Zach
1
@s_ha_dum: Es ist nicht so, dass man sich an jede Antwort erinnert - zumindest nicht (ich habe meine eigene Antwort zuvor gegoogelt). An diesen erinnere ich mich allerdings. Ich antwortete als erster und hatte absoluten Mist geschrieben. Hat sich überhaupt nicht beworben. Ich folge einer Richtlinie, um nicht zu antworten, es sei denn, ich bin zu mindestens 99,5% sicher, dass ich dafür qualifiziert bin (ich gehe davon aus, dass dies auch für Sie zutrifft) - hier war ich weit vom Ziel entfernt. Das störte die Lebenden, so dass ich ein paar Stunden später, nachdem dies eine akzeptierte Antwort erhalten hatte, immer noch über diese nachdachte und mir die obigen Gedanken machte. Ich finde es auch ziemlich clever - danke, dass du es bemerkt hast.
Johannes Pille
3

Es beantwortet Ihre Frage nicht genau, aber aus persönlicher Erfahrung fand ich es besser, den Debug-Modus durch Abgleichen der IP-Adresse anstelle der URL zu aktivieren.

Dies erfordert eine Änderung der Links und löst das Identifizieren des Administrators, bevor WP die erforderliche Benutzerfunktionalität lädt.

Rarst
quelle
Eigentlich mag ich diese Idee auch - wenn ich also so etwas wie pastebin.com/m22KNakh gemacht hätte , könnte das ... theoretisch funktionieren, richtig? Laufende echo $_SERVER['REMOTE_ADDR']Erträge ::1, die auf localhost erwartet werden? Es klingt ehrlich gesagt wie eine separate Protokolldatei, und auf diese Weise (da sich die IP-Adressen zu Hause scheinbar ständig ändern) ist es möglicherweise eine gute Idee.
Zach
@ Zach ja, ::1ist nur IPv6-Version von 127.0.0.1. Dynamische IP-Marken sind weniger praktisch, aber ich betrachte dies nur als vorübergehende Fehlerbehebungstechnik für Live-Inhalte. Ersetzt nicht das richtige lokale Debug-Setup.
Rarst
Ah, danke, dass du mich informiert hast. Wie auf jeden Fall beide Optionen hier, werde ich mit @s_ha_dum antworten (zusätzlich zu Ihrem Kommentar, den ich hochgestuft habe), was auch großartig ist. Nochmals vielen Dank, ich weiß das wirklich zu schätzen!
Zach
1

Dies ist auch ein möglicher Trick, aber Sie müssen diesen in Ihr wp-config.phpda WP_DEBUGeinfügen, das dort definiert ist:

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

Fügen Sie ?debugsecret=debugsecretder Seiten-URL, die Sie debuggen möchten, hinzu.

prosti
quelle