WordCamp SF 2011: Debugging in WordPress

8,434 views
8,301 views

Published on

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

Published in: Business, Technology
2 Comments
15 Likes
Statistics
Notes
  • @batmoo Ive used something similar that adds a few extra options http://wordpress.org/extend/plugins/debugwp/
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • The Debug Bar Extender plugin is also a must: http://wordpress.org/extend/plugins/debug-bar-extender/
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
8,434
On SlideShare
0
From Embeds
0
Number of Embeds
1,181
Actions
Shares
0
Downloads
83
Comments
2
Likes
15
Embeds 0
No embeds

No notes for slide

WordCamp SF 2011: Debugging in WordPress

  1. 1. Debugging in WordPressWordCamp San Francisco 2011August 13, 2011
  2. 2. Andrew NacinCore Developer of WordPressTech Ninja at Audrey Capitalnacin@wordpress.org@nacin on Twitter
  3. 3. var_dump( $data ); die( ); // fin.
  4. 4. “I love suppressing errormessages!” — no one, ever.
  5. 5. So lets start withWP_DEBUGdefine( WP_DEBUG, true );
  6. 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. 7. You can change its output:// A default of true forces on display_errors.define( WP_DEBUG_DISPLAY, true );// Setting it to false will let PHP (php.ini) decide.define( WP_DEBUG_DISPLAY, false );// So, if your php.ini has display_errors on, youll also need to turn it off:ini_set( display_errors, 0 );
  8. 8. Likely being simplified in 3.3:// A default of true forces on display_errors.define( WP_DEBUG_DISPLAY, true );// False forces off display_errors.define( WP_DEBUG_DISPLAY, false );// Null will let PHP (php.ini) decide.define( WP_DEBUG_DISPLAY, null );
  9. 9. You can specify an error log:// wp-content/debug.logdefine( WP_DEBUG_LOG, true );// New in 3.3! (Likely.)define( WP_DEBUG_LOG, /tmp/php-errors );// Follow ticket #18391, created last night.
  10. 10. Debug admin CSS & JS withSCRIPT_DEBUGdefine( SCRIPT_DEBUG, true );
  11. 11. SCRIPT_DEBUG preventsminification and concatenation ofcore scripts and styles.load-scripts.php?c=1&load=global,wp-admin,ms…versus global.dev.css, wp-admin.dev.css, ms.dev.css
  12. 12. SCRIPT_DEBUG is good for:— Finding bugs in your admin screens— Studying the admin theme— Contributing to core
  13. 13. Debug queries withSAVEQUERIESdefine( SAVEQUERIES, true );
  14. 14. SAVEQUERIES stores query data in$wpdb->queries.(OMG BBQ:This is NOT for production.)
  15. 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. 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. 17. Plugins
  18. 18. Your new best friend:The Debug BarIt’s like Firebug for your WordPress.
  19. 19. Debug Bar ConsoleA Firebug-like console forPHP and MySQL (really)
  20. 20. Whats stopping you frombuilding your own DebugBar extension?Nothing.
  21. 21. Log Deprecated Notices— Logs the usage of deprecated files,functions, and function arguments.— Pinpoints where the deprecatedfunctionality is being used.— NEVER use in production.
  22. 22. Theme Check— Test your theme for the latestWordPress standards and practices.— Required for the theme directory.
  23. 23. Common functions whendebugging— error_log and var_export / print_r— var_dump and sometimes die— debug_backtrace
  24. 24. Tracking it down
  25. 25. Step 1Disable pluginsSwitch to default theme
  26. 26. What might be left behind?Cron, Rewrites,Roles/Capabilities
  27. 27. Drop-ins— advanced-cache.php— db.php— object-cache.php— mu-plugins
  28. 28. Whats going on?Query vars set properly?Main query SQL look right?Rewrite rule matched?
  29. 29. Funny redirect?Confirm its canonical.remove_action( template_redirect, redirect_canonical );
  30. 30. Testing multisite?I leave this in my config:// define( MULTISITE, true );
  31. 31. Dig into the codebase.Your friends are phpxref, grep.Learn the stack.Learn what things call what.
  32. 32. Some common traps
  33. 33. Step 1Is your code even running?(Spell the hook right?)die( wtf ); or error_log( )
  34. 34. White screen on thefrontend, no errors?Appearance > Themes
  35. 35. User interface doesnt work?Check the browsers JS consolefor an error, usually a conflict.
  36. 36. Internal server errors?Infinite redirects. Check:— home and siteurl— then .htaccess— then canonical
  37. 37. Widgets got moved around?Do the sidebars have IDs?Otherwise, its the order in whichregister_sidebar() is called.
  38. 38. Lots of pages? Slow site?My next Q: Whats yourpermalink structure?No longer an issue in 3.3!
  39. 39. Weird Bug #1Somewhere deep in style.css:“Template: home.php”Miscalculated as a multisite bug:activated on single site beforestyle.css had the headers.
  40. 40. Weird Bug #2The admin looked weird
  41. 41. Weird Bug #2The admin looked weirdTrigger: Upgrade from 2.5 to 3.1
  42. 42. Weird Bug #2The admin looked weirdTrigger: Upgrade from 2.5 to 3.1Problem: No MySQL ALTERpermissions
  43. 43. Weird Bug #3Some bbPress rewritesfailed after activation
  44. 44. Weird Bug #3Some bbPress rewritesfailed after activationProblem: Custom post typerewrites arent registered onactivation
  45. 45. // Say you have:add_action( generate_rewrite_rules, function( $wp_rewrite ) { … } );// And:register_activation_hook( __FILE__, function() { flush_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( ); flush_rewrite_rules( );} );
  46. 46. Local Development
  47. 47. /etc/hosts127.0.0.1 andrewnacin.comConfigure virtual hostsInstall local WordPress
  48. 48. Replace links with anoutput buffer fordevelopment or stagingenvironments
  49. 49. // Run this on development or staging.// A development wp-config.php or local-config.php is fine.ob_start( nacin_dev_urls );function nacin_dev_urls( $buffer ) { $live = http://andrewnacin.com; $dev = http://dev.andrewnacin.com; return str_replace( $live, $dev, $buffer );}
  50. 50. URLs are more portablewhen theyre absolute.Really.*The serialized stuff is lame though.
  51. 51. Start of a conversationXdebug (backtraces, profiling)KCacheGrind (visualization)Using an IDEUnit testing
  52. 52. And finally, remember:Friends dont let friendsdevelop withoutWP_DEBUG.
  53. 53. Thanks! Questions?@nacin

×