{"id":229420,"date":"2022-11-03T12:53:00","date_gmt":"2022-11-03T09:53:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229420"},"modified":"2022-11-09T07:03:07","modified_gmt":"2022-11-09T04:03:07","slug":"prototypage-rapide-prototyper-pour-coder-partie-1","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/prototypage-rapide-prototyper-pour-coder-partie-1\/","title":{"rendered":"Prototypage rapide : Prototyper pour coder, partie 1"},"content":{"rendered":"\n<p>En ce qui concerne les prototypes rapides et WordPress, nous avons fait deux choses jusqu&rsquo;\u00e0 pr\u00e9sent\u00a0:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/prototypage-rapide-avec-wordpress-du-concept-au-plugin\/\" title=\"pr\u00e9vu le plugin\" >pr\u00e9vu le plugin<\/a> ,<\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/prototypage-rapide-avec-wordpress-analyse-de-concept\/\" title=\"esquiss\u00e9 un sch\u00e9ma de la fa\u00e7on dont le code peut \u00eatre organis\u00e9\" >esquiss\u00e9 un sch\u00e9ma de la fa\u00e7on dont le code peut \u00eatre organis\u00e9<\/a><\/li>\n<\/ol>\n<p>\u00c0 ce stade, nous avons fait suffisamment de travail pour justifier de commencer \u00e0 refactoriser notre code. Autrement dit, nous allons commencer \u00e0 convertir le prototype en code. Mais c&rsquo;est quelque chose qui va devoir \u00eatre fait en deux phases.<\/p>\n<p>Dans un premier temps, nous allons simplement introduire des classes qui repr\u00e9sentent les diagrammes du post pr\u00e9c\u00e9dent et qui encapsulent la responsabilit\u00e9 de chaque projet.<\/p>\n<p>Apr\u00e8s cela, nous verrons comment organiser le code en espaces de noms et packages. Avant de pouvoir le faire, nous devons nous assurer que le code est orient\u00e9 objet et reste fonctionnel. C&rsquo;est donc ce qui va se passer dans ce post.<\/p>\n<h2>Prototyper \u00e0 coder<\/h2>\n<p>Si vous avez lu les messages pr\u00e9c\u00e9dents, notez que je pr\u00e9vois de suivre l&rsquo;organisation que j&rsquo;ai esquiss\u00e9e dans le dernier message. Vous n&rsquo;\u00eates pas oblig\u00e9 de suivre cette conception particuli\u00e8re, bien s\u00fbr.<\/p>\n<h3>Un mot sur le contr\u00f4le des sources<\/h3>\n<p>Si vous utilisez le contr\u00f4le de source, c&rsquo;est l\u00e0 que je recommande de cr\u00e9er une <a href=\"https:\/\/git-scm.com\/book\/en\/v1\/Git-Branching\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">branche<\/a> hors de la branche master (si vous utilisez Git) afin que vous puissiez faire votre travail sans nuire \u00e0 la version stable du code.<\/p>\n<p>C&rsquo;est un peu au-del\u00e0 de la port\u00e9e de la s\u00e9rie, donc si vous n&rsquo;utilisez pas le contr\u00f4le de source, pas de soucis. Si c&rsquo;est le cas, j&rsquo;opte pour <strong>d\u00e9velopper<\/strong> comme nom de cette branche. Je le fusionnerai dans <strong>master\u00a0<\/strong> une fois que je serai s\u00fbr qu&rsquo;il est fonctionnel.<\/p>\n<h3>Code d&rsquo;\u00e9criture<\/h3>\n<p>Selon le travail esquiss\u00e9 hier, je vais cr\u00e9er deux classes :<\/p>\n<ol>\n<li>la classe meta box,<\/li>\n<li>la classe d&rsquo;affichage de la bo\u00eete m\u00e9ta.<\/li>\n<\/ol>\n<p>Il y aura une certaine r\u00e9utilisation du code \u00e0 partir de ce que nous avons d\u00e9j\u00e0 vu, comme vous le verrez dans le code suivant.<\/p>\n<h4>Le code<\/h4>\n<p>Tout d&rsquo;abord, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-00-class-meta-box-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">notre meta box<\/a> :<\/p>\n<pre><code>&lt;?php\n\/**\n * Registers the Meta Box with WordPress.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\n\n\/**\n * Registers the Meta Box with WordPress. Defines the ID, title, display function,\n * and the post type on which it will live.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\nclass Meta_Box {\n\n    \/**\n     * A reference to the class that will display the contents in the meta box.\n     *\n     * @access private\n     * @var    Meta_Box_Display\n     *\/\n    private $meta_box_display;\n\n    \/**\n     * Instantiates the class by setting its property equal to a reference to its display.\n     *\/\n    public function __construct() {\n        $this-&gt;meta_box_display = new Meta_Box_Display();\n    }\n\n    \/**\n     * The function responsible for hooking into the WordPress API.\n     *\/\n    public function init() {\n\n        add_meta_box(\n            'three-recent-posts',\n            'Three Recent Posts',\n            array( $this-&gt;meta_box_display, 'display' ),\n            'post',\n            'side'\n        );\n    }\n}\n<\/code><\/pre>\n<p>Et ensuite, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-01-class-meta-box-display-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">notre affichage<\/a> :<\/p>\n<pre><code>&lt;?php\n\/**\n * Defines the display for the meta box.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\n\n\/**\n * Defines the display for the meta box that will render the content in the\n * context of its meta box.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\nclass Meta_Box_Display {\n\n    \/**\n     * A reference to the class that will display the contents in the meta box.\n     *\n     * @access private\n     * @var    Post_Messenger\n     *\/\n    private $messenger;\n\n    \/**\n     * Instantiates the object by setting a property equal to that of the class\n     * responsible for rendering the messages from the post query.\n     *\/\n    public function __construct() {\n        $this-&gt;messenger = new Post_Messenger( $this );\n    }\n\n    \/**\n     * If there are posts to display, renders them in the metabox. Otherwise, displays\n     * a note that there are no posts to display.\n     *\/\n    public function display( $message) {\n        $this-&gt;messenger-&gt;get_message();\n    }\n}\n<\/code><\/pre>\n<p>Que dans le code de la m\u00e9ta-bo\u00eete, dans le code de la m\u00e9ta-bo\u00eete, nous instancions explicitement l&rsquo;affichage afin que nous puissions appeler sa m\u00e9thode d&rsquo;affichage en cas de besoin.<\/p>\n<p>Une autre alternative consisterait \u00e0 instancier les deux objets s\u00e9par\u00e9ment, puis \u00e0 injecter l&rsquo;affichage dans la m\u00e9ta-bo\u00eete via une injection de constructeur ou quelque chose de similaire. Cela devrait \u00eatre fait dans une classe tierce.<\/p>\n<p>Les avantages de cela viennent du d\u00e9couplage un peu plus des deux classes. Peut-\u00eatre verrons-nous comment proc\u00e9der dans le prochain article.<\/p>\n<p>Apr\u00e8s cela, nous devons continuer et d\u00e9finir la classe responsable de l&rsquo;affichage des messages dans le contexte de l&rsquo;affichage de la Meta Box. C&rsquo;est ce que nous appellerons le <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-02-class-post-messenger-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Post Messenger<\/a> :<\/p>\n<pre><code>&lt;?php\n\/**\n * Display content for the meta box when requested.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\n\n\/**\n * Retrieves information from the class responsible for querying the database and\n * renders it in the context of our meta box when called via the Meta Box Display.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\nclass Post_Messenger {\n\n    \/**\n     * A reference to the query resonsible for retrieving post information from\n     * the database.\n     *\n     * @access private\n     * @var    WP_Query\n     *\/\n    private $query;\n\n    \/**\n     * A reference to the message that's displayed in the view of the\n     * meta box.\n     *\n     * @access private\n     *\/\n    private $message;\n\n    \/**\n     * Instantiates the class by setting a reference to the query.\n     *\/\n    public function __construct() {\n        $this-&gt;query = new Post_Query();\n    }\n\n    \/**\n     * Retrieves the content to be displayed in the meta box.\n     *\/\n    public function get_message() {\n\n        $this-&gt;get_description();\n\n        if ($this-&gt;query-&gt;has_posts()) {\n            $this-&gt;get_post_message();\n        } else {\n            $this-&gt;get_no_posts_message();\n        }\n    }\n\n    \/**\n     * Displays the description of the content of the meta box.\n     *\n     * @access private\n     *\/\n    private function get_post_message() {\n        include_once 'post-list.php';\n    }\n\n    \/**\n     * Displays the description of the content of the meta box.\n     *\n     * @access private\n     *\/\n    private function get_description() {\n        include_once 'message-description.php';\n    }\n\n    \/**\n     * Displays a message of there are no recent posts.\n     *\n     * @access private\n     *\/\n    private function get_no_posts_message() {\n        include_once 'no-post-list.php';\n    }\n}\n<\/code><\/pre>\n<p>Notez ici que Post Messenger fait \u00e9galement r\u00e9f\u00e9rence \u00e0 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-03-post-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Post Query<\/a>. Il s&rsquo;agit de la classe o\u00f9 se produit la communication avec la base de donn\u00e9es. J&rsquo;ai \u00e9galement inclus quelques fonctions d&rsquo;assistance pour rendre le code de vue un peu plus simple, comme nous le verrons dans un instant.<\/p>\n<pre><code>&lt;?php\n\/**\n * Queries the database for three most recent posts.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\n\n\/**\n * Queries the database for three most recent posts. Returns the query to the\n * caller so that it can be interrogates for posts or not.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\nclass Post_Query {\n\n    \/**\n     * A reference to the WP_Query this class wraps.\n     *\n     * @access private\n     * @var    WP_Query\n     *\/\n    private $query;\n\n    \/**\n     * Instantiates the class by preparing instance data and executing the\n     * query so the display can render the contents.\n     *\/\n    public function __construct() {\n\n        $this-&gt;query = null;\n        $this-&gt;get_posts();\n    }\n\n    \/**\n     * Executes the query for returning the post recent posts ordered by date.\n     *\n     * @access private\n     *\/\n    private function get_posts() {\n\n        $args = array(\n            'post_type'   =&gt; 'post',\n            'post_status' =&gt; 'publish',\n            'orderby'     =&gt; 'date',\n            'order'       =&gt; 'desc',\n        );\n        $this-&gt;query = new WP_Query( $args );\n\n        return $this-&gt;query;\n    }\n\n    \/**\n     * A helper function to determine if the query has any posts.\n     *\/\n    public function has_posts() {\n        return! $this-&gt;query-&gt;have_posts();\n    }\n\n    \/**\n     * A helper function for retrieving the next post in the list of\n     * posts\n     *\/\n    public function the_post() {\n        return $this-&gt;query-&gt;the_post();\n    }\n}\n<\/code><\/pre>\n<p>Et c&rsquo;est tout pour les classes de base. Bien s\u00fbr, nous devons encore parler des points de vue.<\/p>\n<h4>Les vues<\/h4>\n<p>Les vues sont responsables du rendu du HTML dans le contexte de la m\u00e9ta-bo\u00eete. Je n&rsquo;aime pas \u00e9crire du HTML dans le contexte de PHP (je n&rsquo;aime pas non plus m\u00e9langer PHP dans le contexte de HTML, mais c&rsquo;est in\u00e9vitable dans ce projet).<\/p>\n<p>Il existe d&rsquo;excellents projets de mod\u00e8les pour faciliter cela, mais je m&rsquo;\u00e9loigne du sujet. Quoi qu&rsquo;il en soit, vous remarquerez que dans le\u00a0 fichier <strong>post-list.php<\/strong>, il y a des r\u00e9f\u00e9rences aux fonctions d&rsquo;assistance dans la classe Post Query. C&rsquo;est pour m&rsquo;assurer que je n&rsquo;expose pas trop de propri\u00e9t\u00e9s et que je ne viole pas la loi de D\u00e9m\u00e9ter.<\/p>\n<p>Voyons d&rsquo;abord ce fichier car <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-04-post-list-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">c&rsquo;est le plus compliqu\u00e9<\/a> :<\/p>\n<pre><code>&lt;ol&gt;\n    &lt;?php while ($this-&gt;query-&gt;has_posts()) {  ?&gt;\n        &lt;?php $this-&gt;query-&gt;the_post(); ?&gt;\n        &lt;li&gt;\n            &lt;a href=\"&lt;?php get_the_permalink(); ?&gt;\" target=\"_blank\"&gt;\n                &lt;?php echo get_the_title(); ?&gt;\n            &lt;\/a&gt;\n        &lt;\/li&gt;\n    &lt;?php } ?&gt;\n&lt;\/ol&gt;<\/code><\/pre>\n<p>Il ressemble \u00e0 ce code WordPress standard, mais rappelez-vous que puisque ce fichier est appel\u00e9 dans le <strong>Post Messenger<\/strong>, il va faire r\u00e9f\u00e9rence \u00e0 la requ\u00eate en tant que requ\u00eate envelopp\u00e9e par cette classe.<\/p>\n<p>Les deux derniers fichiers sont assez simples. L&rsquo;un d&rsquo;eux fournit <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-06-message-description-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">une description<\/a> :<\/p>\n<pre><code>&lt;p&gt;\n    &lt;span class=\"description\"&gt;\n        Displays up to the three most recent posts.\n    &lt;\/span&gt;&lt;!-- .description --&gt;\n&lt;\/p&gt;<\/code><\/pre>\n<p>L&rsquo;autre fournit un message lorsqu&rsquo;il n&rsquo;y a <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-07-no-post-list-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pas de messages<\/a>\u00a0:<\/p>\n<pre><code>&lt;p&gt;There are no recent posts.&lt;\/p&gt;<\/code><\/pre>\n<p>En dehors de cela, la fonctionnalit\u00e9 de base est termin\u00e9e.<\/p>\n<h3>Amorcer le plugin<\/h3>\n<p>La derni\u00e8re chose que nous devons faire est de d\u00e9marrer le plugin. Pour ce faire, nous modifions le code dans le fichier principal du plugin pour qu&rsquo;il ressemble <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-08-three-recent-posts-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e0 ceci<\/a> :<\/p>\n<pre><code>&lt;?php\n\/**\n * Three Recent Posts\n *\n * @package     TRP\n * @author      Tom McFarlin\n * @copyright   2017 Tom McFarlin\n * @license     MIT\n *\n * @wordpress-plugin\n * Plugin Name: Three Recent Posts\n * Plugin URI:  https:\/\/tommcfarlin.com\/three-recent-posts\/\n * Description: Displays the three mot recent posts in your post editor screen.\n * Version:     0.2.0\n * Author:      Tom McFarlin\n * Author URI:  https:\/\/tommcfarlin.com\n * Text Domain: three-recent-posts\n * License:     GPL\n * License URI: http:\/\/www.gnu.org\/licenses\/gpl-3.0.txt\n *\/\n\ninclude 'class-meta-box.php';\ninclude 'class-meta-box-display.php';\ninclude 'class-post-messenger.php';\ninclude 'class-post-query.php';\n\nadd_action( 'add_meta_boxes', 'trp_start' );\n\/**\n * Starts the plugin.\n *\/\nfunction trp_start() {\n\n    $meta_box = new Meta_Box();\n    $meta_box-&gt;init();\n}\n<\/code><\/pre>\n<p>Cela s&rsquo;accrochera \u00e0 WordPress, instanciera notre plugin, puis le mettra en mouvement. Lorsque vous l&rsquo;ex\u00e9cutez dans votre installation de WordPress, il devrait ressembler exactement \u00e0 ce qu&rsquo;il \u00e9tait lors de la premi\u00e8re version.<\/p>\n<p>La seule diff\u00e9rence est que nous avons maintenant des choses organis\u00e9es en classes plut\u00f4t qu&rsquo;en fonctions individuelles.<\/p>\n<h2>Remarques<\/h2>\n<p>Tout d&rsquo;abord, il existe ici des opportunit\u00e9s de refactorisation qui r\u00e9duiraient encore plus le d\u00e9couplage (comme diff\u00e9rents types d&rsquo; <a href=\"https:\/\/en.wikipedia.org\/wiki\/Dependency_injection\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">injection de d\u00e9pendances<\/a>, etc.), mais le but de cette s\u00e9rie n&rsquo;est pas de couvrir cela.<\/p>\n<p>Au lieu de cela, il s&rsquo;agit de prendre l&rsquo;id\u00e9e de voir des plugins \u00e9crits par de nombreuses fonctions proc\u00e9durales, puis de les diviser en classes plus conceptuelles qui encapsulent leurs responsabilit\u00e9s.<\/p>\n<p>Deuxi\u00e8mement, si vous examinez le code source dans le r\u00e9f\u00e9rentiel de cette version du projet, vous verrez que j&rsquo;ai \u00e9galement introduit composer.json. C&rsquo;est pour que je puisse tirer parti de <a href=\"https:\/\/tommcfarlin.com\/php-codesniffer-with-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP CodeSniffer<\/a> et des <a href=\"https:\/\/tommcfarlin.com\/following-the-wordpress-coding-standards\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">normes de codage WordPress<\/a> lors de l&rsquo;\u00e9criture de code.<\/p>\n<p>Dans la derni\u00e8re partie de la s\u00e9rie, nous passerons en revue l&rsquo; espacement des <a href=\"https:\/\/wordpress.mediadoma.com\/fr\/espaces-de-noms-et-chargement-automatique-dans-wordpress\/\" title=\"noms\">noms<\/a> et r\u00e9organiserons les fichiers. Si le temps le permet, nous inclurons un chargeur automatique afin que nous n&rsquo;ayons pas \u00e0 inclure manuellement des fichiers en haut de notre fichier de plugin.<\/p>\n<p>Enfin, j&rsquo;ai fusionn\u00e9 ce code <a href=\"https:\/\/github.com\/tommcfarlin\/three-recent-posts\/tree\/0.2.1\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dans master et l&rsquo;ai marqu\u00e9 comme 0.2.1<\/a> (car j&rsquo;ai d\u00fb faire un petit correctif) car c&rsquo;est encore un travail en cours.<\/p>\n<h2>Messages de la s\u00e9rie<\/h2>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/prototypage-rapide-avec-wordpress-du-concept-au-plugin\/\" title=\"Prototypage rapide avec WordPress\u00a0: du concept au plugin\">Prototypage rapide avec WordPress\u00a0: du concept au plugin<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/prototypage-rapide-avec-wordpress-analyse-de-concept\/\" title=\"Prototypage rapide avec WordPress: analyse de concept\">Prototypage rapide avec WordPress: analyse de concept<\/a><\/li>\n<li><a href=\"https:\/\/tommcfarlin.com\/prototype-to-code-1\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Prototypage rapide: Prototyper pour coder, partie 1<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/prototypage-rapide-prototyper-pour-coder-partie-2\/\" title=\"Prototypage rapide: Prototyper pour coder, partie 2\">Prototypage rapide: Prototyper pour coder, partie 2<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/prototypage-rapide-presentation-du-chargement-automatique\/\" title=\"Prototypage rapide\u00a0: pr\u00e9sentation du chargement automatique\">Prototypage rapide\u00a0: pr\u00e9sentation du chargement automatique<\/a><\/li>\n<\/ol>\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>C&rsquo;est l\u00e0 que nous commen\u00e7ons \u00e0 convertir notre prototype en code. Il devrait montrer pourquoi il est utile de r\u00e9fl\u00e9chir \u00e0 un projet.<\/p>\n","protected":false},"author":1,"featured_media":223902,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[915,717,841],"tags":[1167],"class_list":["post-229420","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-autre","category-developpeur","category-tutoriels","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/229420","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=229420"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/229420\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/223902"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=229420"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=229420"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=229420"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}