{"id":231580,"date":"2022-12-24T19:21:00","date_gmt":"2022-12-24T16:21:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231580"},"modified":"2022-12-24T19:21:22","modified_gmt":"2022-12-24T16:21:22","slug":"um-exemplo-geral-do-padrao-de-repositorio-no-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/um-exemplo-geral-do-padrao-de-repositorio-no-wordpress\/","title":{"rendered":"Um exemplo geral do padr\u00e3o de reposit\u00f3rio no WordPress"},"content":{"rendered":"\n<p>Na minha experi\u00eancia, a maneira como interagimos pela primeira vez com o padr\u00e3o de design do reposit\u00f3rio geralmente influencia como pensamos sobre o padr\u00e3o. (Todas as primeiras impress\u00f5es s\u00e3o impress\u00f5es duradouras, certo?)<\/p>\n<p>O objetivo deste post \u00e9 mostrar como ele pode ser implementado no WordPress especificamente ao escrever plugins orientados a objetos para ler dados (escrever dados pode ser abordado em outro post), mas antes de fazer isso tentei pensar em algumas consist\u00eancias entre os varia\u00e7\u00f5es do padr\u00e3o que eu vi.<\/p>\n<p>De um modo geral, isso \u00e9 o que eu acho que um padr\u00e3o de reposit\u00f3rio deve fazer:<\/p>\n<ul>\n<li>fornecer um \u00fanico local para ler dados,<\/li>\n<li>abstrair os detalhes de como os dados s\u00e3o acessados,<\/li>\n<li>e ter uma interface consistente para isso.<\/li>\n<\/ul>\n<p>Isso significa que tudo o que voc\u00ea precisa recuperar do aplicativo pode ser recuperado do banco de dados. Mas como \u00e9 recuperado pode ser considerado uma caixa preta. Isso depende do desenvolvedor que implementa o padr\u00e3o.<\/p>\n<p>E no caso para quem l\u00ea este post, provavelmente somos n\u00f3s.<\/p>\n<h2>O padr\u00e3o de reposit\u00f3rio no WordPress<\/h2>\n<p>Alguns anos atr\u00e1s, <a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/o-primer-do-padrao-de-repositorio\/\" title=\"escrevi sobre o padr\u00e3o de reposit\u00f3rio\">escrevi sobre o padr\u00e3o de reposit\u00f3rio<\/a> dando um exemplo concreto. Ainda \u00e9 relevante, mas o prop\u00f3sito do que quero abordar neste post \u00e9 um pouco diferente.<\/p>\n<p>Em vez de mostrar uma implementa\u00e7\u00e3o espec\u00edfica baseada em um exemplo real, prefiro defender como podemos empregar esse padr\u00e3o em nosso trabalho di\u00e1rio.<\/p>\n<p>As duas coisas a ter em mente ao ler isso s\u00e3o:<\/p>\n<ol>\n<li>da perspectiva do usu\u00e1rio, o armazenamento de dados subjacente n\u00e3o importa,<\/li>\n<li>da perspectiva do desenvolvedor, o padr\u00e3o nos permite trabalhar com v\u00e1rias fontes de dados e tamb\u00e9m simular um armazenamento de dados de amostra para que possamos testar os dados em unidade.<\/li>\n<\/ol>\n<p>Ao implementar o padr\u00e3o, n\u00e3o importa de onde os dados v\u00eam. Pelo menos enquanto voc\u00ea for o objeto de desenvolvedor ou cliente que o chama. O armazenamento de dados pode ser um banco de dados, um conjunto de fun\u00e7\u00f5es de API ou uma combina\u00e7\u00e3o de ambos.<\/p>\n<p>Vamos supor, ent\u00e3o, que voc\u00ea est\u00e1 trabalhando com um tipo de postagem personalizado para Eventos e tamb\u00e9m est\u00e1 trabalhando com metadados de postagem e op\u00e7\u00f5es relacionadas a algo como eventos.<\/p>\n<p>Voc\u00ea pode fazer algo como:<\/p>\n<ul>\n<li>obter o nome do evento,<\/li>\n<li>encontrar informa\u00e7\u00f5es sobre o local do evento,<\/li>\n<li>recuperar o primeiro tipo de postagem e status ordenado por seu ID<\/li>\n<\/ul>\n<p>Todas essas informa\u00e7\u00f5es podem estar espalhadas em diferentes lugares e a forma como s\u00e3o recuperadas pode variar.<\/p>\n<h3>1 Obtendo o Nome do Evento<\/h3>\n<p>Se estivermos trabalhando com um tipo de postagem personalizado e precisarmos obter o nome do evento, podemos usar o ID de uma postagem e <a href=\"https:\/\/gist.github.com\/tommcfarlin\/24e5bae859863d39512abc2af2169fbb#file-00-get-event-name-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">uma das fun\u00e7\u00f5es da API do WordPress para fazer isso<\/a>.<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Retrieves the title of the Event, a custom post type.\n *\n * @param  int    $eventId the ID of the event post type\n * @return string          the title of the post.\n *\/\npublic function getName(int $eventId): string\n{\n  return get_the_title($eventId);\n}<\/code><\/pre>\n<p>Este \u00e9 um caso em que o armazenamento de dados ainda \u00e9 abstra\u00eddo de n\u00f3s e, em vez disso, aproveita a API existente do WordPress.<\/p>\n<h3>2 Obtendo o local do evento<\/h3>\n<p>Nesse caso, podemos supor que o local do evento foi inserido manualmente ou talvez recuperado por uma API de terceiros. E como o local est\u00e1 associado a um evento espec\u00edfico, ele pode estar na tabela de metadados de postagem.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160195-61e7073d3924f.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-160195-61e7073d3924f.png\" alt=\"Um exemplo geral do padr\u00e3o de reposit\u00f3rio no WordPress\"><\/a><\/p>\n<p>Novamente, podemos recuper\u00e1-lo usando fun\u00e7\u00f5es de API pr\u00e9-existentes; no entanto, em situa\u00e7\u00f5es como essa, faz sentido ter uma fun\u00e7\u00e3o auxiliar porque provavelmente tamb\u00e9m acessaremos outros metadados.<\/p>\n<p>Ent\u00e3o, primeiro, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/24e5bae859863d39512abc2af2169fbb#file-01-get-the-event-location-helper-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o ajudante<\/a> :<\/p>\n<pre><code>&lt;?php \n\/**\n * A helper function for easily retrieving post meta data for a given Event.\n *\n * @param int    $id  the ID of the event\n * @param string $key the key for the post meta data for which we're retrieveing the data\n *\n * @return string the result of retrieiving the meta data\n *\/\nprivate function get(int $id, string $key): string\n{\n    return get_post_meta($id, $key, true);\n}<\/code><\/pre>\n<p>E ent\u00e3o a fun\u00e7\u00e3o que usa o auxiliar para <a href=\"https:\/\/gist.github.com\/tommcfarlin\/24e5bae859863d39512abc2af2169fbb#file-02-get-the-event-location-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">obter a localiza\u00e7\u00e3o<\/a> :<\/p>\n<pre><code>&lt;?php\n\/**\n * @param  int    $eventID the ID of the event\n * @return string          the name of the event of an empty string\n *\/\npublic function getLocationName($eventId): string\n{\n    return $this-&gt;get($eventId, 'ymc-event-location-name');\n}<\/code><\/pre>\n<p>Mas nestes dois exemplos, ainda estamos usando fun\u00e7\u00f5es de API existentes. E o caso em que precisamos falar com o banco de dados?<\/p>\n<h3>3 Recuperando um \u00fanico URL de postagem<\/h3>\n<p>Nesse caso, estaremos nos comunicando diretamente com o banco de dados do WordPress. Se voc\u00ea estiver familiarizado com o objeto <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$wpdb<\/a> e SQL, isso n\u00e3o ser\u00e1 um grande problema.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160195-61e70741367bc.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-160195-61e70741367bc.png\" alt=\"Um exemplo geral do padr\u00e3o de reposit\u00f3rio no WordPress\"><\/a><\/p>\n<p>Se n\u00e3o estiver, recomendo ler sobre a fun\u00e7\u00e3o <a href=\"https:\/\/codex.wordpress.org\/Data_Validation#Database\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">prepare<\/a>, bem como a fun\u00e7\u00e3o <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb#Talking_to_the_Database:_The_wpdb_Class\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_results<\/a>.<\/p>\n<p>Dado isso, podemos escrever uma consulta que far\u00e1 o seguinte:<\/p>\n<ol>\n<li>pegue todas as postagens em que o ID corresponde a um determinado valor, o tipo de postagem e o status da postagem s\u00e3o um determinado valor, e ordenaremos os resultados por valor crescente do ID,<\/li>\n<li>em seguida, usaremos os resultados dessa consulta para obter um \u00fanico valor.<\/li>\n<\/ol>\n<p>E <a href=\"https:\/\/gist.github.com\/tommcfarlin\/24e5bae859863d39512abc2af2169fbb#file-03-get-single-post-url-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">podemos fazer isso<\/a> acessando o banco de dados e escrevendo uma consulta aninhada:<\/p>\n<pre><code>&lt;?php\n\n\/**\n * @return string the URL to the event next to the current event.\n *\/\npublic function getNextEventUrl()\n{\n    global $wpdb;\n    $results = $wpdb-&gt;get_results(\n        $wpdb-&gt;prepare(\n            \"\n            SELECT *\n            FROM $wpdb-&gt;posts\n            WHERE ID &gt; (SELECT ID\n                FROM $wpdb-&gt;posts\n                WHERE ID = %d\n                AND post_type = '%s'\n                AND post_status = '%s'\n                ORDER BY ID ASC) AND post_type = '%s'\n            AND post_status = '%s'\n            ORDER BY ID ASC\n            LIMIT 1\n        \",\n            get_the_ID(),\n            'ymc-events',\n            'publish',\n            'ymc-events',\n            'publish') );\n\n  $result = (isset($result[0]))? $result[0]: '';\n\n  return $result;\n}<\/code><\/pre>\n<p>E ent\u00e3o tudo isso pode ser encapsulado em uma \u00fanica classe que seria, digamos, o Event Repository (ou <strong>EventRepository<\/strong> ).<\/p>\n<p>Eu vou ter mais sobre isso em um post de acompanhamento, no entanto. Ou seja, como lidar com determinar quais fun\u00e7\u00f5es pertencem a onde, as conven\u00e7\u00f5es de nomenclatura e como lidar com a persist\u00eancia, caso voc\u00ea queira introduzir isso em seu reposit\u00f3rio tamb\u00e9m.<\/p>\n<h2>Reposit\u00f3rio definido<\/h2>\n<p>Acima de tudo, tenha isso em mente:<\/p>\n<p>O padr\u00e3o de reposit\u00f3rio mascara como os dados s\u00e3o recuperados, mas fornece uma maneira consistente de como os dados com os quais est\u00e3o relacionados podem ser recuperados.<\/p>\n<p>Alguns tamb\u00e9m podem adicionar como ele pode ser recuperado <strong>e<\/strong> como pode ser escrito, mas talvez eu discuta isso em outro post.<\/p>\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>O padr\u00e3o de reposit\u00f3rio fornece uma maneira consistente de como os dados podem ser recuperados. Veja como ele pode ser implementado em um plugin do WordPress.<\/p>\n","protected":false},"author":1,"featured_media":236255,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,867],"tags":[1170],"class_list":["post-231580","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231580","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=231580"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231580\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/236255"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=231580"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=231580"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=231580"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}