'

WordPress 4.4 and Beyond

Понравилась презентация – покажи это...





Слайд 0

(Beyond) WordPress 4.4 WordCamp NYC, 2015


Слайд 1


Слайд 2

Scott Taylor • WordPress 4.4 Release Lead • Core Committer • Sr. Software Engineer, The New York Times • @wonderboymusic on Trac/ Twitter/Swarm/Instagram


Слайд 3

Pre-4.4


Слайд 4

My goals for 4.4 • Close as many tickets as possible • Front-load development, no lull in activity • Work on as many things as possible • Find out what can be accomplished - try things, revert doesn’t matter • Find out what really needs to be fixed • Rely on no one else to make progress • Set goals for Trac


Слайд 5

What’s in 4.4? • REST API: Phase 1 • Term Meta + WP_Term • Responsive Images • Embeds beyond Embeds • Twenty Sixteen • Comments overhaul + WP_Comment


Слайд 6


Слайд 7

Things I learned • Committers have a responsibility to the community to move the project forward. Those who patch tickets have no ability to commit their own code. • Volunteers are not beholden to a project schedule. • The burn out rate on components and features is high. • WordPress has frightening amounts of technical debt.


Слайд 8


Слайд 9

Case Studies from 4.4


Слайд 10

“PHP Manifests” • a file like post.php contained PHP classes, dozens of functions, and sometimes “top-level code” • without a plan for these domains of the code, the future will just be more bloat • PSR-1 tells us to not mix symbols and side-effects • Hack disallows top-level code


Слайд 11

File Structure • Classes should live in their own files • Important for code organization • Important for developer experience (DX™) • Essential for Autoloading • Moved functions out of admin handlers


Слайд 12

Comments • Comments were being queried in a ludicrous way • Comment “permalinks” were designed poorly • Extreme scale was not considered


Слайд 13

“The Worst Case Scenario should be your Default Use Case” - Scott Taylor


Слайд 14

Changes were made to WP_Query that never made it to WP_Comment_Query and WP_User_Query


Слайд 15

AJAX Unit Tests • Have been running slow forever • Everyone thought it was because of the @runInSeparateProcess annotation • Every test method was internally triggering ‘admin_init’ • ‘admin_init’ has the following callbacks hooked to it: • _maybe_update_core • _maybe_update_plugins • _maybe_update_themes


Слайд 16

Moden Application Structure


Слайд 17

Modern Structure


Слайд 18

• Composer • Node modules • Gulp • Git modules • WordPress as a piece of a larger system


Слайд 19

Ticking Time Bombs


Слайд 20

“Globals will destroy WordPress, Globals are destroying WordPress” - Scott Taylor


Слайд 21

Backwards Compatibility • Once a global is added, it can almost never be replaced • Globals are not immutable, every global import requires type-checking or re-instantiation • Top-level variables arbitrarily get hoisted into global scope • Functions are an anti-pattern in modern PHP • Functions exist mainly for Themes to use


Слайд 22

PHP is NOT a template language


Слайд 23

Template Language • PHP is not a template language • WordPress Themes are not portable • inline PHP logic in markup is dangerous • Engines like Mustache can be shared between PHP and JS


Слайд 24

HTTP • WordPress does not support parallel HTTP • HTTP does not scale when requests are made serially


Слайд 25

WordPress: Good Intentions


Слайд 26

REST API • It’s great that we added this • The main thing this does is replace XML-RPC • REST is not new • WordPress is not unique for having REST • Many other languages/frameworks do it


Слайд 27

Browserify • write code that looks like Node for the browser • break code into modules • Media has to use a modified version of it • Media exposed everything to global scope, so plugin devs had the ability to wipe out entire objects with their own version


Слайд 28

Meta Query • the Metadata API is great • it is great for READING data • it is awful for searching by value


Слайд 29

Where we can draw inspiration


Слайд 30

PSR • PSR-1 and PSR-2 describe Coding Standards • PSR-3 describes Application Logging • PSR-0 PSR-4 describes Autoloading • • • Autoloading simplifies large codebases Autoloading encourages OO PSR-7 describes HTTP Request/Response interfaces


Слайд 31

{ "repositories":[ { "type":"composer", "url":"http://wpackagist.org" }, { "type": "vcs", "url": "https://github.com/newsdev/nyt-wp-media.git" }, { "type": "vcs", "url": "https://github.com/newsdev/nyt-wp-bylines.git" } ], "require": { "guzzlehttp/guzzle": "~6.0", "mustache/mustache": "~2.5", "symfony/http-foundation": "~2.7", "monolog/monolog": "~1.14", "wpackagist-plugin/akismet": "~3.1", "wpackagist-plugin/amazon-s3-and-cloudfront": "~0.9", "wpackagist-plugin/amazon-web-services": "~0.3", "wpackagist-plugin/rewrite-rules-inspector": "~1.2", "wpackagist-plugin/debug-bar": "0.8.*", "wpackagist-plugin/debug-bar-console": "0.3.*", "newsdev/nyt-wp-media": "dev-master", "newsdev/nyt-wp-bylines": "dev-master" }, "prefer-stable": true, "autoload": { "psr-4": { "NYT\\" : "lib/php", "NYT\\Shell\\": "wp-content/themes/shell/php" } } }


Слайд 32

Node / Gulp / Express • JavaScript is extremely popular • Node is the back end and the front end • Node is easy compared to many other low-level languages • Express is way easier than learning Apache/nginx • Express routing is dead simple • Share code on the back-end / front-end


Слайд 33


Слайд 34


Слайд 35

Mustache • Mustache is my current favorite template language • Mustache is almost completely devoid of logic • Mustache requires you to query your data ahead of time • Mustache is portable • tools like Hogan allow you to compile your backend templates for the front end


Слайд 36

<span class="byline" itemprop="author creator" itemscope itemtype=“http://schema.org/Person" itemid="{{ meta.website }}"> {{# meta.website }} <a href="{{ meta.website }}" rel="author" title="{{ l10.more_articles_by }}{{# upper }} {{ display_name }}{{/ upper }}"> {{/ meta.website }} <span class="byline-author" data-byline-name="{{# upper }}{{ display_name }}{{/ upper }}" itemprop="name" data-twitter-handle="{{ meta.twitter }}">{{ display_name }}</span> {{# meta.website }}</a>{{/ meta.website }} </span>


Слайд 37

Guzzle • written by Michael Dowling from AWS • allows asynchronous requests • implements Promises/A+ in PHP • implements PSR-7


Слайд 38

<?php namespace NYT\Http; use GuzzleHttp\Promise; trait Client { protected $client; protected $promises = []; public function setConfig( $config = [] ) { $this->client = new \GuzzleHttp\Client( $config ); } public function add( $key, $request ) { $this->promises[ $key ] = $request; } public function send() { $results = Promise\unwrap( $this->promises ); $responses = []; foreach ( $results as $key => $response ) { $responses[ $key ] = [ 'status' => $response->getStatusCode(), 'headers' => $response->getHeaders(), // convert Psr\Http\Message\StreamInterface to string 'body' => (string) $response->getBody(), ]; { true ); if ( in_array( 'application/json', $response->getHeader( 'Content-Type' ) ) ) } } // clear the queue $this->promises = []; } } return $responses; $responses[ $key ]['body'] = json_decode( $responses[ $key ]['body'],


Слайд 39

Questions?


Слайд 40


×

HTML:





Ссылка: