{"id":231252,"date":"2022-12-18T19:21:00","date_gmt":"2022-12-18T16:21:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231252"},"modified":"2022-12-18T19:23:24","modified_gmt":"2022-12-18T16:23:24","slug":"widgets-wordpress-refactorisation-partie-7","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/widgets-wordpress-refactorisation-partie-7\/","title":{"rendered":"Widgets WordPress : refactorisation, partie 7"},"content":{"rendered":"\n<p>Dans les derniers articles, nous avons fait beaucoup de travail pour amener le code au point de refactorisation qui sera couvert dans cet article.<\/p>\n<p>Plus pr\u00e9cis\u00e9ment, nous avons couvert\u00a0:<\/p>\n<ul>\n<li>crochets,<\/li>\n<li>un <a href=\"https:\/\/tommcfarlin.com\/wordpress-widgets-part-4\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Registre<\/a> ,<\/li>\n<li>et <a href=\"https:\/\/wordpress.mediadoma.com\/fr\/widgets-wordpress-refactorisation-partie-3\/\" title=\"Abonn\u00e9s\">Abonn\u00e9s<\/a>.<\/li>\n<\/ul>\n<p>Tous ces \u00e9l\u00e9ments vont jouer un r\u00f4le dans ce que nous allons faire aujourd&rsquo;hui.<\/p>\n<h2>Le passe-partout du widget WordPress\u00a0: refactorisation, partie\u00a07<\/h2>\n<p>Pour ceux qui connaissent l&rsquo; <a href=\"https:\/\/codex.wordpress.org\/Widgets_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">API WordPress Widgets<\/a>, vous savez probablement qu&rsquo;elle n&rsquo;a pas beaucoup chang\u00e9 au cours des derni\u00e8res ann\u00e9es.<\/p>\n<p>De plus, il ne se compose en r\u00e9alit\u00e9 que de quatre fonctions (dont l&rsquo;une est le constructeur) :<\/p>\n<ol>\n<li>Le constructeur est charg\u00e9 de d\u00e9finir plusieurs propri\u00e9t\u00e9s sur le widget, le plus souvent son nom et sa description.<\/li>\n<li>La fonction widget est responsable du rendu du contenu du widget.<\/li>\n<li>La fonction de formulaire est responsable de l&rsquo;affichage du formulaire dans la zone d&rsquo;administration de WordPress lorsque vous travaillez avec le widget.<\/li>\n<li>La fonction de mise \u00e0 jour est charg\u00e9e de mettre \u00e0 jour les options qui sont enregistr\u00e9es dans la base de donn\u00e9es (ou initialis\u00e9es puis d&rsquo;enregistrer les options qui n&rsquo;existent peut-\u00eatre pas encore dans la base de donn\u00e9es).<\/li>\n<\/ol>\n<p>La bonne chose est que cette approche particuli\u00e8re est r\u00e9alis\u00e9e en h\u00e9ritant d&rsquo;une fonctionnalit\u00e9 pour la classe <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_widget\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Widget<\/a>.<\/p>\n<p>Le probl\u00e8me, cependant, est que c&rsquo;est beaucoup de travail pour une seule classe.<\/p>\n<p>Au lieu de cela, nous devrions s\u00e9parer chacune des fonctions dans son propre domaine de fonctionnalit\u00e9.<\/p>\n<p>Comme pour tout ce qui concerne la programmation, il y aura des fa\u00e7ons dont certaines choses sont claires sur la fa\u00e7on dont elles peuvent \u00eatre faites, puis il y aura des choses qui peuvent \u00eatre faites de plusieurs fa\u00e7ons.<\/p>\n<p>Ce que je vais vous pr\u00e9senter, c&rsquo;est comment je l&rsquo;aborde pour l&rsquo;instant. Cela pourrait changer \u00e0 l&rsquo;avenir, ou peut-\u00eatre pas, et d&rsquo;autres pourraient avoir une vision diff\u00e9rente.<\/p>\n<p>Quoi qu&rsquo;il en soit, l&rsquo;impl\u00e9mentation sera beaucoup plus orient\u00e9e objet et donnera \u00e0 chaque classe son propre ensemble de responsabilit\u00e9s.<\/p>\n<p>La premi\u00e8re question, cependant, est de savoir comment diviser une classe avec quatre fonctions et qui h\u00e9rite d&rsquo;une classe parente ?<\/p>\n<h3>Mise \u00e0 jour du Bootstrap<\/h3>\n<p>Tout d&rsquo;abord, il y a quelques choses que nous devons ajuster dans le bootstrap du plugin. A savoir, nous devons faire ce qui suit:<\/p>\n<ol>\n<li>instancier le registre et le rendre disponible via le projet,<\/li>\n<li>mettre \u00e0 jour la classe Plugin pour qu&rsquo;elle accepte un registre et charge les abonn\u00e9s,<\/li>\n<li>revoir le bootstrap<\/li>\n<\/ol>\n<p>Voici un aper\u00e7u des trois \u00e9l\u00e9ments ci-dessus.<\/p>\n<h3>1 Instancier le Registre<\/h3>\n<p>Puisque nous avons d\u00e9j\u00e0 couvert cela plus t\u00f4t dans la s\u00e9rie, il devrait \u00eatre clair comment proc\u00e9der.<\/p>\n<p>D&rsquo;abord, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9c39ba3635c823f85447d0378c8976d2#file-00-instantiate-the-registry-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">voyez le code suivant<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/\/ Setup a filter so we can retrieve the registry throughout the plugin.\n$registry = new Registry();\nadd_filter('wpwBoilerplateRegistry', function() use ($registry) {\n    return $registry;\n});<\/code><\/pre>\n<p>Ensuite, notez que nous instancions le registre (nous parlerons de son espace de noms dans un instant), puis nous l&rsquo;accrochons \u00e0 un filtre personnalis\u00e9 qui nous permet d&rsquo;y acc\u00e9der \u00e0 tout moment dans le plug-in.<\/p>\n<h3>2 Mettre \u00e0 jour la classe du plugin<\/h3>\n<p>Ensuite, nous devons mettre \u00e0 jour la classe du plugin principal (qui r\u00e9side dans le\u00a0 r\u00e9pertoire <strong>src<\/strong>) afin qu&rsquo;elle r\u00e9f\u00e9rence le registre et charge <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9c39ba3635c823f85447d0378c8976d2#file-01-update-the-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tous les abonn\u00e9s enregistr\u00e9s<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of WordPress Widget Boilerplate\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace WordPressWidgetBoilerplate;\n\nuse WordPressWidgetBoilerplateUtilitiesRegistry;\n\n\/**\n * The base class for this plugin. Maintains a copy of the registry and starts\n * all of the objects that should hook into WordPress.\n *\/\nclass Plugin\n{\n    \/**\n     * @var Registry a reference to the simple container used to maintain plugin objects\n     *\/\n    private $registry;\n\n    \/**\n     * @param Registry $registry a reference to the simple container used to maintain plugin objects\n     *\/\n    public function __construct(Registry $registry)\n    {\n        $this-&gt;registry = $registry;\n    }\n\n    \/**\n     * Iterates through each of the subscribers maintained in the registry and registers them\n     * to the proper WordPress hook.\n     *\/\n    public function start()\n    {\n        array_map(function ($subscriber) {\n            add_action($subscriber-&gt;getHook(), [$subscriber, 'load']);\n        }, $this-&gt;registry-&gt;getRegisteredSubscribers());\n    }\n}<\/code><\/pre>\n<p>Notez, cependant, que nous n&rsquo;avons pas encore vraiment configur\u00e9 d&rsquo;abonn\u00e9s. Nous avons commenc\u00e9 cela plus t\u00f4t dans la s\u00e9rie et il est maintenant temps d&rsquo;y revenir, mais nous le ferons plus tard.<\/p>\n<p>Nous devons cependant <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9c39ba3635c823f85447d0378c8976d2#file-03-new-registry-function-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ajouter une fonction<\/a> &#8211; m\u00eame si elle est temporaire &#8211; afin que nous puissions ajouter des classes qui ne sont pas des abonn\u00e9s explicites aux \u00e9v\u00e9nements\u00a0:<\/p>\n<pre><code>&lt;?php\n\/**\n * @return array all of the the objects that aren't subscribers registered with WordPress\n *\/\npublic function getRegisteredObjects()\n{\n    $objects = [];\n    foreach ($this-&gt;registry as $object) {\n        if (!$object instanceof AbstractSubscriber) {\n            $objects[] = $object;\n        }\n    }\n\n    return array_filter($objects);\n}<\/code><\/pre>\n<p>Cela sera retravaill\u00e9 plus tard car nous transformerons les classes principales en abonn\u00e9s plus tard.<\/p>\n<h3>3 Revoir le Bootstrap<\/h3>\n<p>Avant d&rsquo;aller plus loin, je pense qu&rsquo;il est important de revoir le bootstrap. Bien que votre en-t\u00eate et votre documentation puissent varier, il est important de noter que nous faisons les choses suivantes\u00a0:<\/p>\n<ul>\n<li>namespacer le bootstrap,<\/li>\n<li>emp\u00eacher l&rsquo;acc\u00e8s au fichier,<\/li>\n<li>appeler le chargeur automatique,<\/li>\n<li>mise en place du registre,<\/li>\n<li>et lancer le plugin.<\/li>\n<\/ul>\n<p>Cela semble beaucoup mais <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9c39ba3635c823f85447d0378c8976d2#file-02-the-current-bootstrap-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">le code est assez court<\/a> :<\/p>\n<pre><code>&lt;?php\n\/**\n * WordPress Widget Boilerplate\n *\n * The WordPress Widget Boilerplate is an organized, maintainable boilerplate for building\n * widgets using WordPress best practices.\n *\n * @package   WordPressWidgetBoilerplate\n * @author    Your Name &lt;email@example.com&gt;\n * @license   GPL-3.0+\n * @link      http:\/\/example.com\n * @copyright 2018 - 2019 Your Name or Company Name\n *\n * @wordpress-plugin\n * Plugin Name:       WordPress Widget Boilerplate\n * Plugin URI:        https:\/\/github.com\/tommcfarlin\/wordpress-widget-boilerplate\n * Description:       An object-oriented foundation for building WordPress Widgets.\n * Version:           1.0.0\n * Author:            Tom McFarlin\n * Author URI:        https:\/\/tommcfarlin.com\n * Text Domain:       widget-name\n * License:           GPL-3.0+\n * License URI:       http:\/\/www.gnu.org\/licenses\/gpl-3.0.txt\n * Domain Path:       \/lang\n *\/\n\nnamespace WordPressWidgetBoilerplate;\n\nuse WordPressWidgetBoilerplateUtilitiesRegistry;\nuse WordPressWidgetBoilerplatePlugin;\n\n\/\/ Prevent this file from being called directly.\ndefined('WPINC') || die;\n\n\/\/ Include the autoloader.\nrequire_once __DIR__. '\/vendor\/autoload.php';\n\n\/\/ Setup a filter so we can retrieve the registry throughout the plugin.\n$registry = new Registry();\nadd_filter('wpwBoilerplateRegistry', function() use ($registry) {\n    return $registry;\n});\n\n\/\/ Start the machine.\n(new Plugin($registry))-&gt;start();\n<\/code><\/pre>\n<p>\u00c0 ce stade, cependant, il est temps d&rsquo;examiner ce que c&rsquo;est que de diviser la classe enfant de l&rsquo; <a href=\"https:\/\/codex.wordpress.org\/Widgets_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">API Widgets<\/a> standard en quelque chose qui correspond au mod\u00e8le de code avec lequel nous travaillons.<\/p>\n<h2>Fractionner une classe enfant<\/h2>\n<p>Cette partie va probablement s&rsquo;\u00e9tendre sur quelques articles car il y a un peu de travail \u00e0 faire, mais nous allons commencer par cr\u00e9er notre propre classe de widgets qui h\u00e9ritera de la classe de base Widget.<\/p>\n<p>Tout d&rsquo;abord, allez-y et cr\u00e9ez un\u00a0 r\u00e9pertoire <strong>API<\/strong> dans le\u00a0 r\u00e9pertoire <strong>src<\/strong> et ajoutez un fichier appel\u00e9 <strong>Widget.php<\/strong>. C&rsquo;est l\u00e0 que r\u00e9sideront les bases du widget. Nous aborderons les feuilles de style administratives et publiques et les fichiers JavaScript dans le prochain article.<\/p>\n<p>\u00c0 ce stade, les bases du fichier devraient <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9c39ba3635c823f85447d0378c8976d2#file-04-widget-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ressembler \u00e0 ceci<\/a>\u00a0:<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of WordPress Widget Boilerplate\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace WordPressWidgetBoilerplateAPI;\n\nuse WP_Widget;\n\nclass Widget extends WP_Widget\n{\n    \/**\n     * @var string unique identifier for your widget\n     *\/\n    protected $widgetSlug;\n\n    \/**\n     * Initializes the plugin by setting its properties and calling the parent class with the description.\n     *\n     * @param mixed $widgetSlug\n     *\/\n    public function __construct($widgetSlug)\n    {\n        $this-&gt;widgetSlug = $widgetSlug;\n\n        \/\/ TODO: update description\n        parent::__construct(\n            $this-&gt;getWidgetSlug(),\n            __('Widget Name', $this-&gt;getWidgetSlug()),\n            [\n                'classname' =&gt; $this-&gt;getWidgetSlug().'-class',\n                'description' =&gt; __('Short description of the widget goes here.', $this-&gt;getWidgetSlug()),\n            ]\n        );\n    }\n\n    \/**\n     * Return the widget slug.\n     *\n     * @return string slug variable\n     *\/\n    public function getWidgetSlug()\n    {\n        return $this-&gt;widgetSlug;\n    }\n\n    \/**\n     * TODO: This is a temporary message to show that the Boilerplate has loaded.\n     *\/\n    public function load()\n    {\n        $html = '&lt;p style=\"text-align:center; background: #fff; padding: 1em; border: 1px dotted gray; margin: 2em 2em 2em 14em;\"&gt;';\n        $html .= 'The Widget Boilerplate is loaded.';\n        $html .= '&lt;\/p&gt;';\n        echo $html;\n    }\n}\n<\/code><\/pre>\n<p>Notez qu&rsquo;il prend un seul argument. J&rsquo;ai utilis\u00e9 widget-name mais vous pouvez utiliser ce que vous voulez tant qu&rsquo;il repr\u00e9sente votre widget.<\/p>\n<p>Cela permet de montrer que la classe est correctement instanci\u00e9e et charg\u00e9e lorsque le plugin est activ\u00e9. Si vous ne voyez pas cela, c&rsquo;est que quelque chose ne va pas (ce que nous reviendrons dans un moment).<\/p>\n<p>Ensuite, il est important de s&rsquo;assurer que cette classe est ajout\u00e9e au Registre. Ajoutez donc les lignes suivantes du code <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9c39ba3635c823f85447d0378c8976d2#file-05-add-registry-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dans le bootstrap\u00a0:<\/a><\/p>\n<pre><code>&lt;?php\n\n\/\/ Add the Widget base class to the Registry.\n$registry-&gt;add('widget', new Widget('widget-name'));<\/code><\/pre>\n<p>Et maintenant, lorsque vous activez le plugin, vous devriez voir ceci :<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160983-61e7189c9c671.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-160983-61e7189c9c671.png\" alt=\"Widgets WordPress : refactorisation, partie 7\"><\/a><\/p>\n<p>Si ce n&rsquo;est pas le cas, assurez-vous de consulter le code dans <a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/tree\/develop\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la branche de d\u00e9veloppement<\/a> pour vous assurer que vous disposez de tout ce qui est d\u00e9crit dans cet article.<\/p>\n<h2>Mise en \u0153uvre des abonn\u00e9s<\/h2>\n<p>Dans les prochains articles, nous verrons comment nous pouvons impl\u00e9menter des abonn\u00e9s pour le c\u00f4t\u00e9 public du site (c&rsquo;est-\u00e0-dire l\u00e0 o\u00f9 le contenu du widget est affich\u00e9). Et nous ferons de m\u00eame pour la zone d&rsquo;administration du site.<\/p>\n<p>Enfin, nous porterons notre attention sur le code responsable de la s\u00e9curisation et de la s\u00e9rialisation des donn\u00e9es (lire\u00a0: mettre \u00e0 jour notre widget), puis nous verrons \u00e0 quoi ressemble la version finale d&rsquo;un passe-partout mis \u00e0 jour.<\/p>\n<p>Dans cet article, cependant, la strat\u00e9gie principale que nous utilisons consiste \u00e0 diviser une classe enfant afin qu&rsquo;elle puisse toujours \u00eatre utilis\u00e9e avec d&rsquo;autres classes \u00e0 l&rsquo;aide d&rsquo;interfaces et de classes de base d\u00e9j\u00e0 d\u00e9finies dans la base de code.<\/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>Le probl\u00e8me avec WP_Widget est que c&rsquo;est beaucoup de travail pour une seule classe. Nous allons donc commencer \u00e0 le refactoriser maintenant.<\/p>\n","protected":false},"author":1,"featured_media":236064,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[717],"tags":[1167],"class_list":["post-231252","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-developpeur","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231252","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=231252"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231252\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/236064"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=231252"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=231252"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=231252"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}