Slide 1

Slide 1 text

Next Generation WordPress Ryan McCue
 Director of Engineering at Human Made

Slide 2

Slide 2 text

Next Generation Previous Current

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

2003
 1.x

Slide 5

Slide 5 text

2003
 1.x 2005
 2.x

Slide 6

Slide 6 text

2003
 1.x 2005
 2.x 2010 3.x

Slide 7

Slide 7 text

2003
 1.x 2005
 2.x 2010 3.x 2014 4.x

Slide 8

Slide 8 text

Blogging CMS Platform 2003
 1.x 2005
 2.x 2010 3.x 2014 4.x

Slide 9

Slide 9 text

4.7 + 4.8

Slide 10

Slide 10 text

4.x

Slide 11

Slide 11 text

Platform?

Slide 12

Slide 12 text

Platform = Next Generation

Slide 13

Slide 13 text

1. Philosophy 2. Process 3. Projects Next Generation

Slide 14

Slide 14 text

Philosophy

Slide 15

Slide 15 text

Backwards compatibility Design for the majority Decisions, not options

Slide 16

Slide 16 text

The user comes first

Slide 17

Slide 17 text

The user comes first

Slide 18

Slide 18 text

User Experience

Slide 19

Slide 19 text

Developer User Experience

Slide 20

Slide 20 text

DUX

Slide 21

Slide 21 text

Developers Are Users Too Philosophy:

Slide 22

Slide 22 text

WordPress Sucks Spoiler:

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

Why?

Slide 26

Slide 26 text

WordPress End-users

Slide 27

Slide 27 text

WordPress End-users Developers

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

All About Me

Slide 30

Slide 30 text

Process

Slide 31

Slide 31 text

How WordPress Works

Slide 32

Slide 32 text

Incremental development
 =
 Organic growth

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

Posts ➡ Pages ➡ CPTs

Slide 35

Slide 35 text

for end users for developers

Slide 36

Slide 36 text

Grand Design ≠ better

Slide 37

Slide 37 text

~ 2 years pass ~

Slide 38

Slide 38 text

Design For Developers Process:

Slide 39

Slide 39 text

Rebuilding the Plane While Flying It

Slide 40

Slide 40 text

WordPress WordPress

Slide 41

Slide 41 text

Blog CMS Platform WordPress Architecture

Slide 42

Slide 42 text

Platform Blog CMS Next Generation

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

Retains Backwards Compatibility Write, Test, Flip

Slide 45

Slide 45 text

Projects

Slide 46

Slide 46 text

Set a Standard Projects:

Slide 47

Slide 47 text

wp_insert_post

Slide 48

Slide 48 text

wp_insert_post (Why?)

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

WP_Post::create

Slide 54

Slide 54 text

WP_Post::create WP_Page Woo_Product WP_Revision Jetpack_Comic

Slide 55

Slide 55 text

Rewrites

Slide 56

Slide 56 text

Slide 57

Slide 57 text

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() {

Slide 58

Slide 58 text

'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/(.*)?',

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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})/?$',

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

Bonus:
 No More Flushing

Slide 65

Slide 65 text

Autoloading

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

Autoloading
 is a trade-off

Slide 68

Slide 68 text

15 MB 15,000,000 bytes

Slide 69

Slide 69 text

Autoloading Load Everything

Slide 70

Slide 70 text

Composer?

Slide 71

Slide 71 text

Plugin Dependencies

Slide 72

Slide 72 text

Slide 73

Slide 73 text

Conflicts? Plugin Dependencies

Slide 74

Slide 74 text

Already a Problem Plugin Dependencies

Slide 75

Slide 75 text

Even bigger?

Slide 76

Slide 76 text

Split WordPress

Slide 77

Slide 77 text

No content

Slide 78

Slide 78 text

No content

Slide 79

Slide 79 text

No content

Slide 80

Slide 80 text

No content

Slide 81

Slide 81 text

What is WordPress?

Slide 82

Slide 82 text

Do Not Break WordPress

Slide 83

Slide 83 text

Next Generation

Slide 84

Slide 84 text

1. Philosophy 2. Process 3. Projects Next Generation

Slide 85

Slide 85 text

Developers Are Users Too Philosophy:

Slide 86

Slide 86 text

Design For Developers Process:

Slide 87

Slide 87 text

Set the Standard Projects:

Slide 88

Slide 88 text

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