{"id":231307,"date":"2022-12-20T12:10:00","date_gmt":"2022-12-20T09:10:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231307"},"modified":"2022-12-20T12:10:22","modified_gmt":"2022-12-20T09:10:22","slug":"widgets-wordpress-refactorisation-partie-10","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/widgets-wordpress-refactorisation-partie-10\/","title":{"rendered":"Widgets WordPress : refactorisation, partie 10"},"content":{"rendered":"\n<p>En ce qui concerne la refactorisation de WordPress Widget Boilerplate, nous sommes \u00e0 un bon endroit. Beaucoup de travail a \u00e9t\u00e9 fait pour que l&rsquo;introduction de nouvelles classes, fonctionnalit\u00e9s et fonctionnalit\u00e9s soit beaucoup plus facile.<\/p>\n<p>Et pas seulement cela: cela devrait \u00eatre plus facile \u00e0 suivre.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/widgets-wordpress-refactorisation-partie-9\/\" title=\"Gr\u00e2ce au travail effectu\u00e9 dans le dernier article\">Gr\u00e2ce au travail effectu\u00e9 dans le dernier article<\/a>, nous avons beaucoup de travail \u00e0 faire, \u00e0 savoir une interface administrative de base.<\/p>\n<p>Enfin, le dernier post disait :<\/p>\n<blockquote>\n<p>Au cours des prochains articles, cela va continuer \u00e0 \u00e9voluer mais, comme vous pouvez le voir, nous nous assurons d&rsquo;avoir une seule classe de fonctionnalit\u00e9s de base pour parler avec WordPress et une classe sp\u00e9cifiquement pour rendre le formulaire administratif.<\/p>\n<\/blockquote>\n<p>Et c&rsquo;est l\u00e0 que nous allons revenir dans cet article. Plus pr\u00e9cis\u00e9ment, nous allons examiner la d\u00e9sinfection et la s\u00e9rialisation des donn\u00e9es ainsi que la r\u00e9cup\u00e9ration des donn\u00e9es enregistr\u00e9es dans le widget.<\/p>\n<h2>Le passe-partout du widget WordPress\u00a0: refactorisation de la partie 10<\/h2>\n<h3>Refactoriser l&rsquo;interface utilisateur<\/h3>\n<p>Avant d&rsquo;entrer dans la s\u00e9rialisation, nous allons devoir effectuer quelques travaux mineurs sur notre vue administrative. Rappelez-vous des articles pr\u00e9c\u00e9dents de la s\u00e9rie que nous avons cr\u00e9\u00e9 un formulaire qui accepte\u00a0:<\/p>\n<ul>\n<li>un titre,<\/li>\n<li>un peu de contenu,<\/li>\n<li>et une case \u00e0 cocher.<\/li>\n<\/ul>\n<p>Cela s&rsquo;affiche tr\u00e8s bien, mais cela exclut certaines fonctionnalit\u00e9s cl\u00e9s de l&rsquo; <a href=\"https:\/\/codex.wordpress.org\/Widgets_API#Widgets_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">API Widgets<\/a>. \u00c0 savoir, nous devons nous assurer que nous nommons correctement nos \u00e9l\u00e9ments en utilisant les fonctions suivantes\u00a0:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_widget\/get_field_id\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_field_id<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_widget\/get_field_name\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_field_name<\/a><\/li>\n<\/ul>\n<p>Et puis nous \u00e9crirons notre fonction simplement appel\u00e9e <a href=\"https:\/\/codex.wordpress.org\/Widgets_API#Widgets_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get<\/a> que j&rsquo;expliquerai momentan\u00e9ment.<\/p>\n<p>Les fonctions ci-dessus sont n\u00e9cessaires car elles aident WordPress \u00e0 suivre le nombre d&rsquo;instances du widget utilis\u00e9es et celle que l&rsquo;utilisateur modifie. En d&rsquo;autres termes, nous obtenons beaucoup de fonctionnalit\u00e9s gratuitement.<\/p>\n<p>Avant de vous montrer le code, je veux discuter bri\u00e8vement du but de la\u00a0 fonction <strong>get<\/strong> que nous allons introduire. En bref, c&rsquo;est un moyen pour nous de passer une cl\u00e9 (comme dans la cl\u00e9 d&rsquo;une paire cl\u00e9\/valeur) dans une fonction, puis de la faire r\u00e9cup\u00e9rer facilement une valeur pour nous afin qu&rsquo;elle garde notre interface aussi propre que possible.<\/p>\n<p>Donc, d&rsquo;abord, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/392a2eda9ebc0b0a59cd4b364e427445#file-00-get-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la m\u00e9thode get<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * If the value for the key exists in the current instance of the widget, then it will\n * retrieve it. Otherwise, it will return an empty value.\n *\n * @param string $key the used to identify the value of the widget.\n * @param array $instance the options for the instance of this widget\n *\/\nprotected function get($key, $instance)\n{\n    return empty($instance[$key])? '': $instance[$key];\n}<\/code><\/pre>\n<p>La chose importante \u00e0 noter est que cette m\u00e9thode accepte non seulement la cl\u00e9 de la valeur que nous lisons, mais un tableau faisant r\u00e9f\u00e9rence \u00e0 l&rsquo;instance du tableau.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/392a2eda9ebc0b0a59cd4b364e427445#file-01-admin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Et maintenant, l&rsquo;UI refactoris\u00e9e<\/a> :<\/p>\n<pre><code>&lt;?php\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?&gt;\n\n&lt;div class=\"widget-content\"&gt;\n    &lt;p&gt;\n        &lt;input\n            type=\"text\"\n            id=\"&lt;?php echo esc_attr($this-&gt;get_field_id('title')); ?&gt;\"\n            name=\"&lt;?php echo esc_attr($this-&gt;get_field_name('title')); ?&gt;\"\n            value=\"&lt;?php echo $this-&gt;get('title', $instance) ?&gt;\"\n            placeholder=\"Widget Title\"\n            class=\"widefat\"\n        \/&gt;\n    &lt;\/p&gt;\n\n    &lt;p&gt;\n        &lt;textarea\n            id=\"&lt;?php echo esc_attr($this-&gt;get_field_id('content')); ?&gt;\"\n            name=\"&lt;?php echo esc_attr($this-&gt;get_field_name('content')); ?&gt;\"\n            placeholder=\"Widget Content\"\n            style=\"width:100%;\"&gt;&lt;?php echo $this-&gt;get('content', $instance) ?&gt;&lt;\/textarea&gt;\n    &lt;\/p&gt;\n\n    &lt;p&gt;\n        &lt;input\n            type=\"checkbox\"\n            value=\"on\"\n            name=\"&lt;?php echo esc_attr($this-&gt;get_field_name('display-title')); ?&gt;\"\n            id=\"&lt;?php echo esc_attr($this-&gt;get_field_id('display-title')); ?&gt;\"\n            &lt;?php checked('on', $this-&gt;get('display-title', $instance), true); ?&gt;\n            class=\"checkbox\"\n        \/&gt;\n        &lt;label for=\"&lt;?php echo esc_attr($this-&gt;get_field_id('display-title')); ?&gt;\"&gt;Display Title?&lt;\/label&gt;\n    &lt;\/p&gt;\n&lt;\/div&gt;&lt;!-- .widget-content --&gt;\n<\/code><\/pre>\n<p>Mais cela laisse encore des fonctionnalit\u00e9s manquantes et cela nous laisse du travail \u00e0 faire. \u00c0 savoir, nous devons assainir les donn\u00e9es et les renvoyer \u00e0 WordPress, afin qu&rsquo;il enregistre les donn\u00e9es.<\/p>\n<h3>Assainissement et s\u00e9rialisation<\/h3>\n<p>Aux fins de notre exemple, nous allons \u00eatre tr\u00e8s stricts dans ce que nous autorisons. \u00c0 savoir, nous n&rsquo;allons prendre en charge que le texte de base et nous allons tout supprimer de mani\u00e8re agressive.<\/p>\n<p>Cela signifie que nous n&rsquo;allons pas autoriser le balisage ou quelque chose comme \u00e7a. Au lieu de cela, nous allons supprimer tout ce qui n&rsquo;est pas du texte de base. Nous pouvons le d\u00e9corer un peu quand viendra le temps de l&rsquo;afficher sur le front-end, mais nous laisserons cela jusqu&rsquo;au poste appropri\u00e9.<\/p>\n<p>Pour ce faire, nous allons utiliser les fonctions suivantes\u00a0:<\/p>\n<ul>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.strip-tags.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">strip_tags<\/a><\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.stripslashes.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">bandes de coups de fouet<\/a><\/li>\n<\/ul>\n<p>Rappelez-vous que nous avons deux champs dans notre widget &#8211; le champ de titre et le champ de contenu. Selon le type de widget que vous construisez, vous n&rsquo;aurez peut-\u00eatre besoin que d&rsquo;une seule classe ou fonction pour nettoyer les donn\u00e9es. Dans d&rsquo;autres situations, vous aurez peut-\u00eatre besoin de quelque chose de plus complexe.<\/p>\n<p>Gardez cela \u00e0 l&rsquo;esprit lorsque nous parcourons ce code, car il ne s&rsquo;agira pas d&rsquo;une solution unique. Au lieu de cela, ce sera sp\u00e9cifiquement pour cela.<\/p>\n<p>Quoi qu&rsquo;il en soit, pour assainir les donn\u00e9es, nous allons \u00e9crire une classe sp\u00e9cifiquement \u00e0 cet effet, puis nous la mettrons \u00e0 la disposition de notre classe WidgetAdmin.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/392a2eda9ebc0b0a59cd4b364e427445#file-02-widget-serializer-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Voici la classe dans son int\u00e9gralit\u00e9<\/a> avec une description \u00e0 suivre\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 WordPressWidgetBoilerplateWordPress;\n\n\/**\n * Santiizes and saves the data for the widget.\n *\/\nclass WidgetSerializer\n{\n    \/**\n     * Updates the values of the widget. Sanitizes the information before saving it.\n     *\n     * @param array $newInstance the array of new options to save\n     *\/\n    public function update($newInstance)\n    {\n        $instance = [];\n        foreach ($newInstance as $key =&gt; $value) {\n            $instance[$key] = strip_tags(\n                stripslashes($value)\n            );\n        }\n\n        return $instance;\n    }\n}\n<\/code><\/pre>\n<p>La classe doit \u00eatre simple. Il prend les valeurs entrantes du widget, les nettoie, puis renvoie un nouveau tableau \u00e0 restituer \u00e0 WordPress.<\/p>\n<p>Il y a un hic cependant. Cette classe doit \u00eatre une propri\u00e9t\u00e9 de la\u00a0 classe <strong>Widget<\/strong> principale \u00a0qui a \u00e9t\u00e9 affich\u00e9e dans le dernier message.<\/p>\n<p>Deuxi\u00e8mement, la\u00a0 m\u00e9thode de <strong>mise<\/strong> \u00e0 jour qui fait partie de l&rsquo;API Widgets est ce qui appellera cette classe. Il n&rsquo;est pas n\u00e9cessaire de transmettre la variable <strong>$oldInstance<\/strong> au s\u00e9rialiseur, mais elle est requise pour la m\u00e9thode de mise \u00e0 jour.<\/p>\n<p>Voici la classe <strong>Widget<\/strong> <a href=\"https:\/\/gist.github.com\/tommcfarlin\/392a2eda9ebc0b0a59cd4b364e427445#file-03-widget-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">telle qu&rsquo;elle est actuellement construite<\/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 WordPressWidgetBoilerplateWordPress;\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 string           $widgetSlug       unique identifier for your widget\n     * @param WidgetSerializer $widgetSerializer the class responsible for saving widget options\n     *\/\n    public function __construct($widgetSlug)\n    {\n        $this-&gt;widgetSlug = $widgetSlug;\n\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     * Displays the administrative view of the form and includes the options\n     * for the instance of the widget as arguments passed into the function.\n     *\n     * @param array $instance the options for the instance of this widget\n     *\/\n    public function form($instance)\n    {\n        include plugin_dir_path(__FILE__).'Views\/Admin.php';\n    }\n\n    \/**\n     * Updates the values of the widget. Uses the serialization class to sanitize the\n     * information before saving it.\n     *\n     * @param array $newInstance the values to be sanitized and saved\n     * @param array $oldInstance the values that were originally saved\n     *\/\n    public function update($newInstance, $oldInstance)\n    {\n        return $this-&gt;widgetSerializer-&gt;update($newInstance, $oldInstance);\n    }\n\n    \/**\n     * If the value for the key exists in the current instance of the widget, then it will\n     * retrieve it. Otherwise, it will return an empty value.\n     *\n     * @param string $key      the used to identify the value of the widget\n     * @param array  $instance the options for the instance of this widget\n     *\/\n    protected function get($key, $instance)\n    {\n        return empty($instance[$key])? '': $instance[$key];\n    }\n}\n<\/code><\/pre>\n<p>Mais si vous actualisez la page, vous remarquerez peut-\u00eatre que le nettoyage et la s\u00e9rialisation ne semblent pas fonctionner lors de la r\u00e9cup\u00e9ration des donn\u00e9es. Et c&rsquo;est ce que nous allons examiner dans le prochain article.<\/p>\n<h2>R\u00e9cup\u00e9ration des donn\u00e9es<\/h2>\n<p>Notez que bien que la fonctionnalit\u00e9 semble incompl\u00e8te pour cela (puisque les donn\u00e9es non nettoy\u00e9es sont toujours affich\u00e9es), nous nous effor\u00e7ons de nous assurer que nous \u00e9crivons des classes avec coh\u00e9sion, responsabilit\u00e9 et qui ne sont pas \u00e9troitement coupl\u00e9es.<\/p>\n<p>Nous allons it\u00e9rer un peu plus sur ce sujet dans le prochain post. Alors \u00e9tudiez le code ci-dessus, impl\u00e9mentez-le si c&rsquo;est ce que vous avez fait, et nous partirons de l\u00e0 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>Et maintenant, nous commen\u00e7ons \u00e0 ajouter des fonctionnalit\u00e9s de d\u00e9sinfection et de s\u00e9rialisation dans le WordPress Widget Boilerplate.<\/p>\n","protected":false},"author":1,"featured_media":234959,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[717,841],"tags":[1167],"class_list":["post-231307","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-developpeur","category-tutoriels","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231307","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=231307"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231307\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/234959"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=231307"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=231307"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=231307"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}