WordCamp SF 2011: Debugging in WordPress

53
Debugging in WordPress WordCamp San Francisco 2011 August 13, 2011

description

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

Transcript of WordCamp SF 2011: Debugging in WordPress

Page 1: WordCamp SF 2011: Debugging in WordPress

Debugging in WordPress

WordCamp San Francisco 2011 August 13, 2011

Page 2: WordCamp SF 2011: Debugging in WordPress

Andrew Nacin Core Developer of WordPress Tech Ninja at Audrey Capital [email protected] @nacin on Twitter

Page 3: WordCamp SF 2011: Debugging in WordPress

var_dump( $data ); die( ); // f in.

Page 4: WordCamp SF 2011: Debugging in WordPress

“I love suppressing error messages!” — no one, ever.

Page 5: WordCamp SF 2011: Debugging in WordPress

So let's start with WP_DEBUG define( 'WP_DEBUG', true );

Page 6: WordCamp SF 2011: Debugging in WordPress

What WP_DEBUG does:

— Sets the error reporting level to include PHP notices

— Bypasses some error suppression

— Triggers notices for deprecated usage (more on that later)

Page 7: WordCamp SF 2011: Debugging in WordPress

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, you'll also need to turn it off: ini_set( 'display_errors', 0 );

Page 8: WordCamp SF 2011: Debugging in WordPress

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 );

Page 9: WordCamp SF 2011: Debugging in WordPress

You can specify an error log:

// wp-content/debug.log define( 'WP_DEBUG_LOG', true ); // New in 3.3! (Likely.) define( 'WP_DEBUG_LOG', '/tmp/php-errors' ); // Follow ticket #18391, created last night.

Page 10: WordCamp SF 2011: Debugging in WordPress

Debug admin CSS & JS with SCRIPT_DEBUG define( 'SCRIPT_DEBUG', true );

Page 11: WordCamp SF 2011: Debugging in WordPress

SCRIPT_DEBUG prevents minification and concatenation of core scripts and styles. load-scripts.php?c=1&load=global,wp-admin,ms… versus global.dev.css, wp-admin.dev.css, ms.dev.css

Page 12: WordCamp SF 2011: Debugging in WordPress

SCRIPT_DEBUG is good for:

— Finding bugs in your admin screens

— Studying the admin theme

— Contributing to core

Page 13: WordCamp SF 2011: Debugging in WordPress

Debug queries with SAVEQUERIES define( 'SAVEQUERIES', true );

Page 14: WordCamp SF 2011: Debugging in WordPress

SAVEQUERIES stores query data in $wpdb->queries. (OMG BBQ: This is NOT for production.)

Page 15: WordCamp SF 2011: Debugging in WordPress

Query: SELECT * FROM wp_users WHERE user_login = 'nacin'

Backtrace: WP->init, wp_get_current_user, get_currentuserinfo, wp_validate_auth_cookie, get_user_by

Execution time: 0.4ms

Page 16: WordCamp SF 2011: Debugging in WordPress

On using these in production:

WP_DEBUG — Don't display errors — Don't log to wp-content/error.log

SCRIPT_DEBUG — Bad idea.

SAVEQUERIES — Barry will hunt you down.

Page 17: WordCamp SF 2011: Debugging in WordPress

Plugins

Page 18: WordCamp SF 2011: Debugging in WordPress

Your new best friend: The Debug Bar It’s like Firebug for your WordPress.

Page 19: WordCamp SF 2011: Debugging in WordPress

Debug Bar Console A Firebug-like console for PHP and MySQL (really)

Page 20: WordCamp SF 2011: Debugging in WordPress

What's stopping you from building your own Debug Bar extension? Nothing.

Page 21: WordCamp SF 2011: Debugging in WordPress

Log Deprecated Notices — Logs the usage of deprecated files, functions, and function arguments. — Pinpoints where the deprecated functionality is being used. — NEVER use in production.

Page 22: WordCamp SF 2011: Debugging in WordPress

Theme Check — Test your theme for the latest WordPress standards and practices. — Required for the theme directory.

Page 23: WordCamp SF 2011: Debugging in WordPress

Common functions when debugging — error_log and var_export / print_r — var_dump and sometimes die — debug_backtrace

Page 24: WordCamp SF 2011: Debugging in WordPress

Tracking it down

Page 25: WordCamp SF 2011: Debugging in WordPress

Step 1 Disable plugins Switch to default theme

Page 26: WordCamp SF 2011: Debugging in WordPress

What might be left behind? Cron, Rewrites, Roles/Capabilities

Page 27: WordCamp SF 2011: Debugging in WordPress

Drop-ins — advanced-cache.php — db.php — object-cache.php — mu-plugins

Page 28: WordCamp SF 2011: Debugging in WordPress

What's going on? Query vars set properly? Main query SQL look right? Rewrite rule matched?

Page 29: WordCamp SF 2011: Debugging in WordPress

Funny redirect? Confirm it's canonical.

remove_action( 'template_redirect', 'redirect_canonical' );

Page 30: WordCamp SF 2011: Debugging in WordPress

Testing multisite?

I leave this in my config: // define( 'MULTISITE', true );

Page 31: WordCamp SF 2011: Debugging in WordPress

Dig into the codebase. Your friends are phpxref, grep. Learn the stack. Learn what things call what.

Page 32: WordCamp SF 2011: Debugging in WordPress

Some common traps

Page 33: WordCamp SF 2011: Debugging in WordPress

Step 1 Is your code even running? (Spell the hook right?)

die( 'wtf' ); or error_log( )

Page 34: WordCamp SF 2011: Debugging in WordPress

White screen on the frontend, no errors? Appearance > Themes

Page 35: WordCamp SF 2011: Debugging in WordPress

User interface doesn't work? Check the browser's JS console for an error, usually a conflict.

Page 36: WordCamp SF 2011: Debugging in WordPress

Internal server errors? Infinite redirects. Check: — home and siteurl — then .htaccess — then canonical

Page 37: WordCamp SF 2011: Debugging in WordPress

Widgets got moved around? Do the sidebars have IDs? Otherwise, it's the order in which register_sidebar() is called.

Page 38: WordCamp SF 2011: Debugging in WordPress

Lots of pages? Slow site? My next Q: What's your permalink structure? No longer an issue in 3.3!

Page 39: WordCamp SF 2011: Debugging in WordPress

Weird Bug #1 Somewhere deep in style.css: “Template: home.php” Miscalculated as a multisite bug: activated on single site before style.css had the headers.

Page 40: WordCamp SF 2011: Debugging in WordPress

Weird Bug #2 The admin looked weird

Page 41: WordCamp SF 2011: Debugging in WordPress

Weird Bug #2 The admin looked weird

Trigger: Upgrade from 2.5 to 3.1

Page 42: WordCamp SF 2011: Debugging in WordPress

Weird Bug #2 The admin looked weird

Trigger: Upgrade from 2.5 to 3.1 Problem: No MySQL ALTER permissions

Page 43: WordCamp SF 2011: Debugging in WordPress

Weird Bug #3 Some bbPress rewrites failed after activation

Page 44: WordCamp SF 2011: Debugging in WordPress

Weird Bug #3 Some bbPress rewrites failed after activation Problem: Custom post type rewrites aren't registered on activation

Page 45: WordCamp SF 2011: Debugging in WordPress

// Say you have: add_action( 'generate_rewrite_rules',

function( $wp_rewrite ) { … } ); // And: register_activation_hook( __FILE__, function() { flush_rewrite_rules( ); } ); // But! This won't work for CPTs. Try this: add_action( 'init', 'my_register_post_types' ); register_activation_hook( __FILE__, function( ) { my_register_post_types( ); flush_rewrite_rules( ); } );

Page 46: WordCamp SF 2011: Debugging in WordPress

Local Development

Page 47: WordCamp SF 2011: Debugging in WordPress

/etc/hosts 127.0.0.1 andrewnacin.com Configure virtual hosts Install local WordPress

Page 48: WordCamp SF 2011: Debugging in WordPress

Replace links with an output buffer for development or staging environments

Page 49: WordCamp SF 2011: Debugging in WordPress

// 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 ); }

Page 50: WordCamp SF 2011: Debugging in WordPress

URLs are more portable when they're absolute.

Really.* The serialized stuff is lame though.

Page 51: WordCamp SF 2011: Debugging in WordPress

Start of a conversation Xdebug (backtraces, profiling) KCacheGrind (visualization) Using an IDE Unit testing

Page 52: WordCamp SF 2011: Debugging in WordPress

And finally, remember: Friends don't let friends develop without WP_DEBUG.

Page 53: WordCamp SF 2011: Debugging in WordPress

Thanks! Questions?

@nacin