$30 off During Our Annual Pro Sale. View Details »

Next Generation WordPress

Ryan McCue
February 07, 2017

Next Generation WordPress

Explore what we need to push into the next generation of the WordPress project.

Ryan McCue

February 07, 2017
Tweet

More Decks by Ryan McCue

Other Decks in Programming

Transcript

  1. Next Generation
    WordPress
    Ryan McCue

    Director of Engineering at Human Made

    View Slide

  2. Next Generation
    Previous
    Current

    View Slide

  3. View Slide

  4. 2003

    1.x

    View Slide

  5. 2003

    1.x
    2005

    2.x

    View Slide

  6. 2003

    1.x
    2005

    2.x
    2010
    3.x

    View Slide

  7. 2003

    1.x
    2005

    2.x
    2010
    3.x
    2014
    4.x

    View Slide

  8. Blogging
    CMS
    Platform
    2003

    1.x
    2005

    2.x
    2010
    3.x
    2014
    4.x

    View Slide

  9. 4.7 + 4.8

    View Slide

  10. 4.x

    View Slide

  11. Platform?

    View Slide

  12. Platform
    =
    Next Generation

    View Slide

  13. 1. Philosophy
    2. Process
    3. Projects
    Next Generation

    View Slide

  14. Philosophy

    View Slide

  15. Backwards compatibility
    Design for the majority
    Decisions, not options

    View Slide

  16. The user comes first

    View Slide

  17. The user comes first

    View Slide

  18. User Experience

    View Slide

  19. Developer User Experience

    View Slide

  20. DUX

    View Slide

  21. Developers Are Users Too
    Philosophy:

    View Slide

  22. WordPress Sucks
    Spoiler:

    View Slide

  23. View Slide

  24. View Slide

  25. Why?

    View Slide

  26. WordPress End-users

    View Slide

  27. WordPress End-users
    Developers

    View Slide

  28. “What got us here, won’t get us there”
    — Matt Mullenweg, State of the Word 2016

    View Slide

  29. All About Me

    View Slide

  30. Process

    View Slide

  31. How WordPress Works

    View Slide

  32. Incremental development

    =

    Organic growth

    View Slide

  33. “A rolling codebase gathers technical debt”
    — Ancient Australian proverb

    View Slide

  34. Posts ➡ Pages ➡ CPTs

    View Slide

  35. for end users
    for developers

    View Slide

  36. Grand Design ≠ better

    View Slide

  37. ~ 2 years pass ~

    View Slide

  38. Design For Developers
    Process:

    View Slide

  39. Rebuilding the Plane
    While Flying It

    View Slide

  40. WordPress
    WordPress

    View Slide

  41. Blog
    CMS
    Platform
    WordPress Architecture

    View Slide

  42. Platform
    Blog
    CMS
    Next Generation

    View Slide

  43. 1. Write wrappers
    2. Test both old and new
    3. Flip the wrapper

    View Slide

  44. Retains Backwards
    Compatibility
    Write, Test, Flip

    View Slide

  45. Projects

    View Slide

  46. Set a Standard
    Projects:

    View Slide

  47. wp_insert_post

    View Slide

  48. wp_insert_post
    (Why?)

    View Slide

  49. 1. Write
    wp_insert_post
    WP_Post::create
    $wpdb->insert(
    "INSERT INTO $wpdb->posts"
    )
    wp_set_post_categories()
    wp_set_post_tags()
    wp_slash()

    View Slide

  50. 2. Test
    wp_insert_post
    WP_Post::create
    $wpdb->insert(
    "INSERT INTO $wpdb->posts"
    )
    exercise left to reader
    wp_set_post_categories()
    wp_set_post_tags()
    wp_slash()

    View Slide

  51. 3. Flip
    WP_Post::create $wpdb->insert(
    "INSERT INTO $wpdb->posts"
    )
    wp_set_post_categories()
    wp_set_post_tags()
    wp_slash()
    wp_insert_post

    View Slide

  52. 3. Flip
    WP_Post::create $wpdb->insert(
    "INSERT INTO $wpdb->posts"
    )
    wp_set_post_categories()
    wp_set_post_tags()
    wp_slash()
    wp_insert_post

    View Slide

  53. WP_Post::create

    View Slide

  54. WP_Post::create
    WP_Page
    Woo_Product
    WP_Revision
    Jetpack_Comic

    View Slide

  55. Rewrites

    View Slide

  56. add_rewrite_rule(
    'archives/date/([0-9]{4})/([0-9]{1,2})/?$',
    'index.php?year=$matches[1]&monthnum=$matches[2]'
    );

    View Slide

  57. Routers
    $app = new \Slim\App;
    $app->get('/hello/{name}', function (Request $request, Response $response) {
    Slim Framework
    Route::get('user/{id}', function ($id) {
    Laravel
    Symfony
    class BlogController extends Controller {
    /**
    * @Route("/blog", name="blog_list")
    */
    public function listAction() {

    View Slide

  58. 'index.php?rest_route=/$matches[1]'
    );
    add_action( 'init', function () {
    global $wp;
    $wp->add_query_var( 'rest_route' );
    });
    add_action( 'parse_request', function () {
    global $wp;
    if ( empty( $wp->query_vars['rest_route'] ) ) {
    return;
    }
    // Finally, do something.
    });
    add_rewrite_rule(
    '^wp-json/(.*)?',

    View Slide

  59. function () {
    // Much easier.
    }
    );
    add_rewrite_rule(
    '^wp-json/(.*)?',

    View Slide

  60. 'index.php?year=$matches[1]&monthnum=$matches[2]'
    );
    add_rewrite_rule(
    'archives/date/([0-9]{4})/([0-9]{1,2})/?$',

    View Slide

  61. function ( $matches ) {
    global $wp_query;
    $args = [
    'year' => $matches[1],
    'monthnum' => $matches[2],
    ];
    $wp_query = new WP_Query( $matches );
    }
    );
    add_rewrite_rule(
    'archives/date/([0-9]{4})/([0-9]{1,2})/?$',

    View Slide

  62. add_rewrite_rule(
    'login/?$',
    function () {
    get_header();
    wp_login_form();
    get_footer();
    }
    );

    View Slide

  63. 1. Write wrappers
    2. Test both old and new
    3. Flip the wrapper

    View Slide

  64. Bonus:

    No More Flushing

    View Slide

  65. Autoloading

    View Slide

  66. Drupal ✓
    Joomla ✓
    MediaWiki ✓
    Magento ✓
    WordPress ✗
    Autoloading?

    View Slide

  67. Autoloading

    is a trade-off

    View Slide

  68. 15 MB
    15,000,000 bytes

    View Slide

  69. Autoloading Load Everything

    View Slide

  70. Composer?

    View Slide

  71. Plugin Dependencies

    View Slide

  72. /**
    * Plugin Name: Amazing Plugin
    * Requires: other-plugin, rest-api
    */
    add_plugin_dependencies(
    __FILE__,
    [ 'other-plugin', 'rest-api' ]
    );

    View Slide

  73. Conflicts?
    Plugin Dependencies

    View Slide

  74. Already a Problem
    Plugin Dependencies

    View Slide

  75. Even bigger?

    View Slide

  76. Split WordPress

    View Slide

  77. View Slide

  78. View Slide

  79. View Slide

  80. View Slide

  81. What is WordPress?

    View Slide

  82. Do Not Break WordPress

    View Slide

  83. Next Generation

    View Slide

  84. 1. Philosophy
    2. Process
    3. Projects
    Next Generation

    View Slide

  85. Developers Are Users Too
    Philosophy:

    View Slide

  86. Design For Developers
    Process:

    View Slide

  87. Set the Standard
    Projects:

    View Slide

  88. Thanks.
    rmccue.io
    speakerdeck.com/rmccue
    core.trac.wordpress.org/ticket/31245
    Frank the DUX Duck

    from Twemoji
    State of the Word photo: Brian Richards for Post Status
    hmn.md

    View Slide