{"id":231480,"date":"2022-12-24T18:32:00","date_gmt":"2022-12-24T15:32:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231480"},"modified":"2022-12-24T18:35:40","modified_gmt":"2022-12-24T15:35:40","slug":"un-exemple-general-du-modele-de-referentiel-dans-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/un-exemple-general-du-modele-de-referentiel-dans-wordpress\/","title":{"rendered":"Un exemple g\u00e9n\u00e9ral du mod\u00e8le de r\u00e9f\u00e9rentiel dans WordPress"},"content":{"rendered":"\n<p>D&rsquo;apr\u00e8s mon exp\u00e9rience, la fa\u00e7on dont nous interagissons d&rsquo;abord avec le mod\u00e8le de conception du r\u00e9f\u00e9rentiel influence souvent la fa\u00e7on dont nous pensons au mod\u00e8le. (Toutes les premi\u00e8res impressions sont des impressions durables, n&rsquo;est-ce pas\u00a0?)<\/p>\n<p>Le but de cet article est de montrer comment il peut \u00eatre impl\u00e9ment\u00e9 dans WordPress sp\u00e9cifiquement lors de l&rsquo;\u00e9criture de plugins orient\u00e9s objet pour lire des donn\u00e9es (l&rsquo;\u00e9criture de donn\u00e9es peut \u00eatre couverte dans un autre article), mais avant cela, j&rsquo;ai essay\u00e9 de penser \u00e0 quelques coh\u00e9rences entre les variations du mod\u00e8le que j&rsquo;ai vu.<\/p>\n<p>D&rsquo;une mani\u00e8re g\u00e9n\u00e9rale, voici ce que je pense qu&rsquo;un mod\u00e8le de r\u00e9f\u00e9rentiel devrait faire\u00a0:<\/p>\n<ul>\n<li>fournir un lieu unique pour lire les donn\u00e9es,<\/li>\n<li>r\u00e9sumer les d\u00e9tails de l&rsquo;acc\u00e8s aux donn\u00e9es,<\/li>\n<li>et avoir une interface coh\u00e9rente pour le faire.<\/li>\n<\/ul>\n<p>Cela signifie que tout ce que vous devez r\u00e9cup\u00e9rer \u00e0 partir de l&rsquo;application peut \u00eatre r\u00e9cup\u00e9r\u00e9 \u00e0 partir de la base de donn\u00e9es. Mais comment sa r\u00e9cup\u00e9ration peut \u00eatre consid\u00e9r\u00e9e comme une bo\u00eete noire. C&rsquo;est au d\u00e9veloppeur d&rsquo;impl\u00e9menter le mod\u00e8le.<\/p>\n<p>Et dans le cas de ceux qui lisent ce post, c&rsquo;est tr\u00e8s probablement nous.<\/p>\n<h2>Le mod\u00e8le de r\u00e9f\u00e9rentiel dans WordPress<\/h2>\n<p>Il y a quelques ann\u00e9es, <a href=\"https:\/\/wordpress.mediadoma.com\/fr\/lamorce-du-modele-de-referentiel\/\" title=\"j'ai \u00e9crit sur le mod\u00e8le de r\u00e9f\u00e9rentiel en\">j&rsquo;ai \u00e9crit sur le mod\u00e8le de r\u00e9f\u00e9rentiel en<\/a> donnant un exemple concret. C&rsquo;est toujours pertinent, mais le but de ce que je veux couvrir dans ce post est un peu diff\u00e9rent.<\/p>\n<p>Plut\u00f4t que de montrer une impl\u00e9mentation particuli\u00e8re ancr\u00e9e dans un exemple r\u00e9el, je pr\u00e9f\u00e8re expliquer comment nous pouvons utiliser ce mod\u00e8le dans notre travail quotidien.<\/p>\n<p>Les deux choses \u00e0 garder \u00e0 l&rsquo;esprit lors de la lecture de ceci sont:<\/p>\n<ol>\n<li>du point de vue de l&rsquo;utilisateur, le magasin de donn\u00e9es sous-jacent n&rsquo;a pas d&rsquo;importance,<\/li>\n<li>du point de vue du d\u00e9veloppeur, le mod\u00e8le nous permet de travailler avec plusieurs sources de donn\u00e9es et \u00e9galement de mod\u00e9liser un exemple de magasin de donn\u00e9es afin que nous puissions tester les donn\u00e9es \u00e0 l&rsquo;unit\u00e9.<\/li>\n<\/ol>\n<p>Lors de la mise en \u0153uvre du mod\u00e8le, la provenance des donn\u00e9es n&rsquo;a pas d&rsquo;importance. Au moins tant que vous \u00eates le d\u00e9veloppeur ou l&rsquo;objet client qui l&rsquo;appelle. Le magasin de donn\u00e9es peut \u00eatre une base de donn\u00e9es, un ensemble de fonctions API ou une combinaison des deux.<\/p>\n<p>Supposons, alors, que vous travaillez avec un type de publication personnalis\u00e9 pour les \u00e9v\u00e9nements et que vous travaillez \u00e9galement avec des m\u00e9tadonn\u00e9es de publication et des options li\u00e9es \u00e0 quelque chose comme des \u00e9v\u00e9nements.<\/p>\n<p>Vous pouvez faire quelque chose comme:<\/p>\n<ul>\n<li>obtenir le nom de l&rsquo;\u00e9v\u00e9nement,<\/li>\n<li>trouver des informations sur le lieu de l&rsquo;\u00e9v\u00e9nement,<\/li>\n<li>r\u00e9cup\u00e9rer le premier type de message et son statut class\u00e9s par son ID<\/li>\n<\/ul>\n<p>Toutes ces informations peuvent \u00eatre dispers\u00e9es \u00e0 diff\u00e9rents endroits et la mani\u00e8re dont elles sont r\u00e9cup\u00e9r\u00e9es peut varier.<\/p>\n<h3>1 Obtenir le nom de l&rsquo;\u00e9v\u00e9nement<\/h3>\n<p>Si nous travaillons avec un type de publication personnalis\u00e9 et que nous devons obtenir le nom de l&rsquo;\u00e9v\u00e9nement, nous pouvons utiliser l&rsquo;ID d&rsquo;une publication et <a href=\"https:\/\/gist.github.com\/tommcfarlin\/24e5bae859863d39512abc2af2169fbb#file-00-get-event-name-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l&rsquo;une des fonctions API de WordPress pour le faire<\/a>.<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Retrieves the title of the Event, a custom post type.\n *\n * @param  int    $eventId the ID of the event post type\n * @return string          the title of the post.\n *\/\npublic function getName(int $eventId): string\n{\n  return get_the_title($eventId);\n}<\/code><\/pre>\n<p>Il s&rsquo;agit d&rsquo;un cas dans lequel le magasin de donn\u00e9es est toujours abstrait de nous et, \u00e0 la place, exploite l&rsquo;API WordPress existante.<\/p>\n<h3>2 Obtenir le lieu de l&rsquo;\u00e9v\u00e9nement<\/h3>\n<p>Dans ce cas, nous pouvons supposer que l&#8217;emplacement de l&rsquo;\u00e9v\u00e9nement a \u00e9t\u00e9 saisi manuellement ou peut-\u00eatre r\u00e9cup\u00e9r\u00e9 par une API tierce. Et puisque l&#8217;emplacement est associ\u00e9 \u00e0 un \u00e9v\u00e9nement sp\u00e9cifique, il peut se trouver dans la table des m\u00e9tadonn\u00e9es de la publication.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160195-61e7073d3924f.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-160195-61e7073d3924f.png\" alt=\"Un exemple g\u00e9n\u00e9ral du mod\u00e8le de r\u00e9f\u00e9rentiel dans WordPress\"><\/a><\/p>\n<p>Encore une fois, nous pouvons le r\u00e9cup\u00e9rer en utilisant des fonctions API pr\u00e9existantes\u00a0; cependant, dans des situations comme celle-ci, il est logique d&rsquo;avoir une fonction d&rsquo;assistance car nous aurons probablement acc\u00e8s \u00e0 d&rsquo;autres m\u00e9tadonn\u00e9es \u00e9galement.<\/p>\n<p>Alors d&rsquo;abord, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/24e5bae859863d39512abc2af2169fbb#file-01-get-the-event-location-helper-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l&rsquo;assistant<\/a> :<\/p>\n<pre><code>&lt;?php \n\/**\n * A helper function for easily retrieving post meta data for a given Event.\n *\n * @param int    $id  the ID of the event\n * @param string $key the key for the post meta data for which we're retrieveing the data\n *\n * @return string the result of retrieiving the meta data\n *\/\nprivate function get(int $id, string $key): string\n{\n    return get_post_meta($id, $key, true);\n}<\/code><\/pre>\n<p>Et puis la fonction qui utilise le helper pour <a href=\"https:\/\/gist.github.com\/tommcfarlin\/24e5bae859863d39512abc2af2169fbb#file-02-get-the-event-location-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">obtenir l&#8217;emplacement<\/a> :<\/p>\n<pre><code>&lt;?php\n\/**\n * @param  int    $eventID the ID of the event\n * @return string          the name of the event of an empty string\n *\/\npublic function getLocationName($eventId): string\n{\n    return $this-&gt;get($eventId, 'ymc-event-location-name');\n}<\/code><\/pre>\n<p>Mais dans ces deux exemples, nous utilisons toujours des fonctions API existantes. Qu&rsquo;en est-il du cas o\u00f9 nous devons parler \u00e0 la base de donn\u00e9es\u00a0?<\/p>\n<h3>3 R\u00e9cup\u00e9ration d&rsquo;une URL de publication unique<\/h3>\n<p>Dans ce cas, nous allons communiquer directement avec la base de donn\u00e9es WordPress. Si vous \u00eates familier avec l&rsquo; objet <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$wpdb<\/a> et SQL, ce ne sera pas un gros probl\u00e8me.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160195-61e70741367bc.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-160195-61e70741367bc.png\" alt=\"Un exemple g\u00e9n\u00e9ral du mod\u00e8le de r\u00e9f\u00e9rentiel dans WordPress\"><\/a><\/p>\n<p>Si ce n&rsquo;est pas le cas, je vous recommande de lire la fonction <a href=\"https:\/\/codex.wordpress.org\/Data_Validation#Database\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">prepare<\/a> ainsi que la fonction <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb#Talking_to_the_Database:_The_wpdb_Class\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_results<\/a>.<\/p>\n<p>Compte tenu de cela, nous pouvons \u00e9crire une requ\u00eate qui fera ce qui suit\u00a0:<\/p>\n<ol>\n<li>saisir tous les messages o\u00f9 l&rsquo;ID correspond \u00e0 une certaine valeur, le type de message et le statut du message sont une certaine valeur, et nous ordonnerons les r\u00e9sultats par valeur croissante de l&rsquo;ID,<\/li>\n<li>Ensuite, nous utiliserons les r\u00e9sultats de cette requ\u00eate pour obtenir une valeur unique.<\/li>\n<\/ol>\n<p>Et <a href=\"https:\/\/gist.github.com\/tommcfarlin\/24e5bae859863d39512abc2af2169fbb#file-03-get-single-post-url-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">nous pouvons le faire<\/a> en acc\u00e9dant \u00e0 la base de donn\u00e9es et en \u00e9crivant une requ\u00eate imbriqu\u00e9e\u00a0:<\/p>\n<pre><code>&lt;?php\n\n\/**\n * @return string the URL to the event next to the current event.\n *\/\npublic function getNextEventUrl()\n{\n    global $wpdb;\n    $results = $wpdb-&gt;get_results(\n        $wpdb-&gt;prepare(\n            \"\n            SELECT *\n            FROM $wpdb-&gt;posts\n            WHERE ID &gt; (SELECT ID\n                FROM $wpdb-&gt;posts\n                WHERE ID = %d\n                AND post_type = '%s'\n                AND post_status = '%s'\n                ORDER BY ID ASC) AND post_type = '%s'\n            AND post_status = '%s'\n            ORDER BY ID ASC\n            LIMIT 1\n        \",\n            get_the_ID(),\n            'ymc-events',\n            'publish',\n            'ymc-events',\n            'publish') );\n\n  $result = (isset($result[0]))? $result[0]: '';\n\n  return $result;\n}<\/code><\/pre>\n<p>Et puis tout cela peut \u00eatre encapsul\u00e9 dans une seule classe qui serait, par exemple, le Event Repository (ou <strong>EventRepository<\/strong> ).<\/p>\n<p>J&rsquo;en aurai plus \u00e0 ce sujet dans un post de suivi, cependant. \u00c0 savoir, comment g\u00e9rer d\u00e9terminer quelles fonctions appartiennent o\u00f9, les conventions de nommage et comment g\u00e9rer la persistance si vous souhaitez \u00e9galement introduire cela dans votre r\u00e9f\u00e9rentiel.<\/p>\n<h2>R\u00e9f\u00e9rentiel d\u00e9fini<\/h2>\n<p>Avant toute chose, gardez ceci \u00e0 l&rsquo;esprit :<\/p>\n<p>Le mod\u00e8le de r\u00e9f\u00e9rentiel masque la mani\u00e8re dont les donn\u00e9es sont r\u00e9cup\u00e9r\u00e9es, mais fournit un moyen coh\u00e9rent de r\u00e9cup\u00e9rer les donn\u00e9es auxquelles il est associ\u00e9.<\/p>\n<p>Certains peuvent \u00e9galement ajouter comment il peut \u00eatre r\u00e9cup\u00e9r\u00e9 <strong>et<\/strong> comment il peut \u00eatre \u00e9crit, mais j&rsquo;en parlerai peut-\u00eatre dans un autre 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>Le mod\u00e8le de r\u00e9f\u00e9rentiel fournit une mani\u00e8re coh\u00e9rente de r\u00e9cup\u00e9rer les donn\u00e9es. Voici comment cela peut \u00eatre impl\u00e9ment\u00e9 dans un plugin WordPress.<\/p>\n","protected":false},"author":1,"featured_media":236255,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,717,862],"tags":[1167],"class_list":["post-231480","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231480","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=231480"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231480\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/236255"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=231480"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=231480"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=231480"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}