Débugger WordPress comme un Pro : Guide Pratique 🔍
Salut jeune padawan ! Tu galères avec un bug WordPress qui te donne des sueurs froides ? Pas de panique, je vais te montrer comment devenir un véritable Sherlock Holmes du debugging WordPress !
🎯 Première étape : Configurer ton labo de debug
Commence par transformer ton wp-config.php en véritable centre de commandement :
// Active le mode détective 🕵️ define('WP_DEBUG', true); // Note tout dans un fichier define('WP_DEBUG_LOG', true); // Affiche à l'écran (à éviter en prod !) define('WP_DEBUG_DISPLAY', true); // Désactive le min des scripts define('SCRIPT_DEBUG', true);
🔍 Les outils indispensables de l’enquêteur
1. Query Monitor – Ton meilleur allié
C’est comme avoir une caméra de surveillance sur ton WordPress. Il te montre :
- Les requêtes SQL suspectes
- Les hooks qui traînent
- Les templates chargés
- Les temps de chargement
2. Le journal de bord personnalisé
function super_debug($message, $data = null) { if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { $trace = debug_backtrace()[0]; $log_entry = sprintf( "[%s] %s:%d - %s", date('Y-m-d H:i:s'), basename($trace['file']), $trace['line'], $message ); if ($data) { $log_entry .= "\n" . print_r($data, true); } error_log($log_entry . "\n", 3, WP_CONTENT_DIR . '/debug.log'); } } // Utilisation super_debug("L'utilisateur fait des bêtises", $_POST);
Pense à regarder la doc error_log 👽
🕵️♂️ Techniques d’investigation avancées
1. Espionner les hooks WordPress
function hook_detective($hook_name) { add_action($hook_name, function() use ($hook_name) { super_debug("🎣 Hook déclenché : " . $hook_name, [ 'args' => func_get_args(), 'time' => microtime(true) ]); }, 0); } // Surveillance des suspects habituels hook_detective('init'); hook_detective('wp_loaded'); hook_detective('wp_footer');
Pour debug les filtres, c’est une autre histoire … Tu peux tenter
add_action( 'shutdown', function () { if ( ! defined( 'WP_DEBUG' ) || ! WP_DEBUG ) { return; } global $wp_actions, $wp_filter; echo '<pre>' . print_r( $wp_filter, true ) . '</pre>'; die(); }, 999 );
Si tu essaies de tout logger d’un coup, tu risques de te prendre un beau « Fatal error: Allowed memory size » dans la figure (Cette structure est beaucoup plus complexe et volumineuse). L’idéal c’est de boucler dessus $wp_filter et de print + die juste ce que tu as besoin.
En comparaison : $wp_actions est ton ami ! C’est une structure simple qui contient juste les noms des hooks et leur nombre d’exécutions. Tu peux le débugger sans crainte.
2. Traquer les requêtes SQL louches
/** * Debug les requêtes SQL lentes sans impacter les performances * Utilise SAVEQUERIES et un seuil de temps configurable */ function better_db_detective() { // Vérifie si on est en mode debug et si SAVEQUERIES est activé if ( ! defined( 'WP_DEBUG' ) || ! WP_DEBUG ) { return; } if ( ! defined( 'SAVEQUERIES' ) || ! SAVEQUERIES ) { return; } // On attend la fin de l'exécution pour analyser add_action( 'shutdown', function () { global $wpdb; // Seuil de temps en secondes (ici 1 seconde) $threshold = 1; // Analyse uniquement si $wpdb->queries existe if ( ! empty( $wpdb->queries ) ) { foreach ( $wpdb->queries as $query ) { // $query[1] contient le temps d'exécution if ( $query[1] > $threshold ) { super_debug( sprintf( "[Requête lente] Temps: %fs\nRequête: %s\nCaller: %s\n", $query[1], $query[0], $query[2] ) ); } } } }, 999 ); }
🎯 Les scènes de crime courantes
1. Le mystère du template disparu
/** * Log les fichiers PHP inclus dans WordPress, groupés par catégorie */ function log_included_files() { if ( ! defined( 'WP_DEBUG' ) || ! WP_DEBUG ) { return; } $files = array( 'wp-admin' => array(), 'wp-includes' => array(), 'wp-content' => array( 'themes' => array(), 'plugins' => array(), 'other' => array(), ), 'root' => array(), ); foreach ( get_included_files() as $file ) { $path = str_replace( ABSPATH, '', $file ); if ( strpos( $path, 'wp-admin/' ) === 0 ) { $files['wp-admin'][] = $path; } elseif ( strpos( $path, 'wp-includes/' ) === 0 ) { $files['wp-includes'][] = $path; } elseif ( strpos( $path, 'wp-content/' ) === 0 ) { if ( strpos( $path, 'wp-content/themes/' ) === 0 ) { $files['wp-content']['themes'][] = $path; } elseif ( strpos( $path, 'wp-content/plugins/' ) === 0 ) { $files['wp-content']['plugins'][] = $path; } else { $files['wp-content']['other'][] = $path; } } else { $files['root'][] = $path; } } super_debug( 'WordPress Files Loaded', $files ); } add_action( 'shutdown', 'log_included_files', 999 );
2. L’énigme des assets manquants
function assets_detective() { global $wp_scripts, $wp_styles; super_debug( '📚 Assets chargés', array( 'scripts' => array_keys( $wp_scripts->registered ), 'styles' => array_keys( $wp_styles->registered ), ) ); } add_action( 'wp_print_scripts', 'assets_detective', 999 );
❓Priorité 999
C’est tout con, un priorité basse pour arriver en dernier. On attend que tout s’éxécute pour intervenir ensuite.
⚠️ Hey Padawan, la priorité basse c’est comme les roues stabilisatrices : parfait pour débugger, mais danger en prod ! Remets des priorités classiques et surtout, protège ce code avec des constantes de debug – parce qu’un ninja ne laisse pas traîner ses outils d’entraînement en mission ! 🥷
📝 La checklist du parfait détective
- ✅ Activer WP_DEBUG
- ✅ Installer Query Monitor
- ✅ Vérifier le fichier debug.log
- ✅ Désactiver les plugins un par un
- ✅ Passer temporairement sur un thème par défaut
- ✅ Vérifier les conflits de versions PHP/WordPress
🎓 Pro Tips
- Garde toujours une copie des fichiers ou de la base avant de jouer au détective
- Les erreurs 500 se cachent souvent dans les .htaccess
- Un wp_mail() qui ne marche pas ? Installe un plugin SMTP pour débugger
- Les problèmes de performance ? Active Query Monitor et SAVEQUERIES
🚀 Pour aller plus loin
- Apprends à utiliser xDebug avec WordPress
- Explore le débogueur de navigateur pour les problèmes JavaScript
- Mets en place un environnement de développement local avec MailHog
💡 Le mot de la fin
Le debugging WordPress, c’est comme une enquête policière : patience, méthode et un bon outillage font toute la différence.
N’oublie pas que même les meilleurs détectives demandent parfois de l’aide !