{"id":21094,"date":"2021-12-09T13:18:35","date_gmt":"2021-12-09T16:18:35","guid":{"rendered":"https:\/\/www.mxcursos.com\/blog\/?p=21094"},"modified":"2021-12-09T15:05:09","modified_gmt":"2021-12-09T18:05:09","slug":"exibindo-posts-do-wordpress-usando-apenas-javascript-vanilla","status":"publish","type":"post","link":"https:\/\/www.mxcursos.com\/blog\/exibindo-posts-do-wordpress-usando-apenas-javascript-vanilla\/","title":{"rendered":"Exibindo Posts do WordPress usando apenas Javascript Vanilla"},"content":{"rendered":"<p>Se voc\u00ea possui uma ecommerce, ou site institucional,\u00a0 algo primordial para alavancar visitas e conhecimentos em cima do seus produtos e servi\u00e7os\u00a0 s\u00e3o as publica\u00e7\u00f5es de conte\u00fado relacionado direta ou indiretamente aos produtos ou servi\u00e7os.<\/p>\n<p>E o CMS mais conhecimento e utilizado \u00e9 WordPress, que facilita a publica\u00e7\u00f5es de conte\u00fados.<\/p>\n<p>Mas muitas vezes, e algo bem comum \u00e9 separar o que \u00e9 conte\u00fado do que \u00e9 servi\u00e7os em sistemas diferentes, exemplo, voc\u00ea tem uma loja, ou hospedada por voc\u00ea como OpenCart, Magento, ou mesmo contratando servi\u00e7os como a Loja Integrada. E\u00a0 a exibi\u00e7\u00e3o de publica\u00e7\u00f5es que voc\u00ea produz nas suas lojas pode ser um chamariz para conhecer melhor o que voc\u00ea deseja vende, s\u00f3 que voc\u00ea tem esse conte\u00fado instalado em outro sistema, no caso WordPress.<\/p>\n<p>Uma forma interessante que pode ser feito \u00e9 exibir as publica\u00e7\u00f5es do WordPress em outro sistema, e isso pode ser feito utilizando Javascript, atrav\u00e9s da API Rest do WordPress\u00a0 .<\/p>\n<p>O WordPress oferece endpoint que voc\u00ea consegue recuperar informa\u00e7\u00f5es de posts, p\u00e1ginas, tipos personalizados, etc.<\/p>\n<p>Em nosso tutorial iremos exibir posts com as imagens.<\/p>\n<h2>Ent\u00e3o vamos para o c\u00f3digo.<\/h2>\n<p>A primeira coisa que iremos fazer \u00e9 cria\u00e7\u00e3o do elemento HTML onde ser\u00e1 exibido esse conte\u00fado.<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;div id=&quot;posts&quot;&gt;&lt;\/div&gt;\r\n<\/pre>\n<p>No nosso HTML ser\u00e1 apenas isso. Agora vamos para o javascript, iremos criar uma fun\u00e7\u00e3o an\u00f4nima auto execut\u00e1vel (<strong>IIFE<\/strong> &#8211; Immediately-invoked function expression), isso nos garante a defini\u00e7\u00e3o de um escopo, limitando onde as vari\u00e1veis ir\u00e3o existir apenas esse escopo, e n\u00e3o interferindo em outros elementos do site.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">(function(){\r\n\r\n\r\n \/*Aqui dentro ficar\u00e1 o script*\/\r\n\r\n})();\r\n<\/pre>\n<p>O que ser\u00e1 feito realizar um requisi\u00e7\u00e3o para um endpoint (uma URL), que ir\u00e1 retornar os posts, em formato JSON, e organizaremos para que possa ser inserida na div#posts<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">(function(){\r\n\r\n\/*URL do site*\/\r\nconst urlSite = 'https:\/\/www.mxcursos.com\/blog';\r\n\r\n\/*definimos um endpoint para resgatar os posts, com imagens*\/\r\nconst endPoint = `${urlSite}\/wp-json\/wp\/v2\/posts?_embed`;\r\n\r\n\r\n})();<\/pre>\n<p>Definimos agora onde ser\u00e1 realizada a requisi\u00e7\u00e3o, separei em duas vari\u00e1veis por uma quest\u00e3o de did\u00e1tica. Repare que na vari\u00e1vel <strong>endPoint<\/strong> foi usado o <strong>acento grave<\/strong>, e n\u00e3o aspas simples ou duplas, elas s\u00e3o chamadas de <strong>Template String,<\/strong> onde voc\u00ea consegue definir m\u00faltiplas linhas, e interpolar vari\u00e1veis, que voc\u00ea precisa utilizar o sinal de cifr\u00e3o, e chaves, e dentro das chaves voc\u00ea informar a vari\u00e1vel que deseja adicionar ali.<\/p>\n<p>No vari\u00e1vel <strong>endpoint<\/strong>, no caminho definido, tem um sinal de <strong>?_embed<\/strong>, esse par\u00e2metro \u00e9 adicionado para retornar as imagens tamb\u00e9m dos posts. Voc\u00ea pode utilizar outros par\u00e2metros no endpoint de acordo com necessidade, voc\u00ea pode consultar no site do WordPress para saber mais sobre a\u00a0<a href=\"https:\/\/developer.wordpress.org\/rest-api\/reference\/posts\/#list-posts\" target=\"_blank\" rel=\"noopener\"> API REST.<\/a><\/p>\n<p>Agora vamos utilizar a fun\u00e7\u00e3o <strong>fetch<\/strong>, que far\u00e1 requisi\u00e7\u00e3o do tipo <strong>GET<\/strong> e retornar\u00e1 os posts.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">(function(){\r\n\r\n\/*URL do site*\/\r\nconst urlSite = 'https:\/\/www.mxcursos.com\/blog';\r\n\r\n\/*definimos um endpoint para resgatar os posts, com imagens*\/\r\nconst endPoint = `${urlSite}\/wp-json\/wp\/v2\/posts?_embed`;\r\n\r\n\/*faz requisi\u00e7\u00e3o do tipo GET que retornar\u00e1 os posts*\/\r\nfetch(endPoint)\r\n.then(response =&gt; response.json())\r\n.then( posts =&gt; {\r\n\r\n});\r\n\r\n})();<\/pre>\n<p>A fun\u00e7\u00e3o <strong>fetch <\/strong>ela retornar uma <strong>Promisse<\/strong>, que \u00e9 um objeto que representa um valor que ainda n\u00e3o est\u00e1 dispon\u00edvel. Ela \u00e9 usada em processamentos ass\u00edncronos, onde n\u00e3o precisa atualizar a p\u00e1gina para realizar uma requisi\u00e7\u00e3o. E a forma de acessar esse objeto <strong>Promisse <\/strong>\u00e9 atrav\u00e9s do m\u00e9todo <strong>then<\/strong>, esse m\u00e9todo <strong>then<\/strong>, n\u00e3o \u00e9 da <strong>fetch<\/strong>, mas sim do objeto <strong>Promisse <\/strong>. O primeiro <strong>then <\/strong>recuperamos o valor, mas retornando o json, que \u00e9 o que queremos, que tamb\u00e9m nesse caso \u00e9 um objeto <strong>Promisse<\/strong>, vimos para acessar esse <strong>Promisse <\/strong>usando o m\u00e9todo <strong>then<\/strong>, e assim acessamos os <strong>posts<\/strong> em formato de <strong>JSON<\/strong> para podermos percorrer e exibir.<\/p>\n<p>Agora vamos percorrer os posts, e monta nossa estrutura<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">(function(){\r\n\r\n\/*URL do site*\/\r\nconst urlSite = 'https:\/\/www.mxcursos.com\/blog';\r\n\r\n\/*definimos um endpoint para resgatar os posts, com imagens*\/\r\nconst endPoint = `${urlSite}\/wp-json\/wp\/v2\/posts?_embed`;\r\n\r\n\/*faz requisi\u00e7\u00e3o do tipo GET que retornar\u00e1 os posts*\/\r\nfetch(endPoint)\r\n.then(response =&gt; response.json())\r\n.then( posts =&gt; {\r\n\r\n   \/*Define uma vari\u00e1vel que receber\u00e1 um array*\/\r\n    const html = &#x5B;];\r\n  \r\n  \/*Percorre o posts*\/\r\n  posts.forEach( post =&gt; {\r\n  \t\t\r\n      \/*resgata o titulo*\/\r\n      const title = post.title.rendered;\r\n      \r\n      \/*resgatar o link*\/\r\n      const link = post.link;\r\n\r\n      \/*resgata as images*\/\r\n      const images = post._embedded&#x5B;'wp:featuredmedia']&#x5B;0].media_details.sizes; \r\n\r\n      \/\/resgata a image especifica, no caso medium.\r\n      const image = images.medium.source_url;\r\n           \r\n   });\r\n\r\n});\r\n\r\n})();<\/pre>\n<p>Criamos uma vari\u00e1vel <strong>html<\/strong>, que defini um <strong>array <\/strong>vazio, que iremos armazenar nela cada post formatado, para no final inserir na p\u00e1gina, para que n\u00e3o precise se acessado toda hora do DOM, otimizando nosso processo no navegador.<\/p>\n<p>Usamos <strong>forEach<\/strong> para percorrer cada post retornado, e dentro dele definimos vari\u00e1veis para resgatar as informa\u00e7\u00f5es que desejamos: titulo, link, imagem.<\/p>\n<p>Agora vamos montar o HTML com vari\u00e1veis que foram definidas, e usaremos a <strong>Template Strings<\/strong> para possamos criar um string de m\u00faltiplas linhas e ter f\u00e1cil acesso as vari\u00e1veis.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">(function(){\r\n\r\n\/*URL do site*\/\r\nconst urlSite = 'https:\/\/www.mxcursos.com\/blog';\r\n\r\n\/*definimos um endpoint para resgatar os posts, com imagens*\/\r\nconst endPoint = `${urlSite}\/wp-json\/wp\/v2\/posts?_embed`;\r\n\r\n\/*faz requisi\u00e7\u00e3o do tipo GET que retornar\u00e1 os posts*\/\r\nfetch(endPoint)\r\n.then(response =&gt; response.json())\r\n.then( posts =&gt; {\r\n\r\n  \/*Define uma variavel que receber\u00e1 um array*\/\r\n  const html = &#x5B;];\r\n  \r\n  \/*Percorre o posts*\/\r\n  posts.forEach( post =&gt; {\r\n  \t\t\r\n  \/*resgata o titulo*\/\r\n  const title = post.title.rendered;\r\n  \r\n  \/*resgatar o link*\/\r\n  const link = post.link;\r\n  \r\n  \/*resgata as images*\/\r\n  const images = post._embedded&#x5B;'wp:featuredmedia']&#x5B;0].media_details.sizes; \r\n  \r\n  \/\/resgata a image especifica, no caso medium.\r\n  const image = images.medium.source_url;\r\n      \r\n     const article = `\r\n     \t\t   &lt;article&gt;\r\n                         &lt;a href=&quot;${link}&quot;&gt;\r\n                            &lt;img src=&quot;${image}&quot; alt=&quot;${title}&quot; \/&gt;\r\n                            &lt;h3&gt;${title}&lt;\/h3&gt;                         \r\n                         &lt;\/a&gt;                  \r\n                  &lt;\/article&gt;\r\n     `;\r\n           \r\n   });\r\n\r\n});\r\n\r\n})();<\/pre>\n<p>Pronto, montamos nosso HTML, de forma bem simples e diretas, tem outras forma utilizando javascript tamb\u00e9m, mas dessa forma mais f\u00e1cil de voc\u00ea visualizar o que est\u00e1 ocorrendo, mas se quiser usar outras formas n\u00e3o tem problema.<\/p>\n<p>Agora precisamos adicionar a nossa <strong>vari\u00e1vel <\/strong>html, e depois inserir na <strong>div#posts<\/strong>.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">(function(){\r\n\r\n\/*URL do site*\/\r\nconst urlSite = 'https:\/\/www.mxcursos.com\/blog';\r\n\r\n\/*definimos um endpoint para resgatar os posts, com imagens*\/\r\nconst endPoint = `${urlSite}\/wp-json\/wp\/v2\/posts?_embed`;\r\n\r\n\/*faz requisi\u00e7\u00e3o do tipo GET que retornar\u00e1 os posts*\/\r\nfetch(endPoint)\r\n.then(response =&gt; response.json())\r\n.then( posts =&gt; {\r\n\r\n\t\/*Define uma variavel que receber\u00e1 um array*\/\r\n\tconst html = &#x5B;];\r\n  \r\n  \/*Percorre o posts*\/\r\n  posts.forEach( post =&gt; {\r\n  \t\t\r\n      \/*resgata o titulo*\/\r\n      const title = post.title.rendered;\r\n      \r\n      \/*resgatar o link*\/\r\n      const link = post.link;\r\n      \r\n      \/*resgata as images*\/\r\n      const images = post._embedded&#x5B;'wp:featuredmedia']&#x5B;0].media_details.sizes; \r\n      \r\n      \/\/resgata a image especifica, no caso medium.\r\n      const image = images.medium.source_url;\r\n      \r\n      \/*defini a estrutura html*\/      \r\n      const article = `\r\n     \t\t&lt;article&gt;\r\n                         &lt;a href=&quot;${link}&quot;&gt;\r\n                            &lt;img src=&quot;${image}&quot; alt=&quot;${title}&quot; \/&gt;\r\n                            &lt;h3&gt;${title}&lt;\/h3&gt;                         \r\n                         &lt;\/a&gt;                  \r\n                  &lt;\/article&gt;\r\n     `;\r\n     \r\n     \/*Adiciona a vari\u00e1vel article no array*\/\r\n     html.push(article);\r\n           \r\n   });\r\n\r\n   \/*Seleciona o elemento posts, e inseri os posts*\/\r\n   document.querySelector(&quot;#posts&quot;).innerHTML = html.join('');\r\n\r\n});\r\n\r\n})();<\/pre>\n<p>Agora finalizamos o javascript, onde adicionar a vari\u00e1vel <strong>article <\/strong>no <strong>array <\/strong>html utilizado o m\u00e9todo <strong>push<\/strong>. E depois selecionamos o <strong>div#posts<\/strong>, e inserimos o posts, que est\u00e3o no <strong>array<\/strong>, e convertemos em string utilizando o m\u00e9todo <strong>join.<\/strong><\/p>\n<p>O posts est\u00e3o inserido no HTML, dentro de div#posts.<\/p>\n<h2>Formatando com CSS<\/h2>\n<p>Agora como posts listados, vamos estiliz\u00e1-los, fazendo que fiquem em 2 colunas, e uma forma f\u00e1cil de realizar \u00e9 usando o display: grid.<\/p>\n<pre class=\"brush: css; title: ; notranslate\" title=\"\">#posts{\r\n  display: grid;\r\n  grid-template-columns: 1fr 1fr;\r\n  gap: 20px 10px;  \r\n}\r\n\r\n#posts &gt; article img{\r\n  max-width: 100%;\r\n  width: auto;\r\n}\r\n#posts &gt; article a{\r\n  text-decoration: none;\r\n}\r\n\r\n#posts &gt; article a h3{\r\n  color: #333;\r\n  padding: 0;\r\n  margin: 0;\r\n  font-size: 15px;\r\n}<\/pre>\n<p>Utilizando o <strong>display:grid<\/strong> para definimos que nossos elementos ser\u00e3o dispostos dessa forma, e definimos que tenham duas colunas usando\u00a0 <strong>grid-template-columns , <\/strong>e o espa\u00e7amento entre os itens de 20px 10px usando<strong> o gap.<\/strong><\/p>\n<p>Vamos ver como ficou o resultado final:<\/p>\n<p><script async src=\"\/\/jsfiddle.net\/davidchc\/6n394mta\/32\/embed\/js,html,css,result\/dark\/\"><\/script><\/p>\n<p>Pronto, dessa forma voc\u00ea consegue resgatar posts do WordPress para qualquer aplica\u00e7\u00e3o apenas usando o Javascript, voc\u00ea poderia utilizar alguma biblioteca javascript para renderizar tamb\u00e9m como VueJs, React, Angular, entre outros.<\/p>\n<p>Espero que tenham gostado, e at\u00e9 a pr\u00f3xima<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Se voc\u00ea possui uma ecommerce, ou site institucional,\u00a0 algo primordial para alavancar visitas e conhecimentos em cima do seus produtos e servi\u00e7os\u00a0 s\u00e3o as publica\u00e7\u00f5es de conte\u00fado relacionado direta ou indiretamente aos produtos ou servi\u00e7os. E o CMS mais conhecimento e utilizado \u00e9 WordPress, que facilita a publica\u00e7\u00f5es de conte\u00fados. Mas muitas vezes, e algo [&hellip;]<\/p>\n","protected":false},"author":67,"featured_media":21115,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1178],"tags":[1233],"class_list":["post-21094","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programacao","tag-javascript"],"_links":{"self":[{"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/posts\/21094","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/users\/67"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/comments?post=21094"}],"version-history":[{"count":0,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/posts\/21094\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/media\/21115"}],"wp:attachment":[{"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/media?parent=21094"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/categories?post=21094"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/tags?post=21094"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}