{"id":230898,"date":"2022-12-17T15:05:00","date_gmt":"2022-12-17T12:05:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230898"},"modified":"2022-12-17T15:09:04","modified_gmt":"2022-12-17T12:09:04","slug":"widgets-de-wordpress-refactorizacion-parte-3","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/widgets-de-wordpress-refactorizacion-parte-3\/","title":{"rendered":"Widgets de WordPress: Refactorizaci\u00f3n, Parte 3"},"content":{"rendered":"\n<p>En t\u00e9rminos de actualizaci\u00f3n de WordPress Widget Boilerplate (todo lo cual se rastrea en la rama de <a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/tree\/develop\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">desarrollo<\/a> ), hemos recorrido un largo camino en t\u00e9rminos de refactorizaci\u00f3n de c\u00f3mo est\u00e1 organizado.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161272-61e71e5eea22f.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-161272-61e71e5eea22f.png\" alt=\"Widgets de WordPress: Refactorizaci\u00f3n, Parte 3\"><\/a><\/p>\n<p>Hasta ahora, hemos:<\/p>\n<ul>\n<li>observ\u00f3 c\u00f3mo <a href=\"https:\/\/wordpress.mediadoma.com\/es\/widgets-de-wordpress-un-enfoque-orientado-a-objetos\/\" title=\"la API de widgets de WordPress proporciona un ejemplo\">la API de widgets de WordPress proporciona un ejemplo<\/a> de programaci\u00f3n orientada a objetos,<\/li>\n<li>c\u00f3mo podemos usar esta API <a href=\"https:\/\/wordpress.mediadoma.com\/es\/widgets-de-wordpress-detecta-la-programacion-orientada-a-objetos\/\" title=\"para determinar la programaci\u00f3n orientada a objetos\">para determinar la programaci\u00f3n orientada a objetos<\/a> en otras \u00e1reas de WordPress,<\/li>\n<li>herramientas instaladas <a href=\"https:\/\/wordpress.mediadoma.com\/es\/widgets-de-wordpress-comenzando-con-los-estandares\/\" title=\"para ayudarnos a evaluar la calidad\">para ayudarnos a evaluar la calidad<\/a> del c\u00f3digo,<\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/es\/widgets-de-wordpress-refactorizacion-parte-1\/\" title=\"encontr\u00f3 errores que existen actualmente en el c\u00f3digo\">encontr\u00f3 errores que existen actualmente en el c\u00f3digo<\/a> en t\u00e9rminos de est\u00e1ndares de programaci\u00f3n modernos,<\/li>\n<li>y comenz\u00f3 a reorganizar el c\u00f3digo base para que se ajuste a <a href=\"https:\/\/wordpress.mediadoma.com\/es\/widgets-de-wordpress-refactorizacion-parte-2\/\" title=\"las pr\u00e1cticas m\u00e1s modernas\">las pr\u00e1cticas m\u00e1s modernas<\/a>.<\/li>\n<\/ul>\n<p>Ahora estamos listos para comenzar a refactorizar este c\u00f3digo de una manera mucho m\u00e1s orientada a objetos.<\/p>\n<p>Entonces, si a\u00fan tiene que ponerse al d\u00eda con las publicaciones anteriores (cualquiera de ellas, en realidad), le recomiendo que lo haga porque llevar\u00e1 un poco de tiempo actualizar esto. Hay mucho c\u00f3digo para escribir una explicaci\u00f3n.<\/p>\n<p>Empecemos.<\/p>\n<h2>El modelo de widget de WordPress: refactorizaci\u00f3n, parte 3<\/h2>\n<p>Podr\u00eda decirse que el mayor problema con Boilerplate es que todo est\u00e1 encapsulado dentro de una sola clase.<\/p>\n<p>Claro, hay algunas cosas buenas como mantener nuestras vistas separadas de la l\u00f3gica del lado del servidor, pero eso es todo.<\/p>\n<p>Otros problemas que existen con solo mirar el c\u00f3digo incluyen:<\/p>\n<ul>\n<li>agregando acciones y filtros en el constructor,<\/li>\n<li>tener m\u00e9todos para hacer m\u00e1s de una cosa,<\/li>\n<li>no tener clases responsables de implementar cosas como registrar dependencias,<\/li>\n<li>y as\u00ed.<\/li>\n<\/ul>\n<p>En esta publicaci\u00f3n, vamos a comenzar el proceso de creaci\u00f3n de abstracciones que eventualmente implementaremos para romper la naturaleza de tipo dios del Boilerplate tal como est\u00e1.<\/p>\n<p>Esto se dividir\u00e1 en varias publicaciones para que pueda brindar una explicaci\u00f3n s\u00f3lida de por qu\u00e9 estamos haciendo ciertas cosas y explicar los ejemplos detr\u00e1s de esto.<\/p>\n<p>Si lo hago de otra manera, la serie omite demasiada informaci\u00f3n valiosa que es aplicable a otras pr\u00e1cticas de programaci\u00f3n orientada a objetos.<\/p>\n<h3>\u00bfQu\u00e9 es un Suscriptor?<\/h3>\n<p>El sistema de ganchos de WordPress, es decir, las acciones y los filtros que tenemos disponibles, se basan en un patr\u00f3n de dise\u00f1o basado en eventos. Esto significa que cada vez que sucede algo, un evento, WordPress activar\u00e1 cualquier otro c\u00f3digo que se haya suscrito a dicho evento.<\/p>\n<p>Entonces, cuando registramos una funci\u00f3n con un gancho, nos estamos <strong>suscribiendo<\/strong> al <strong>evento<\/strong>. Con ese fin, soy fan\u00e1tico de crear suscriptores para cualquier gancho que necesitemos.<\/p>\n<p>Adem\u00e1s de eso, los suscriptores generalmente siguen un formato consistente. Esto significa que es muy f\u00e1cil crear una clase abstracta que implemente algunas de las funciones coherentes y luego permita que la clase que implementa la clase abstracta se centre \u00fanicamente en la l\u00f3gica empresarial.<\/p>\n<p>Una de las formas m\u00e1s f\u00e1ciles de demostrar esto es a trav\u00e9s de la suscripci\u00f3n de archivos CSS y archivos JavaScript porque son dos de las cosas m\u00e1s comunes que usamos cuando creamos complementos.<\/p>\n<h3>Crear una clase abstracta<\/h3>\n<p>Antes de implementar la clase abstracta, expongamos exactamente qu\u00e9 es lo que vamos a hacer para crear esto.<\/p>\n<ol>\n<li>Necesitamos una propiedad que represente el evento al que nos estamos suscribiendo.<\/li>\n<li>Necesitamos una funci\u00f3n para activar cada vez que WordPress activa el gancho. Otra forma de pensar en esto es que necesitamos una funci\u00f3n para implementar cada vez que WordPress active una acci\u00f3n o filtro determinado.<\/li>\n<li>Necesitamos clases para implementar la abstracci\u00f3n.<\/li>\n<\/ol>\n<p>Primero, definamos clases abstractas. <a href=\"https:\/\/secure.php.net\/manual\/en\/language.oop5.abstract.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Directamente del manual de PHP<\/a>, leemos:<\/p>\n<blockquote>\n<p>Las clases definidas como abstractas no se pueden instanciar, y cualquier clase que contenga al menos un m\u00e9todo abstracto tambi\u00e9n debe ser abstracta. Los m\u00e9todos definidos como abstractos simplemente declaran la firma del m\u00e9todo; no pueden definir la implementaci\u00f3n.<\/p>\n<\/blockquote>\n<p>En resumen, esto significa que en realidad no podemos crear una instancia de una clase abstracta. Solo podemos instanciar clases que definen la implementaci\u00f3n.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161272-61e71e62f02d2.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-161272-61e71e62f02d2.png\" alt=\"Widgets de WordPress: Refactorizaci\u00f3n, Parte 3\"><\/a><\/p>\n<p>Sin embargo, esto no significa que la clase abstracta no pueda implementar cosas concretas (como la definici\u00f3n de un gancho). Pero significa que hay ciertos m\u00e9todos que no tienen implementaci\u00f3n.<\/p>\n<p>De lo contrario, nos quedamos con una clase b\u00e1sica.<\/p>\n<p>\u00bfTener sentido? Vamos a ver.<\/p>\n<h3>Crear una clase abstracta<\/h3>\n<p>Para esta publicaci\u00f3n, vamos a crear una clase abstracta espec\u00edficamente para archivos CSS y JavaScript.<\/p>\n<p>Recuerde, debido a que esta es una clase abstracta, los suscriptores concretos pueden llamarse de alguna manera que identifique lo que hacen (es decir, pueden llamarse a s\u00ed mismos de cualquier forma que represente su prop\u00f3sito). Y llegaremos a eso.<\/p>\n<p>Pero primero, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9cf10f4aadbe54f2fc2e87b619a33bcc#file-00-abstract-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la clase abstracta.<\/a> Compartir\u00e9 el c\u00f3digo y luego explicar\u00e9 exactamente qu\u00e9 est\u00e1 pasando con \u00e9l:<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of the WordPress Widget Boilerplate\n *\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 WordPressWidgetBoilerplateSubscriber;\n\n\/**\n * An abstract implementation of a subscriber that requires a hook and the ability to\n * start the class.\n *\/\nabstract class AbstractSubscriber\n{\n    \/**\n     * @var string a reference to the hook to which the subscriber should be registered\n     *\/\n    protected $hook;\n\n    \/**\n     * @param string $hook the hook to which the subscriber is registered\n     *\/\n    public function __construct(string $hook)\n    {\n        $this-&gt;hook = $hook;\n    }\n\n    \/**\n     * @return string the hook to which the subscriber is registered\n     *\/\n    public function getHook(): string\n    {\n        return $this-&gt;hook;\n    }\n\n    \/**\n     * Implements the domain logic for the concrete class implementating this subcriber.\n     *\/\n    abstract public function load();\n}\n<\/code><\/pre>\n<ol>\n<li>Observe que la propiedad que hemos creado est\u00e1 <strong>protegida<\/strong>. Esto es para que las clases de implementaci\u00f3n puedan acceder a \u00e9l, pero nada fuera de \u00e9l no puede.<\/li>\n<li>Cre\u00e9 una funci\u00f3n para recuperar el gancho que se har\u00e1 evidente m\u00e1s adelante. Por lo general, odio implementar una funcionalidad que no es inmediatamente obvia, pero esto es algo que es importante dado el lugar al que nos dirigimos.<\/li>\n<li>Hay una funci\u00f3n abstracta llamada <strong>load<\/strong>. Aqu\u00ed es donde cualquier clase que implemente esta funci\u00f3n alojar\u00e1 su l\u00f3gica de negocio, como veremos en un momento.<\/li>\n<li>Me gusta documentar el prop\u00f3sito de las funciones cuando sea necesario para que est\u00e9n en un solo lugar y luego deje que las clases de implementaci\u00f3n proporcionen la documentaci\u00f3n que necesitan para su implementaci\u00f3n. Ver\u00e1s esto moment\u00e1neamente, tambi\u00e9n.<\/li>\n<\/ol>\n<p>Ahora que tenemos la clase abstracta en su lugar, lo \u00faltimo que debemos hacer es asegurarnos de que est\u00e9 ubicada en el directorio adecuado y con el espacio de nombres. Si ha seguido desde la publicaci\u00f3n anterior, es probable que haya podido adivinar d\u00f3nde residir\u00e1 en funci\u00f3n del espacio de nombres en el c\u00f3digo.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161272-61e71e66e7d4a.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-161272-61e71e66e7d4a.png\" alt=\"Widgets de WordPress: Refactorizaci\u00f3n, Parte 3\"><\/a><\/p>\n<p>Y si no, no te preocupes. Descubrir los espacios de nombres y lo que no puede llevar un poco de tiempo. Entonces, a trav\u00e9s de estas publicaciones de membres\u00eda y estos ejemplos, espero que se aclare con el tiempo.<\/p>\n<h3>Creaci\u00f3n de clases concretas<\/h3>\n<p>Ahora implementemos esta clase en particular para agregar las hojas de estilo y las fuentes de JavaScript que tenemos. Sin embargo, lo que vas a notar es que son muy similares.<\/p>\n<p>Lo \u00fanico que difiere es la implementaci\u00f3n de la funcionalidad de <strong>carga<\/strong>, que es exactamente c\u00f3mo deber\u00eda funcionar.<\/p>\n<h5>hojas de estilo<\/h5>\n<p>Dada la clase abstracta anterior, ahora necesitamos crear una clase para registrar hojas de estilo. Como tenemos dos hojas de estilo, vamos a crear dos clases:<\/p>\n<ol>\n<li>la primera clase ser\u00e1 responsable de registrar la hoja de estilo para el tablero y espec\u00edficamente para la p\u00e1gina del widget de WordPress,<\/li>\n<li>la segunda clase ser\u00e1 responsable de registrar el complemento para el blog real.<\/li>\n<\/ol>\n<p>Llamemos a cada uno de estos <strong>AdminStylesheetSubscriber<\/strong> y <strong>PublicStylesheetSubscriber<\/strong> respectivamente.<\/p>\n<p>Primero, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9cf10f4aadbe54f2fc2e87b619a33bcc#file-03-admin-style-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">el suscriptor de la hoja de estilo del administrador<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of the WordPress Widget Boilerplate\n *\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com?\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 WordPressWidgetBoilerplateSubscriber;\n\n\/**\n * The subscriber responsible for loading the stylesheet on the Widget administration page.\n *\/\nclass AdminStyleAssetSubscriber extends AbstractSubscriber\n{\n    \/**\n     * {@inheritdoc}\n     *\/\n    public function __construct(string $hook)\n    {\n        parent::__construct($hook);\n    }\n\n    \/**\n     * Adds the administrative stylesheet to the widget administration page.\n     *\/\n    public function load()\n    {\n        if ('widgets' !== get_current_screen()-&gt;id) {\n            return;\n        }\n\n        wp_enqueue_style(\n            'wordpress-widget-boilerplate',\n            plugin_dir_url(dirname(__DIR__)).'assets\/css\/admin.css'\n        );\n    }\n}\n<\/code><\/pre>\n<p>Tenga en cuenta que esto usa la funci\u00f3n <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/get_current_screen\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_current_screen()<\/a> que he usado en publicaciones anteriores para asegurarnos de que estamos agregando dependencias solo donde sea necesario.<\/p>\n<p>Ahora, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9cf10f4aadbe54f2fc2e87b619a33bcc#file-05-public-style-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">el suscriptor p\u00fablico de JavaScript<\/a>. Esto usa la funci\u00f3n <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/is_admin\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">is_admin()<\/a> para asegurarse de que no estamos en el \u00e1rea administrativa de WordPress.<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of the WordPress Widget Boilerplate\n *\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 WordPressWidgetBoilerplateSubscriber;\n\n\/**\n * The subscriber responsible for loading the stylesheet on the blog.\n *\/\nclass PublicStyleAssetSubscriber extends AbstractSubscriber\n{\n    \/**\n     * {@inheritdoc}\n     *\/\n    public function __construct(string $hook)\n    {\n        parent::__construct($hook);\n    }\n\n    \/**\n     * Adds the stylesheet to the public-facing side of the site.\n     *\/\n    public function load()\n    {\n        if (is_admin()) {\n            return;\n        }\n\n        wp_enqueue_style(\n            'wordpress-widget-boilerplate',\n            plugin_dir_url(dirname(__DIR__)).'assets\/css\/widget.css'\n        );\n    }\n}\n<\/code><\/pre>\n<p>Obviamente, todav\u00eda tenemos que instanciar estas clases. Eso vendr\u00e1 m\u00e1s adelante en la serie.<\/p>\n<h5>JavaScript<\/h5>\n<p>Los suscriptores de JavaScript no son muy diferentes, como habr\u00e1s adivinado. Los separaremos seg\u00fan el \u00e1rea de la aplicaci\u00f3n en la que se centren y los nombraremos apropiadamente.<\/p>\n<p>Primero, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9cf10f4aadbe54f2fc2e87b619a33bcc#file-02-admin-script-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">el suscriptor de JavaScript administrador<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of the WordPress Widget Boilerplate\n *\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 WordPressWidgetBoilerplateSubscriber;\n\n\/**\n * The subscriber responsible for loading the JavaScript on the Widget's adminsitration page.\n *\/\nclass AdminScriptAssetSubscriber extends AbstractSubscriber\n{\n    \/**\n     * {@inheritdoc}\n     *\/\n    public function __construct(string $hook)\n    {\n        parent::__construct($hook);\n    }\n\n    \/**\n     * Adds the administrative JavaScript to the widget administration page.\n     *\/\n    public function load()\n    {\n        if ('widgets' !== get_current_screen()-&gt;id) {\n            return;\n        }\n\n        wp_enqueue_script(\n            'wordpress-widget-boilerplate',\n            plugin_dir_url(dirname(__DIR__)).'assets\/js\/admin.js'\n        );\n    }\n}\n<\/code><\/pre>\n<p>Y <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9cf10f4aadbe54f2fc2e87b619a33bcc#file-04-public-script-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">el suscriptor p\u00fablico de JavaScript:<\/a><\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of the WordPress Widget Boilerplate\n *\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 WordPressWidgetBoilerplateSubscriber;\n\n\/**\n * The subscriber responsible for loading the JavaScript on the blog.\n *\/\nclass PublicScriptAssetSubscriber extends AbstractSubscriber\n{\n    \/**\n     * {@inheritdoc}\n     *\/\n    public function __construct(string $hook)\n    {\n        parent::__construct($hook);\n    }\n\n    \/**\n     * Adds the JavaScript to the public-facing side of the site.\n     *\/\n    public function load()\n    {\n        if (is_admin()) {\n            return;\n        }\n\n        wp_enqueue_script(\n            'wordpress-widget-boilerplate',\n            plugin_dir_url(dirname(__DIR__)).'assets\/js\/widget.js'\n        );\n    }\n}\n<\/code><\/pre>\n<p>Una vez m\u00e1s, estas clases a\u00fan no se pueden instanciar, pero nos centraremos en eso en una pr\u00f3xima publicaci\u00f3n.<\/p>\n<h2>Abstracciones e Interfaces<\/h2>\n<p>Recuerde que las abstracciones y las interfaces son diferentes pero se confunden f\u00e1cilmente. Las interfaces contienen absolutamente cero implementaci\u00f3n. En su lugar, proporcionan una garant\u00eda de que cualquier clase que implemente la interfaz implementar\u00e1 todos los m\u00e9todos.<\/p>\n<p>Las clases abstractas, por otro lado, pueden tener alguna funcionalidad implementada en la clase abstracta mientras se deja el c\u00f3digo espec\u00edfico del dominio, como cargar hojas de estilo y JavaScript, al m\u00e9todo apropiado.<\/p>\n<p>Esto se har\u00e1 evidente, si no lo ha sido ya, cuanto m\u00e1s avancemos en esta serie. Mientras tanto, y como de costumbre, no olvide consultar la rama de <a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/tree\/develop\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">desarrollo<\/a> para ver d\u00f3nde estamos con el c\u00f3digo.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Podr\u00eda decirse que el mayor problema con Boilerplate es que todo est\u00e1 encapsulado dentro de una sola clase. As\u00ed que cambiemos eso con clases abstractas.<\/p>\n","protected":false},"author":1,"featured_media":235804,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[716,831,800,861],"tags":[1172],"class_list":["post-230898","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desarrollador","category-guia-para-principiantes","category-php-2","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230898","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=230898"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230898\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/235804"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=230898"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=230898"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=230898"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}