WordCamp Montreal 2018

@remyperona

MODERNISEZ & STANDARDISEZ

VOTRE DÉVELOPPEMENT PHP POUR WORDPRESS

WordCamp Montreal 2018

@remyperona

VERSION CONTROL

WordCamp Montreal 2018

@remyperona

VERSION CONTROL

QU'EST-CE QUE C'EST ?

Outil de gestion des changements du code source dans le temps

WordCamp Montreal 2018

@remyperona

VERSION CONTROL

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

VERSION CONTROL

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

VERSION CONTROL

PLATE-FORMES

GitHub - GitLab - BitBucket

WordCamp Montreal 2018

@remyperona

VERSION CONTROL

DÉPOT PUBLIC OU PRIVÉ ?

Sauf bonne raison, toujours public !

WordCamp Montreal 2018

@remyperona

VERSION MINIMUM PHP & WORDPRESS

WordCamp Montreal 2018

@remyperona

VERSION MINIMUM PHP

Version minimum actuelle de PHP pour WordPress

5.2

WordCamp Montreal 2018

@remyperona

VERSION MINIMUM PHP

Version minimum de PHP pour votre projet

VOUS DÉCIDEZ

(au moins PHP 5.6)

WordCamp Montreal 2018

@remyperona

VERSION MINIMUM WORDPRESS

WordPress continue de maintenir jusqu'à la version

3.7

WordCamp Montreal 2018

@remyperona

VERSION MINIMUM WORDPRESS

Version de WordPress avec laquelle vous devez être compatible

VOUS DÉCIDEZ

WordCamp Montreal 2018

@remyperona

PHP MODERNE

WordCamp Montreal 2018

@remyperona

PHP MODERNE

NAMESPACES

Organisation du code dans une hiérarchie virtuelle pour prévenir les conflits de nommage

WordCamp Montreal 2018

@remyperona

PHP MODERNE

NAMESPACES

namespace WP_Rocket;

class Plugin {
    public function init() {}
}

WordCamp Montreal 2018

@remyperona

PHP MODERNE

NAMESPACES

namespace Imagify;

class Plugin {
    public function init() {}
}

WordCamp Montreal 2018

@remyperona

PHP MODERNE

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

PHP MODERNE

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

PHP MODERNE

TRAITS

trait Path_Rewriter {
    public function rewrite_paths( $file, $content ) {
	return \Minify_CSS_UriRewriter::rewrite(
            dirname( $file ),
            $content
        );
    }
}

WordCamp Montreal 2018

@remyperona

PHP MODERNE

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

PHP MODERNE

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

PHP MODERNE

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

PHP MODERNE

AVANT

foreach ( $matches as $i => $match ) {
    // fonction à usage unique
    if ( ! rocket_is_match( $match ) ) {
        unset( $matches[ $i ];
    }
}

WordCamp Montreal 2018

@remyperona

PHP MODERNE

APRÈS

$matches = array_map(
    function( $match ) {
        if ( false === \strpos( $match[1], 'GoogleAnalyticsObject' ) ) {
           return;
        }

        return $match;
    },
    $matches
);

WordCamp Montreal 2018

@remyperona

PHP MODERNE

À ÉVITER

// fonction anonyme sur un hook WordPress.
// Impossible à enlever !
add_filter( 'the_content', function( $content ) {
    return 'hello world';
}

WordCamp Montreal 2018

@remyperona

PHP STANDARDS RECOMMENDATIONS

WordCamp Montreal 2018

@remyperona

PHP STANDARDS RECOMMENDATIONS

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

PHP STANDARDS RECOMMENDATIONS

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

PHP STANDARDS RECOMMENDATIONS

WordCamp Montreal 2018

@remyperona

PHP STANDARDS RECOMMENDATIONS

WordCamp Montreal 2018

@remyperona

PHP STANDARDS RECOMMENDATIONS

WordCamp Montreal 2018

@remyperona

COMPOSER

WordCamp Montreal 2018

@remyperona

COMPOSER

GESTION DES DÉPENDANCES

POUR PHP

https://getcomposer.org

https://packagist.org

WordCamp Montreal 2018

@remyperona

COMPOSER

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

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

COMPOSER

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

PHP AUTOLOADING

WordCamp Montreal 2018

@remyperona

PHP AUTOLOADING

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

PHP AUTOLOADING

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

PHP AUTOLOADING

AVEC COMPOSER AUTOLOADER

require 'vendor/autoload.php';

$wp_rocket = new WP_Rocket\Plugin();
$wp_rocket->load();

WordCamp Montreal 2018

@remyperona

PHP AUTOLOADING

COMPOSER.JSON

Dans le fichier composer.json
...
"autoload": {
    "psr-4" : {"WP_Rocket\\" : "inc"}
}
...

WordCamp Montreal 2018

@remyperona

CODING STANDARDS

WordCamp Montreal 2018

@remyperona

CODING STANDARDS

OBJECTIF

Tous les fichiers d'un projet semblent

avoir été créé par la même personne

WordCamp Montreal 2018

@remyperona

CODING STANDARDS

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

CODING STANDARDS

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

CODING STANDARDS

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

CODING STANDARDS

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

PHP MESS DETECTOR

WordCamp Montreal 2018

@remyperona

PHP MESS DETECTOR

Outil de détection de problèmes potentiels dans le code source

https://phpmd.org

WordCamp Montreal 2018

@remyperona

PHP MESS DETECTOR

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

PHP MESS DETECTOR

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

DESIGN PATTERNS

WordCamp Montreal 2018

@remyperona

DESIGN PATTERNS

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

DESIGN PATTERNS

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

AUTOMATISATION

WordCamp Montreal 2018

@remyperona

AUTOMATISATION

Réduire le temps nécessaire pour effectuer des tâches répétitives

WordCamp Montreal 2018

@remyperona

AUTOMATISATION

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

AUTOMATISATION

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

TESTS

(AUTOMATISÉS)

WordCamp Montreal 2018

@remyperona

TESTS (AUTOMATISÉS)

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 (AUTOMATISÉS)

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

TESTS (AUTOMATISÉS)

AUTOMATISATION

Intégration avec un outil d'intégration continue

 

Travis-CI / CircleCI / Etc

WordCamp Montreal 2018

@remyperona

Ressources

Livres

- Modern PHP chez O'Reilly

- PHP Objects, Patterns and Practice chez Apress

 

Personnes à suivre

​- 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

QUESTIONS ?

Remy Perona

Lead développeur de WP Rocket chez WP Media

 

On recrute! https://wp-rocket.me/career/developer-wp-rocket/

Moderniser votre développement

By Remy Perona

Moderniser votre développement

  • 4,217