{"id":231201,"date":"2022-12-24T19:13:00","date_gmt":"2022-12-24T16:13:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231201"},"modified":"2022-12-24T19:15:27","modified_gmt":"2022-12-24T16:15:27","slug":"un-ejemplo-general-del-patron-de-repositorio-en-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/un-ejemplo-general-del-patron-de-repositorio-en-wordpress\/","title":{"rendered":"Un ejemplo general del patr\u00f3n de repositorio en WordPress"},"content":{"rendered":"\n<p>En mi experiencia, la forma en que primero interactuamos con el patr\u00f3n de dise\u00f1o del repositorio a menudo influye en c\u00f3mo pensamos sobre el patr\u00f3n. (Todas las primeras impresiones son impresiones duraderas, \u00bfverdad?)<\/p>\n<p>El prop\u00f3sito de esta publicaci\u00f3n es mostrar c\u00f3mo se puede implementar en WordPress espec\u00edficamente cuando se escriben complementos orientados a objetos para leer datos (la escritura de datos puede tratarse en otra publicaci\u00f3n), pero antes de hacerlo, trat\u00e9 de pensar en algunas consistencias entre los variaciones del patr\u00f3n que he visto.<\/p>\n<p>En t\u00e9rminos generales, esto es lo que creo que deber\u00eda hacer un patr\u00f3n de repositorio:<\/p>\n<ul>\n<li>proporcionar un solo lugar para leer datos,<\/li>\n<li>abstraer los detalles de c\u00f3mo se accede a los datos,<\/li>\n<li>y tener una interfaz consistente para hacerlo.<\/li>\n<\/ul>\n<p>Esto significa que cualquier cosa que necesite recuperar de la aplicaci\u00f3n puede recuperarse de la base de datos. Pero c\u00f3mo se recupera puede considerarse una caja negra. Eso depende del desarrollador que implemente el patr\u00f3n.<\/p>\n<p>Y en el caso de aquellos que leen esta publicaci\u00f3n, lo m\u00e1s probable es que seamos nosotros.<\/p>\n<h2>El patr\u00f3n de repositorio en WordPress<\/h2>\n<p>Hace un par de a\u00f1os, <a href=\"https:\/\/wordpress.mediadoma.com\/es\/introduccion-al-patron-del-repositorio\/\" title=\"escrib\u00ed sobre el patr\u00f3n de repositorio\">escrib\u00ed sobre el patr\u00f3n de repositorio<\/a> dando un ejemplo concreto. Todav\u00eda es relevante, pero el prop\u00f3sito de lo que quiero cubrir en esta publicaci\u00f3n es un poco diferente.<\/p>\n<p>En lugar de mostrar una implementaci\u00f3n particular arraigada en un ejemplo real, prefiero exponer c\u00f3mo podemos emplear este patr\u00f3n en nuestro trabajo diario.<\/p>\n<p>Las dos cosas a tener en cuenta al leer esto son:<\/p>\n<ol>\n<li>desde la perspectiva del usuario, el almac\u00e9n de datos subyacente no importa,<\/li>\n<li>desde la perspectiva del desarrollador, el patr\u00f3n nos permite trabajar con m\u00faltiples fuentes de datos y tambi\u00e9n simular un almac\u00e9n de datos de muestra para que podamos realizar pruebas unitarias de los datos.<\/li>\n<\/ol>\n<p>Al implementar el patr\u00f3n, no importa de d\u00f3nde provengan los datos. Al menos mientras sea el desarrollador o el objeto del cliente que lo llama. El almac\u00e9n de datos puede ser una base de datos, un conjunto de funciones API o una combinaci\u00f3n de ambos.<\/p>\n<p>Supongamos, entonces, que est\u00e1 trabajando con un tipo de publicaci\u00f3n personalizada para Eventos y tambi\u00e9n est\u00e1 trabajando con metadatos de publicaci\u00f3n y opciones relacionadas con algo como eventos.<\/p>\n<p>Puede hacer algo como:<\/p>\n<ul>\n<li>obtener el nombre del evento,<\/li>\n<li>encontrar informaci\u00f3n sobre la ubicaci\u00f3n del evento,<\/li>\n<li>recuperar el primer tipo de publicaci\u00f3n y el estado ordenado por su ID<\/li>\n<\/ul>\n<p>Toda esta informaci\u00f3n puede estar dispersa en diferentes lugares y la forma en que se recupera puede variar.<\/p>\n<h3>1 Obtener el nombre del evento<\/h3>\n<p>Si estamos trabajando con un tipo de publicaci\u00f3n personalizada y necesitamos obtener el nombre del evento, entonces podemos usar la ID de una publicaci\u00f3n y <a href=\"https:\/\/gist.github.com\/tommcfarlin\/24e5bae859863d39512abc2af2169fbb#file-00-get-event-name-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">una de las funciones API de WordPress para hacerlo<\/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 es un caso en el que el almac\u00e9n de datos a\u00fan se abstrae de nosotros y, en su lugar, aprovecha la API de WordPress existente.<\/p>\n<h3>2 Obtener la ubicaci\u00f3n del evento<\/h3>\n<p>En este caso, podemos suponer que la ubicaci\u00f3n del evento se ingres\u00f3 manualmente o tal vez fue recuperada por una API de terceros. Y dado que la ubicaci\u00f3n est\u00e1 asociada con un evento espec\u00edfico, entonces puede estar en la tabla de metadatos de la publicaci\u00f3n.<\/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=\"Un ejemplo general del patr\u00f3n de repositorio en WordPress\"><\/a><\/p>\n<p>Nuevamente, podemos recuperarlo usando funciones API preexistentes; sin embargo, en situaciones como esta, tiene sentido tener una funci\u00f3n auxiliar porque probablemente tambi\u00e9n accederemos a otros metadatos.<\/p>\n<p>As\u00ed que primero, <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\">el ayudante<\/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>Y luego la funci\u00f3n que usa el ayudante 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\">obtener la ubicaci\u00f3n<\/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>Pero en estos dos ejemplos, todav\u00eda estamos usando funciones API existentes. \u00bfQu\u00e9 pasa con el caso en que necesitamos hablar con la base de datos?<\/p>\n<h3>3 Recuperar una URL de publicaci\u00f3n \u00fanica<\/h3>\n<p>En este caso, nos comunicaremos directamente con la base de datos de WordPress. Si est\u00e1 familiarizado con el objeto <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$wpdb<\/a> y SQL, esto no ser\u00e1 gran cosa.<\/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=\"Un ejemplo general del patr\u00f3n de repositorio en WordPress\"><\/a><\/p>\n<p>Si no es as\u00ed, le recomiendo leer sobre la funci\u00f3n de <a href=\"https:\/\/codex.wordpress.org\/Data_Validation#Database\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">preparaci\u00f3n y la funci\u00f3n<\/a> <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 esto, podemos escribir una consulta que har\u00e1 lo siguiente:<\/p>\n<ol>\n<li>tome todas las publicaciones donde la ID coincida con un cierto valor, el tipo de publicaci\u00f3n y el estado de la publicaci\u00f3n tienen un valor determinado, y ordenaremos los resultados por valor ascendente de la ID,<\/li>\n<li>a continuaci\u00f3n, usaremos los resultados de esa consulta para obtener un valor \u00fanico.<\/li>\n<\/ol>\n<p>Y <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 hacer esto<\/a> accediendo a la base de datos y escribiendo una consulta anidada:<\/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>Y luego todo esto se puede encapsular en una sola clase que ser\u00eda, por ejemplo, el Repositorio de eventos (o <strong>EventRepository<\/strong> ).<\/p>\n<p>Sin embargo, tendr\u00e9 m\u00e1s sobre esto en una publicaci\u00f3n de seguimiento. Es decir, c\u00f3mo manejar determinar qu\u00e9 funciones pertenecen a d\u00f3nde, las convenciones de nomenclatura y c\u00f3mo manejar la persistencia si tambi\u00e9n desea introducir eso en su repositorio.<\/p>\n<h2>Repositorio definido<\/h2>\n<p>Por encima de todo, ten esto en cuenta:<\/p>\n<p>El patr\u00f3n de repositorio enmascara c\u00f3mo se recuperan los datos, pero proporciona una forma coherente de c\u00f3mo se pueden recuperar los datos con los que est\u00e1 relacionado.<\/p>\n<p>Algunos tambi\u00e9n pueden agregar c\u00f3mo se puede recuperar <strong>y<\/strong> c\u00f3mo se puede escribir, pero tal vez lo discuta en otra publicaci\u00f3n.<\/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>El patr\u00f3n del repositorio proporciona una forma consistente de c\u00f3mo se pueden recuperar los datos. As\u00ed es como se puede implementar en un complemento de 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":[892,716,861],"tags":[1172],"class_list":["post-231201","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/231201","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=231201"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/231201\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/236255"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=231201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=231201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=231201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}