Definir WP_DEBUG condicionalmente / solo para administradores / errores de registro (¿agregar consulta arg para todos los enlaces?)

20

Estoy desarrollando un sitio en un servidor al que el cliente también tiene acceso y lo que me gustaría hacer es mostrar WP_DEBUGsolo a los administradores. Referenciando el artículo de Yoast sobre una forma de evitar esto:

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

se mostrará WP_DEBUGsolo para las URL que se hayan ?debug=trueadjuntado a ellas, comohttp://domain.com/?debug=true

Estaba pensando que la barra de depuración podría contener parte de esta información de forma predeterminada (ya sea que WP_DEBUGesté activada o no ), pero estaba loco porque no creo que ese sea el caso.

Entonces, lo que estaba pensando sería útil, sería una verificación para el usuario actual (que tiene la manage_optionscapacidad y luego ejecuta enlaces a través de add_query_arg():

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

pero de lo que no estoy seguro es: ¿hay un gancho que pueda usar para efectuar todos los enlaces en un sitio con esto? De esta manera, los administradores siempre ven la depuración que pensé que sería extremadamente útil. Gracias por cualquier ayuda como siempre!

Zach
fuente
Esta solución alternativa (de Yoast) es extremadamente útil para la depuración sobre la marcha. También habilité el registro que funciona bien. if ( isset( $_GET['bug'] ) )
Modifiqué

Respuestas:

18

No creo que haya un enlace URL universal. Hay muchos ganchos y puede que me los haya perdido, pero no creo que haya uno. Puedes mirar a través de los ganchos en adambrown.info . Hay muchos enlaces URL, pero no uno universal.

Si puedo sugerir otra solución: registre los errores en un archivo.

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

Ese código proviene directamente del Codex para el archivo wp-config.php . Si haces eso, no tendrás que preocuparte por hacer malabares $_GETo resolver quién es y quién no es un administrador.

Editar:

Olvidé una posible solución. Puedes hacer esto con Javascript. Una secuencia de comandos breve podría adjuntar su parámetro a todas las URL de la página, y puede cargar la secuencia de comandos con bastante facilidad solo para administradores.

Todavía sugeriría la solución 'log' ya que los errores para todos están registrados. Si su gente es como la mía y envía 'informes' de error como " oye, el sitio se rompe cuando haces ese formulario ", apreciarás el registro. :)

s_ha_dum
fuente
Supongo que estoy mimado de verlos en la pantalla :) pero un archivo de registro tiene más sentido aquí. Investigaré un poco más por mi parte, pero esta parece ser la mejor solución que he encontrado hasta ahora. ¡Gracias!
Zach
55
Tenga en cuenta que el registro nativo está codificado para iniciar sesión en un archivo accesible desde la web, lo que no es una buena idea en producción. Es mejor configurar la ubicación del archivo de registro privado (fuera de la carpeta web) a través de medios PHP para sitios en vivo.
Rarst
9

Aunque mi primer enfoque fue para el contenedor de basura y la respuesta s_ha_dums es una forma limpia, y probablemente la mejor, de hacerlo, permítanme ofrecer un escenario de trabajo más:

Lo siguiente establece una cookie que es válida durante las próximas 24 horas (86400 segundos) cuando un administrador inicia sesión en el sistema. En wp-config.php , la constante WP_DEBUGse define condicionalmente dependiendo de la presencia y el valor de dicha cookie.

Advertencia: WP_DEBUGa partir de entonces se configurará truepara que todos inicien sesión desde el mismo navegador en la misma máquina el mismo día.

en functions.php (o como complemento):

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

Ver: Códice> Referencia de acciones> wp_login

en wp-config.php :

if ( isset( $_COOKIE['wp_debug'] ) && 'on' === $_COOKIE['wp_debug'] ) {
    define( 'WP_DEBUG', true );
} else {
    define( 'WP_DEBUG', false );
}
Johannes Pille
fuente
Andrew Nacin comentó sobre ese artículo, mencionando que inites demasiado tarde para tener algún efecto. También probé esto y no funcionó.
Zach
Las constantes no se pueden redefinir. Se podría modificar el nivel de informe de errores sin tocar constante, pero no es perfecto. También hay muchas cosas que suceden antes initque son de interés.
Rarst
Creo que la respuesta aceptada sigue siendo la solución más viable, sin embargo, en aras de la exhaustividad, este nuevo enfoque debería hacer el trabajo con avisos de depuración en pantalla.
Johannes Pille
Ah, una solución muy interesante, definitivamente lo probaré
Zach
1
@s_ha_dum: No es como si uno recordara cada respuesta, al menos no (busqué en Google mi propia respuesta antes). Aunque sí recuerdo este. Fui el primero en responder y había escrito una mierda absoluta. No se aplicó en absoluto. Sigo una política de no responder a menos que tenga al menos un 99.5% de certeza de que estoy calificado (supongo que lo mismo ocurre con usted): aquí había estado muy lejos del objetivo. Eso me molestó mucho, así que unas horas más tarde, después de obtener una respuesta aceptada, todavía estaba pensando en esta y se me ocurrió lo anterior. También creo que es bastante hábil, gracias por notarlo.
Johannes Pille
3

No responde su pregunta con precisión, pero por experiencia personal descubrí que es mejor habilitar el modo de depuración haciendo coincidir la dirección IP en lugar de la URL.

Eso requiere la modificación de enlaces y resuelve cómo identificar al administrador antes de que WP cargue la funcionalidad requerida del usuario.

Rarst
fuente
De hecho, también me gusta esta idea, así que si hiciera algo como pastebin.com/m22KNakh eso podría ... en teoría funcionar, ¿correcto? Ejecutando los echo $_SERVER['REMOTE_ADDR']rendimientos ::1que se esperaban en localhost? Sinceramente, suena como un archivo de registro separado y de esta manera (ya que las direcciones IP de los hogares parecen cambiar todo el tiempo) podría ser una buena idea.
Zach
@Zach sí, ::1es solo la versión IPv6 de 127.0.0.1. La creación de IP dinámica es menos conveniente, pero de todos modos solo trato esto como una técnica de resolución de problemas temporal para material en vivo. No reemplaza la configuración de depuración local adecuada.
Rarst
Ah, gracias por hacérmelo saber. Definitivamente, como las dos opciones aquí, voy a ir con la respuesta @s_ha_dum (además de tu comentario que voté) que también es genial. Gracias de nuevo, ¡realmente lo aprecio!
Zach
1

Este también es un posible truco, pero debe poner esto en su wp-config.phppuesto ya que WP_DEBUGestá definido allí:

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

Agregue ?debugsecret=debugsecreta la página URL que desea depurar.

prosti
fuente