{"id":233777,"date":"2023-02-21T15:20:00","date_gmt":"2023-02-21T12:20:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233777"},"modified":"2023-02-21T15:26:05","modified_gmt":"2023-02-21T12:26:05","slug":"implementando-uma-filtragem-animada-de-postagens-por-categoria","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/implementando-uma-filtragem-animada-de-postagens-por-categoria\/","title":{"rendered":"Implementando uma filtragem animada de postagens por categoria"},"content":{"rendered":"\n<p>Sempre quis fazer uma boa apresenta\u00e7\u00e3o em coluna de posts com filtros de categoria acima que embaralha e filtra os posts com uma boa anima\u00e7\u00e3o? Ent\u00e3o este \u00e9 o tutorial para voc\u00ea.<\/p>\n<p>O que faremos neste tutorial \u00e9 uma lista de todas as postagens (de prefer\u00eancia dentro de um tipo de postagem personalizado, como funcion\u00e1rios) bem em colunas e com suas imagens em destaque. Acima das postagens geramos filtros para a taxonomia conectada. Ao clicar em um filtro, as postagens com uma bela anima\u00e7\u00e3o embaralham e ocultam as postagens que n\u00e3o est\u00e3o presentes na categoria escolhida.<\/p>\n<\/p>\n<p>Para isso fazemos uso de uma biblioteca Javascript para a filtragem. Existem muitos dispon\u00edveis \u2013 alguns exigem jQuery e outros n\u00e3o \u2013 alguns s\u00e3o de c\u00f3digo aberto e alguns exigem licen\u00e7a comercial. Os mais populares s\u00e3o <a href=\"https:\/\/www.kunkalabs.com\/mixitup\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">MixItUp<\/a> e <a href=\"https:\/\/isotope.metafizzy.co\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Isotope<\/a>. No entanto, ambos requerem uma licen\u00e7a comercial. Para o meu projeto, eu precisava de uma biblioteca que fizesse o truque e fosse totalmente gratuita para uso em projetos comerciais. Eu tentei v\u00e1rios e o melhor que encontrei at\u00e9 agora \u00e9 o <a href=\"https:\/\/yiotis.net\/filterizr\/#\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">FilterizR<\/a>. Vamos come\u00e7ar este tutorial obtendo esta biblioteca!<\/p>\n<h2>A biblioteca FilterizR<\/h2>\n<p>Confira a demonstra\u00e7\u00e3o na <a href=\"https:\/\/yiotis.net\/filterizr\/#\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">p\u00e1gina inicial do FilterizR<\/a> para ver se esta biblioteca \u00e9 para voc\u00ea. Voc\u00ea pode at\u00e9 jogar com as op\u00e7\u00f5es em tempo real. Esta biblioteca suporta filtragem (que \u00e9 o que faremos neste tutorial), embaralhamento (ordem aleat\u00f3ria), pesquisa e classifica\u00e7\u00e3o. \u00c9 responsivo e otimizado para dispositivos m\u00f3veis. Longe do que eu experimentei, ele tamb\u00e9m consegue definir muito bem a altura autom\u00e1tica no cont\u00eainer em cada item.<\/p>\n<p>O FilterizR oferece tr\u00eas tipos diferentes de uso:<\/p>\n<ul>\n<li>Vanilla Javascript: Exp\u00f5e o FilterizR como uma fun\u00e7\u00e3o global para chamar em Javascript padr\u00e3o.<\/li>\n<li>jQuery: Permite usar <code>jQuery<\/code>para inicializar e configur\u00e1-lo.<\/li>\n<li>Pure Javascript library\/npm: Para uso em importa\u00e7\u00f5es ES6 (por exemplo, se voc\u00ea escrever blocos personalizados para Gutenberg).<\/li>\n<\/ul>\n<p>A segunda op\u00e7\u00e3o \u00e9 a mais f\u00e1cil para pessoas n\u00e3o familiarizadas com Javascript. A maioria das pessoas come\u00e7a com jQuery. Mas tenha em mente que jQuery \u00e9 uma biblioteca grande e pesada para carregar em seu projeto, e se isso puder ser evitado, voc\u00ea deveria. Neste tutorial, usaremos o m\u00e9todo Javascript vanilla. Se voc\u00ea estiver implementando isso em um bloco personalizado do Gutenberg, considere usar a terceira op\u00e7\u00e3o. Ent\u00e3o voc\u00ea pode simplesmente instal\u00e1-lo <code>npm<\/code>e importar a biblioteca em seu c\u00f3digo de bloco.<\/p>\n<h2>Baixando e configurando os arquivos<\/h2>\n<p>Vamos pegar o arquivo apropriado! V\u00e1 para <a href=\"https:\/\/github.com\/giotiskl\/filterizr\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o Github do FilterizR<\/a> para fazer o download. A menos que voc\u00ea esteja instalando via npm (terceira op\u00e7\u00e3o), voc\u00ea pode entrar na pasta &#8216; <code>dist<\/code>&#8216; e baixar a biblioteca minificada que voc\u00ea precisa. Como vou us\u00e1-lo com vanilla Javascript neste tutorial, vou baixar o <code>vanilla.filterizr.min.js<\/code>arquivo e coloc\u00e1-lo na minha <code>theme-folder\/assets\/js\/<\/code>pasta. \u00c9 claro que onde voc\u00ea coloca a biblioteca depende completamente de voc\u00ea, basta ajustar o caminho mais abaixo.<\/p>\n<p>Tamb\u00e9m precisaremos de outro arquivo Javascript para inicializar e decidir as op\u00e7\u00f5es. Vou criar um arquivo <code>theme-folder\/assets\/js\/filtering-main.js<\/code>. Voltaremos a este arquivo mais tarde. Obviamente, isso n\u00e3o \u00e9 necess\u00e1rio se voc\u00ea estiver implementando isso em um bloco Gutenberg personalizado.<\/p>\n<p>Para fazer o WordPress incluir os scripts, precisamos enfileirar os dois scripts no <code>wp_enqueue_scripts<\/code>gancho. Isso pode ser adicionado em algum lugar no arquivo <code>functions.php<\/code>. Igual a:<\/p>\n<pre><code>add_action('wp_enqueue_scripts', function() {\n    wp_enqueue_script('filterizr', get_template_directory_uri(). '\/assets\/js\/vanilla.filterizr.min.js', [], false, true);\n    wp_enqueue_script('filtering-script', get_template_directory_uri(). '\/assets\/js\/filtering-main.js', ['filterizr'], false, true);\n});<\/code><\/pre>\n<p>Ajuste os nomes de arquivos e\/ou caminhos para se adequarem ao seu projeto\/tema. O c\u00f3digo acima enfileira o script vanilla filterizR e, em segundo lugar, o <code>filtering-main.js<\/code>script que tem uma depend\u00eancia do script filterizR. Isso garante que o script de inicializa\u00e7\u00e3o seja carregado ap\u00f3s a biblioteca necess\u00e1ria.<\/p>\n<h2>Renderizando o modelo<\/h2>\n<p>O pr\u00f3ximo passo \u00e9 ter um lugar onde queremos renderizar essa lista de posts. Isso depende inteiramente de voc\u00ea. Para simplificar neste tutorial, usarei um modelo de p\u00e1gina no meu tema. Se voc\u00ea estiver implementando isso em um bloco Gutenberg, voc\u00ea pode renderiz\u00e1-lo com PHP (para blocos din\u00e2micos) ou com Javascript no <code>save<\/code>m\u00e9todo do bloco. A parte importante \u00e9 renderizar o HTML ao redor das postagens e filtros corretamente.<\/p>\n<h3>Renderizando os filtros<\/h3>\n<p>Vou criar um modelo de p\u00e1gina <code>template-filters.php<\/code>na pasta do meu tema e adicionar meu c\u00f3digo PHP para renderizar a sa\u00edda l\u00e1.<\/p>\n<p>Neste tutorial, assumimos que queremos renderizar postagens em um tipo de postagem personalizado. Voc\u00ea pode fazer isso com postagens e categorias padr\u00e3o, mas as postagens geralmente se tornar\u00e3o muitas \u2013 o que n\u00e3o \u00e9 vi\u00e1vel de usar para esse tipo de exibi\u00e7\u00e3o. Suponha, por exemplo, um tipo de postagem personalizado para funcion\u00e1rios com uma taxonomia personalizada conectada para o departamento. N\u00e3o mostrarei como adicionar o tipo de postagem personalizado neste tutorial, apenas lembre-se de que o nome do tipo de postagem \u00e9 <code>employees<\/code>e o nome da taxonomia personalizada \u00e9 <code>department<\/code>. Alterne os nomes para seu tipo de postagem e taxonomia. Se voc\u00ea n\u00e3o tiver certeza de como adicionar um tipo de postagem personalizado, tenho um <a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/crie-tipos-de-postagem-personalizados-e-taxonomias-personalizadas-no-wordpress-por-codigo\/\" title=\"post tutorial sobre como criar tipos de postagem personalizados e taxonomias\">post tutorial sobre como criar tipos de postagem personalizados e taxonomias<\/a>.<\/p>\n<p>No meu template eu come\u00e7o gerando os filtros. Vou buscar todos os termos n\u00e3o vazios em minha taxonomia personalizada usando <code>[get_terms](https:\/\/developer.wordpress.org\/reference\/functions\/get_terms\/)()<\/code>e adicion\u00e1-los em uma lista n\u00e3o ordenada.<\/p>\n<pre><code>&lt;?php\n$departments = get_terms([\n    'taxonomy' =&gt; 'department'\n]);\n?&gt;&lt;ul class=\"filter-controls\"&gt;\n    &lt;li data-filter=\"all\"&gt;&lt;?php _e('All', 'txtdomain'); ?&gt;&lt;\/li&gt;&lt;?php\n    foreach ($departments as $department) {\n        ?&gt;&lt;li data-filter=\"&lt;?php echo $department-&gt;slug; ?&gt;\"&gt;&lt;?php echo $department-&gt;name; ?&gt;&lt;\/li&gt;&lt;?php\n    }\n?&gt;&lt;\/ul&gt;\n\u00a0<\/code><\/pre>\n<p>Antes de gerar os elementos para cada termo na taxonomia, farei um elemento para &quot;Todos&quot; (linha <code>#6<\/code>). Para fazer a filtragem do FilterizR funcionar, precisamos fornecer o atributo de dados &quot; <code>data-filter<\/code>&quot; para cada elemento do filtro. O conte\u00fado deve significa exclusivamente um valor de filtragem exclusivo, no nosso caso, o slug do termo (voc\u00ea pode usar o ID do termo ou qualquer outra coisa, se quiser). O FilterizR pode saber quais posts pertencem a qual filtro.<\/p>\n<p>Com o c\u00f3digo acima, voc\u00ea deve obter uma lista com &#8220;All&quot; seguido de todos os termos n\u00e3o vazios. Excelente!<\/p>\n<p>Agora, logo abaixo disso, come\u00e7arei a renderizar os posts.<\/p>\n<h3>Renderizando as postagens<\/h3>\n<p>Ao renderizar os posts voc\u00ea precisa se lembrar de duas coisas. Uma \u00e9 envolver todos os posts dentro de um container, que darei o nome da classe <code>filter-container<\/code>. Essa classe \u00e9 o que precisamos direcionar com Javascript para fazer o FilterizR funcionar. E segundo, cada item precisa ter um atributo de dados &#8221; <code>data-category<\/code>&#8221; que liste todos os termos separados por v\u00edrgula. Os valores aqui devem corresponder aos valores que voc\u00ea gerou no <code>data-filter<\/code>atributo &#8221; &#8221; dos filtros.<\/p>\n<p>Eu consulto todas as postagens do tipo de postagem personalizada <code>[WP_Query](https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/)<\/code>e percorro as postagens. O que voc\u00ea exibe por postagem depende totalmente de voc\u00ea, mas o exemplo abaixo renderiza a imagem em destaque, o t\u00edtulo da postagem e uma \u00fanica meta de postagem personalizada para o cargo. Tudo envolto em links que v\u00e3o para o \u00fanico funcion\u00e1rio.<\/p>\n<pre><code>&lt;?php\n$employees = new WP_Query([\n    'post_type' =&gt; 'employees',\n    'posts_per_page' =&gt; -1,\n    'orderby' =&gt; 'name',\n    'order' =&gt; 'ASC'\n]);\nif ($employees-&gt;have_posts()) {\n    ?&gt;&lt;div class=\"filter-container\"&gt;&lt;?php\n    while ($employees-&gt;have_posts()) {\n        $employees-&gt;the_post();\n\u00a0\n        $dep = wp_get_object_terms(get_the_ID(), 'department', ['fields' =&gt; 'slugs']);\n        ?&gt;&lt;div class=\"filtr-item\" data-category=\"&lt;?php echo implode(',', $dep); ?&gt;\"&gt;\n            &lt;a href=\"&lt;?php the_permalink(); ?&gt;\" title=\"&lt;?php the_title(); ?&gt;\"&gt;&lt;?php\n        if (has_post_thumbnail()) {\n            the_post_thumbnail('employees-thumb');\n        }\n\u00a0\n        $job_title = get_post_meta(get_the_ID(), 'job_title', true);\n        ?&gt;&lt;div class=\"employee-info\"&gt;\n            &lt;h2&gt;&lt;?php the_title(); ?&gt;&lt;\/h2&gt;\n            &lt;span class=\"job-title\"&gt;&lt;?php echo $job_title; ?&gt;&lt;\/span&gt;\n        &lt;\/div&gt;&lt;?php\n\u00a0\n\u00a0\n        ?&gt;&lt;\/a&gt;&lt;\/div&gt;&lt;?php\n    }\n    wp_reset_postdata();\n    ?&gt;&lt;\/div&gt;&lt;?php\n}\n?&gt;<\/code><\/pre>\n<p>A consulta na linha <code>#2-7<\/code>garante que eu busque todas as postagens publicadas do tipo de postagem funcion\u00e1rios, ordenadas em ordem alfab\u00e9tica. Antes de renderizar o wrapper <code>div<\/code>de cada post, em line <code>#13<\/code>, uso <code>[wp_get_object_terms](https:\/\/developer.wordpress.org\/reference\/functions\/wp_get_object_terms\/)()<\/code>para buscar todos os termos atribu\u00eddos a este post. Como par\u00e2metro pe\u00e7o apenas os slugs dos termos. O retorno \u00e9 uma matriz de quaisquer slugs de termo atribu\u00eddos. Em seguida, uso a fun\u00e7\u00e3o PHP <code>[implode](https:\/\/www.php.net\/manual\/en\/function.implode.php)()<\/code>para criar uma string de todos os elementos da matriz separados por v\u00edrgula. Isso \u00e9 ecoado como o <code>data-category<\/code>atributo necess\u00e1rio para a raiz <code>div<\/code>\u2013 o que faz os filtros funcionarem.<\/p>\n<p>Quanto ao conte\u00fado de cada post, a sa\u00edda \u00e9 bastante padr\u00e3o. Geramos a imagem em destaque da postagem usando um tamanho de imagem personalizado (&#8216; <code>employees-thumb<\/code>&#8216;), o t\u00edtulo da postagem e o valor de uma \u00fanica meta de postagem personalizada (para o t\u00edtulo do trabalho). Tudo \u00e9 empacotado dentro de um link que vai para a visualiza\u00e7\u00e3o \u00fanica desse funcion\u00e1rio. Tamb\u00e9m adicionei algumas classes e wrappers para facilitar o direcionamento com CSS. A sa\u00edda para cada elemento \u00e9, obviamente, completamente a seu crit\u00e9rio.<\/p>\n<p>Neste ponto, a renderiza\u00e7\u00e3o do PHP deve estar completa. Voc\u00ea est\u00e1 convidado a estilizar e torn\u00e1-lo bonito, mas n\u00e3o se preocupe em estilizar colunas. O FilterizR ir\u00e1 gerar colunas (flexbox) para voc\u00ea. O pr\u00f3ximo passo \u00e9 inicializar o script de filtragem!<\/p>\n<h2>Inicializando o script de filtro<\/h2>\n<p>A \u00faltima parte \u00e9 editar o <code>filtering-main.js<\/code>script. N\u00f3s simplesmente precisamos dizer ao FilterizR para inicializar a filtragem em nosso conte\u00fado renderizado. H\u00e1 algumas coisas a ter em mente aqui, no entanto:<\/p>\n<p>O FilterizR garantir\u00e1 que o cont\u00eainer de encapsulamento de todas as postagens seja dimensionado automaticamente para caber na visualiza\u00e7\u00e3o. Por exemplo, se o filtro ativo exibir postagens em uma linha e clicarmos em outro filtro com quatro linhas, o cont\u00eainer ser\u00e1 dimensionado automaticamente para a altura correta. Assim, certificando-se de que qualquer conte\u00fado que vem depois n\u00e3o fique escondido atr\u00e1s. Mas para que esse redimensionamento autom\u00e1tico funcione, todas as imagens devem ter sido carregadas primeiro. Em alguns casos, o script pode ser carregado e executado antes que o carregamento de cada imagem seja conclu\u00eddo, e isso faz com que o cont\u00eainer seja recolhido automaticamente para uma altura de 0. Isso n\u00e3o \u00e9 bom. Portanto, precisamos colocar o c\u00f3digo de inicializa\u00e7\u00e3o dentro de uma fun\u00e7\u00e3o onde sabemos que as imagens terminaram de carregar. Para Javascript de baunilha, isso \u00e9 <code>window.onload<\/code>. Para jQuery voc\u00ea usaria <code>$(window).load()<\/code>.<\/p>\n<p>Em segundo lugar, queremos garantir que nosso script inicialize o FilterizR apenas se houver de fato um cont\u00eainer filtr\u00e1vel presente. Se inicializarmos o FilterizR e a p\u00e1gina atual n\u00e3o tiver a classe wrapper necess\u00e1ria, isso resultar\u00e1 em um erro de Javascript. Podemos resolver isso verificando se a classe container existe primeiro. Em vanilla Javascript voc\u00ea pode usar <code>document.getElementById()<\/code>ou <code>document.getElementsByClassName()<\/code>. Veja exemplo abaixo. Para jQuery voc\u00ea usaria <code>jQuery('&lt;selector&gt;').length<\/code>para verificar isso.<\/p>\n<p>A maneira de inicializar o FilterizR por vanilla Javascript \u00e9 criando uma nova inst\u00e2ncia de <code>Filterizr<\/code>, fornecendo o seletor de cont\u00eainer como primeiro par\u00e2metro e opcionalmente um objeto de configura\u00e7\u00f5es como segundo par\u00e2metro. Este \u00e9 um exemplo do mais b\u00e1sico:<\/p>\n<pre><code>window.onload = function() {\n    var filterContainer = document.getElementsByClassName('filter-container');\n    if (filterContainer.length &gt; 0) {\n        filterizr = new Filterizr('.filter-container');\n    }\n\u00a0\n}<\/code><\/pre>\n<p>A inicializa\u00e7\u00e3o acontece na linha <code>#4<\/code>. Fornecemos o nome da classe ao cont\u00eainer que envolve nossas postagens com um ponto na frente, significando um seletor de classe. Com o c\u00f3digo acima, o FilterizR agora deve assumir seus posts e coloc\u00e1-los em colunas. Como usamos os atributos de dados apropriados, os filtros tamb\u00e9m devem funcionar automaticamente!<\/p>\n<h3>Personalizando as op\u00e7\u00f5es do FilterizR<\/h3>\n<p>Tenho apenas algumas dicas finais para otimizar o FilterizR, o que podemos fazer fornecendo um objeto de configura\u00e7\u00f5es. Eu recomendo dar uma olhada nas <a href=\"https:\/\/yiotis.net\/filterizr\/#\/documentation\/vanilla\/options\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">op\u00e7\u00f5es poss\u00edveis<\/a> para FilterizR para ver o que voc\u00ea pode fazer. Voc\u00ea pode controlar a velocidade da anima\u00e7\u00e3o, o tipo de anima\u00e7\u00e3o e muito mais!<\/p>\n<p>Para fazer com que as colunas funcionem de maneira ideal em tamanhos responsivos, descobri que a configura\u00e7\u00e3o <code>layout<\/code>para &#8216; <code>sameWidth<\/code>&#8216; faz com que o FilterizR funcione melhor com postagens com alturas diferentes. Isso resulta em um estilo &#8220;Ma\u00e7onaria&#8221;. Em nosso exemplo, ecoamos conte\u00fado adicional ap\u00f3s a imagem, e isso pode resultar em alturas variadas (os nomes podem ser mais longos, for\u00e7ando-o em v\u00e1rias linhas). Isso pode resultar em algum comportamento estranho.<\/p>\n<p>Como padr\u00e3o, cada item n\u00e3o recebe espa\u00e7o entre si. Se voc\u00ea quiser algum espa\u00e7amento entre cada item, voc\u00ea pode definir o tamanho da lacuna em px para <code>gutterPixels<\/code>. No exemplo acima, usei 10px como tamanho da lacuna. PS: O tamanho da lacuna tamb\u00e9m \u00e9 adicionado ao cont\u00eainer de embalagem. Isso pode nem sempre ser o que voc\u00ea quer. Para substituir isso, simplesmente adicionei estilo <code>padding: 0!important<\/code>ao <code>.filter-container<\/code>.<\/p>\n<p>Aqui est\u00e1 o c\u00f3digo ajustado para inicializar o FilterizR com minhas op\u00e7\u00f5es:<\/p>\n<pre><code>window.onload = function() {\n    var filterContainer = document.getElementsByClassName('filter-container');\n    if (filterContainer.length &gt; 0) {\n        var options = {\n            layout: 'sameWidth',\n            gutterPixels: 10,\n        }\n        filterizr = new Filterizr('.filter-container', options);\n    }\n\u00a0\n}<\/code><\/pre>\n<p>Com algum estilo menor, o resultado \u00e9 algo assim:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152296-61e4d54c4aa2b.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-152296-61e4d54c4aa2b.png\" alt=\"Implementando uma filtragem animada de postagens por categoria\"><\/a><\/p>\n<p>Tenha em mente que filtrar \u00e9 apenas uma coisa que o FilterizR pode fazer! Confira os exemplos em &#8216;Tutoriais&#8217; em sua <a href=\"https:\/\/yiotis.net\/filterizr\/#\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">p\u00e1gina inicial<\/a>. Voc\u00ea pode adicionar controles para classificar, embaralhar e\/ou pesquisar. E voc\u00ea tem mais op\u00e7\u00f5es para controlar o layout tamb\u00e9m.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sempre quis fazer uma boa coluna de apresenta\u00e7\u00e3o de posts com filtros de categoria acima que filtram os posts com uma boa anima\u00e7\u00e3o? Ent\u00e3o n\u00e3o procure mais!<\/p>\n","protected":false},"author":1,"featured_media":152297,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[930,898,898,722,722,920,1110,920,930,846,846,867,867],"tags":[1170],"class_list":["post-233777","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-assuntos","category-codigo-2","category-desenvolvedor","category-outro","category-n-a","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233777","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=233777"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233777\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/152297"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=233777"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=233777"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=233777"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}