{"id":231022,"date":"2022-12-13T13:13:00","date_gmt":"2022-12-13T10:13:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231022"},"modified":"2022-12-13T13:15:29","modified_gmt":"2022-12-13T10:15:29","slug":"widgets-wordpress-une-approche-orientee-objet","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/widgets-wordpress-une-approche-orientee-objet\/","title":{"rendered":"Widgets WordPress\u00a0: une approche orient\u00e9e objet"},"content":{"rendered":"\n<p>Il y a des ann\u00e9es, j&rsquo;ai cr\u00e9\u00e9 le <strong><a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress Widget Boilerplate<\/a><\/strong> visant \u00e0 \u00eatre le suivant :<\/p>\n<blockquote>\n<p>Un passe-partout organis\u00e9 et maintenable pour cr\u00e9er des widgets en utilisant les meilleures pratiques de WordPress.<\/p>\n<\/blockquote>\n<p>Depuis lors, peu de choses ont chang\u00e9 en ce qui concerne l&rsquo; <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">API Widgets<\/a><\/strong> (que nous examinerons plus tard dans cet article), mais ce que je consid\u00e8re comme les \u00ab\u00a0meilleures pratiques\u00a0\u00bb a chang\u00e9. De plus, la mesure dans laquelle je pense que cette API est un solide exemple d&rsquo;introduction \u00e0 la programmation orient\u00e9e objet dans WordPress est \u00e9lev\u00e9.<\/p>\n<p>Ce n&rsquo;est pas parce qu&rsquo;il utilise beaucoup de principes orient\u00e9s objet, ce n&rsquo;est pas parce qu&rsquo;il utilise des normes modernes (du moins en ce qui concerne le PHP moderne), mais parce qu&rsquo;il utilise quelques \u00e9l\u00e9ments qui nous aident \u00e0 en reconna\u00eetre quelques-uns, disons, signaux concernant la programmation orient\u00e9e objet dans WordPress.<\/p>\n<p>Et c&rsquo;est quelque chose qui ne doit pas \u00eatre sous-estim\u00e9\u00a0: si vous recherchez des exemples de programmation orient\u00e9e objet dans WordPress, recherchez des API qui l&rsquo;utilisent.<\/p>\n<p>De plus, si vous cherchez des moyens d&rsquo;\u00e9valuer votre propre niveau d&rsquo;\u00e9valuation d&rsquo;un morceau de code (sans parler d&rsquo;une base de code) pour l&rsquo;utilisation de classes et de certaines des fonctionnalit\u00e9s les plus avanc\u00e9es de la POO, alors pourquoi ne pas avoir une sorte d&rsquo;un test d\u00e9cisif pour voir comment vous allez\u00a0?<\/p>\n<\/p>\n<p>Et l&rsquo;API Widgets fait exactement cela.<\/p>\n<h2>Widgets WordPress: une introduction<\/h2>\n<p>Donc, dans une s\u00e9rie plus petite que la pr\u00e9c\u00e9dente, je vise \u00e0 regarder l&rsquo;API Widgets et \u00e0 faire quelques choses\u00a0:<\/p>\n<ol>\n<li>vous montrer le squelette de base d&rsquo;un widget et pourquoi il est orient\u00e9 objet,<\/li>\n<li>discuter des choses que vous devriez \u00eatre en mesure de remarquer et pourquoi,<\/li>\n<li>mettez d&rsquo;abord \u00e0 jour le Widget Boilerplate directement sur ce site, puis envoyez-le \u00e0 GitHub,<\/li>\n<li>construire un widget en utilisant l&rsquo;API avec le passe-partout comme base de notre travail.<\/li>\n<\/ol>\n<p>Et dans cet article, nous allons commencer par le premier point ci-dessus.<\/p>\n<h3>Mais d&rsquo;abord\u2026<\/h3>\n<p>Avant d&rsquo;entrer dans cet article, je vous recommande de lire les articles suivants\u00a0:<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/les-deux-premiers-piliers-de-la-poo\/\" title=\"Deux piliers de la programmation orient\u00e9e objet: partie 1 sur 2\">Deux piliers de la programmation orient\u00e9e objet: partie 1 sur 2<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/les-deux-deuxiemes-piliers-de-la-poo\/\" title=\"Deux piliers de la programmation orient\u00e9e objet: partie 2 sur 2\">Deux piliers de la programmation orient\u00e9e objet: partie 2 sur 2<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/classes-abstraites-partie-1-comportement-dabstraction\/\" title=\"Classes abstraites, partie 1 - Comportement d&#039;abstraction\">Classes abstraites, partie 1 &#8211; Comportement d&rsquo;abstraction<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/classes-abstraites-partie-2-classes-abstraites-et-interfaces\/\" title=\"Classes abstraites, partie 2 \u2013 Classes abstraites et interfaces\">Classes abstraites, partie 2 \u2013 Classes abstraites et interfaces<\/a><\/strong><\/li>\n<\/ol>\n<p>Une fois cela fait (ou si vous sentez que vous ma\u00eetrisez d\u00e9j\u00e0 les sujets), nous sommes pr\u00eats \u00e0 commencer.<\/p>\n<p>[restrict pay\u00e9=&quot;true\u00a0\u00bb]<\/p>\n<h2>Les bases de l&rsquo;API Widgets<\/h2>\n<p>Si vous lisez la page du manuel sur les widgets, vous verrez beaucoup de contenu. C&rsquo;est une bonne chose, mais ce n&rsquo;est pas toujours la meilleure d\u00e9cision lorsque vous essayez de distiller du contenu \u00e0 un public tel que vous lorsque vous recherchez des conseils pratiques et orient\u00e9s objet.<\/p>\n<p>Je vais donc s\u00e9lectionner les parties pertinentes de la documentation de l&rsquo;API, puis les appliquer au code qui nous est \u00e9galement fourni.<\/p>\n<h3>Qu&rsquo;est-ce qu&rsquo;un widget\u00a0?<\/h3>\n<p>Je pense que la plupart d&rsquo;entre nous qui travaillons avec WordPress savent ce qu&rsquo;est un widget, mais il est important de d\u00e9finir le terme afin que nous travaillions tous sur la m\u00eame id\u00e9e. <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Le manuel se lit comme suit\u00a0:<\/a><\/strong><\/p>\n<blockquote>\n<p>Un widget est un objet PHP qui g\u00e9n\u00e8re du HTML. Le m\u00eame type de widget peut \u00eatre utilis\u00e9 plusieurs fois sur la m\u00eame page (par exemple, le widget de texte). Les widgets peuvent enregistrer des donn\u00e9es dans la base de donn\u00e9es (dans le tableau des options).<\/p>\n<\/blockquote>\n<p>Avec cela en place, regardons le code d&rsquo;un widget personnalis\u00e9, au moins un bout de celui-ci, et voyons ce que nous pouvons glaner en ce qui concerne sa nature orient\u00e9e objet.<\/p>\n<h3>La classe des widgets<\/h3>\n<p>Avant m\u00eame de regarder le code, nous savons qu&rsquo;il y aura un certain niveau de programmation orient\u00e9e objet simplement parce que la documentation nous dit de faire trois choses\u00a0:<\/p>\n<ol>\n<li>Cr\u00e9ez la classe de votre widget en \u00e9tendant la classe standard <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_widget\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Widget<\/a> et certaines de ses fonctions.<\/li>\n<li>Enregistrez votre widget afin qu&rsquo;il soit disponible dans l&rsquo; \u00e9cran <strong>Widgets<\/strong>.<\/li>\n<li>Assurez-vous que votre th\u00e8me comporte au moins une <strong><a href=\"https:\/\/make.wordpress.org\/docs\/theme-developer-handbook\/theme-functionality\/sidebars\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">zone de widgets<\/a><\/strong> dans laquelle ajouter les widgets.<\/li>\n<\/ol>\n<p>Dans cet article, je vais me concentrer sur le premier point (bien que nous verrons \u00e9ventuellement comment nous introduisons nos widgets dans un th\u00e8me avant la fin de la s\u00e9rie).<\/p>\n<p>Pr\u00e9sentons donc <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/ea73655b0a022d65317529930cbb0cad#file-00-widget-base-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">le code<\/a><\/strong> tel qu&rsquo;il est pr\u00e9sent\u00e9 dans la documentation et parlons de ce que nous pouvons en apprendre\u00a0:<\/p>\n<pre><code>&lt;?php\nclass AcmeWidget extends WP_Widget \n{ \n    public function __construct() \n    {\n    }\n\n    public function widget($args, $instance) \n    {\n    }\n\n    public function form($instance)\n    {\n    }\n\n    public function update($newInstance, $oldInstance)\n    {\n    }\n}<\/code><\/pre>\n<p>Tout d&rsquo;abord, nous remarquons que bien que nous ayons d\u00e9fini une classe (que nous pouvons nommer comme nous voulons, ma fa\u00e7on), elle doit \u00e9tendre <strong>WP_Widget<\/strong>. Cela signifie que dans le noyau de WordPress, il existe une classe <strong>WP_Widget<\/strong>. Vous pouvez voir une r\u00e9partition bien organis\u00e9e du code source sur <strong><a href=\"https:\/\/developer.wordpress.org\/reference\/files\/wp-includes\/class-wp-widget.php\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">cette page.<\/a><\/strong><\/p>\n<p>Deuxi\u00e8mement, le mot cl\u00e9 <strong>extend<\/strong> indique que nous utilisons l&rsquo; <strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.inheritance.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">h\u00e9ritage PHP<\/a><\/strong> qui est un pilier central de la programmation orient\u00e9e objet.<\/p>\n<p>Troisi\u00e8mement, il y a quatre fonctions que nous devons impl\u00e9menter dont deux n\u00e9cessitent des arguments. Les fonctions que nous devons impl\u00e9menter sont les suivantes :<\/p>\n<ul>\n<li><strong>__construct()<\/strong> qui est le constructeur de classe de base. C&rsquo;est l\u00e0 que nous devrons nous assurer que le constructeur de la classe parent est appel\u00e9, s&rsquo;il y en a un, puis nous initialisons les propri\u00e9t\u00e9s que nous jugeons n\u00e9cessaires pour notre widget. Nous y reviendrons plus tard dans la s\u00e9rie.<\/li>\n<li><strong>widget()<\/strong> est responsable de la sortie du contenu du widget que l&rsquo;utilisateur fournit \u00e0 l&rsquo;aide de l&rsquo;interface dans la zone administrative. Il accepte deux param\u00e8tres &#8211; <strong>$args<\/strong> et <strong>$instance.<\/strong> Le param\u00e8tre <strong>$args<\/strong> est l&rsquo;information \u00e0 rendre sur la page, et le <strong>$instance<\/strong> est une r\u00e9f\u00e9rence \u00e0 l&rsquo;instance du widget (puisque plusieurs widgets peuvent \u00eatre rendus sur une page).<\/li>\n<li><strong>form()<\/strong> affiche l&rsquo;interface administrative avec laquelle l&rsquo;utilisateur interagit pour guider ce qui est affich\u00e9 sur le front-end du site. Il n\u00e9cessite \u00e9galement l&rsquo; argument <strong>$instance<\/strong> afin que les informations fournies concernent le widget r\u00e9el avec lequel l&rsquo;utilisateur travaille (par rapport \u00e0 toutes les instances du widget).<\/li>\n<li><strong>update()<\/strong> est utilis\u00e9 pour enregistrer les valeurs dans l&rsquo;instance actuelle du widget. Il accepte deux arguments. Le premier est la nouvelle instance du widget avec les valeurs de mises \u00e0 jour que l&rsquo;utilisateur a fournies (pensez \u00e0 mettre \u00e0 jour la valeur d&rsquo;un widget texte actif) et le deuxi\u00e8me argument est celui de l&rsquo;ancienne instance du widget ou peut-\u00eatre de l&rsquo;instance pr\u00e9c\u00e9dente ou peut-\u00eatre &quot; l&rsquo;instance qui contenait les valeurs pr\u00e9c\u00e9dentes.<\/li>\n<\/ul>\n<p>Ces quatre fonctions doivent \u00eatre impl\u00e9ment\u00e9es dans le cadre de l&rsquo;API Widget, dans le cadre des fonctions h\u00e9rit\u00e9es de l&rsquo;interface \u00e9tendue, et pour produire les fonctionnalit\u00e9s de base d&rsquo;un widget.<\/p>\n<p>Cela ne signifie pas que plus ne peut pas \u00eatre ajout\u00e9, mais dans le bon sens orient\u00e9 objet, il serait probablement pr\u00e9f\u00e9rable de rel\u00e9guer ce comportement dans d&rsquo;autres classes. Mais nous verrons cela plus tard dans la s\u00e9rie lorsque nous cr\u00e9erons notre propre widget.<\/p>\n<h3>Quels sont les principaux plats \u00e0 emporter\u00a0?<\/h3>\n<p>Pour \u00eatre s\u00fbr que je suis clair sur ce qui serait compris de ce post, c&rsquo;est le suivant:<\/p>\n<ul>\n<li>L&rsquo;API Widgets est orient\u00e9e objet. Ce n&rsquo;est pas seulement orient\u00e9 objet parce qu&rsquo;il utilise une classe (bien que ce soit certainement un bon point de d\u00e9part), mais aussi parce qu&rsquo;il h\u00e9rite de fonctionnalit\u00e9s int\u00e9gr\u00e9es dans une classe de base pr\u00e9existante.<\/li>\n<li>Chaque fois que nous h\u00e9ritons du comportement d&rsquo;une classe de base ou d&rsquo;une classe parente, nous obtenons gratuitement des fonctionnalit\u00e9s pr\u00e9-d\u00e9velopp\u00e9es. C&rsquo;est une tr\u00e8s bonne chose \u00e0 propos de la programmation orient\u00e9e objet car elle nous permet de nous concentrer sp\u00e9cifiquement sur la logique de programmation que nous souhaitons mettre en \u0153uvre.<\/li>\n<\/ul>\n<p>Imaginez un instant que vous souhaitiez d\u00e9velopper un widget, mais \u00e0 chaque fois que vous le faites, vous devez \u00e9crire toutes les fonctionnalit\u00e9s des crochets dans WordPress pour faire toutes les m\u00eames fonctionnalit\u00e9s passe-partout r\u00e9p\u00e9titives.<\/p>\n<p>C&rsquo;est l\u00e0 que l&rsquo;h\u00e9ritage et la programmation orient\u00e9e objet entrent en jeu. Le code r\u00e9p\u00e9titif est abstrait dans une classe de base, il n&rsquo;est donc \u00e9crit qu&rsquo;une seule fois, puis le code sur lequel nous voulons nous concentrer est laiss\u00e9 \u00e0 notre impl\u00e9mentation.<\/p>\n<p>Tout ce qui pr\u00e9c\u00e8de est ce qu&rsquo;il faut comprendre lors de la lecture de cette passe initiale au code source pour une API de base orient\u00e9e objet dans WordPress.<\/p>\n<h2>Et apr\u00e8s?<\/h2>\n<p>Dans le prochain article de cette s\u00e9rie, nous allons examiner la nature orient\u00e9e objet de l&rsquo;API Widgets et les \u00e9l\u00e9ments que vous devriez pouvoir d\u00e9tecter imm\u00e9diatement en lisant le code.<\/p>\n<p>En effet, il est important de reconna\u00eetre certains principes orient\u00e9s objet dans la pratique et c&rsquo;est un bon moyen d&rsquo;\u00e9valuer si vous \u00eates capable de le faire ou non. Si c&rsquo;est le cas, super\u00a0! Ensuite, il continuera \u00e0 aider \u00e0 d\u00e9velopper ce muscle. Sinon, pas de soucis \u2013 cela vous aide toujours \u00e0 d\u00e9velopper ce muscle.<\/p>\n<p>Et cela vous servira bien alors que nous continuons \u00e0 nous orienter de plus en plus vers le d\u00e9veloppement WordPress orient\u00e9 objet par des moyens pratiques.<\/p>\n<p>La th\u00e9orie n\u00e9cessaire a \u00e9t\u00e9 couverte. Commen\u00e7ons donc \u00e0 le mettre en pratique.<\/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>L&rsquo;API WordPress Widgets aide \u00e0 fournir un test d\u00e9cisif solide et un exemple de la fa\u00e7on de d\u00e9marrer avec la programmation orient\u00e9e objet dans WordPress.<\/p>\n","protected":false},"author":1,"featured_media":236133,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,717,801,862],"tags":[1167],"class_list":["post-231022","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-php-3","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231022","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=231022"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231022\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/236133"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=231022"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=231022"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=231022"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}