Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Demystifying the Black Box of WordPress Core

Evan Solomon
October 13, 2012

Demystifying the Black Box of WordPress Core

Evan Solomon

October 13, 2012
Tweet

More Decks by Evan Solomon

Other Decks in Technology

Transcript

  1. “Core” n. The hard or fibrous central part of certain

    fruits, such as the apple or pear, containing the seeds.
  2. “Core” n. The hard or fibrous central part of certain

    fruits, such as the apple or pear, containing the seeds. n. Those files you can download from WordPress.org.
  3. If you are reading this document in earnest, you should

    be comfortable reading documentation in code. So I won’t bother to copy and paste it here where it has little hope of staying current. ANDY SKELTON, AUTOMATTIC FIELD GUIDE
  4. Startup /** * Front to the WordPress application. * This

    file doesn't do anything, but loads * wp-blog-header.php which does and * tells WordPress to load the theme. * * @package WordPress */
  5. index.php Everything starts here wp-blog-header.php Load WP environment wp-load.php WordPress

    bootstrap wp-settings.php Load /wp-includes <?php wp(); ?> Parse the request
  6. index.php Everything starts here wp-blog-header.php Load WP environment wp-load.php WordPress

    bootstrap wp-settings.php Load /wp-includes <?php wp(); ?> Parse the request template-loader.php Load theme template
  7. File structure -rw-r--r-- index.php -rw-r--r-- license.txt -rw-r--r-- readme.html -rw-r--r-- wp-activate.php

    drwxr-xr-x wp-admin -rw-r--r-- wp-app.php -rw-r--r-- wp-blog-header.php -rw-r--r-- wp-comments-post.php -rw-r--r-- wp-config-sample.php drwxr-xr-x wp-content -rw-r--r-- wp-cron.php drwxr-xr-x wp-includes -rw-r--r-- wp-links-opml.php -rw-r--r-- wp-load.php -rw-r--r-- wp-login.php -rw-r--r-- wp-mail.php -rw-r--r-- wp-settings.php -rw-r--r-- wp-signup.php -rw-r--r-- wp-trackback.php -rw-r--r-- xmlrpc.php $ ls -l | awk '{print $1"\t"$9}'
  8. File structure -rw-r--r-- index.php -rw-r--r-- license.txt -rw-r--r-- readme.html -rw-r--r-- wp-activate.php

    drwxr-xr-x wp-admin -rw-r--r-- wp-app.php -rw-r--r-- wp-blog-header.php -rw-r--r-- wp-comments-post.php -rw-r--r-- wp-config-sample.php drwxr-xr-x wp-content -rw-r--r-- wp-cron.php drwxr-xr-x wp-includes -rw-r--r-- wp-links-opml.php -rw-r--r-- wp-load.php -rw-r--r-- wp-login.php -rw-r--r-- wp-mail.php -rw-r--r-- wp-settings.php -rw-r--r-- wp-signup.php -rw-r--r-- wp-trackback.php -rw-r--r-- xmlrpc.php $ ls -l | awk '{print $1"\t"$9}'
  9. /wp-admin Mostly page/file relationships that make the wp-admin UI /wp-includes

    Mostly discrete functionality not meant to be accessed directly
  10. $ ls wp-includes SimplePie Text admin-bar.php atomlib.php author-template.php bookmark-template.php bookmark.php

    cache.php canonical.php capabilities.php category-template.php category.php class-feed.php class-http.php class-IXR.php class-json.php class-oembed.php class-phpass.php class-phpmailer.php class-pop3.php class-simplepie.php class-smtp.php class-snoopy.php class-wp-admin-bar.php class-wp-ajax-response.php class-wp-customize- control.php class-wp-customize-manager.php class-wp-customize-section.php class-wp-customize-setting.php class-wp-editor.php class-wp-embed.php class-wp-error.php class-wp-http-ixr-client.php class-wp-theme.php class-wp-walker.php class-wp-xmlrpc-server.php class-wp.php class.wp-dependencies.php class.wp-scripts.php class.wp-styles.php comment-template.php comment.php compat.php cron.php css default-constants.php default-filters.php default-widgets.php deprecated.php feed-atom-comments.php feed-atom.php feed-rdf.php feed-rss.php feed-rss2-comments.php feed-rss2.php feed.php formatting.php functions.php functions.wp-scripts.php functions.wp-styles.php general-template.php http.php images js kses.php l10n.php link-template.php load.php locale.php media.php meta.php ms-blogs.php ms-default-constants.php ms-default-filters.php ms-deprecated.php ms-files.php ms-functions.php ms-load.php ms-settings.php nav-menu-template.php nav-menu.php option.php pluggable-deprecated.php pluggable.php plugin.php pomo post-template.php post-thumbnail-template.php post.php query.php registration-functions.php registration.php rewrite.php rss-functions.php rss.php script-loader.php shortcodes.php taxonomy.php template-loader.php template.php theme-compat theme.php update.php user.php vars.php version.php widgets.php wlwmanifest.xml wp-db.php wp-diff.php
  11. I had to invent integral and differential calculus to figure

    it out. ISSAC NEWTON, ON ELLIPTICAL ORBITS
  12. action An alert that something just happened or is about

    to happen filter A similar alert, with the added responsibility to manipulate data
  13. function es_alert_me() { send_the_alert( 'evan' ); } add_action( 'sound_the_alarm', 'es_alert_me'

    ); /** * Some other code runs... */ do_action( 'sound_the_alarm' ); // es_alert_me() runs add_action()
  14. // Always turn sirens to bells function es_set_alert( $alert )

    { return ( 'bell' == $alert ) ? 'siren' : $alert; } add_filter( 'alert_type', 'es_set_alert' ); /** * Some other code runs... */ $alert = 'bell'; $alert = apply_filters( 'alert_type', $alert ); // Now $alert is 'siren' add_filter()
  15. function add_action( /* arguments */ ) { return add_filter( /*

    same arguments */ ); } wp-includes/plugin.php
  16. Where does that come from? $ ack comment-content wp-content/ themes/twentyeleven

    --php wp-content/themes/twentyeleven/functions.php 562: <div class="comment-content"><?php comment_text(); ?></div>
  17. Where does that come from? $ ack comment-content wp-content/ themes/twentyeleven

    --php wp-content/themes/twentyeleven/functions.php 562: <div class="comment-content"><?php comment_text(); ?></div>
  18. This function looks promising $ fx comment_text function comment_text( $comment_ID

    = 0 ) { $comment = get_comment( $comment_ID ); echo apply_filters( 'comment_text', get_comment_text( $comment_ID ), $comment ); }
  19. This function looks promising $ fx comment_text function comment_text( $comment_ID

    = 0 ) { $comment = get_comment( $comment_ID ); echo apply_filters( 'comment_text', get_comment_text( $comment_ID ), $comment ); }
  20. I bet this changes comments function es_comment_text( $comment_text ) {

    return $comment_text . 'I SHOULD SEE THIS'; } add_filter( 'comment_text', 'es_comment_text' );
  21. I bet this changes comments function es_comment_text( $comment_text ) {

    return $comment_text . 'I SHOULD SEE THIS'; } add_filter( 'comment_text', 'es_comment_text' ); Fatal error!
  22. Let’s see why it breaks function es_comment_text( $comment_text ) {

    error_log( var_export( $comment_text, true ) ); return $comment_text; } add_filter( 'comment_text', 'es_comment_text' );
  23. Let’s see why it breaks function es_comment_text( $comment_text ) {

    error_log( var_export( $comment_text, true ) ); return $comment_text; } add_filter( 'comment_text', 'es_comment_text' ); array ( 0 => 'comment text here...', )
  24. Use the array function es_comment_text( $comment_text ) { $comment_text[ 0

    ] += " I SHOULD SEE THIS"; return $comment_text; } add_filter( 'comment_text', 'es_comment_text' );
  25. Use the array function es_comment_text( $comment_text ) { $comment_text[ 0

    ] += " I SHOULD SEE THIS"; return $comment_text; } add_filter( 'comment_text', 'es_comment_text' ); It works!
  26. There’s probably an oEmbed filter $ ack add_filter wp-includes/ |

    ack oembed wp-includes/class-oembed.php:54: add_filter( 'oembed_dataparse', array(&$this, '_strip_newlines'), 10, 3 ); wp-includes/media.php:1058: add_filter( 'the_content', array(&$this, 'autoembed'), 8 );
  27. I know what makes automatic links $ ack add_filter wp-includes/

    | ack comment_text | ack make_clickable wp-includes/default-filters.php: 151: add_filter( 'comment_text', 'make_clickable', 9 );
  28. class ES_oEmbed_Comments { function __construct() { add_action( 'init', array( $this,

    'init' ) ); } function init() { if ( ! is_admin() ) $this->oembed_in_comments(); } function oembed_in_comments() { $clickable = has_filter( 'comment_text', 'make_clickable' ); $priority = ( $clickable ) ? $clickable - 1 : 10; add_filter( 'comment_text', array( $this, 'oembed_filter' ), $priority ); } function oembed_filter( $comment_text ) { global $wp_embed; add_filter( 'embed_oembed_discover', '__return_false', 999 ); $comment_text = $wp_embed->autoembed( $comment_text ); remove_filter( 'embed_oembed_discover', '__return_false', 999 ); return $comment_text; } } new ES_oEmbed_Comments; Finished Plugin