WordCamp Montreal 2018
@remyperona
WordCamp Montreal 2018
@remyperona
WordCamp Montreal 2018
@remyperona
QU'EST-CE QUE C'EST ?
Outil de gestion des changements du code source dans le temps
WordCamp Montreal 2018
@remyperona
LES PLUS CONNUS
Subversion (SVN): utilisé par WordPress
Git: utilisé par des milliers de développeurs de thèmes et plugins
WordCamp Montreal 2018
@remyperona
AVANTAGES
Historique de tous les changements du code source
Collaboration facilitée: système de branches et de fusion
Traçabilité pour la gestion de projets
WordCamp Montreal 2018
@remyperona
PLATE-FORMES
GitHub - GitLab - BitBucket
WordCamp Montreal 2018
@remyperona
DÉPOT PUBLIC OU PRIVÉ ?
Sauf bonne raison, toujours public !
WordCamp Montreal 2018
@remyperona
WordCamp Montreal 2018
@remyperona
Version minimum actuelle de PHP pour WordPress
5.2
WordCamp Montreal 2018
@remyperona
Version minimum de PHP pour votre projet
VOUS DÉCIDEZ
(au moins PHP 5.6)
WordCamp Montreal 2018
@remyperona
WordPress continue de maintenir jusqu'à la version
3.7
WordCamp Montreal 2018
@remyperona
Version de WordPress avec laquelle vous devez être compatible
VOUS DÉCIDEZ
WordCamp Montreal 2018
@remyperona
WordCamp Montreal 2018
@remyperona
NAMESPACES
Organisation du code dans une hiérarchie virtuelle pour prévenir les conflits de nommage
WordCamp Montreal 2018
@remyperona
NAMESPACES
namespace WP_Rocket;
class Plugin {
public function init() {}
}
WordCamp Montreal 2018
@remyperona
NAMESPACES
namespace Imagify;
class Plugin {
public function init() {}
}
WordCamp Montreal 2018
@remyperona
NAMESPACES
namespace WP_Rocket\Admin\Settings;
class Page {
public function configure() {}
}
Chemin du fichier de classe : wp-rocket/inc/classes/Admin/Settings/Page.php
WordCamp Montreal 2018
@remyperona
TRAITS
Mécanisme de réutilisation du code pour réduire certaines limites de l'héritage des classes
Permet de partager des méthodes communes dans des classes indépendantes
WordCamp Montreal 2018
@remyperona
TRAITS
trait Path_Rewriter {
public function rewrite_paths( $file, $content ) {
return \Minify_CSS_UriRewriter::rewrite(
dirname( $file ),
$content
);
}
}
WordCamp Montreal 2018
@remyperona
TRAITS
class Minify {
use Path_Rewriter;
public function minify( $file ) {
// code before
$file_content = $this->rewrite_paths( $file, $file_content );
// code after
}
}
WordCamp Montreal 2018
@remyperona
TRAITS
class Remove_Query_String {
use Path_Rewriter;
public function replace_url( $url ) {
// code before
$content = $this->rewrite_paths( $file, $content );
// code after
}
}
WordCamp Montreal 2018
@remyperona
FONCTIONS ANONYMES
Création de fonctions sans leur donner de nom
Permettent de simplifier le code en évitant d'utiliser des boucles et des fonctions à usage unique
Particulièrement utile pour les fonctions avec un paramètre de callback comme array_map()
WordCamp Montreal 2018
@remyperona
AVANT
foreach ( $matches as $i => $match ) {
// fonction à usage unique
if ( ! rocket_is_match( $match ) ) {
unset( $matches[ $i ];
}
}
WordCamp Montreal 2018
@remyperona
APRÈS
$matches = array_map(
function( $match ) {
if ( false === \strpos( $match[1], 'GoogleAnalyticsObject' ) ) {
return;
}
return $match;
},
$matches
);
WordCamp Montreal 2018
@remyperona
À ÉVITER
// fonction anonyme sur un hook WordPress.
// Impossible à enlever !
add_filter( 'the_content', function( $content ) {
return 'hello world';
}
WordCamp Montreal 2018
@remyperona
WordCamp Montreal 2018
@remyperona
Ensemble de règles établies par le PHP-FIG (Framework Interoperability Group)
A pour but d'établir des points communs entre les différents projets participants
https://www.php-fig.org
WordCamp Montreal 2018
@remyperona
Ces recommendations établies permettent de standardiser et partager entre les projets :
- La manière d'écrire le code
- La manière de charger le code
- La manière d'interagir avec des interfaces spécifiques
WordCamp Montreal 2018
@remyperona
WordCamp Montreal 2018
@remyperona
WordCamp Montreal 2018
@remyperona
WordCamp Montreal 2018
@remyperona
WordCamp Montreal 2018
@remyperona
GESTION DES DÉPENDANCES
POUR PHP
https://getcomposer.org
https://packagist.org
WordCamp Montreal 2018
@remyperona
AVANTAGES
Facilite la maintenance des dépendances du code source: Installation et mises à jour
Inclusion automatique du code des dépendances et de votre code projet grâce à l'autoloader
WordCamp Montreal 2018
@remyperona
COMPOSER.JSON
{
"name": "wp-media/wp-rocket",
"type": "wordpress-plugin",
"require": {
"php": ">=5.4.0",
"a5hleyrich/wp-background-processing": "1.1 as 1.0",
"composer/installers": "~1.0",
"jamesryanbell/cloudflare": "^1.11",
"matthiasmullie/minify": "1.3.*"
},
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "^0.4.4",
"phpcompatibility/phpcompatibility-wp": "*",
"squizlabs/php_codesniffer": "^3.2",
"wp-coding-standards/wpcs": "^1.0.0"
}
}
WordCamp Montreal 2018
@remyperona
QUELQUES COMMANDES
// Installe les dépendances listées dans le fichier composer.json
composer install
// Mets à jour les dépendances listées dans le fichier composer.json
composer update
// Ajoute une dépendance à la liste et installe ses fichiers
composer require author/package
WordCamp Montreal 2018
@remyperona
WordCamp Montreal 2018
@remyperona
QU'EST-CE QUE C'EST ?
Chargement automatique des classes PHP
au moment où on en a besoin
(si elles ne le sont pas déjà)
WordCamp Montreal 2018
@remyperona
SANS AUTOLOADING
require WP_ROCKET_FUNCTIONS_PATH . 'files.php';
require WP_ROCKET_FUNCTIONS_PATH . 'posts.php';
require WP_ROCKET_FUNCTIONS_PATH . 'admin.php';
require WP_ROCKET_FUNCTIONS_PATH . 'formatting.php';
require WP_ROCKET_FUNCTIONS_PATH . 'cdn.php';
require WP_ROCKET_FUNCTIONS_PATH . 'i18n.php';
require WP_ROCKET_FUNCTIONS_PATH . 'bots.php';
WordCamp Montreal 2018
@remyperona
AVEC COMPOSER AUTOLOADER
require 'vendor/autoload.php';
$wp_rocket = new WP_Rocket\Plugin();
$wp_rocket->load();
WordCamp Montreal 2018
@remyperona
COMPOSER.JSON
Dans le fichier composer.json
...
"autoload": {
"psr-4" : {"WP_Rocket\\" : "inc"}
}
...
WordCamp Montreal 2018
@remyperona
WordCamp Montreal 2018
@remyperona
OBJECTIF
Tous les fichiers d'un projet semblent
avoir été créé par la même personne
WordCamp Montreal 2018
@remyperona
AVANTAGES
- N'importe qui peut comprendre et modifier une partie du code, peu importe quand et par qui elle a été écrite
- Aide à éliminer les erreurs fréquentes
- Améliore la lisibilité du code
WordCamp Montreal 2018
@remyperona
DIFFÉRENTS STANDARDS
WordPress Coding Standards
https://make.wordpress.org/core/handbook/best-practices/coding-standards/php/
PSR-1 (basic coding standard) & PSR-2 (coding style guide)
WordCamp Montreal 2018
@remyperona
OUTILS
PHP CodeSniffer
https://github.com/squizlabs/PHP_CodeSniffer
WordPress Coding Standards
https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards
WordCamp Montreal 2018
@remyperona
EXEMPLE
FILE: /wp-rocket/inc/functions/formatting.php
----------------------------------------------------------------------------------------------------------------------------------
FOUND 2 ERRORS AFFECTING 2 LINES
----------------------------------------------------------------------------------------------------------------------------------
191 | ERROR | [ ] Functions declared by a theme/plugin should start with the
theme/plugin prefix. Found: "get_rocket_parse_url".
322 | ERROR | [x] No space found after comma in function call
----------------------------------------------------------------------------------------------------------------------------------
WordCamp Montreal 2018
@remyperona
WordCamp Montreal 2018
@remyperona
Outil de détection de problèmes potentiels dans le code source
https://phpmd.org
WordCamp Montreal 2018
@remyperona
AIDE À DÉTECTER
Des bugs potentiels
Des variables, paramètres ou méthodes inutilisées
Du code trop long ou trop complexe
WordCamp Montreal 2018
@remyperona
EXEMPLE
/wp-rocket/inc/classes/class-rocket-background-database.php
- The method task() has 103 lines of code.
Current threshold is set to 100. Avoid really long methods.
- The method task uses an else expression.
Else is never necessary and you can simplify the code to work without else.
- Avoid unused parameters such as '$data
WordCamp Montreal 2018
@remyperona
WordCamp Montreal 2018
@remyperona
QU'EST-CE QUE C'EST ?
Solution répétable et standardisée à un problème récurrent en design logiciel sans dépendance à un langage spécifique
WordCamp Montreal 2018
@remyperona
AVANTAGES
Solutions testées et approuvées à un problème spécifique
Uniformisation du code
Vocabulaire commun simplifiant l'explication de la solution
WordCamp Montreal 2018
@remyperona
WordCamp Montreal 2018
@remyperona
Réduire le temps nécessaire pour effectuer des tâches répétitives
WordCamp Montreal 2018
@remyperona
Déploiement d'une nouvelle version du plugin (avant)
- Création d'une nouvelle release sur GitHub
- Téléchargement du fichier zip
- Décompression du fichier zip
- Renommer le dossier
- composer install --no-dev pour les dépendances
- Re-zip le fichier avec le bon format de nom
- Connexion et envoi sur le FTP
- Mise à jour de la version dans l'admin du site
WordCamp Montreal 2018
@remyperona
Déploiement d'une nouvelle version du plugin
(après avec Ansible)
- Création d'une nouvelle release sur GitHub
- ansible-playbook deploy-plugin.yml -i servers
- Mise à jour de la version dans l'admin du site
https://www.ansible.com
WordCamp Montreal 2018
@remyperona
WordCamp Montreal 2018
@remyperona
TESTS UNITAIRES
Teste le retour de chaque unité (function ou méthode) afin de s'assurer que c'est bien le résultat attendu
https://phpunit.de/index.html
WordCamp Montreal 2018
@remyperona
TESTS FONCTIONNELS
Teste le bon fonctionnement du système, exemples :
Création du fichier de cache
Création des fichiers minifiés
WordCamp Montreal 2018
@remyperona
AUTOMATISATION
Intégration avec un outil d'intégration continue
Travis-CI / CircleCI / Etc
WordCamp Montreal 2018
@remyperona
- Modern PHP chez O'Reilly
- PHP Objects, Patterns and Practice chez Apress
- Carl Alexander https://carlalexander.ca
- Alain Schlesser https://www.alainschlesser.com/
- Josh Pollock https://joshpress.net - https://torquemag.io/author/joshp/
- Tonya Mork https://knowthecode.io - https://hellofromtonya.com
WordCamp Montreal 2018
@remyperona
Lead développeur de WP Rocket chez WP Media
On recrute! https://wp-rocket.me/career/developer-wp-rocket/