{"id":230706,"date":"2022-12-06T14:42:00","date_gmt":"2022-12-06T11:42:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230706"},"modified":"2022-12-06T14:42:48","modified_gmt":"2022-12-06T11:42:48","slug":"organisation-des-types-des-vues-et-des-abonnes-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/organisation-des-types-des-vues-et-des-abonnes-wordpress\/","title":{"rendered":"Organisation des types, des vues et des abonn\u00e9s WordPress"},"content":{"rendered":"\n<p>L&rsquo;une des choses que j&rsquo;essaie de faire r\u00e9guli\u00e8rement est de rationaliser la fa\u00e7on dont je construis des fonctionnalit\u00e9s ax\u00e9es sur WordPress. <strong><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/un-guide-simple-pour-organiser-des-cours-centres-sur-wordpress\/\" title=\"J'en ai r\u00e9cemment parl\u00e9\">J&rsquo;en ai r\u00e9cemment parl\u00e9<\/a><\/strong>, mais j&rsquo;ai pens\u00e9 que je d\u00e9velopperais un peu plus.<\/p>\n<p>Autrement dit, j&rsquo;ai pens\u00e9 que j&rsquo;exposerais l&rsquo;approche que j&rsquo;adopte lors de la cr\u00e9ation d&rsquo;\u00e9l\u00e9ments tels que les types de publication personnalis\u00e9s, les taxonomies, les m\u00e9ta-bo\u00eetes, etc.<\/p>\n<p>En r\u00e8gle g\u00e9n\u00e9rale, consid\u00e9rez cela comme une strat\u00e9gie que je suis pour d\u00e9velopper des aspects d&rsquo;un projet qui s&rsquo;interface directement avec WordPress mais qui peut n\u00e9cessiter quelques composants tels que\u00a0:<\/p>\n<ul>\n<li>des classes qui s&rsquo;enregistrent aupr\u00e8s de WordPress via divers hooks,<\/li>\n<li>classes qui n\u00e9cessitent des appels \u00e0 certaines API WordPress<\/li>\n<li>et les classes qui n\u00e9cessitent une vue personnalis\u00e9e.<\/li>\n<\/ul>\n<p>Bien s\u00fbr, tout ce qui s&rsquo;interface avec WordPress n&rsquo;aura pas besoin de tout ce qui pr\u00e9c\u00e8de (par exemple, un type de publication personnalis\u00e9 a-t-il besoin d&rsquo;une vue? Non. Mais une m\u00e9ta-bo\u00eete en a besoin.)<\/p>\n<h2>Organisation des types WordPress<\/h2>\n<p>Cela dit, je vais prendre un exemple plus complexe tel qu&rsquo;une m\u00e9ta-bo\u00eete, puis d\u00e9composer une mani\u00e8re dont je pense qu&rsquo;elle peut \u00eatre impl\u00e9ment\u00e9e. Je vais noter les choses que je pense n\u00e9cessaires et les choses qui sont facultatives.<\/p>\n<p>Et, comme je l&rsquo;ai dit, j&rsquo;utilise une m\u00e9ta-bo\u00eete comme exemple parce que j&rsquo;ai une r\u00e9f\u00e9rence pr\u00e9c\u00e9dente et cela implique le plus de travail alors qu&rsquo;autre chose comme une taxonomie personnalis\u00e9e peut ne pas n\u00e9cessiter tout (juste un sous-ensemble) des pi\u00e8ces .<\/p>\n<p>Cela dit, permettez-moi d&rsquo;exposer mon approche.<\/p>\n<h3>Nous avons besoin d&rsquo;abonn\u00e9s<\/h3>\n<p>J&rsquo;ai suffisamment parl\u00e9 de ce mod\u00e8le particulier \u00e0 un point o\u00f9 je vais simplement faire un <a href=\"https:\/\/en.wikipedia.org\/wiki\/Publish%E2%80%93subscribe_pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">lien vers une d\u00e9finition de celui-ci<\/a>. Si vous lisez cette page, vous connaissez probablement bien les diff\u00e9rents crochets et comment les utiliser dans WordPress.<\/p>\n<p>Photo par Alexander Andrews sur Unsplash<\/p>\n<p>Mais la raison pour laquelle je veux le mentionner est que plut\u00f4t que de penser \u00e0 connecter une fonction pour qu&rsquo;elle se d\u00e9clenche chaque fois que quelque chose se produit, je veux que vous pensiez \u00e0 un objet qui s&rsquo;abonne \u00e0 un \u00e9v\u00e9nement lorsqu&rsquo;il se produit.<\/p>\n<p>Cela signifie que nous aurons besoin d&rsquo;un type de classe d&rsquo;abonn\u00e9s.<\/p>\n<h3>Cours d&rsquo;API WordPress<\/h3>\n<p>Deuxi\u00e8mement, nous avons besoin de classes qui se chargent de s&rsquo;interfacer directement avec WordPress. Ce sont les classes qui appellent l&rsquo;API WordPress et enregistrent tout ce dont elles sont responsables.<\/p>\n<p>C&rsquo;est-\u00e0-dire qu&rsquo;ils vont peut-\u00eatre d\u00e9finir un type de publication personnalis\u00e9 ou peut-\u00eatre, comme indiqu\u00e9, ils vont d\u00e9finir une m\u00e9ta-bo\u00eete.<\/p>\n<h3>D\u00e9finition des vues<\/h3>\n<p>Enfin, il est important de noter que pour certaines fonctionnalit\u00e9s personnalis\u00e9es de la zone d&rsquo;administration de WordPress (ou m\u00eame des zones publiques), vous pouvez inclure une vue ou un mod\u00e8le ou une partie (je les appelle g\u00e9n\u00e9ralement vues) qui travail pour repr\u00e9senter les donn\u00e9es d&rsquo;une m\u00e9ta-bo\u00eete.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162654-61e741fa06c63.jpg\" 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-162654-61e741fa06c63.jpg\" alt=\"Organisation des types, des vues et des abonn\u00e9s WordPress\"><\/a><\/p>\n<p>Photo de Saketh Garuda sur Unsplash<\/p>\n<p>Parfois, ce sera simplement informatif. Parfois, cela n\u00e9cessitera qu&rsquo;il republie sur le serveur et s\u00e9rialise les donn\u00e9es. Bien que je pense que parler de ce dernier serait vraiment b\u00e9n\u00e9fique, cela sort du cadre actuel de cet article.<\/p>\n<p>Peut-\u00eatre dans un prochain billet.<\/p>\n<h2>Organisation des cours<\/h2>\n<p>Qu&rsquo;est-ce que tout cela a dit, \u00e0 quoi cela ressemblerait-il d&rsquo;exposer tout cela\u00a0? \u00c0 tout le moins, nous examinons\u00a0:<\/p>\n<ul>\n<li>un abonn\u00e9,<\/li>\n<li>un type WordPress,<\/li>\n<li>une vue<\/li>\n<\/ul>\n<p>Et, tout au plus, vous pourriez \u00eatre int\u00e9ress\u00e9 par la d\u00e9finition d&rsquo;interfaces ou de classes abstraites pour aider \u00e0 faire respecter un contrat entre les diff\u00e9rents types de WordPress. C&rsquo;est aussi un principe orient\u00e9 objet sain dont je parlerai dans un prochain article.<\/p>\n<p>Pour l&rsquo;instant, cependant, parlons de la fa\u00e7on de configurer chacun d&rsquo;entre eux.<\/p>\n<h3>L&rsquo;abonn\u00e9<\/h3>\n<p>En termes simples, l&rsquo;abonn\u00e9 est responsable d&rsquo;\u00e9couter chaque fois que WordPress d\u00e9clenche un \u00e9v\u00e9nement (publie un \u00e9v\u00e9nement). Et quand il s&rsquo;en aper\u00e7oit, il d\u00e9clenche une fonction qui lui est li\u00e9e.<\/p>\n<p>Ceci est g\u00e9n\u00e9ralement d\u00e9fini dans le mod\u00e8le de registre. Si vous n&rsquo;avez pas lu cet article, je le recommande, mais la configuration du code <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/274b69d0fc1e39aaf51384287240cea6#file-00-acme-meta-box-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">est assez simple\u00a0:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nclass AcmeMetaBoxSubscriber extends AbstractSubscriber\n{\n    public function __construct(string $hook)\n    {\n        parent::__construct($hook);\n    }\n\n    public function load()\n    {\n        (new AcmeMetaBox())-&gt;render();\n    }\n}\n<\/code><\/pre>\n<p>\u00c0 partir de l\u00e0, chaque fois que l&rsquo;\u00e9v\u00e9nement est d\u00e9clench\u00e9, la fonction se d\u00e9clenche. Voici le probl\u00e8me: la fonction doit faire partie d&rsquo;une certaine classe. Ainsi, la n\u00e9cessit\u00e9 du type WordPress<\/p>\n<h3>Le type WordPress<\/h3>\n<p>J&rsquo;aime consid\u00e9rer les types de choses qui s&rsquo;interfacent avec WordPress comme des types WordPress (tout comme nos langages de programmation ont des types natifs tels que des cha\u00eenes et des entiers). WordPress a des taxonomies, des m\u00e9ta-bo\u00eetes, des menus, etc.<\/p>\n<p>Pour que notre abonn\u00e9 fonctionne correctement, il doit \u00eatre mis au courant de notre type de WordPress. Conform\u00e9ment \u00e0 l&rsquo;exemple de la bo\u00eete de m\u00e9ta, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/274b69d0fc1e39aaf51384287240cea6#file-01-acme-meta-box-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">voici \u00e0 quoi cela peut ressembler\u00a0:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nclass AcmeMetaBox extends AbstractMetaBox\n{\n    public function render()\n    {\n        add_meta_box(\n            'acme-data',\n            'Acme Data',\n            [$this, 'display'],\n            $this-&gt;postType,\n            'normal',\n            'high'\n        );\n    }\n\n    public function display()\n    {\n        include_once plugin_dir_path(__FILE__).'Views\/acme-data.php';\n    }\n}\n<\/code><\/pre>\n<p>Ensuite, nous devons nous assurer que le registre est conscient de cette classe.<\/p>\n<h3>La vue<\/h3>\n<p>Enfin, pour une bo\u00eete m\u00e9ta, nous devons nous assurer qu&rsquo;il existe une vue qui affichera au moins des informations. La s\u00e9rialisation des informations, puis la mise \u00e0 jour de la vue pour l&rsquo;utilisateur est un peu diff\u00e9rente.<\/p>\n<p>Mais \u00e0 quoi pourrait ressembler une vue? <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/274b69d0fc1e39aaf51384287240cea6#file-02-acme-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Facile<\/a><\/strong> :<\/p>\n<pre><code>&lt;div class=\"acme-data-metabox\"&gt;\n  &lt;?php echo __('Acme Data', 'acme-meta-box'); ?&gt;\n  &lt;p class=\"description\"&gt;\n    This is the content of the metabox.\n  &lt;\/p&gt;\n&lt;\/div&gt;<\/code><\/pre>\n<p>C&rsquo;est juste un balisage de base qui rend les informations \u00e0 l&rsquo;utilisateur.<\/p>\n<h2>Tout lier ensemble<\/h2>\n<p>Chaque fois que je mets tout cela ensemble, j&rsquo;ai g\u00e9n\u00e9ralement une classe de plugin qui d\u00e9marre tout. Si un projet est volumineux, il peut y en avoir plusieurs, mais dans ce cas, je pense qu&rsquo;il est acceptable de montrer \u00e0 quoi il ressemble en utilisant une seule classe.<\/p>\n<p>Donc, tout d&rsquo;abord, la classe principale du plugin <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/274b69d0fc1e39aaf51384287240cea6#file-03-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ressemble \u00e0 ceci\u00a0:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nclass Plugin\n{\n    private $registry;\n\n    public function __construct(Registry $registry)\n    {\n        $this-&gt;registry = $registry;\n    }\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}\n<\/code><\/pre>\n<p>Et le bootstrap du plugin <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/274b69d0fc1e39aaf51384287240cea6#file-04-bootstrap-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ressemble \u00e0 ceci :<\/a><\/strong><\/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('acmeApiRegistry', function() use ($registry) {\n    return $registry;\n});\n\n\/\/ Register all of our objects with a basic registry.\n$registry-&gt;add('acmeMetaBoxSubscriber', new AcmeMetaBoxSubscriber('add_meta_boxes'));\n\n$plugin = new Plugin($registry);\n$plugin-&gt;start();<\/code><\/pre>\n<p>Et, \u00e0 partir de l\u00e0, tout le reste est mis en mouvement.<\/p>\n<h2>Qu&rsquo;en est-il des fonctionnalit\u00e9s plus avanc\u00e9es\u00a0?<\/h2>\n<p>Je soul\u00e8ve cette question car j&rsquo;en ai d\u00e9j\u00e0 parl\u00e9 un peu plus t\u00f4t dans le post. A savoir, j&rsquo;ai parl\u00e9 de :<\/p>\n<ol>\n<li>l&rsquo;id\u00e9e de poster des donn\u00e9es sur le serveur (et probablement de les relire),<\/li>\n<li>et j&rsquo;ai parl\u00e9 de l&rsquo;utilisation des interfaces.<\/li>\n<\/ol>\n<p>Ce sont deux choses qui, je pense, m\u00e9ritent d&rsquo;\u00eatre explor\u00e9es plus en d\u00e9tail. Mais avant de faire cela, jeter les bases de la fa\u00e7on dont j&rsquo;organise ces informations est qu&rsquo;elles sont construites d&rsquo;autant plus qu&rsquo;elles s&rsquo;appuient sur des publications pr\u00e9c\u00e9dentes telles que <strong><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/utilisation-du-modele-de-registre-dans-wordpress\/\" title=\"le mod\u00e8le de registre\">le mod\u00e8le de registre<\/a><\/strong> et l&rsquo;organisation de classes centr\u00e9es sur WordPress via <strong><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/un-guide-simple-pour-organiser-des-cours-centres-sur-wordpress\/\" title=\"des m\u00e9ta-bo\u00eetes\">des m\u00e9ta-bo\u00eetes<\/a><\/strong> \u00e9galement.<\/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;organisation des types WordPress, des vues, des abonn\u00e9s et d&rsquo;autres \u00e9l\u00e9ments connexes peut \u00eatre syst\u00e9matique. C&rsquo;est une bonne chose car cela nous donne un moyen reproductible de construire divers projets pour nos clients.<\/p>\n","protected":false},"author":1,"featured_media":162655,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[862],"tags":[1167],"class_list":["post-230706","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230706","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=230706"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230706\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/162655"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=230706"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=230706"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=230706"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}