@tweetingsherry
#phpuk17
~ ChrisSherry $ WordPress for the modern PHP developer
@tweetingsherry
#phpuk17
~ ChrisSherry $ WordPress for the modern PHP developer
@tweetingsherry
#phpuk17
~ ChrisSherry $ WordPress for the modern PHP developer
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
Version Control
@tweetingsherry
#phpuk17
See who changed what, when
@tweetingsherry
#phpuk17
See who changed what, when
Multiple people working on the
same files simultaneously
@tweetingsherry
#phpuk17
See who changed what, when
Multiple people working on the
same files simultaneously
Work on features in parallel
@tweetingsherry
#phpuk17
See who changed what, when
Multiple people working on the
same files simultaneously
Work on features in parallel
Roll back to previous versions
@tweetingsherry
#phpuk17
See who changed what, when
Multiple people working on the
same files simultaneously
Work on features in parallel
Roll back to previous versions
Go home on time
@tweetingsherry
#phpuk17
ALL THE THINGS
~/site $ git init
~/site $ git add —-all
@tweetingsherry
#phpuk17
.git index.php readme.htmllicense.txt wp-activate.php wp-admin wp-blog-header.php
wp-comments-
post.php
wp-config-
sample.php
wp-config.php wp-content wp-cron.php wp-includes wp-links-opml.php
wp-load.php wp-login.php wp-mail.php wp-settings.php wp-signup.php wp-trackback.php xmlrpc.php
@tweetingsherry
#phpuk17
.git index.php readme.htmllicense.txt wp-activate.php wp-admin wp-blog-header.php
wp-comments-
post.php
wp-config-
sample.php
wp-config.php wp-content wp-cron.php wp-includes wp-links-opml.php
wp-load.php wp-login.php wp-mail.php wp-settings.php wp-signup.php wp-trackback.php xmlrpc.php
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
Our users can change our
codebase using the editor tool
@tweetingsherry
#phpuk17
...


define('DISALLOW_FILE_EDIT', true);
/wp-config.php
@tweetingsherry
#phpuk17
...


define('DISALLOW_FILE_EDIT', true);
/wp-config.php
define('AUTOMATIC_UPDATER_DISABLED', true);
@tweetingsherry
#phpuk17
.git index.php readme.htmllicense.txt wp-activate.php wp-admin wp-blog-header.php
wp-comments-
post.php
wp-config-
sample.php
wp-config.php wp-content wp-cron.php wp-includes wp-links-opml.php
wp-load.php wp-login.php wp-mail.php wp-settings.php wp-signup.php wp-trackback.php xmlrpc.php
@tweetingsherry
#phpuk17
.git index.php readme.htmllicense.txt wp-activate.php wp-admin wp-blog-header.php
wp-comments-
post.php
wp-config-
sample.php
wp-config.php wp-content wp-cron.php wp-includes wp-links-opml.php
wp-load.php wp-login.php wp-mail.php wp-settings.php wp-signup.php wp-trackback.php xmlrpc.php
@tweetingsherry
#phpuk17
.git index.php readme.htmllicense.txt wp-activate.php wp-admin wp-blog-header.php
wp-comments-
post.php
wp-config-
sample.php
wp-config.php wp-content wp-cron.php wp-includes wp-links-opml.php
wp-load.php wp-login.php wp-mail.php wp-settings.php wp-signup.php wp-trackback.php xmlrpc.php
@tweetingsherry
#phpuk17
.git index.php
wp-config.php
readme.htmllicense.txt wp-activate.php wp-admin wp-blog-header.php
wp-comments-
post.php
wp-config-
sample.php
wp-content wp-cron.php wp-includes wp-links-opml.php
wp-load.php wp-login.php wp-mail.php wp-settings.php wp-signup.php wp-trackback.php xmlrpc.php
@tweetingsherry
#phpuk17
.git index.php wp-config.phpwordpress
@tweetingsherry
#phpuk17
.git index.php wp-config.phpwordpress
@tweetingsherry
#phpuk17
.git index.php wp-config.phpwordpress
@tweetingsherry
#phpuk17
.git index.php wp-config.phpwordpress
@tweetingsherry
#phpuk17
.git index.php wp-config.phpwordpress
@tweetingsherry
#phpuk17
if (!defined('ABSPATH')) {

define(
'ABSPATH',
dirname(__FILE__) . '/'
);

}

/wp-config.php...
@tweetingsherry
#phpuk17
if (!defined('ABSPATH')) {

define(
'ABSPATH',
dirname(__FILE__) . '/wordpress/'
);

}

/wp-config.php...
@tweetingsherry
#phpuk17
option_value
https://site.com
https://site.com
WordPress
Just another WordPress site
...
option_name
siteurl
home
blogname
blogdescription
...
wp_options
@tweetingsherry
#phpuk17
option_value
https://site.com
https://site.com
WordPress
Just another WordPress site
...
/wordpress
option_name
siteurl
home
blogname
blogdescription
...
wp_options
@tweetingsherry
#phpuk17
.git index.php wp-config.phpwordpress
@tweetingsherry
#phpuk17
.git index.php wp-config.phpwordpress
mments-
t.php
wp-config-
sample.php
wp-content wp-cron.php wp-includes wp-links-opml.php wp-load.php wp-logi
@tweetingsherry
#phpuk17
.git index.php wp-config.phpwordpress
mments-
t.php
wp-config-
sample.php
wp-content wp-cron.php
index.php
wp-includes
plugins themes
wp-links-opml.php wp-load.php wp-logi
@tweetingsherry
#phpuk17
.git index.php wp-config.phpwordpress
mments-
t.php
wp-config-
sample.php
wp-content wp-cron.php
index.php
wp-includes
plugins themes
wp-links-opml.php wp-load.php wp-logi
index.php hello.php
@tweetingsherry
#phpuk17
.git index.php wp-config.phpwordpress
mments-
t.php
wp-config-
sample.php
wp-content wp-cron.php
index.php
wp-includes
plugins themes
wp-links-opml.php wp-load.php wp-logi
index.php twentyeleven twentytwelve twentythirteen twentyfourteen twentyfifiteen twentysixteen
@tweetingsherry
#phpuk17
.git index.php wp-config.phpwordpress
mments-
t.php
wp-config-
sample.php
wp-content wp-cron.php
index.php
wp-includes
plugins themes
wp-links-opml.php wp-load.php wp-logi
wp-content
index.php twentyeleven twentytwelve twentythirteen twentyfourteen twentyfifiteen twentysixteen
@tweetingsherry
#phpuk17
.git index.php wp-config.phpwordpress wp-content
plugins themes
@tweetingsherry
#phpuk17
.git index.php wp-config.phpwordpress wp-content
plugins themes
advanced-
custom-fields
debug-bar awesome-plugin
@tweetingsherry
#phpuk17
define(
'WP_CONTENT_DIR',
$_SERVER['DOCUMENT_ROOT'] . '/wp-content'
);


define(
'WP_CONTENT_URL', '/wp-content'
);
/wp-config.php...
@tweetingsherry
#phpuk17
.git index.php wp-config.phpwordpress wp-content
@tweetingsherry
#phpuk17
.git index.php wp-config.phpwordpress wp-content
core code
@tweetingsherry
#phpuk17
.git index.php wp-config.phpwordpress wp-content
core code application code
@tweetingsherry
#phpuk17
YOU MADE A NEW FOLDER
I’M GLAD I CHOSE THIS TRACK
@tweetingsherry
#phpuk17
GENE WILDER 1933-2016
@tweetingsherry
#phpuk17
.git index.php wp-config.phpwordpress wp-content
@tweetingsherry
#phpuk17
.git index.php wp-config.phpwordpress wp-content.gitignore
@tweetingsherry
#phpuk17
/.DS_Store
/wordpress
/.gitignore
@tweetingsherry
#phpuk17
~ $ git clone https://github.com/chrissherry/site
@tweetingsherry
#phpuk17
~ $ git clone https://github.com/chrissherry/site
.git index.php wp-config.php wp-content.gitignore
@tweetingsherry
#phpuk17
~ $ git clone https://github.com/chrissherry/site
.git index.php wp-config.php wp-content.gitignore
@tweetingsherry
#phpuk17
Dependency
Management
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
&
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
github.com/johnpbloch/wordpress
@tweetingsherry
#phpuk17
github.com/johnpbloch/wordpress
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
Default
type:library
/vendor/[vendor]/[name]
@tweetingsherry
#phpuk17
Default
type:library
/vendor/[vendor]/[name]
Custom
type: wordpress-core
/wordpress
@tweetingsherry
#phpuk17
~/site $ composer require johnpbloch/wordpress
~/site $ composer init
~/site $ composer install
@tweetingsherry
#phpuk17
~/site $ composer require johnpbloch/wordpress
{
"require": {

"johnpbloch/wordpress": "^4.5"

}
}
/composer.json
~/site $ composer init
~/site $ composer install
@tweetingsherry
#phpuk17
index.php wp-config.phpwordpress wp-contentcomposer.json composer.lockgitignore
@tweetingsherry
#phpuk17
index.php wp-config.phpwordpress wp-contentcomposer.json composer.lockgitignore
@tweetingsherry
#phpuk17
index.php wp-config.phpwordpress wp-contentcomposer.json composer.lockgitignore
@tweetingsherry
#phpuk17
index.php wp-config.phpwordpress wp-contentcomposer.json composer.lockgitignore
@tweetingsherry
#phpuk17
index.php wp-config.phpwordpress wp-contentcomposer.json composer.lockgitignore
@tweetingsherry
#phpuk17
index.php wp-config.phpwordpress wp-content
plugins themes
advanced-
custom-fields
composer.json composer.lockgitignore
debug-bar awesome-plugin
@tweetingsherry
#phpuk17
wpackagist.org
@tweetingsherry
#phpuk17
wpackagist.org
type: wordpress-plugin /wp-content/plugins
type: wordpress-theme /wp-content/themes
Custom
@tweetingsherry
#phpuk17
.git index.php wp-config.phpwordpress wp-content
plugins themes
@tweetingsherry
#phpuk17
github.com/composer/installers
@tweetingsherry
#phpuk17
{
"require": {

"johnpbloch/wordpress": "^4.5",
"wpackagist-plugin/advanced-custom-fields": "~4.4"

}
}
/composer.json
@tweetingsherry
#phpuk17
https://wordpress.org/plugins/advanced-custom-fields
@tweetingsherry
#phpuk17
https://wordpress.org/plugins/advanced-custom-fields
@tweetingsherry
#phpuk17
https://wordpress.org/plugins/advanced-custom-fields
@tweetingsherry
#phpuk17
https://wordpress.org/plugins/advanced-custom-fields
@tweetingsherry
#phpuk17
{
"require": {

"johnpbloch/wordpress": "^4.5",
"wpackagist-plugin/advanced-custom-fields": "4.4"

}
}
/composer.json
@tweetingsherry
#phpuk17
{
"require": {

"johnpbloch/wordpress": "^4.5",
"wpackagist-plugin/advanced-custom-fields": "4.4"

}
}
/composer.json
@tweetingsherry
#phpuk17
/composer.json{
"require": {

"johnpbloch/wordpress": "^4.5",
"wpackagist-plugin/advanced-custom-fields": "4.4"

},
"repositories":
[

{

"type": "composer",

"url": "https://wpackagist.org"

}
]
}
@tweetingsherry
#phpuk17
{
"require": {

"johnpbloch/wordpress": "^4.5",
"wpackagist-plugin/advanced-custom-fields": "4.4"

},
"require-dev": {
"wpackagist-plugin/debug-bar": "*"

},
"repositories":[...]
}
/composer.json
~/site $ composer require —-dev wpackagist-plugin/debug-bar
@tweetingsherry
#phpuk17
index.php wp-config.phpwordpress wp-content
plugins themes
advanced-
custom-fields
composer.json composer.lockgitignore
awesome-plugindebug-bar
@tweetingsherry
#phpuk17
index.php wp-config.phpwordpress wp-content
plugins themes
advanced-
custom-fields
composer.json composer.lockgitignore
awesome-plugindebug-bar
@tweetingsherry
#phpuk17
/wordpress



/wp-content/plugins/*

!/wp-content/plugins/.gitkeep





/.gitignore
@tweetingsherry
#phpuk17
index.php wp-config.phpwordpress wp-content
plugins themes
advanced-
custom-fields
composer.json composer.lockgitignore
awesome-plugindebug-bar
@tweetingsherry
#phpuk17
index.php wp-config.phpwordpress wp-content
plugins themes
advanced-
custom-fields
composer.json composer.lockgitignore
awesome-plugindebug-bar
@tweetingsherry
#phpuk17
/wordpress



/wp-content/plugins/*

!/wp-content/plugins/.gitkeep
!/wp-content/plugins/awesome-plugin







/.gitignore
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
github.com/chrissherry/awesome-plugin
@tweetingsherry
#phpuk17
github.com/chrissherry/awesome-plugin
@tweetingsherry
#phpuk17
chrissherry/awesome-plugin v1.0
v2.0
TAGS
v1.0 (awesome)
v2.0 (more awesome!) Site B
Site AGithub
@tweetingsherry
#phpuk17
github.com/chrissherry/awesome-plugin
@tweetingsherry
#phpuk17
github.com/chrissherry/awesome-plugin
@tweetingsherry
#phpuk17
github.com/chrissherry/awesome-plugin/composer.json
@tweetingsherry
#phpuk17
github.com/chrissherry/awesome-plugin/composer.json
@tweetingsherry
#phpuk17
github.com/chrissherry/awesome-plugin/composer.json
@tweetingsherry
#phpuk17
{

"require": {

{...},
"chrissherry/awesome-plugin": "~1.0" 

}
/composer.json
@tweetingsherry
#phpuk17
{

"require": {

{...},
"chrissherry/awesome-plugin": "~1.0" 

},
"repositories": [
{...},
{

"type": "vcs",
"url": "https://github.com/chrissherry/awesome-p..."
}
]
}
/composer.json
@tweetingsherry
#phpuk17
index.php wp-config.phpwordpress wp-content
plugins themes
advanced-
custom-fields
composer.json composer.lockgitignore
awesome-plugindebug-bar
@tweetingsherry
#phpuk17
index.php wp-config.phpwordpress wp-content
plugins themes
composer.json composer.lockgitignore
awesome-theme
@tweetingsherry
#phpuk17
index.php wp-config.phpwordpress wp-content
plugins themes
composer.json composer.lockgitignore
awesome-theme storefront sydney twentysixteen
@tweetingsherry
#phpuk17
/wordpress



/wp-content/plugins/*

!/wp-content/plugins/.gitkeep





/.gitignore
@tweetingsherry
#phpuk17
/wordpress



/wp-content/plugins/*

!/wp-content/plugins/.gitkeep





/.gitignore
/wp-content/themes/*
!/wp-content/themes/.gitkeep
@tweetingsherry
#phpuk17
/wordpress



/wp-content/plugins/*

!/wp-content/plugins/.gitkeep





/.gitignore
/wp-content/themes/*
!/wp-content/themes/.gitkeep
!/wp-content/themes/awesome-theme
@tweetingsherry
#phpuk17
/wordpress



/wp-content/plugins/*

!/wp-content/plugins/.gitkeep





/.gitignore
@tweetingsherry
#phpuk17
ONE DOES NOT SIMPLY
CLICK TO UPDATE THINGS
@tweetingsherry
#phpuk17
wordpress.org/plugins/members
@tweetingsherry
#phpuk17
{
"require": {
...,
"wpackagist-plugin/members": "1.1.3"
},
"repositories":[...]
}
/composer.json
~/site $ composer require wpackagist-plugin/members
@tweetingsherry
#phpuk17
Defined versions for dependancies
@tweetingsherry
#phpuk17
Defined versions for dependancies
Less third party code in the
repository
@tweetingsherry
#phpuk17
Defined versions for dependancies
Less third party code in the
repository
Greater reliance on 3rd party
availability
@tweetingsherry
#phpuk17
Uploads
@tweetingsherry
#phpuk17
Uploads
@tweetingsherry
#phpuk17
/wordpress

/wp-content/uploads/*



/wp-content/plugins/*

!/wp-content/plugins/.gitkeep

...

/.gitignore
@tweetingsherry
#phpuk17
s3tools.org/s3cmd
@tweetingsherry
#phpuk17
github.com/humanmade/s3-uploads
@tweetingsherry
#phpuk17
~/site $ composer require hadyfayed/s3-uploads
{
"require": {
...,
"hadyfayed/s3-uploads": "2.0"
},
"repositories":[...]
}
/composer.json
@tweetingsherry
#phpuk17
~/site $ rsync -avz
user@site.com:/var/www/mysite/wp-content/uploads
wp-content/uploads
@tweetingsherry
#phpuk17
Smaller repository -don’t need
version control over uploads
@tweetingsherry
#phpuk17
Smaller repository -don’t need
version control over uploads
Faster clone and deploy times
@tweetingsherry
#phpuk17
Smaller repository -don’t need
version control over uploads
Faster clone and deploy times
Remote backups of our uploads
@tweetingsherry
#phpuk17
Databases
@tweetingsherry
#phpuk17
prod:~/site $ mysqldump -u user -p dbname > db.sql
~/site $ scp user@site.com:site/db.sql db.sql
~/site $ mysql -u user -p dbname < db.sql
@tweetingsherry
#phpuk17
Environments
@tweetingsherry
#phpuk17
option_name
siteurl
home
blogname
blogdescription
...
option_value
https://site.com/wordpress
https://site.com
WordPress
Just another WordPress site
...
wp_options
@tweetingsherry
#phpuk17
option_name
siteurl
home
blogname
blogdescription
...
option_value
https://staging.site.com/wordpre…
https://staging.site.com
WordPress
Just another WordPress site
...
wp_options
@tweetingsherry
#phpuk17
...
...
define('WP_HOME', 'https://site.com');
define('WP_SITEURL', 'https://site.com/wordpress');
/wp-config.php
@tweetingsherry
#phpuk17
//define('WP_HOME', 'https://site.com');
//define('WP_SITEURL', 'https://site.com/wordpress…
define('WP_HOME', 'https://staging.site.com');
define('WP_SITEURL', 'https://staging.site.com/wor…
/wp-config.php...
...
@tweetingsherry
#phpuk17
server {

listen 443;

server_name staging.site.com;
env WP_ENV=staging
...
/etc/nginx/sites-enabled/vhost.conf
@tweetingsherry
#phpuk17
server {

listen 443;

server_name staging.site.com;
env WP_ENV=staging
...
switch ($_ENV['WP_ENV']) {

case 'staging':

define('WP_HOME', 'https://staging.site.com…
define('WP_SITEURL', 'https://staging.site.…
...
/wp-config.php
/etc/nginx/sites-enabled/vhost.conf
@tweetingsherry
#phpuk17
server {

listen 443;

server_name staging.site.com;
env WP_ENV=staging
...
switch ($_ENV['WP_ENV']) {

case 'staging':

define('WP_HOME', 'https://staging.site.com…
define('WP_SITEURL', 'https://staging.site.…
...
/wp-config.php
/etc/nginx/sites-enabled/vhost.conf
define('WP_HOME', 'https://staging.site.com…
define('WP_SITEURL', 'https://staging.site.…
@tweetingsherry
#phpuk17
define('DB_NAME', 'database_name_here');

define('DB_USER', 'username_here');

define('DB_PASSWORD', 'password_here');

define('DB_HOST', 'localhost');
define('WP_HOME', 'https://site.com');
define('WP_SITEURL', 'https://site.com/wordp…
define('AUTH_KEY', 'put your unique phrase…

define('SECURE_AUTH_KEY', 'put your unique phrase…

define('LOGGED_IN_KEY', 'put your unique phrase…
define('WP_DEBUG', true);
... /wp-config.php
...
@tweetingsherry
#phpuk17
define('DB_NAME', 'database_name_here');

define('DB_USER', 'username_here');

define('DB_PASSWORD', 'password_here');

define('DB_HOST', 'localhost');
define('WP_HOME', 'https://site.com');
define('WP_SITEURL', 'https://site.com/wordp…
define('AUTH_KEY', 'put your unique phrase…

define('SECURE_AUTH_KEY', 'put your unique phrase…

define('LOGGED_IN_KEY', 'put your unique phrase…
define('WP_DEBUG', true);
...
... /wp-config.php
@tweetingsherry
#phpuk17
define('DB_NAME', 'database_name_here');

define('DB_USER', 'username_here');

define('DB_PASSWORD', 'password_here');

define('DB_HOST', 'localhost');
define('WP_HOME', 'https://site.com');
define('WP_SITEURL', 'https://site.com/wordp…
define('AUTH_KEY', 'put your unique phrase…

define('SECURE_AUTH_KEY', 'put your unique phrase…

define('LOGGED_IN_KEY', 'put your unique phrase…

define('WP_DEBUG', true);
...
... /wp-config.php
@tweetingsherry
#phpuk17
KEEP IT SAFE
KEEP IT SECRET
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
github.com/vlucas/phpdotenv
@tweetingsherry
#phpuk17
{

"require": {

{...}
"vlucas/phpdotenv": "^1.0"

},
...
}
/composer.json
~/site $ composer require vlucas/phpdotenv
@tweetingsherry
#phpuk17
index.php
wp-config.php
wordpress
wp-content
composer.json composer.lock.gitignore.git.env
vendor
@tweetingsherry
#phpuk17
index.php
wp-config.php
wordpress
wp-content
composer.json composer.lock.gitignore.git.env
vendor
@tweetingsherry
#phpuk17
index.php
wp-config.php
wordpress
wp-content
composer.json composer.lock.gitignore.git.env
vendor
@tweetingsherry
#phpuk17
DB_NAME=dbname

DB_USER=user

DB_PASSWORD=correcthorsebatterystaple

DB_HOST=localhost


WP_ENV=development

WP_HOME=https://site.com

WP_SITEURL=https://site.com/wordpress
/.env
@tweetingsherry
#phpuk17
DB_NAME=dbname

DB_USER=user

DB_PASSWORD=correcthorsebatterystaple

DB_HOST=localhost


WP_ENV=development

WP_HOME=https://site.com

WP_SITEURL=https://site.com/wordpress
/.env
@tweetingsherry
#phpuk17
require_once dirname(__DIR__).'/vendor/autoload.php';
<?php /wp-config.php
@tweetingsherry
#phpuk17
require_once dirname(__DIR__).'/vendor/autoload.php';
<?php /wp-config.php
Dotenv::load('.env');



@tweetingsherry
#phpuk17
require_once dirname(__DIR__).'/vendor/autoload.php';
<?php /wp-config.php
Dotenv::load('.env');



define('DB_NAME', $_SERVER['DB_NAME']));

define('DB_USER', $_ENV['DB_USER']);

define('DB_PASSWORD', getenv('DB_PASSWORD'));

define('DB_HOST', getenv('DB_HOST'));
define('WP_HOME', getenv('WP_HOME'));
define('WP_SITEURL', getenv('WP_SITE_URL’));
...
@tweetingsherry
#phpuk17
require_once dirname(__DIR__).'/vendor/autoload.php';
<?php /wp-config.php
Dotenv::load('.env');



define('DB_NAME', $_SERVER['DB_NAME']));

define('DB_USER', $_ENV['DB_USER']);

define('DB_PASSWORD', getenv('DB_PASSWORD'));

define('DB_HOST', getenv('DB_HOST'));
define('WP_HOME', getenv('WP_HOME'));
define('WP_SITEURL', getenv('WP_SITE_URL’));
...
@tweetingsherry
#phpuk17
require_once dirname(__DIR__).'/vendor/autoload.php';
<?php /wp-config.php
Dotenv::load('.env');



define('DB_NAME', $_SERVER['DB_NAME']));

define('DB_USER', $_ENV['DB_USER']);

define('DB_PASSWORD', getenv('DB_PASSWORD'));

define('DB_HOST', getenv('DB_HOST'));
...
@tweetingsherry
#phpuk17
require_once dirname(__DIR__).'/vendor/autoload.php';
<?php /wp-config.php
Dotenv::load('.env');



Dotenv::required(['DB_NAME', 'DB_USER', 'DB_PASSWORD',
'WP_HOME', 'WP_SITEURL']);
define('DB_NAME', $_SERVER['DB_NAME']));

define('DB_USER', $_ENV['DB_USER']);

define('DB_PASSWORD', getenv('DB_PASSWORD'));

define('DB_HOST', getenv('DB_HOST'));
...
@tweetingsherry
#phpuk17
/.env
/wordpress

/wp-content/uploads/*


...

/.gitignore
@tweetingsherry
#phpuk17
Easy to locate and update
@tweetingsherry
#phpuk17
Easy to locate and update
Per environment configuration
@tweetingsherry
#phpuk17
Easy to locate and update
Per environment configuration
Not in source control
@tweetingsherry
#phpuk17
Easy to locate and update
Per environment configuration
Not in source control
Ready for open source
@tweetingsherry
#phpuk17
Easy to locate and update
Per environment configuration
Not in source control
Ready for open source
Easy to store outside of webroot
@tweetingsherry
#phpuk17
index.php
wp-config.php
wordpress
wp-content
composer.json composer.lock.gitignore.git.env
vendor
@tweetingsherry
#phpuk17
index.php
wp-config.php
wordpress
wp-content
composer.json composer.lock.gitignore.git.env
server {
...
root /var/www/site
...
/etc/nginx/sites-enabled/vhost.conf
vendor
@tweetingsherry
#phpuk17
index.php
wp-config.php
wordpress
wp-content
composer.json composer.lock.gitignore.git.env
web
server {
...
root /var/www/site
...
/etc/nginx/sites-enabled/vhost.conf
/web
vendor
@tweetingsherry
#phpuk17
composer.json composer.lock.gitignore.git.env web
server {
...
root /var/www/site
...
/etc/nginx/sites-enabled/vhost.conf
/web
vendor
@tweetingsherry
#phpuk17
index.php wp-config.php wordpress wp-content
composer.json composer.lock.gitignore.git.env web vendor
@tweetingsherry
#phpuk17
Only keeping what we need in
version control
@tweetingsherry
#phpuk17
Only keeping what we need in
version control
Dependencies managed
@tweetingsherry
#phpuk17
Only keeping what we need in
version control
Dependencies managed
Backups of uploads & databases
@tweetingsherry
#phpuk17
Only keeping what we need in
version control
Dependencies managed
Backups of uploads & databases
Isolated configuration for
environments
@tweetingsherry
#phpuk17
Only keeping what we need in
version control
Dependencies managed
Backups of uploads & databases
Isolated configuration for
environments
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
roots.io/bedrock
@tweetingsherry
#phpuk17
I DONT ALWAYS USE BEDROCK
@tweetingsherry
#phpuk17
Only keeping what we need in
version control
Dependencies managed
Backups of uploads & databases
Isolated configuration for
environments
Active open source community
@tweetingsherry
#phpuk17
index.php wp-config.php wordpress wp-content
composer.json composer.lock.gitignore.git.env web vendor
@tweetingsherry
#phpuk17
index.php wp-config.php wordpress wp-content
composer.json composer.lock.gitignore.git.env web vendor
@tweetingsherry
#phpuk17
index.php wp-config.php wp app
composer.json composer.lock.gitignore.git.env web vendor
@tweetingsherry
#phpuk17
/composer.json
@tweetingsherry
#phpuk17
/composer.json{
...,
"extra": {

"installer-paths": {

"web/app/plugins/{$name}/": ["type:wordpress-plugin"],

"web/app/themes/{$name}/": ["type:wordpress-theme"]

},
"wordpress-install-dir": "wp"

}

}
}
@tweetingsherry
#phpuk17
index.php wp-config.php
composer.json composer.lock.gitignore.git.env web vendor
wp app
@tweetingsherry
#phpuk17
index.php wp-config.php
composer.json composer.lock.gitignore.git.env web vendor
wp-contentwp app
@tweetingsherry
#phpuk17
Virtual
Machines
@tweetingsherry
#phpuk17
vagrantup.com
@tweetingsherry
#phpuk17
Virtual Machine
(Virtual Server)
@tweetingsherry
#phpuk17
Host Machine
Virtual Machine
(Virtual Server)
@tweetingsherry
#phpuk17
PHP 7.1
Host Machine
@tweetingsherry
#phpuk17
PHP 7.1
Host Machine
@tweetingsherry
#phpuk17
PHP 7.1
Host Machine
PHP 7.1
Remote Server A
@tweetingsherry
#phpuk17
PHP 7.1
Host Machine
PHP 7.1
Remote Server A
@tweetingsherry
#phpuk17
Remote Server B
PHP 5.2
PHP 7.1
Host Machine
PHP 7.1
Remote Server A
@tweetingsherry
#phpuk17
Remote Server B
PHP 5.2
PHP 7.1
Host Machine
PHP 7.1
Remote Server A
FatalErrorException
@tweetingsherry
#phpuk17
Virtual Machine A Remote Server A
Remote Server BVirtual Machine B
PHP 7.1
PHP 5.2
PHP 7.1
PHP 5.2
@tweetingsherry
#phpuk17
Host machine uncluttered
@tweetingsherry
#phpuk17
Host machine uncluttered
Software versions contained
@tweetingsherry
#phpuk17
Host machine uncluttered
Software versions contained
Similar as possible to production
@tweetingsherry
#phpuk17
Host machine uncluttered
Software versions contained
Similar as possible to production
Shared filesystem runs slow
@tweetingsherry
#phpuk17
Host machine uncluttered
Software versions contained
Similar as possible to production
Shared filesystem runs slow
Memory hungry
@tweetingsherry
#phpuk17
WHY IS THE RAM
ALWAYS GONE
@tweetingsherry
#phpuk17
Provisioning
@tweetingsherry
#phpuk17
ansible.com
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
php
7.1
@tweetingsherry
#phpuk17
php 7.1
php
7.1
@tweetingsherry
#phpuk17
php 7.1
php 7.1
php
7.1
@tweetingsherry
#phpuk17
php 7.1
php 7.1
php
7.1
php
7.1
@tweetingsherry
#phpuk17
Provision servers with single command
@tweetingsherry
#phpuk17
Provision servers with single command
Descriptive configurations
@tweetingsherry
#phpuk17
Provision servers with single command
Descriptive configurations
Idempotency (same when repeated)
@tweetingsherry
#phpuk17
Provision servers with single command
Descriptive configurations
Idempotency (same when repeated)
Reproducable servers
@tweetingsherry
#phpuk17
roots.io/trellis
@tweetingsherry
#phpuk17
Multisite, wp-cli, etc
@tweetingsherry
#phpuk17
Multisite, wp-cli, etc
Deploy script with build hooks
@tweetingsherry
#phpuk17
Multisite, wp-cli, etc
Deploy script with build hooks
Active open source community
@tweetingsherry
#phpuk17
Multisite, wp-cli, etc
Deploy script with build hooks
Active open source community
Usually does more than you need
@tweetingsherry
#phpuk17
Multisite, wp-cli, etc
Deploy script with build hooks
Active open source community
Usually does more than you need
Fiddly to update
@tweetingsherry
#phpuk17
~/site $ git remote add upstream https://github.com/
roots/trellis.git
@tweetingsherry
#phpuk17
~/site $ git remote add upstream https://github.com/
roots/trellis.git
~/site $ git remote -v
origin git@github.com:chrissherry/site.git (fetch)
origin git@github.com:chrissherry/site.git (push)
upstream git@github.com:roots/trellis.git (fetch)
@tweetingsherry
#phpuk17
~/site $ git fetch upstream master
~/site $ git merge -X subtree=trellis
--squash upstream/master
@tweetingsherry
#phpuk17
MERGE CONFLICTS
MERGE CONFLICTS EVERYWHERE
@tweetingsherry
#phpuk17
roots.io/trellis
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
Autoloading
@tweetingsherry
#phpuk17
require_once dirname(__DIR__).'/vendor/autoload.php';
<?php
/wp-config.php
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
@tweetingsherry
#phpuk17
~ ChrisSherry $ WordPress for the modern PHP developer
@tweetingsherry
#phpuk17
~ ChrisSherry $ WordPress for the modern PHP developer
@tweetingsherry
#phpuk17 You’re awesome
Thank you
@tweetingsherry
#phpuk17
Next Talks
Serving 30,000,000
Requests an Hour in the
Cloud
The road to continuous
deployment: a case
study
It's all about the goto
Terrence Ryan Michiel Rook Derick Rethans
Main Track Sidetrack 1 Sidetrack 2

WordPress for the modern PHP developer