{"id":230146,"date":"2022-11-23T15:35:00","date_gmt":"2022-11-23T12:35:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230146"},"modified":"2022-11-09T20:18:35","modified_gmt":"2022-11-09T17:18:35","slug":"travailler-avec-des-classes-des-modeles-et-des-partiels-dans-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/travailler-avec-des-classes-des-modeles-et-des-partiels-dans-wordpress\/","title":{"rendered":"Travailler avec des classes, des mod\u00e8les et des partiels dans WordPress"},"content":{"rendered":"\n<p>Quand je me suis assis pour commencer ce post, j&rsquo;avais pr\u00e9vu d&rsquo;\u00e9crire quelque chose de beaucoup plus impliqu\u00e9 que ce que je vais partager. Au d\u00e9part, je voulais parcourir l&rsquo;une des deux choses suivantes\u00a0:<\/p>\n<ul>\n<li>Le guide complet pour configurer un environnement de d\u00e9veloppement,<\/li>\n<li>Int\u00e9gration des outils de qualit\u00e9 de code dans PhpStorm<\/li>\n<\/ul>\n<p>La premi\u00e8re serait de se concentrer sur une vari\u00e9t\u00e9 d&rsquo;autres choses dont j&rsquo;ai parl\u00e9, de les lier toutes ensemble et d&rsquo;avoir une r\u00e9f\u00e9rence d\u00e9finitive. Mais c&rsquo;est quelque chose que je veux prendre le temps de mettre en place pour m&rsquo;assurer que c&rsquo;est bien fait.<\/p>\n<p>Le second est celui que je pense \u00eatre important mais je suis un peu dans une phase de transition avec certains de mes propres outils. Tant que ce n&rsquo;est pas fait, je pr\u00e9f\u00e8re ne pas \u00e9crire \u00e0 ce sujet.<\/p>\n<p>M\u00eame quand m\u00eame, il y a toujours quelque chose \u00e0 couvrir, n&rsquo;est-ce pas? Alors aujourd&rsquo;hui, j&rsquo;ai opt\u00e9 pour quelque chose de plus simple: d\u00e9composer l&rsquo;utilisation des classes, des mod\u00e8les et des partiels dans les plugins WordPress \u00e0 l&rsquo;aide d&rsquo;un exemple simple.<\/p>\n<h2>Classes, mod\u00e8les et partiels dans WordPress<\/h2>\n<p>Pour ce sujet particulier, une question imm\u00e9diate qui peut venir \u00e0 l&rsquo;esprit est simple: pourquoi s&#8217;emb\u00eater \u00e0 en parler ?<\/p>\n<p>Parce que nous sommes en 2018 et que nous voyons toujours un m\u00e9lange grossier de PHP, CSS, balisage et JavaScript dans un seul fichier. Ce n&rsquo;est pas pour frapper sur d&rsquo;autres technologies qui le font par d\u00e9faut (comme React). Je parle sp\u00e9cifiquement des plugins WordPress et de l&rsquo;\u00e9criture de code maintenable de mani\u00e8re \u00e0 ce qu&rsquo;il soit facile [\u00e9videmment] \u00e0 maintenir, \u00e9crire et lire.<\/p>\n<h3>Un exemple pratique<\/h3>\n<p>Disons que vous travaillez sur une page de sous-menu pour quelque chose qui va appara\u00eetre sous un menu personnalis\u00e9. <a href=\"https:\/\/gist.github.com\/tommcfarlin\/f72e1444fb01cff19de2c58f0aacab34#file-00-addmenupage-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Vous enregistrez votre page<\/a> \u00e0 l&rsquo;aide de l&rsquo;API WordPress\u00a0:<\/p>\n<pre><code>&lt;?php\n\npublic function addMenuPage()\n{\n    add_menu_page(\n      'Acme Menu',\n      'Acme Menu',\n      'manage_options',\n      'acme-custom-menu',\n      array($this, 'display'),\n      'dashicons-dashboard',\n      30\n    );\n\n    add_submenu_page(\n      'acme-custom-menu',\n      'Acme Menu',\n      'Acme Menu',\n      'Acme Menu',\n      'acme-custom-menu',\n      array($this, 'display')\n    );\n}\n<\/code><\/pre>\n<p>Mais lorsque vous configurez une fonction de rappel pour afficher la page, vous <strong>n&rsquo;utilisez pas<\/strong> la fonction pour m\u00e9langer toutes les diff\u00e9rentes langues ensemble. Au lieu de cela, vous l&rsquo;utilisez pour <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/f72e1444fb01cff19de2c58f0aacab34#file-01-display-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">inclure un fichier.<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\npublic function display()\n{\n    include_once $this-&gt;pluginPath. 'views\/acme-settings.php';\n}\n<\/code><\/pre>\n<p>Notez que dans le fichier ci-dessus, je r\u00e9f\u00e9rence une propri\u00e9t\u00e9 <strong>$this-&gt;pluginPath<\/strong>. Ceci est d\u00e9fini dans le constructeur de la classe afin que je puisse facilement acc\u00e9der \u00e0 la racine du plugin.<\/p>\n<p>Quoi qu&rsquo;il en soit, \u00e0 quoi pourrait ressembler ce fichier\u00a0?<\/p>\n<h3>Un mod\u00e8le et un partiel<\/h3>\n<p>Dans ce cas, je suppose que votre mod\u00e8le est ce qui va fournir des informations \u00e0 l&rsquo;utilisateur et va demander sa contribution. Le partiel sera responsable de l&rsquo;affichage d&rsquo;un message de r\u00e9ussite, d&rsquo;erreur ou d&rsquo;avertissement \u00e0 l&rsquo;utilisateur.<\/p>\n<h4>Un mod\u00e8le<\/h4>\n<p>Pour rester simple, je vais garder \u00e0 la fois le mod\u00e8le et le partiel aussi l\u00e9gers que possible. Dans ce cas, supposons que nous allons afficher une page, demander \u00e0 l&rsquo;utilisateur d&rsquo;enregistrer une valeur, et si la valeur est enregistr\u00e9e avec succ\u00e8s (et existe donc dans la table <strong>wp_options<\/strong> ), nous afficherons le message de r\u00e9ussite.<\/p>\n<p>\u00c7a signifie:<\/p>\n<ul>\n<li>le mod\u00e8le affichera le titre de la page, les informations, la saisie et le bouton d&rsquo;enregistrement,<\/li>\n<li>le partiel affichera le message de r\u00e9ussite si n\u00e9cessaire.<\/li>\n<\/ul>\n<p>Jetez un \u0153il au code <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/f72e1444fb01cff19de2c58f0aacab34#file-02-acme-settings-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">du mod\u00e8le ci-dessous\u00a0:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\/**\n * Renders the settings page for the plugin.\n *\/\n?&gt;\n&lt;div class=\"wrap\"&gt;\n    &lt;h1 class=\"wp-heading-inline\"&gt;&lt;?php echo get_admin_page_title(); ?&gt;&lt;\/h1&gt;\n    &lt;?php if ($this-&gt;showSuccessMessage()) { ?&gt;\n      &lt;?php include_once 'partials\/settings-saved.php'; ?&gt;\n    ?&gt;\n    &lt;div id=\"acme-settings-schedule\"&gt;\n        &lt;form id=\"acme-form\" method=\"post\" action=\"&lt;?php echo esc_html(admin_url('admin-post.php')); ?&gt;\"\"&gt;\n            &lt;!-- This is where your settings go. --&gt;\n            &lt;p&gt;\n                &lt;?php\n                submit_button(\n                    'Save',\n                    'primary',\n                    'acme-save-settings',\n                    false\n                );\n                wp_nonce_field(\n                    'acme-save',\n                    'acme-save-nonce'\n                );\n                ?&gt;\n            &lt;\/p&gt;\n        &lt;\/form&gt;\n    &lt;\/div&gt;\n&lt;\/div&gt;\n<\/code><\/pre>\n<p>Notez que, oui, il a une entr\u00e9e, un bouton d&rsquo;enregistrement et un nonce qui sont tous importants (mais au-del\u00e0 de la port\u00e9e de cet article) pour enregistrer des informations.<\/p>\n<p>Mais notez \u00e9galement qu&rsquo;il a une fonction d&rsquo;assistance que j&rsquo;utilise pour v\u00e9rifier la pr\u00e9sence d&rsquo;informations enregistr\u00e9es avec succ\u00e8s. Cette fonction r\u00e9side dans la m\u00eame classe responsable du rendu du mod\u00e8le.<\/p>\n<h4>Partiel<\/h4>\n<p>Cela ressemble <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/f72e1444fb01cff19de2c58f0aacab34#file-03-showsuccessmessage-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e0 ceci\u00a0:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\npublic function showSuccessMessage()\n{\n  return (false !== get_option('acme_custom_setting'));\n}\n<\/code><\/pre>\n<p>Et le partiel r\u00e9sultant est <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/f72e1444fb01cff19de2c58f0aacab34#file-04-settings-saved-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tr\u00e8s simple\u00a0:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\/**\n * Renders the success message if the option has been properly saved.\n *\/\n?&gt;\n\n&lt;div class=\"notice-success notice is-dismissible\"&gt;\n    &lt;p&gt;Your settings have been successfully saved.&lt;\/p&gt;\n    &lt;button type=\"button\" class=\"notice-dismiss\"&gt;\n        &lt;span class=\"screen-reader-text\"&gt;Dismiss this notice.&lt;\/span&gt;\n    &lt;\/button&gt;\n&lt;\/div&gt;\n<\/code><\/pre>\n<p>Bien s\u00fbr, votre impl\u00e9mentation de la fonction peut varier. Le but n&rsquo;est pas tant de montrer comment impl\u00e9menter la fonction mais comment tirer parti d&rsquo;une fonction pour v\u00e9rifier les informations pour afficher un partiel.<\/p>\n<h2>Il y a plus (mais pas ici)<\/h2>\n<p>C&rsquo;est peut-\u00eatre quelque chose qui devrait \u00eatre plac\u00e9 au d\u00e9but de l&rsquo;article.<\/p>\n<p>Pour \u00eatre honn\u00eate, je pense que c&rsquo;est l&rsquo;une de ces choses o\u00f9 certains peuvent trouver plus utile de le voir d\u00e8s le d\u00e9but (mais manquent alors de contexte du code) et d&rsquo;autres trouvent cela plus utile \u00e0 la fin car ils peuvent voir comment tout s&rsquo;int\u00e8gre ensemble.<\/p>\n<p>Quoi qu&rsquo;il en soit, j&rsquo;esp\u00e8re que cela fournira finalement des \u00e9claircissements sur la fa\u00e7on dont tout cela s&#8217;embo\u00eete.<\/p>\n<p>De plus, il y a beaucoup de place dans les endroits pour que des choses soient personnalis\u00e9es telles que :<\/p>\n<ul>\n<li>v\u00e9rifier que l&rsquo;utilisateur a l&rsquo;autorisation d&rsquo;enregistrer,<\/li>\n<li>v\u00e9rification de la valeur nonce,<\/li>\n<li>assainir et valider les donn\u00e9es,<\/li>\n<li>d\u00e9terminer ce qui constitue le succ\u00e8s, les avertissements et les erreurs.<\/li>\n<\/ul>\n<p>Mais si je dois couvrir tout ce qui pr\u00e9c\u00e8de, nous envisageons un message extraordinairement long ou une longue s\u00e9rie de messages. Ce n&rsquo;est pas quelque chose contre quoi je suis, mais c&rsquo;est aussi quelque chose qui ne vaut pas la peine \u00e0 ce stade.<\/p>\n<p>N&rsquo;h\u00e9sitez jamais \u00e0 donner votre avis. Mais en attendant, j&rsquo;esp\u00e8re que tout cela vous aidera \u00e0 cr\u00e9er une base sur laquelle b\u00e2tir lorsque vous travaillerez sur votre prochain projet.<\/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>Dans cet article, je d\u00e9compose l&rsquo;utilisation des classes, des mod\u00e8les et des partiels dans les plugins WordPress \u00e0 l&rsquo;aide d&rsquo;un exemple simple.<\/p>\n","protected":false},"author":1,"featured_media":164763,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[717,801,841,862],"tags":[1167],"class_list":["post-230146","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-developpeur","category-php-3","category-tutoriels","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230146","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=230146"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230146\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/164763"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=230146"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=230146"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=230146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}