{"id":229515,"date":"2022-11-03T12:45:00","date_gmt":"2022-11-03T09:45:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229515"},"modified":"2022-11-09T08:21:44","modified_gmt":"2022-11-09T05:21:44","slug":"prototipagem-rapida-prototipo-para-codigo-parte-1","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/prototipagem-rapida-prototipo-para-codigo-parte-1\/","title":{"rendered":"Prototipagem R\u00e1pida: Prot\u00f3tipo para C\u00f3digo, Parte 1"},"content":{"rendered":"\n<p>No que diz respeito aos prot\u00f3tipos r\u00e1pidos e ao WordPress, fizemos duas coisas at\u00e9 agora:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/prototipagem-rapida-com-wordpress-do-conceito-ao-plugin\/\" title=\"planejou o plugin\" >planejou o plugin<\/a> ,<\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/prototipagem-rapida-com-wordpress-analise-de-conceito\/\" title=\"esbo\u00e7ou um diagrama de como o c\u00f3digo pode ser organizado\" >esbo\u00e7ou um diagrama de como o c\u00f3digo pode ser organizado<\/a><\/li>\n<\/ol>\n<p>Neste ponto, fizemos trabalho suficiente para garantir o in\u00edcio da refatora\u00e7\u00e3o de nosso c\u00f3digo. Ou seja, vamos come\u00e7ar a converter o prot\u00f3tipo em c\u00f3digo. Mas isso \u00e9 algo que vai precisar ser feito em duas fases.<\/p>\n<p>Primeiro, vamos simplesmente introduzir classes que representam os diagramas do post anterior e que encapsulam a responsabilidade de cada projeto.<\/p>\n<p>Depois disso, veremos como organizar o c\u00f3digo em namespaces e pacotes. Antes de podermos fazer isso, por\u00e9m, precisamos ter certeza de que o c\u00f3digo \u00e9 orientado a objetos e permanece funcional. Ent\u00e3o \u00e9 isso que vai acontecer neste post.<\/p>\n<h2>Prot\u00f3tipo para c\u00f3digo<\/h2>\n<p>Se voc\u00ea est\u00e1 lendo os posts anteriores, note que estou planejando seguir a organiza\u00e7\u00e3o que esbocei no \u00faltimo post. Voc\u00ea n\u00e3o precisa seguir esse design espec\u00edfico, \u00e9 claro.<\/p>\n<h3>Uma palavra sobre controle de origem<\/h3>\n<p>Se voc\u00ea estiver usando o controle de origem, \u00e9 aqui que recomendo criar um <a href=\"https:\/\/git-scm.com\/book\/en\/v1\/Git-Branching\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">branch<\/a> fora do branch master (se estiver usando o Git) para que voc\u00ea possa fazer seu trabalho sem prejudicar a vers\u00e3o est\u00e1vel do c\u00f3digo.<\/p>\n<p>Isso est\u00e1 um pouco al\u00e9m do escopo da s\u00e9rie, portanto, se voc\u00ea n\u00e3o estiver usando o controle de origem, n\u00e3o se preocupe. Se voc\u00ea for, estou optando por <strong>desenvolver<\/strong> como o nome desta ramifica\u00e7\u00e3o. Vou mescl\u00e1-lo de volta ao <strong>mestre\u00a0<\/strong> assim que tiver certeza de que est\u00e1 funcional.<\/p>\n<h3>Escrevendo C\u00f3digo<\/h3>\n<p>Conforme o trabalho esbo\u00e7ado ontem, vou criar duas classes:<\/p>\n<ol>\n<li>a classe meta-caixa,<\/li>\n<li>a classe de exibi\u00e7\u00e3o da caixa meta.<\/li>\n<\/ol>\n<p>Haver\u00e1 alguma reutiliza\u00e7\u00e3o de c\u00f3digo do que j\u00e1 vimos, como voc\u00ea ver\u00e1 no c\u00f3digo a seguir.<\/p>\n<h4>O c\u00f3digo<\/h4>\n<p>Primeiro, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-00-class-meta-box-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">nossa metabox<\/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>E a seguir, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-01-class-meta-box-display-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">nossa exibi\u00e7\u00e3o<\/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 no c\u00f3digo da caixa meta, no c\u00f3digo da caixa meta estamos explicitamente instanciando a exibi\u00e7\u00e3o para que possamos chamar seu m\u00e9todo de exibi\u00e7\u00e3o quando necess\u00e1rio.<\/p>\n<p>Outra alternativa seria instanciar os dois objetos separadamente e ent\u00e3o injetar a exibi\u00e7\u00e3o na meta box via inje\u00e7\u00e3o de construtor ou algo semelhante. Isso precisaria ser feito em uma classe de terceiros.<\/p>\n<p>As vantagens disso v\u00eam de desacoplar um pouco mais as duas classes. Talvez n\u00f3s vamos rever como fazer isso no pr\u00f3ximo post.<\/p>\n<p>Depois disso, precisamos seguir em frente e definir a classe respons\u00e1vel por exibir as mensagens dentro do contexto do Meta Box Display. Isto \u00e9 o que chamaremos de <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>Observe aqui que o Post Messenger tamb\u00e9m faz refer\u00eancia \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>. Esta \u00e9 a classe onde a comunica\u00e7\u00e3o com o banco de dados acontece. Tamb\u00e9m inclu\u00ed algumas fun\u00e7\u00f5es auxiliares para tornar o c\u00f3digo de visualiza\u00e7\u00e3o um pouco mais simples, como veremos em breve.<\/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>E \u00e9 isso para as classes principais. Claro, ainda precisamos falar sobre os pontos de vista.<\/p>\n<h4>As visualiza\u00e7\u00f5es<\/h4>\n<p>As views s\u00e3o respons\u00e1veis \u200b\u200bpor renderizar o HTML no contexto da meta box. N\u00e3o gosto de escrever HTML no contexto do PHP (nem gosto de misturar PHP no contexto do HTML, mas isso \u00e9 inevit\u00e1vel neste projeto).<\/p>\n<p>Existem alguns grandes projetos de modelagem para tornar isso mais f\u00e1cil, mas eu discordo. De qualquer forma, voc\u00ea notar\u00e1 que no\u00a0 arquivo <strong>post-list.php<\/strong>, existem refer\u00eancias a fun\u00e7\u00f5es auxiliares na classe Post Query. Isso \u00e9 para ter certeza de que n\u00e3o estou expondo muitas propriedades e violando a Lei de Dem\u00e9ter.<\/p>\n<p>Vamos dar uma olhada nesse arquivo primeiro, pois <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-04-post-list-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e9 o mais complicado<\/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>Parece com o c\u00f3digo padr\u00e3o do WordPress, mas lembre-se de que, como esse arquivo \u00e9 chamado no <strong>Post Messenger<\/strong>, ele se referir\u00e1 \u00e0 consulta como a consulta envolvida por essa classe.<\/p>\n<p>Os dois \u00faltimos arquivos s\u00e3o bastante simples. Um deles fornece <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-06-message-description-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">uma descri\u00e7\u00e3o<\/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>O outro fornece uma mensagem quando n\u00e3o <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-07-no-post-list-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">h\u00e1 postagens<\/a> :<\/p>\n<pre><code>&lt;p&gt;There are no recent posts.&lt;\/p&gt;<\/code><\/pre>\n<p>Fora isso, a funcionalidade b\u00e1sica est\u00e1 feita.<\/p>\n<h3>Inicializando o plug-in<\/h3>\n<p>A \u00faltima coisa que precisamos fazer \u00e9 iniciar o plugin. Para fazer isso, alteramos o c\u00f3digo no arquivo principal do plugin para que fique <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-08-three-recent-posts-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim<\/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>Isso se conectar\u00e1 ao WordPress, instanciar\u00e1 nosso plug-in e o colocar\u00e1 em movimento. Ao execut\u00e1-lo em sua instala\u00e7\u00e3o do WordPress, ele deve ficar exatamente como na primeira vers\u00e3o.<\/p>\n<p>A \u00fanica diferen\u00e7a \u00e9 que agora temos as coisas organizadas em classes ao inv\u00e9s de fun\u00e7\u00f5es individuais.<\/p>\n<h2>Notas<\/h2>\n<p>Primeiro, h\u00e1 oportunidades para refatora\u00e7\u00e3o aqui que reduziriam ainda mais o desacoplamento (como diferentes tipos de <a href=\"https:\/\/en.wikipedia.org\/wiki\/Dependency_injection\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">inje\u00e7\u00e3o de depend\u00eancia<\/a>, etc.), mas o objetivo desta s\u00e9rie n\u00e3o \u00e9 cobrir isso.<\/p>\n<p>Em vez disso, \u00e9 pegar a ideia de ver plugins escritos por muitas fun\u00e7\u00f5es procedurais e ent\u00e3o dividi-los em classes mais conceituais que encapsulam suas responsabilidades.<\/p>\n<p>Em segundo lugar, se voc\u00ea revisar o c\u00f3digo-fonte no reposit\u00f3rio para esta vers\u00e3o do projeto, ver\u00e1 que tamb\u00e9m apresentei composer.json. Isso \u00e9 para que eu possa aproveitar o <a href=\"https:\/\/tommcfarlin.com\/php-codesniffer-with-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP CodeSniffer<\/a> e os <a href=\"https:\/\/tommcfarlin.com\/following-the-wordpress-coding-standards\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">padr\u00f5es de codifica\u00e7\u00e3o do WordPress<\/a> ao escrever c\u00f3digo.<\/p>\n<p>Na \u00faltima parte da s\u00e9rie, passaremos pelo <a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/namespaces-e-carregamento-automatico-no-wordpress\/\" title=\"namespace\">namespace<\/a> e reorganizaremos os arquivos. Se o tempo permitir, incluiremos um autoloader para que n\u00e3o tenhamos que incluir manualmente os arquivos no topo do nosso arquivo de plugin.<\/p>\n<p>Finalmente, mesclei este c\u00f3digo <a href=\"https:\/\/github.com\/tommcfarlin\/three-recent-posts\/tree\/0.2.1\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">no master e o marquei como 0.2.1<\/a> (j\u00e1 que tive que fazer um pequeno hotfix), j\u00e1 que ainda \u00e9 um trabalho em andamento.<\/p>\n<h2>Postagens da s\u00e9rie<\/h2>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/prototipagem-rapida-com-wordpress-do-conceito-ao-plugin\/\" title=\"Prototipagem R\u00e1pida com WordPress: Do Conceito ao Plugin\">Prototipagem R\u00e1pida com WordPress: Do Conceito ao Plugin<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/prototipagem-rapida-com-wordpress-analise-de-conceito\/\" title=\"Prototipagem R\u00e1pida com WordPress: An\u00e1lise de Conceito\">Prototipagem R\u00e1pida com WordPress: An\u00e1lise de Conceito<\/a><\/li>\n<li><a href=\"https:\/\/tommcfarlin.com\/prototype-to-code-1\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Prototipagem R\u00e1pida: Prot\u00f3tipo para C\u00f3digo, Parte 1<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/prototipagem-rapida-prototipo-para-codigo-parte-2\/\" title=\"Prototipagem R\u00e1pida: Prot\u00f3tipo para C\u00f3digo, Parte 2\">Prototipagem R\u00e1pida: Prot\u00f3tipo para C\u00f3digo, Parte 2<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/prototipagem-rapida-apresentando-o-autoloading\/\" title=\"Prototipagem R\u00e1pida: Apresentando o Autoloading\">Prototipagem R\u00e1pida: Apresentando o Autoloading<\/a><\/li>\n<\/ol>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00c9 aqui que come\u00e7amos a converter nosso prot\u00f3tipo em c\u00f3digo. Deve mostrar por que \u00e9 \u00fatil pensar em um projeto.<\/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":[722,920,846],"tags":[1170],"class_list":["post-229515","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desenvolvedor","category-outro","category-tutoriais","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229515","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=229515"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229515\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/223902"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=229515"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=229515"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=229515"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}