Click here to load reader

WordCamp SF 2011: Debugging in WordPress

  • View

  • Download

Embed Size (px)


The slides for my Debugging in WordPress talk at WordCamp San Francisco, on August 13, 2011.

Text of WordCamp SF 2011: Debugging in WordPress

  • 1.Debugging in WordPressWordCamp San Francisco 2011August 13, 2011

2. Andrew NacinCore Developer of WordPressTech Ninja at Audrey [email protected]@nacin on Twitter 3. var_dump( $data );die( );// fin. 4. I love suppressing errormessages! no one, ever. 5. So lets start withWP_DEBUGdene( WP_DEBUG, true ); 6. What WP_DEBUG does: Sets the error reporting level toinclude PHP notices Bypasses some error suppression Triggers notices for deprecatedusage (more on that later) 7. You can change its output:// A default of true forces on display_errors.dene( WP_DEBUG_DISPLAY, true );// Setting it to false will let PHP (php.ini) decide.dene( WP_DEBUG_DISPLAY, false );// So, if your php.ini has display_errors on, youll also need to turn it o:ini_set( display_errors, 0 ); 8. Likely being simplied in 3.3:// A default of true forces on display_errors.dene( WP_DEBUG_DISPLAY, true );// False forces o display_errors.dene( WP_DEBUG_DISPLAY, false );// Null will let PHP (php.ini) decide.dene( WP_DEBUG_DISPLAY, null ); 9. You can specify an error log:// wp-content/debug.logdene( WP_DEBUG_LOG, true );// New in 3.3! (Likely.)dene( WP_DEBUG_LOG, /tmp/php-errors );// Follow ticket #18391, created last night. 10. Debug admin CSS & JS withSCRIPT_DEBUGdene( SCRIPT_DEBUG, true ); 11. SCRIPT_DEBUG preventsminication and concatenation ofcore scripts and styles.load-scripts.php?c=1&load=global,wp-admin,msversus,, 12. SCRIPT_DEBUG is good for: Finding bugs in your admin screens Studying the admin theme Contributing to core 13. Debug queries withSAVEQUERIESdene( SAVEQUERIES, true ); 14. SAVEQUERIES stores query data in$wpdb->queries.(OMG BBQ:This is NOT for production.) 15. Query: SELECT * FROM wp_usersWHERE user_login = nacinBacktrace: WP->init,wp_get_current_user,get_currentuserinfo,wp_validate_auth_cookie,get_user_byExecution time: 0.4ms 16. On using these in production:WP_DEBUG Dont display errors Dont log to wp-content/error.logSCRIPT_DEBUG Bad idea.SAVEQUERIES Barry will hunt you down. 17. Plugins 18. Your new best friend:The Debug BarIts like Firebug for your WordPress. 19. Debug Bar ConsoleA Firebug-like console forPHP and MySQL (really) 20. Whats stopping you frombuilding your own DebugBar extension?Nothing. 21. Log Deprecated Notices Logs the usage of deprecated les,functions, and function arguments. Pinpoints where the deprecatedfunctionality is being used. NEVER use in production. 22. Theme Check Test your theme for the latestWordPress standards and practices. Required for the theme directory. 23. Common functions whendebugging error_log and var_export / print_r var_dump and sometimes die debug_backtrace 24. Tracking it down 25. Step 1Disable pluginsSwitch to default theme 26. What might be left behind?Cron, Rewrites,Roles/Capabilities 27. Drop-ins advanced-cache.php db.php object-cache.php mu-plugins 28. Whats going on?Query vars set properly?Main query SQL look right?Rewrite rule matched? 29. Funny redirect?Conrm its canonical.remove_action( template_redirect, redirect_canonical ); 30. Testing multisite?I leave this in my cong:// dene( MULTISITE, true ); 31. Dig into the codebase.Your friends are phpxref, grep.Learn the stack.Learn what things call what. 32. Some common traps 33. Step 1Is your code even running?(Spell the hook right?)die( wtf ); or error_log( ) 34. White screen on thefrontend, no errors?Appearance > Themes 35. User interface doesnt work?Check the browsers JS consolefor an error, usually a conict. 36. Internal server errors?Innite redirects. Check: home and siteurl then .htaccess then canonical 37. Widgets got moved around?Do the sidebars have IDs?Otherwise, its the order in whichregister_sidebar() is called. 38. Lots of pages? Slow site?My next Q: Whats yourpermalink structure?No longer an issue in 3.3! 39. Weird Bug #1Somewhere deep in style.css:Template: home.phpMiscalculated as a multisite bug:activated on single site beforestyle.css had the headers. 40. Weird Bug #2The admin looked weird 41. Weird Bug #2The admin looked weirdTrigger: Upgrade from 2.5 to 3.1 42. Weird Bug #2The admin looked weirdTrigger: Upgrade from 2.5 to 3.1Problem: No MySQL ALTERpermissions 43. Weird Bug #3Some bbPress rewritesfailed after activation 44. Weird Bug #3Some bbPress rewritesfailed after activationProblem: Custom post typerewrites arent registered onactivation 45. // Say you have:add_action( generate_rewrite_rules, function( $wp_rewrite ) { } );// And:register_activation_hook( __FILE__, function() { ush_rewrite_rules( );} );// But! This wont work for CPTs. Try this:add_action( init, my_register_post_types );register_activation_hook( __FILE__, function( ) { my_register_post_types( ); ush_rewrite_rules( );} ); 46. Local Development 47. /etc/hosts127.0.0.1 andrewnacin.comCongure virtual hostsInstall local WordPress 48. Replace links with anoutput buer fordevelopment or stagingenvironments 49. // Run this on development or staging.// A development wp-cong.php or local-cong.php is ne.ob_start( nacin_dev_urls );function nacin_dev_urls( $buer ) {$live =;$dev =;return str_replace( $live, $dev, $buer );} 50. URLs are more portablewhen theyre absolute.Really.*The serialized stu is lame though. 51. Start of a conversationXdebug (backtraces, proling)KCacheGrind (visualization)Using an IDEUnit testing 52. And nally, remember:Friends dont let friendsdevelop withoutWP_DEBUG. 53. Thanks! [email protected]

Search related