{"id":231472,"date":"2022-12-24T13:14:00","date_gmt":"2022-12-24T10:14:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231472"},"modified":"2022-12-24T13:15:15","modified_gmt":"2022-12-24T10:15:15","slug":"outils-pour-ecrire-un-meilleur-code-wordpress-composer","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/outils-pour-ecrire-un-meilleur-code-wordpress-composer\/","title":{"rendered":"Outils pour \u00e9crire un meilleur code WordPress : Composer"},"content":{"rendered":"\n<p>Bien que je pense que le titre de cette s\u00e9rie et les articles pour chacun sont suffisamment clairs, il y a d&rsquo;autres choses que je vise \u00e0 faire avec cette s\u00e9rie contrairement aux autres s\u00e9ries que j&rsquo;ai \u00e9crites jusqu&rsquo;\u00e0 pr\u00e9sent.<\/p>\n<p>Plus pr\u00e9cis\u00e9ment, deux des choses que j&rsquo;essaie de faire sont de deux\u00a0:<\/p>\n<ol>\n<li>garder chaque article relativement succinct (par rapport \u00e0 la fa\u00e7on dont les articles pr\u00e9c\u00e9dents ont \u00e9t\u00e9),<\/li>\n<li>concentrez-vous sur une chose \u00e0 la fois et faites-en une description courte.<\/li>\n<\/ol>\n<p>Puisqu&rsquo;il s&rsquo;agit de contenu d&rsquo;adh\u00e9sion, cela ne me d\u00e9range pas qu&rsquo;il soit un peu plus long que d&rsquo;habitude, mais je ne veux pas non plus qu&rsquo;il soit si long qu&rsquo;il soit difficile \u00e0 suivre. Je pr\u00e9f\u00e8re que ce soit une courte lecture avec quelque chose de pratique que vous pouvez mettre en \u0153uvre apr\u00e8s avoir lu chaque message.<\/p>\n<p>Et l&rsquo;une des choses qui aide grandement \u00e0 \u00e9crire un meilleur code WordPress est Composer.<\/p>\n<h2>Meilleur code WordPress avec Composer<\/h2>\n<p>Si vous lisez ce blog depuis un certain temps, alors vous savez que je suis un fan de Composer (cependant, je suis loin d&rsquo;\u00eatre la seule personne travaillant dans WordPress qui le soit).<\/p>\n<p>Et bien que j&rsquo;aie \u00e9crit du mat\u00e9riel \u00e0 ce sujet, je n&rsquo;ai pas \u00e9crit quelque chose dans le but sp\u00e9cifique de vous permettre d&rsquo;\u00eatre op\u00e9rationnel d&rsquo;ici la fin de la lecture d&rsquo;un seul et court article.<\/p>\n<p>\u00c0 ce stade, nous allons devoir faire quelques compromis\u00a0: \u00e0 savoir, je fournirai un exemple de fichier de configuration ainsi qu&rsquo;un moyen d&rsquo;organiser le r\u00e9pertoire de votre plugin. Ensuite, dans le prochain article, j&rsquo;expliquerai certaines des fonctionnalit\u00e9s de Composer.<\/p>\n<h3>C&rsquo;est quoi Compositeur ?<\/h3>\n<p>Tout d&rsquo;abord, il est important de comprendre ce qu&rsquo;est Composer. Et c&rsquo;est facile de r\u00e9citer la d\u00e9finition telle qu&rsquo;indiqu\u00e9e sur le site, n&rsquo;est-ce pas? C&rsquo;est un gestionnaire de d\u00e9pendances pour PHP.<\/p>\n<h4>Mais d&rsquo;abord, qu&rsquo;est-ce qu&rsquo;une d\u00e9pendance ?<\/h4>\n<p>Pour certains, cependant, cela soul\u00e8ve quelques questions :<\/p>\n<ul>\n<li>Qu&rsquo;est-ce qu&rsquo;une d\u00e9pendance\u00a0?<\/li>\n<li>Pourquoi dois-je les g\u00e9rer ?<\/li>\n<\/ul>\n<p>Et si vous creusez un peu plus, vous d\u00e9couvrirez peut-\u00eatre qu&rsquo;il s&rsquo;agit d&rsquo;un gestionnaire de paquets, et cela soul\u00e8ve simplement les m\u00eames questions, sauf que vous remplacez simplement &quot;d\u00e9pendance&quot; par &quot;paquet&quot;, et vous \u00eates de retour l\u00e0 o\u00f9 vous avez commenc\u00e9.<\/p>\n<p>Je vais donc faire ce que je peux pour que ce soit le plus clair possible :<\/p>\n<p>Une d\u00e9pendance, ou un package, un morceau de logiciel que votre code utilise. Il peut s&rsquo;agir de quelque chose sur lequel il s&rsquo;appuie pour la fonctionnalit\u00e9 pendant l&rsquo;ex\u00e9cution, comme <a href=\"http:\/\/docs.guzzlephp.org\/en\/stable\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">un moyen de faire des requ\u00eates HTTP<\/a>, ou il peut s&rsquo;agir d&rsquo;une biblioth\u00e8que pour convertir des <a href=\"https:\/\/github.com\/spatie\/array-to-xml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tableaux en XML<\/a>.<\/p>\n<p>Composer facilite l&rsquo;inclusion de ces packages particuliers dans votre biblioth\u00e8que en vous permettant de\u00a0:<\/p>\n<ul>\n<li>t\u00e9l\u00e9charger et inclure le package dans votre plugin,<\/li>\n<li>charger automatiquement votre plugin pendant l&rsquo;ex\u00e9cution,<\/li>\n<li>facilitez l&rsquo;instanciation ou l&rsquo;appel de votre plugin selon vos besoins.<\/li>\n<\/ul>\n<p>Cela signifie que nous n&rsquo;avons pas \u00e0 encombrer les r\u00e9pertoires de notre base de code avec beaucoup de fichiers ajout\u00e9s manuellement et cela signifie que nous n&rsquo;avons pas besoin d&rsquo; <strong>inclure<\/strong> ou <strong>d&rsquo;exiger<\/strong> partout.<\/p>\n<p>Ceux-ci auront leur place, dont je parlerai dans le prochain post, mais ils n&rsquo;auront pas besoin d&rsquo;\u00eatre install\u00e9s automatiquement. Au lieu de cela, Composer les g\u00e9rera. Par cons\u00e9quent, le gestionnaire de d\u00e9pendances fait partie de son objectif.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/ecrire-un-meilleur-code-wordpress-introduction\/\" title=\"Maintenant que vous l&#039;avez install\u00e9\">Maintenant que vous l&rsquo;avez install\u00e9<\/a>, vous avez un peu de contexte.<\/p>\n<h3>Utilisation du compositeur<\/h3>\n<p>\u00c9crire cette section particuli\u00e8re est quelque peu difficile car nous avons tous des besoins diff\u00e9rents, n&rsquo;est-ce pas\u00a0? Mais \u00e0 tout le moins, nous pouvons tous profiter d&rsquo;un chargeur automatique.<\/p>\n<p>C&rsquo;est quelque chose que nous pouvons tous utiliser.<\/p>\n<p>Alors voici ce que je vais faire :<\/p>\n<ol>\n<li>Je vais cr\u00e9er un r\u00e9pertoire de plugins de base,<\/li>\n<li>Cr\u00e9er les fichiers n\u00e9cessaires au pilotage du plugin,<\/li>\n<li>Mettre en place un simple fichier Composer,<\/li>\n<li>L&rsquo;ex\u00e9cuter<\/li>\n<\/ol>\n<p>Et puis je vous laisse voir les r\u00e9sultats. Nous pouvons entrer dans des biblioth\u00e8ques tierces ou d&rsquo;autres fonctionnalit\u00e9s dans un futur article (ou une future s\u00e9rie, vraiment).<\/p>\n<p>Mais si rien d&rsquo;autre, cela vous montrera comment utiliser Composer pour d\u00e9finir un chargeur automatique afin que vous puissiez vous concentrer sur l&rsquo;\u00e9criture de code et non sur la question de savoir si des classes sont incluses.<\/p>\n<h4>Le r\u00e9pertoire des plugins<\/h4>\n<p>Je structure g\u00e9n\u00e9ralement mes plugins comme ceci :<\/p>\n<ul>\n<li>il y a un fichier bootstrap lu par WordPress,<\/li>\n<li>il existe un\u00a0 r\u00e9pertoire <strong>src<\/strong> dans lequel tous les r\u00e9pertoires et fichiers PHP sont conserv\u00e9s,<\/li>\n<li>il existe un\u00a0 r\u00e9pertoire de <strong>ressources<\/strong> de niveau sup\u00e9rieur dans lequel les images, les fichiers JavaScript et les fichiers Sass sont conserv\u00e9s,<\/li>\n<li>et il y a un\u00a0 dossier <strong>fournisseur<\/strong> cr\u00e9\u00e9 par Composer pour h\u00e9berger les d\u00e9pendances et le chargeur automatique.<\/li>\n<\/ul>\n<p>Parfois, il peut y avoir un autre dossier \u00e9trange comme un dossier <strong>inc<\/strong> ou <strong>lib<\/strong>, mais c&rsquo;est tr\u00e8s irr\u00e9gulier \u00e0 ce stade du type de travail que je fais. Et \u00e0 cause de cela, je ne vais pas m&rsquo;en soucier pour ce post.<\/p>\n<p>Au lieu de cela, mon r\u00e9pertoire ressemble \u00e0 ceci.<\/p>\n<p>Le\u00a0 r\u00e9pertoire du <strong>fournisseur<\/strong> est manquant car je n&rsquo;ai pas encore cr\u00e9\u00e9 de fichier Composer utilis\u00e9 pour l&rsquo;ex\u00e9cution. Mais on verra \u00e7a avant la fin du post.<\/p>\n<h4>Exemples de fichiers<\/h4>\n<p>Prenons un exemple de fichier configur\u00e9 dans le plugin. Et quand je dis sample, je veux dire aussi simple.<\/p>\n<p>Ce fichier va avoir un seul but: Imprimer un message sur le tableau de bord lorsque vous vous connectez \u00e0 WordPress.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160226-61e707e186b99.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160226-61e707e186b99.png\" alt=\"Outils pour \u00e9crire un meilleur code WordPress : Composer\"><\/a><\/p>\n<p>Rappelez-vous, cependant, que le but n&rsquo;est pas de montrer comment \u00e9crire un plugin bien architectur\u00e9. Au lieu de cela, il s&rsquo;agit de montrer comment g\u00e9n\u00e9rer un autoloader pour que les fichiers du plugin soient g\u00e9n\u00e9r\u00e9s automatiquement.<\/p>\n<p>Le bootstrap du plugin ressemble donc <a href=\"https:\/\/gist.github.com\/tommcfarlin\/94e25b3c6b304d348b8f4a69b03091fd#file-00-sample-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e0 ceci<\/a> :<\/p>\n<pre><code>&lt;?php\n\/**\n * The plugin bootstrap file\n *\n * This file is read by WordPress to generate the plugin information in the plugin\n * admin area. This file also includes all of the dependencies used by the plugin,\n * registers the activation and deactivation functions, and defines a function\n * that starts the plugin.\n *\n * @since             0.1.0\n * @package           SamplePlugin\n *\n * @wordpress-plugin\n * Plugin Name:       Sample Plugin\n * Description:       A sample plugin used for a blog post.\n * Version:           0.1.0\n * Author:            Tom McFarlin\n * Author URI:        https:\/\/tommcfarlin.com\n * License:           GPL-3.0+\n * License URI:       http:\/\/www.gnu.org\/licenses\/gpl-3.0.txt\n *\/\n\nnamespace SamplePlugin;\n\nuse SamplePluginMessenger;\n\n\/\/ This file called directly.\ndefined('WPINC') || die;\n\n\/\/ Include the autoloader.\nrequire_once __DIR__. '\/vendor\/autoload.php';\n\n\/\/ Start the machine.\n(new Messenger())-&gt;start();\n<\/code><\/pre>\n<p>Et le fichier sp\u00e9cifiquement charg\u00e9 d&rsquo;afficher le message ressemble <a href=\"https:\/\/gist.github.com\/tommcfarlin\/94e25b3c6b304d348b8f4a69b03091fd#file-01-messenger-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e0 ceci<\/a> :<\/p>\n<pre><code>&lt;?php\n\nnamespace SamplePlugin;\n\nclass Messenger\n{\n    \/**\n     * Subscribers the `adminNotices` function to the admin_notices hook in WordPress.\n     *\/\n    public function start()\n    {\n        add_action('admin_notices', [$this, 'adminNotices']);\n    }\n\n    \/**\n     * Displays the contents of the `message.html` file into the adminitrative notices\n     * area on the dashboard whenever the plugin is active.\n     *\/\n    public function adminNotices()\n    {\n        if ('dashboard' !== get_current_screen()-&gt;id) {\n            return;\n        }\n\n        include_once dirname(__FILE__). '\/Admin\/Views\/message.html';\n    }\n}\n<\/code><\/pre>\n<p>Et si vous \u00eates curieux \u00e0 propos du fichier HTML, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/94e25b3c6b304d348b8f4a69b03091fd#file-02-message-html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">c&rsquo;est simple aussi<\/a> :<\/p>\n<pre><code>&lt;div class=\"notice notice-success is-dismissible\"&gt;\n    &lt;p&gt;This is a message from the &lt;strong&gt;Sample Plugin&lt;\/strong&gt;&lt;\/p&gt;\n&lt;\/div&gt;\n<\/code><\/pre>\n<p>Je t&rsquo;ai dit que c&rsquo;etait simple.<\/p>\n<h4>Le fichier de configuration du compositeur<\/h4>\n<p>Ce fichier particulier peut \u00eatre aussi simple ou aussi compliqu\u00e9 que n\u00e9cessaire. Pour cet article, nous gardons les choses simples. Le but, pour ce post, est simplement de lui donner un nom, une description, une licence, les auteurs, puis comment configurer l&rsquo;autochargeur.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/94e25b3c6b304d348b8f4a69b03091fd#file-03-composer-json\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Jetez un \u0153il ici<\/a>, puis je vous expliquerai ce que vous voyez juste en dessous\u00a0:<\/p>\n<pre><code>{\n    \"name\": \"tommcfarlin\/sample-plugin\",\n    \"description\": \"A sample plugin used for a blog post.\",\n    \"type\": \"wordpress-plugin\",\n    \"license\": \"GPL-3.0-or-later\",\n    \"authors\": [\n      {\n        \"name\": \"Tom McFarlin\",\n        \"email\": \"tom@tommcfarlin.com\",\n        \"homepage\": \"https:\/\/tommcfarlin.com\"\n      }\n    ],\n      \"autoload\": {\n        \"psr-4\": {\n          \"SamplePlugin\": \"src\/\"\n        }\n      }\n  }<\/code><\/pre>\n<p>Tout d&rsquo;abord, le nom, la description, le type et la licence doivent \u00eatre assez faciles \u00e0 suivre. La zone auteur est \u00e9galement simple.<\/p>\n<p>Le chargement automatique est le domaine qui nous pr\u00e9occupe en ce moment. Cela devrait \u00eatre assez clair.<\/p>\n<p>En bref, nous avons une directive pour <strong>PSR4<\/strong> sur \u00a0laquelle vous pouvez en savoir plus et o\u00f9 se trouve un espace de noms. Ainsi, dans l&rsquo;exemple ci-dessus, tout ce qui se trouve dans l&rsquo;espace de noms <strong>SamplePlugin<\/strong> se trouve dans <strong>src.\u00a0<\/strong><\/p>\n<p>C&rsquo;est ce qui indique au chargeur automatique o\u00f9 rechercher certains fichiers. Et dans notre cas, il va juste chercher la\u00a0 classe <strong>Messenger<\/strong>.<\/p>\n<h4>Composer en cours d&rsquo;ex\u00e9cution<\/h4>\n<p>Maintenant que nous avons couvert les bases du fichier de configuration de Composer, il est temps de l&rsquo;ex\u00e9cuter. Rappelez-vous que votre r\u00e9pertoire de plugins devrait ressembler \u00e0 ceci\u00a0:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160226-61e707e55e20b.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160226-61e707e55e20b.png\" alt=\"Outils pour \u00e9crire un meilleur code WordPress : Composer\"><\/a><\/p>\n<p>Dans votre terminal, saisissez <a href=\"https:\/\/gist.github.com\/tommcfarlin\/94e25b3c6b304d348b8f4a69b03091fd#file-04-run-composer-txt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la commande suivante<\/a> :<\/p>\n<p>Et vous devriez voir quelque chose comme \u00e7a :<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160226-61e707e92efb9.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160226-61e707e92efb9.png\" alt=\"Outils pour \u00e9crire un meilleur code WordPress : Composer\"><\/a><\/p>\n<p>En supposant que tout s&rsquo;est bien pass\u00e9, vous devriez pouvoir vous connecter \u00e0 WordPress et activer le plugin.<\/p>\n<h4>Tout voir ensemble<\/h4>\n<p>Une fois le plugin activ\u00e9, vous pouvez alors naviguer vers le tableau de bord de votre site. L\u00e0, vous devriez voir un avis de rejet qui ressemble exactement \u00e0 ce que nous avons vu au d\u00e9but du message\u00a0:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160226-61e707e186b99.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160226-61e707e186b99.png\" alt=\"Outils pour \u00e9crire un meilleur code WordPress : Composer\"><\/a><\/p>\n<p>Si vous \u00eates arriv\u00e9 jusqu&rsquo;ici, alors vous \u00eates pr\u00eat \u00e0 partir! Sinon, rev\u00e9rifiez votre syntaxe pour vous assurer que tout va bien. Si quelque chose ne va pas, il est probable que vous n&rsquo;auriez pas pu aller aussi loin et en supposant que les <a href=\"https:\/\/wordpress.mediadoma.com\/fr\/lire-et-comprendre-les-journaux-derreurs-de-wordpress-partie-1\/\" title=\"constantes de d\u00e9bogage de base sont d\u00e9finies\">constantes de d\u00e9bogage de base sont d\u00e9finies<\/a>, vous verrez probablement o\u00f9 se situe le probl\u00e8me.<\/p>\n<h2>Ce n&rsquo;est pas tout<\/h2>\n<p>Il y a beaucoup plus dans Composer, et je recommande fortement de lire la documentation correspondante. Je couvrirai une partie de cela lorsque je regarderai les outils que je pr\u00e9vois de couvrir plus tard dans cette s\u00e9rie mais, pour l&rsquo;instant, je recommande de se familiariser avec certaines des conventions.<\/p>\n<p>Oh! Et je ne recommande pas de v\u00e9rifier le r\u00e9pertoire du fournisseur dans votre r\u00e9f\u00e9rentiel. Cela peut devenir un \u00e9norme r\u00e9pertoire plus tard, et cela peut saper tout l&rsquo;objectif de Composer.<\/p>\n<p>Dans le prochain article, je vous expliquerai pourquoi. Certaines personnes le font, et ce n&rsquo;est pas grave, et je l&rsquo;ai d\u00e9j\u00e0 fait, mais il est important d&rsquo;\u00eatre judicieux quant au moment o\u00f9 vous le faites.<\/p>\n<p>P\u00e9cher par exc\u00e8s de ne pas le faire. Et j&rsquo;expliquerai pourquoi dans le prochain article.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Une introduction tr\u00e8s basique \u00e0 Composer expliquant son objectif et comment vous pouvez l&rsquo;utiliser pour tirer parti du chargement automatique.<\/p>\n","protected":false},"author":1,"featured_media":236343,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,717,862],"tags":[1167],"class_list":["post-231472","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231472","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=231472"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231472\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/236343"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=231472"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=231472"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=231472"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}