WordCamp SF 2011: Debugging in WordPressPresentation Transcript
Debugging in WordPressWordCamp San Francisco 2011August 13, 2011
Andrew NacinCore Developer of WordPressTech Ninja at Audrey Capitalnacin@wordpress.org@nacin on Twitter
var_dump( $data ); die( ); // fin.
“I love suppressing errormessages!” — no one, ever.
So lets start withWP_DEBUGdefine( WP_DEBUG, true );
What WP_DEBUG does:— Sets the error reporting level toinclude PHP notices— Bypasses some error suppression— Triggers notices for deprecatedusage (more on that later)
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 );
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 );
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.
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.
Plugins
Your new best friend:The Debug BarIt’s like Firebug for your WordPress.
Debug Bar ConsoleA Firebug-like console forPHP and MySQL (really)
Whats stopping you frombuilding your own DebugBar extension?Nothing.
Log Deprecated Notices— Logs the usage of deprecated files,functions, and function arguments.— Pinpoints where the deprecatedfunctionality is being used.— NEVER use in production.
Theme Check— Test your theme for the latestWordPress standards and practices.— Required for the theme directory.
Common functions whendebugging— error_log and var_export / print_r— var_dump and sometimes die— debug_backtrace
Tracking it down
Step 1Disable pluginsSwitch to default theme
What might be left behind?Cron, Rewrites,Roles/Capabilities
Whats going on?Query vars set properly?Main query SQL look right?Rewrite rule matched?
Funny redirect?Confirm its canonical.remove_action( template_redirect, redirect_canonical );
Testing multisite?I leave this in my config:// define( MULTISITE, true );
Dig into the codebase.Your friends are phpxref, grep.Learn the stack.Learn what things call what.
Some common traps
Step 1Is your code even running?(Spell the hook right?)die( wtf ); or error_log( )
White screen on thefrontend, no errors?Appearance > Themes
User interface doesnt work?Check the browsers JS consolefor an error, usually a conflict.
Internal server errors?Infinite redirects. Check:— home and siteurl— then .htaccess— then canonical
Widgets got moved around?Do the sidebars have IDs?Otherwise, its the order in whichregister_sidebar() is called.
Lots of pages? Slow site?My next Q: Whats yourpermalink structure?No longer an issue in 3.3!
Weird Bug #1Somewhere deep in style.css:“Template: home.php”Miscalculated as a multisite bug:activated on single site beforestyle.css had the headers.
Weird Bug #2The admin looked weird
Weird Bug #2The admin looked weirdTrigger: Upgrade from 2.5 to 3.1
Weird Bug #2The admin looked weirdTrigger: Upgrade from 2.5 to 3.1Problem: No MySQL ALTERpermissions
Weird Bug #3Some bbPress rewritesfailed after activation
Weird Bug #3Some bbPress rewritesfailed after activationProblem: Custom post typerewrites arent registered onactivation
// 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( );} );
Local Development
/etc/hosts127.0.0.1 andrewnacin.comConfigure virtual hostsInstall local WordPress
Replace links with anoutput buffer fordevelopment or stagingenvironments
// 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 );}
URLs are more portablewhen theyre absolute.Really.*The serialized stuff is lame though.
Start of a conversationXdebug (backtraces, profiling)KCacheGrind (visualization)Using an IDEUnit testing
And finally, remember:Friends dont let friendsdevelop withoutWP_DEBUG.
Thanks! Questions?@nacin
Let LinkedIn power your SlideShare experience
+
Let LinkedIn power your SlideShare experience
Customize SlideShare content based on your interests
We will import your LinkedIn profile and you will be visible on SlideShare.
Keep up to date when your LinkedIn contacts post on SlideShare
1–2 of 2 previous next