Debugando un live site

  • 29/05/2013

Cuando estamos en localhost, es simplesmente una cuestión de activar WP_DEBUG en wp-config.php:

define('WP_DEBUG', true);

Y es ahí cuando nos damos cuenta que aquel Theme tan chulo imprime un montón de notices y warnings por todos los lados: en la administración en sitios donde el theme ni debería pintar, en el front-end avisando del uso de funciones deprecadas… una desgracia, vamos. Hoy en día, un theme o plugin solo me interesa empezar a analizar sí, al activar, no imprime ningún error.

Eso dicho. En un live site no podemos darnos ese lujo, entonces activamos el debug de forma que guarde todos los errores y avisos en un archivo: /wp-content/debug.log:

define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
@ini_set('display_errors',0);
define('SCRIPT_DEBUG', true);

Ok, pero eso de tener que descargar el archivo para ver que pasa es un poco cansino, entonces hice el plugin Manage Debug Log para ver el archivo directamente en el escritorio. Compatible con Multisite. Versión oficial en GitHub (actualizada).

<?php
/**
 * Plugin Name: Manage Debug Log
 * Plugin URI: http://brasofilo.com/manage-debug-log
 * Description: Adds a settings page to view and clear the Debug Log (/wp-content/debug.log)
 * Version: 1.0
 * Author: Rodolfo Buaiz
 * Network: true
 * Author URI: http://wordpress.stackexchange.com/users/12615/brasofilo
 * Licence: GPLv2 or later
 */

!defined( 'ABSPATH' ) AND exit(
	"<pre>Hi there! I'm just part of a plugin, <h1>&iquest;what exactly are you looking for?"
);


add_action(
	'plugins_loaded', 
	array( BL_Default_Post_Meta_Boxes::get_instance(), 'plugin_setup' )
);


class BL_Default_Post_Meta_Boxes
{
	protected static $instance = NULL;
	private $no_log_img;
	private $logfile = 'debug.log';
	private $logpath;

	public function __construct() { }

	public static function get_instance()
	{
		NULL === self::$instance and self::$instance = new self;
		return self::$instance;
	}

	public function plugin_setup()
	{
		$this->no_log_img = 'http://f.cl.ly/items/1r1J1j2t2E291h0E0i0n/nothing-here.jpg';
		$this->logpath = WP_CONTENT_DIR . '/' . $this->logfile;

		$hook = is_multisite() ? 'network_' : '';
		
		add_action( "{$hook}admin_menu", array( $this, 'make_menu' ) );
		
		/* PRIVATE REPO */
		include_once( 'plugin-update-checker.php' );
		$MyUpdateChecker = PucFactory::buildUpdateChecker(
			'http://buaiz.eu/wp-content/custom/wp-update-server/?action=get_metadata&slug=manage-debug-log', 
			__FILE__
		);
		
	}

	public function make_menu()
	{
		$hook = is_multisite() ? 'settings.php' : 'options-general.php';
		add_submenu_page(
			$hook,
			'Debug Log', 
			'Debug Log', 
			'add_users', 
			'debug-log', 
			array( $this, 'render_debug' ) 
		);
	}

	public function render_debug()
	{
		
		# Security check and clear log
		if ( 
			isset( $_POST['b5f_debug_log'] ) 
			&& wp_verify_nonce( $_POST['b5f_debug_log'], plugin_basename( __FILE__ ) ) 
		)
		{
			unlink( $this->logpath );
		}
		
		# Read log
		if ( is_readable( $this->logpath ) ) {
			$handle  = fopen ( $this->logpath, 'r' );
			$content = stream_get_contents( $handle );
			fclose( $handle );
		}
		
		# Prepare content
		$nonce = wp_nonce_field( plugin_basename( __FILE__ ), 'b5f_debug_log', true, false );
		$submit = !empty( $content ) ? '<input type="submit" class="button-secondary" name="submit" value="Delete log" />' : '';
		$content = !empty( $content ) ? '<pre><code>'.print_r($content,true).'</code></pre>' : "<div id='no-cont'>Nothing here, captain!<br /><img src='{$this->no_log_img}' style='margin-top:15px' /></div>";
		
		# Do it
		echo <<<HTML
			<style>
			.wrap { margin-left: .5em; width: 80%; }
			#no-cont { margin: 1em 0; font-size: 2em; font-weight:bold; color:#009 }
			#no-cont img {max-width: 330px;}
			code { line-height: 2em; }
			footer { margin-top:2em; opacity: .5 }
		</style>
		<div class="wrap">
			<div id="icon-tools" class="icon32"></div> 
			<h2>Debug Log</h2>
			<div id="poststuff">
			<form action="" method="post" id="notes_form">
			$nonce
			$submit
			$content
			$submit
			</form>
			<footer>&hearts; <a href="http://brasofilo.com">Rodolfo Buaiz</a> &middot; <a href="https://github.com/brasofilo">Github</a></footer>
			</div>
		</div>	
HTML;
	}


}

plugin screenshot in multisite

Leave a reply

This entry was posted in Debugging, Tutorial and tagged , on .