{"id":231779,"date":"2022-12-24T19:03:00","date_gmt":"2022-12-24T16:03:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231779"},"modified":"2022-12-24T19:06:23","modified_gmt":"2022-12-24T16:06:23","slug":"un-esempio-generale-del-modello-di-repository-in-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/un-esempio-generale-del-modello-di-repository-in-wordpress\/","title":{"rendered":"Un esempio generale del modello di repository in WordPress"},"content":{"rendered":"\n<p>Nella mia esperienza, il modo in cui interagiamo per la prima volta con il pattern di progettazione del repository spesso influenza il modo in cui pensiamo al pattern. (Tutte le prime impressioni sono impressioni durature, giusto?)<\/p>\n<p>Lo scopo di questo post \u00e8 mostrare come pu\u00f2 essere implementato in WordPress nello specifico quando si scrivono plugin orientati agli oggetti per leggere i dati (la scrittura dei dati potrebbe essere trattata in un altro post), ma prima di farlo ho cercato di pensare ad alcune coerenze tra i variazioni del modello che ho visto.<\/p>\n<p>In generale, questo \u00e8 ci\u00f2 che penso dovrebbe fare un modello di repository:<\/p>\n<ul>\n<li>fornire un unico posto per leggere i dati,<\/li>\n<li>astrarre i dettagli di come si accede ai dati,<\/li>\n<li>e avere un&#8217;interfaccia coerente per farlo.<\/li>\n<\/ul>\n<p>Ci\u00f2 significa che tutto ci\u00f2 che \u00e8 necessario recuperare dall&#8217;applicazione pu\u00f2 essere recuperato dal database. Ma come \u00e8 stato recuperato pu\u00f2 essere considerato una scatola nera. Dipende dallo sviluppatore che implementa il modello.<\/p>\n<p>E nel caso per coloro che leggono questo post, molto probabilmente siamo noi.<\/p>\n<h2>Il modello di repository in WordPress<\/h2>\n<p>Un paio di anni fa, <a href=\"https:\/\/wordpress.mediadoma.com\/it\/il-primer-del-modello-di-repository\/\" title=\"ho scritto del pattern del repository\">ho scritto del pattern del repository<\/a> fornendo un esempio concreto. \u00c8 ancora rilevante, ma lo scopo di ci\u00f2 che voglio trattare in questo post \u00e8 un po&#8217; diverso.<\/p>\n<p>Piuttosto che mostrare un&#8217;implementazione particolare radicata in un esempio reale, preferirei illustrare come possiamo utilizzare questo modello nel nostro lavoro quotidiano.<\/p>\n<p>Le due cose da tenere a mente durante la lettura sono:<\/p>\n<ol>\n<li>dal punto di vista dell&#8217;utente, il datastore sottostante non ha importanza,<\/li>\n<li>dal punto di vista dello sviluppatore, il modello ci consente di lavorare con pi\u00f9 origini dati e anche di simulare un archivio dati di esempio in modo da poter testare i dati in unit\u00e0.<\/li>\n<\/ol>\n<p>Quando si implementa il modello, da dove provengono i dati non ha importanza. Almeno finch\u00e9 sei l&#8217;oggetto sviluppatore o client che lo chiama. L&#8217;archivio dati pu\u00f2 essere un database, un insieme di funzioni API o una combinazione di entrambi.<\/p>\n<p>Supponiamo, quindi, che stai lavorando con un tipo di post personalizzato per Eventi e stai anche lavorando con i metadati dei post e le opzioni relative a qualcosa come gli eventi.<\/p>\n<p>Potresti fare qualcosa come:<\/p>\n<ul>\n<li>ottenere il nome dell&#8217;evento,<\/li>\n<li>trovare informazioni sulla location dell&#8217;evento,<\/li>\n<li>recuperare il primo tipo di post e lo stato ordinato in base al suo ID<\/li>\n<\/ul>\n<p>Tutte queste informazioni possono essere sparse in luoghi diversi e il modo in cui vengono recuperate pu\u00f2 variare.<\/p>\n<h3>1 Ottenere il nome dell&#8217;evento<\/h3>\n<p>Se stiamo lavorando con un tipo di post personalizzato e abbiamo bisogno di ottenere il nome dell&#8217;evento, allora possiamo usare l&#8217;ID di un post e <a href=\"https:\/\/gist.github.com\/tommcfarlin\/24e5bae859863d39512abc2af2169fbb#file-00-get-event-name-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">una delle funzioni API di WordPress per farlo<\/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>Questo \u00e8 un caso in cui l&#8217;archivio dati \u00e8 ancora sottratto a noi e, invece, sfrutta l&#8217;API di WordPress esistente.<\/p>\n<h3>2 Ottenere la posizione dell&#8217;evento<\/h3>\n<p>In questo caso, possiamo presumere che il luogo dell&#8217;evento sia stato inserito manualmente o forse sia stato recuperato da un&#8217;API di terze parti. E poich\u00e9 la posizione \u00e8 associata a un evento specifico, potrebbe trovarsi nella tabella dei metadati del post.<\/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 esempio generale del modello di repository in WordPress\"><\/a><\/p>\n<p>Ancora una volta, possiamo recuperarlo utilizzando funzioni API preesistenti; tuttavia, in situazioni come questa, ha senso avere una funzione di supporto perch\u00e9 probabilmente accederemo anche ad altri metadati.<\/p>\n<p>Quindi, per prima cosa, <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\">l&#8217;aiutante<\/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 poi la funzione che usa l&#8217;helper per <a href=\"https:\/\/gist.github.com\/tommcfarlin\/24e5bae859863d39512abc2af2169fbb#file-02-get-the-event-location-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ottenere la posizione<\/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>Ma in questi due esempi, stiamo ancora utilizzando le funzioni API esistenti. E il caso in cui dobbiamo parlare con il database?<\/p>\n<h3>3 Recupero di un URL di un singolo post<\/h3>\n<p>In questo caso, comunicheremo direttamente con il database di WordPress. Se hai familiarit\u00e0 con l&#8217; oggetto <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$wpdb<\/a> e SQL, questo non sar\u00e0 un grosso 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=\"Un esempio generale del modello di repository in WordPress\"><\/a><\/p>\n<p>In caso contrario, ti consiglio di leggere la funzione <a href=\"https:\/\/codex.wordpress.org\/Data_Validation#Database\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">prepare e la funzione<\/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>Detto questo, possiamo scrivere una query che far\u00e0 quanto segue:<\/p>\n<ol>\n<li>prendi tutti i post in cui l&#8217;ID corrisponde a un certo valore, il tipo e lo stato del post hanno un certo valore e ordineremo i risultati in base al valore crescente dell&#8217;ID,<\/li>\n<li>successivamente, utilizzeremo i risultati di quella query per ottenere un singolo valore.<\/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\">possiamo farlo<\/a> sia accedendo al database che scrivendo una query nidificata:<\/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 poi tutto questo pu\u00f2 essere incapsulato in una singola classe che sarebbe, diciamo, Event Repository (o <strong>EventRepository<\/strong> ).<\/p>\n<p>Ne parler\u00f2 di pi\u00f9 in un post di follow-up, per\u00f2. Vale a dire, come gestire determina quali funzioni appartengono a dove, le convenzioni di denominazione e come gestire la persistenza se vuoi introdurla anche nel tuo repository.<\/p>\n<h2>Repository definito<\/h2>\n<p>Soprattutto, tieni presente questo:<\/p>\n<p>Il modello di repository maschera il modo in cui i dati vengono recuperati, ma fornisce un modo coerente per il modo in cui \u00e8 possibile recuperare i dati con cui \u00e8 correlato.<\/p>\n<p>Alcuni potrebbero anche aggiungere come pu\u00f2 essere recuperato <strong>e<\/strong> come pu\u00f2 essere scritto, ma forse ne parler\u00f2 in un altro post.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Il modello di repository fornisce un modo coerente per recuperare i dati. Ecco come pu\u00f2 essere implementato in un plugin per 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":[896,720,865],"tags":[1168],"class_list":["post-231779","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-sviluppatore","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231779","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=231779"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231779\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/236255"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=231779"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=231779"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=231779"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}