Slide 1

Slide 1 text

Novembre 2018. Meetup AFUP Moderniser son code WordPress @jdmweb

Slide 2

Slide 2 text

"Bonjour je m’appelle Jérémy et je bosse principalement sur WordPress chez Wonderful, une agence de communication"

Slide 3

Slide 3 text

" Bouuuuuuuuuu WordPress c’est de la meeerde!" x devs (plus ou moins) anonymes

Slide 4

Slide 4 text

- « Acheter un thème 30$ et changer 3 fichiers, tu me fais rire! » - « Mettre x plugins chopés à droite à gauche c’est du bricolage » - « On dirait du code spaghetti des années 90 » - « C’est pas fait pour faire du dev » - « J’y connais rien et en fait je n’ai pas réussi à faire ce que je voulais » « Mais Pourquoi? » 4

Slide 5

Slide 5 text

1 - Le Bricolage

Slide 6

Slide 6 text

- index.php - style.css avec en-têtes Prérequis pour un thème 6

Slide 7

Slide 7 text

Plugin: - plugins/monplugin.php avec en-têtes Prérequis pour un plugin 7

Slide 8

Slide 8 text

- Peu de règles / Grande flexibilité. Faire bien = + d’efforts - Votre choix = votre responsabilité - Les tutos - Achat de thème - Choix de plugin D’où vient le bricolage alors? 8

Slide 9

Slide 9 text

2 - La Base de code

Slide 10

Slide 10 text

• Programmation objet • PSR • Gestion des dépendances • Autoloader / namespaces / PSR4 • Injection de dépendance • Des objets à responsabilité précise • Tests automatisés • Intégration continue "C’est du vieux code" / "C’est pas fait pour faire du dev" 10

Slide 11

Slide 11 text

Et WordPress du coup? 11 • Programmation objet • PSR • Gestion des dépendances • Autoloader / namespaces / PSR4 • Injection de dépendance • Des objets à responsabilité précise • Tests automatisés • Intégration continue • OUCH

Slide 12

Slide 12 text

3 - « Bon, on fait quoi alors? »

Slide 13

Slide 13 text

- Archi composer - WordPress = vendor - Accès à packagist - wpackagist = accès à tous les plugins du repo WP - satis = packages privés + Autoloader et PSR4 Pour composer : On passe sur bedrock 13

Slide 14

Slide 14 text

Cas 1 : Subir (Core objects, ex wpdb, variables globales) Cas 2 : Interfacer / Abstraire (Core concepts ex: routing, API) Cas 3 : Coder en full objet (code plugin ET thème) Pour l’objet : 3 cas de figure 14

Slide 15

Slide 15 text

- Services! - Container d’injection de dépendance, - MVC (Controllers + vue, voire templating) Ce que l’on peut faire aussi 15

Slide 16

Slide 16 text

4 - En pratique

Slide 17

Slide 17 text

- Full objet, namespaces / PSR4 autoloading - Pas de fichier à rallonge, on range - Une responsabilité = un objet - Main plugin file - Activator / Deactivator -Hook service, ShortCode service, Routing service, ListTable service… Maintenant la pratique : mon plugin 17

Slide 18

Slide 18 text

- Penser le fonctionnement - Traduire ce fonctionnement en interface - Implémenter l’interface par x services - Injecter ces services Méthode possible 18

Slide 19

Slide 19 text

« Et si jamais on veut changer ce morceau, quel impact ça a sur le code?. » = la question qui guide (et qui vous fait créer des services)

Slide 20

Slide 20 text

US: En back, je veux administrer les actualités. En front, je veux afficher une liste d’actualités paginées, puis le détail d’une actu au clic. Exemple : actualités 20

Slide 21

Slide 21 text

En back: - Requêter : un repository - Afficher : une ListTable - Form édition : un service pour ça - Soumission: un service pour ça Pourquoi tant de services ? - Implémentation WordPress ou autre (web service JSON, SOAP…) - Injection d’un override sur mesure Stratégie 21

Slide 22

Slide 22 text

22 Architecture de fichiers

Slide 23

Slide 23 text

Utilisation de composer { "name": "agencewonderful/wwp-actu", "description": "Plugin wwp-actu", "type": "wordpress-plugin", "minimum-stability": "dev", "prefer-stable": true, "authors": [ { "name": "Jeremy Desvaux", "email": "[email protected]" } ], "require": { "agencewonderful/wonderwp-plugin-core": "^1.0.0@dev" }, "autoload": { "psr-4": { "WonderWp\\Plugin\\Actu\\": "includes" } }, "repositories": [ { "type": "composer", "url": "https://won.wonderful.fr/satis/packages-mirror" } ] } Gestion de dépendance De version Autoload

Slide 24

Slide 24 text

Orchestration getPluginName(); $this->setConfig('path.root', plugin_dir_path(dirname(__FILE__))); $this->setConfig('path.url', plugin_dir_url(dirname(__FILE__))); $this->setConfig('textDomain', WWP_ACTU_TEXTDOMAIN); //Register Controllers $this->addController(AbstractManager::ADMIN_CONTROLLER_TYPE, function () { return new ActuAdminController($this); }); $this->addController(AbstractManager::PUBLIC_CONTROLLER_TYPE, function () { return $plugin_public = new ActuPublicController($this); }); //Register Services $this->addService(ServiceInterface::ACTIVATOR_NAME, function () { //Activator return new ActuActivator(WWP_PLUGIN_ACTU_VERSION); }); $this->addService(ServiceInterface::HOOK_SERVICE_NAME, $container->factory(function () { //Hook service return new ActuHookService(); })); $this->addService(ServiceInterface::ASSETS_SERVICE_NAME, function () { //Asset service return new ActuAssetsService(); }); $container[$prefix . '.repository'] = function () { return new ActuRepository(); };

Slide 25

Slide 25 text

Exemple de rangement Full objet Rangé Un objet par responsabilité Facilement overridable (le hook ou le service)

Slide 26

Slide 26 text

Exemple d’interfaçage entre vous et WordPress -1, ]; return get_posts($criteria); } /** * @inheritDoc * @return \WP_Post[] */ public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null) { if (!empty($limit)) { $criteria['numberposts'] = $limit; } else { $criteria['numberposts'] = -1; } if (!empty($offset)) { $criteria['offset'] = $offset; } return get_posts($criteria); } Full objet PSR4 use \WonderWp\PostRepository; $repo = new PostRepository(); $post = $repo->find(1);

Slide 27

Slide 27 text

Transversaliser les plugins et capitaliser dessus : Créer des vendors composer privés ou public. Intégration continue Pour aller plus loin 27

Slide 28

Slide 28 text

• Passer sur bedrock • Coder en full objet son thème et ses plugins • Réappliquer les concepts de code moderne dans vos devs • Middleware entre vous et le code WP qui ne vous plait pas En résumé

Slide 29

Slide 29 text

29 Architecture de fichiers

Slide 30

Slide 30 text

Let’s discuss! Merci Jérémy Desvaux de Marigny Lead Dev @agencewonderful @jdmweb