SlideShare a Scribd company logo
1 of 238
Download to read offline
@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

More Related Content

What's hot

Rails Presentation (Anton Dmitriyev)
Rails Presentation (Anton Dmitriyev)Rails Presentation (Anton Dmitriyev)
Rails Presentation (Anton Dmitriyev)
True-Vision
 
PHP Presentation
PHP PresentationPHP Presentation
PHP Presentation
Nikhil Jain
 
Shifting gears with Composer
Shifting gears with ComposerShifting gears with Composer
Shifting gears with Composer
Javier López
 
Matt Gauger - Lamp vs. the world - MKE PHP Users Group - December 14, 2010
Matt Gauger - Lamp vs. the world - MKE PHP Users Group - December 14, 2010 Matt Gauger - Lamp vs. the world - MKE PHP Users Group - December 14, 2010
Matt Gauger - Lamp vs. the world - MKE PHP Users Group - December 14, 2010
Matt Gauger
 

What's hot (11)

Cucumber Ru09 Web
Cucumber Ru09 WebCucumber Ru09 Web
Cucumber Ru09 Web
 
Rails Presentation (Anton Dmitriyev)
Rails Presentation (Anton Dmitriyev)Rails Presentation (Anton Dmitriyev)
Rails Presentation (Anton Dmitriyev)
 
PHP Presentation
PHP PresentationPHP Presentation
PHP Presentation
 
Php 3 1
Php 3 1Php 3 1
Php 3 1
 
Building a Single Page Application using Ember.js ... for fun and profit
Building a Single Page Application using Ember.js ... for fun and profitBuilding a Single Page Application using Ember.js ... for fun and profit
Building a Single Page Application using Ember.js ... for fun and profit
 
PHP Presentation
PHP PresentationPHP Presentation
PHP Presentation
 
Shifting gears with Composer
Shifting gears with ComposerShifting gears with Composer
Shifting gears with Composer
 
Browser Extensions for Web Hackers
Browser Extensions for Web HackersBrowser Extensions for Web Hackers
Browser Extensions for Web Hackers
 
Matt Gauger - Lamp vs. the world - MKE PHP Users Group - December 14, 2010
Matt Gauger - Lamp vs. the world - MKE PHP Users Group - December 14, 2010 Matt Gauger - Lamp vs. the world - MKE PHP Users Group - December 14, 2010
Matt Gauger - Lamp vs. the world - MKE PHP Users Group - December 14, 2010
 
Behat - Drupal South 2018
Behat  - Drupal South 2018Behat  - Drupal South 2018
Behat - Drupal South 2018
 
Writing automation tests with python selenium behave pageobjects
Writing automation tests with python selenium behave pageobjectsWriting automation tests with python selenium behave pageobjects
Writing automation tests with python selenium behave pageobjects
 

Viewers also liked

Viewers also liked (20)

Demystifying Object-Oriented Programming - PHP UK Conference 2017
Demystifying Object-Oriented Programming - PHP UK Conference 2017Demystifying Object-Oriented Programming - PHP UK Conference 2017
Demystifying Object-Oriented Programming - PHP UK Conference 2017
 
Learn To Test Like A Grumpy Programmer - 3 hour workshop
Learn To Test Like A Grumpy Programmer - 3 hour workshopLearn To Test Like A Grumpy Programmer - 3 hour workshop
Learn To Test Like A Grumpy Programmer - 3 hour workshop
 
JWT - To authentication and beyond!
JWT - To authentication and beyond!JWT - To authentication and beyond!
JWT - To authentication and beyond!
 
PHP UK 2017 - Don't Lose Sleep - Secure Your REST
PHP UK 2017 - Don't Lose Sleep - Secure Your RESTPHP UK 2017 - Don't Lose Sleep - Secure Your REST
PHP UK 2017 - Don't Lose Sleep - Secure Your REST
 
Debugging Effectively - PHP UK 2017
Debugging Effectively - PHP UK 2017Debugging Effectively - PHP UK 2017
Debugging Effectively - PHP UK 2017
 
Hopping in clouds - phpuk 17
Hopping in clouds - phpuk 17Hopping in clouds - phpuk 17
Hopping in clouds - phpuk 17
 
Riding The Crazyhorse: Future Generation WordPress
Riding The Crazyhorse: Future Generation WordPressRiding The Crazyhorse: Future Generation WordPress
Riding The Crazyhorse: Future Generation WordPress
 
Talk about talks
Talk about talksTalk about talks
Talk about talks
 
Integrating React.js with PHP projects
Integrating React.js with PHP projectsIntegrating React.js with PHP projects
Integrating React.js with PHP projects
 
Dip Your Toes in the Sea of Security
Dip Your Toes in the Sea of SecurityDip Your Toes in the Sea of Security
Dip Your Toes in the Sea of Security
 
A recommendation engine for your php application
A recommendation engine for your php applicationA recommendation engine for your php application
A recommendation engine for your php application
 
SunshinePHP 2017 - Making the most out of MySQL
SunshinePHP 2017 - Making the most out of MySQLSunshinePHP 2017 - Making the most out of MySQL
SunshinePHP 2017 - Making the most out of MySQL
 
A World Without PHP
A World Without PHPA World Without PHP
A World Without PHP
 
My app is secure... I think
My app is secure... I thinkMy app is secure... I think
My app is secure... I think
 
Amp your site: An intro to accelerated mobile pages
Amp your site: An intro to accelerated mobile pagesAmp your site: An intro to accelerated mobile pages
Amp your site: An intro to accelerated mobile pages
 
8 Ways to Hack a WordPress website
8 Ways to Hack a WordPress website8 Ways to Hack a WordPress website
8 Ways to Hack a WordPress website
 
From Docker to Production - SunshinePHP 2017
From Docker to Production - SunshinePHP 2017From Docker to Production - SunshinePHP 2017
From Docker to Production - SunshinePHP 2017
 
Taming the resource tiger
Taming the resource tigerTaming the resource tiger
Taming the resource tiger
 
Functional Structures in PHP
Functional Structures in PHPFunctional Structures in PHP
Functional Structures in PHP
 
Isomorphic WordPress Applications with NodeifyWP
Isomorphic WordPress Applications with NodeifyWPIsomorphic WordPress Applications with NodeifyWP
Isomorphic WordPress Applications with NodeifyWP
 

Similar to WordPress for the modern PHP developer

Introduction to php
Introduction to phpIntroduction to php
Introduction to php
jgarifuna
 
Send, pass, get variables with php, form, html & java script code
Send, pass, get variables with php, form, html & java script codeSend, pass, get variables with php, form, html & java script code
Send, pass, get variables with php, form, html & java script code
Noushadur Shoukhin
 

Similar to WordPress for the modern PHP developer (20)

Using PHP
Using PHPUsing PHP
Using PHP
 
Introduction to php
Introduction to phpIntroduction to php
Introduction to php
 
New PHP Exploitation Techniques
New PHP Exploitation TechniquesNew PHP Exploitation Techniques
New PHP Exploitation Techniques
 
Php essentials
Php essentialsPhp essentials
Php essentials
 
Build a Better Editing Experience with Advanced Custom Fields - #WCTO16
Build a Better Editing Experience with Advanced Custom Fields - #WCTO16Build a Better Editing Experience with Advanced Custom Fields - #WCTO16
Build a Better Editing Experience with Advanced Custom Fields - #WCTO16
 
Scaling Complexity in WordPress Enterprise Apps
Scaling Complexity in WordPress Enterprise AppsScaling Complexity in WordPress Enterprise Apps
Scaling Complexity in WordPress Enterprise Apps
 
Php session 3 Important topics
Php session 3 Important topicsPhp session 3 Important topics
Php session 3 Important topics
 
Php
PhpPhp
Php
 
HTMX: Web 1.0 with the benefits of Web 2.0 without the grift of Web 3.0
HTMX: Web 1.0 with the benefits of Web 2.0 without the grift of Web 3.0HTMX: Web 1.0 with the benefits of Web 2.0 without the grift of Web 3.0
HTMX: Web 1.0 with the benefits of Web 2.0 without the grift of Web 3.0
 
Php mysql
Php mysqlPhp mysql
Php mysql
 
Hardcore URL Routing for WordPress - WordCamp Atlanta 2014 (PPT)
Hardcore URL Routing for WordPress - WordCamp Atlanta 2014 (PPT)Hardcore URL Routing for WordPress - WordCamp Atlanta 2014 (PPT)
Hardcore URL Routing for WordPress - WordCamp Atlanta 2014 (PPT)
 
Send, pass, get variables with php, form, html & java script code
Send, pass, get variables with php, form, html & java script codeSend, pass, get variables with php, form, html & java script code
Send, pass, get variables with php, form, html & java script code
 
PHP-Part1
PHP-Part1PHP-Part1
PHP-Part1
 
basic concept of php(Gunikhan sonowal)
basic concept of php(Gunikhan sonowal)basic concept of php(Gunikhan sonowal)
basic concept of php(Gunikhan sonowal)
 
Day1
Day1Day1
Day1
 
Php resque
Php resquePhp resque
Php resque
 
Introduction to PHP - Basics of PHP
Introduction to PHP - Basics of PHPIntroduction to PHP - Basics of PHP
Introduction to PHP - Basics of PHP
 
Php with my sql
Php with my sqlPhp with my sql
Php with my sql
 
Php Tutorial | Introduction Demo | Basics
 Php Tutorial | Introduction Demo | Basics Php Tutorial | Introduction Demo | Basics
Php Tutorial | Introduction Demo | Basics
 
Learning of Php and My SQL Tutorial | For Beginners
Learning of Php and My SQL Tutorial | For BeginnersLearning of Php and My SQL Tutorial | For Beginners
Learning of Php and My SQL Tutorial | For Beginners
 

Recently uploaded

AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
VictorSzoltysek
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
VishalKumarJha10
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
masabamasaba
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
masabamasaba
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
masabamasaba
 

Recently uploaded (20)

%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the past
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
Generic or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisionsGeneric or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisions
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdf
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdfThe Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
 

WordPress for the modern PHP developer