{"id":231403,"date":"2022-12-15T20:05:00","date_gmt":"2022-12-15T17:05:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231403"},"modified":"2022-12-07T11:39:13","modified_gmt":"2022-12-07T08:39:13","slug":"modelli-di-archivio-personalizzati-una-breve-guida","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/modelli-di-archivio-personalizzati-una-breve-guida\/","title":{"rendered":"Modelli di archivio personalizzati: una breve guida"},"content":{"rendered":"\n<p>Ogni volta che lavori con i modelli di archivio in WordPress, i post sono generalmente elencati per data in ordine decrescente. Cio\u00e8, i post pi\u00f9 recenti sono elencati in alto, e poi si va da l\u00ec.<\/p>\n<p>Ultimamente, ho lavorato su alcuni progetti che si integrano con API di terze parti. Queste API restituiscono date, a volte due date, una data di inizio e una data di fine, per un determinato evento e i clienti desiderano utilizzare tali informazioni per elencare i post anzich\u00e9 la data del post. Cio\u00e8, vogliono modelli di archivio personalizzati.<\/p>\n<p>Non \u00e8 troppo difficile farlo, ma prima di farlo, penso che sia importante fornire alcune informazioni di base su come \u00e8 costruito il progetto, quindi c&#8217;\u00e8 un po&#8217; pi\u00f9 di contesto sul perch\u00e9, ad esempio, \u00e8 necessaria una query personalizzata e perch\u00e9 potresti o potresti non \u00e8 necessario esaminare <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/pre_get_posts\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pre_get_posts<\/a>.<\/p>\n<p>Inizier\u00f2 con un TL; DR prima, per\u00f2. In questo modo, puoi farti un&#8217;idea prima di leggere tutto.<\/p>\n<h2>Modelli di archivio personalizzati<\/h2>\n<p>Quindi il TL; DR dietro l&#8217;intera cosa \u00e8 questo:<\/p>\n<ul>\n<li>le informazioni sulla data fornite dall&#8217;API di terze parti sono conservate nella tabella dei metadati post,<\/li>\n<li>la chiave \u00e8 la data di inizio e il valore \u00e8 la data effettiva,<\/li>\n<li>Ordino il contenuto in ordine decrescente e in base al meta valore.<\/li>\n<\/ul>\n<p>L&#8217;impaginazione pu\u00f2 essere un po&#8217; un problema e se usi un tipo di post personalizzato, avrai bisogno di alcuni parametri extra, ma c&#8217;\u00e8 l&#8217;idea generale.<\/p>\n<p>Ora per l&#8217;intera configurazione.<\/p>\n<h3>Tipi di post personalizzati<\/h3>\n<p>Quando si tratta di interfacciarsi con API di terze parti, sono un grande fan dei tipi di post personalizzati perch\u00e9 tendo a pensarli come un ibrido tra modelli e viste.<\/p>\n<ul>\n<li>Il componente del modello include tutto ci\u00f2 che \u00e8 tangenzialmente correlato e pu\u00f2 essere scritto nel database. Ci\u00f2 significa qualsiasi informazione sulla tassonomia o metadati dei post.<\/li>\n<li>Il componente di visualizzazione \u00e8 generalmente tutto ci\u00f2 che entra nel modello in grado di sfruttare eventuali tag di modello preesistenti, ovvero tutto ci\u00f2 che potrebbe essere necessario creare che legga anche le informazioni dal database.<\/li>\n<\/ul>\n<p>Per questo post, user\u00f2 <strong>acme-event<\/strong> come tipo di post personalizzato.<\/p>\n<h3>Pubblica metadati<\/h3>\n<p>Ho impostato le date nei metadati del post piuttosto che nel post stesso perch\u00e9 se succede qualcosa in futuro e i dati sono impostati sul record del post stesso, WordPress lo tratter\u00e0 come un post <strong>programmato<\/strong> che non \u00e8 pubblicato .<\/p>\n<\/p>\n<p>Invece, preferirei pubblicare il post e quindi modificare il modo in cui i metadati vengono visualizzati nel modello.<\/p>\n<h3>Impaginazione<\/h3>\n<p>WordPress fa una sottile distinzione con l&#8217;impaginazione nella sua base di codice. Ovvero, la variabile di query per i siti senza una home page statica utilizza <strong>paged<\/strong> e il caso opposto utilizza <strong>page<\/strong>.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161511-61e724257d2b2.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-161511-61e724257d2b2.png\" alt=\"Modelli di archivio personalizzati: una breve guida\" ><\/a><\/p>\n<p>Questo \u00e8 importante quando stai costruendo gli argomenti per la query a cui arriver\u00f2 momentaneamente.<\/p>\n<h3>Solo pagine di archivio<\/h3>\n<p>Ricorda che ogni volta che stai introducendo l&#8217;impaginazione, vuoi cambiare la query solo ogni volta che ti trovi nella pagina di archivio effettiva.<\/p>\n<p>Ci\u00f2 significa che non ti interessano i casi quando sei nell&#8217;area amministrativa di WordPress e non vuoi modificare la query per archivi di tipo post non personalizzato. A tal fine, assicurati di impostare correttamente la variabile di query nel callback pre_get_posts.<\/p>\n<p>Nota che posso mostrare una funzione su come farlo, ma a causa del modo in cui scriviamo il codice in WordPress, ovvero alcuni scrivono codice procedurale, altri scrivono codice orientato agli oggetti, lo visualizzer\u00f2 semplicemente nel codice procedurale.<\/p>\n<h3>Unendo tutto<\/h3>\n<p>Per prima <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-00-custom-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">cosa, costruir\u00f2 la query:<\/a><\/p>\n<pre><code>&lt;?php\n\n$eventQuery = new WP_Query([\n    'post_type' =&gt; 'acme-events',\n    'post_status' =&gt; 'publish',\n    'orderby' =&gt; 'meta_value',\n    'order' =&gt; 'desc',\n    'meta_key' =&gt; 'acme-event-start-date-time',\n    'posts_per_archive_page' =&gt; 5,\n    'paged' =&gt; get_query_var('paged')? get_query_var('paged'): 1\n]);<\/code><\/pre>\n<p>Nota che nel codice sopra c&#8217;\u00e8 un argomento per <strong>paged<\/strong>. Parler\u00f2 del codice per questo momentaneamente.<\/p>\n<p>Quindi il modello includer\u00e0 tutte le informazioni che scegli di visualizzare. Ho scelto di non condividere il codice per il mio modello in questo post perch\u00e9 \u00e8 irrilevante per l&#8217;idea pi\u00f9 ampia a portata di mano.<\/p>\n<p>Inoltre, hai tutto il necessario per visualizzare il contenuto.<\/p>\n<p>Successivamente, imposter\u00f2 l&#8217;impaginazione. Innanzitutto, devo farlo usando l&#8217;hook pre_get_posts per <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-01-pre-get-posts-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assicurarmi che sia impostata la variabile di query corretta<\/a> :<\/p>\n<pre><code>&lt;?php\n\nadd_action('pre_get_posts', 'setCustomQueryVariable');\npublic function setCustomQueryVariable($query)\n{\n    if (is_admin() || !is_archive()) {\n        return;\n    }\n\n    if ($query-&gt;is_archive('acme-events')) {\n        set_query_var('posts_per_page', 5);\n    }\n}<\/code><\/pre>\n<p>Quindi <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-02-pagination-links-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">implementer\u00f2 l&#8217;impaginazione<\/a> utilizzando la query personalizzata:<\/p>\n<pre><code>&lt;?php\n\n&lt;a class=\"next page-numbers\" href=\"&lt;?php echo esc_attr(get_next_posts_page_link($eventQuery-&gt;max_num_pages)); ?&gt;\"&gt;\n    Next Page\n&lt;\/a&gt;\n\n&lt;a class=\"prev page-numbers\" href=\"&lt;?php echo esc_attr(get_previous_posts_page_link()); ?&gt;\"&gt;\n    Previous Page\n&lt;\/a&gt;<\/code><\/pre>\n<p>E dopo, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-03-reset-post-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ripristiner\u00f2 la variabile $post globale<\/a> usando wp_reset_postdata() nel caso in cui sia necessario utilizzare qualsiasi cosa del post originale.<\/p>\n<pre><code>&lt;?php wp_reset_postdata(); ?&gt;<\/code><\/pre>\n<p>Questo \u00e8 generalmente considerato una buona pulizia ogni volta che si utilizza una query personalizzata, comunque.<\/p>\n<h3>link utili<\/h3>\n<p>Di seguito \u00e8 riportato un elenco di funzioni, pagine e riferimenti che potresti trovare utili in relazione al codice sopra o a qualsiasi lavoro futuro che potresti svolgere.<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query<\/a><\/li>\n<li><a href=\"https:\/\/codex.wordpress.org\/Pagination\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Impaginazione<\/a><\/li>\n<li><a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/pre_get_posts\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pre_get_posts<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_query_var\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_query_var<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/set_query_var\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">set_query_var<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_next_posts_page_link\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_next_posts_page_link<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_previous_posts_page_link\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_previous_posts_page_link<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/update_post_meta\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">update_post_meta<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_reset_postdata\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_reset_postdata<\/a><\/li>\n<li>Il <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">codice completo<\/a> in questo post.<\/li>\n<\/ul>\n<p>Se lavori con WordPress da molto tempo, alcuni di questi potrebbero sembrare ridondanti. In altri casi, potrebbe sembrare nuovo o potrebbe far luce su aree delle API di WordPress che non sapevi esistessero (almeno per me era cos\u00ec).<\/p>\n<h2>Perch\u00e9 preoccuparsi di tutto questo?<\/h2>\n<p>Questo pu\u00f2 sembrare un post lungo per un compito apparentemente semplice, ma le informazioni sono un po&#8217; sparse in tutto il Web in quanto si riferiscono a fare qualcosa del genere.<\/p>\n<p>Quindi ho voluto provare a riunire il tutto con spiegazioni, codice di esempio e collegamenti a pagine che potrebbero essere di interesse a seconda di come viene eseguita l&#8217;implementazione.<\/p>\n<p>Dopotutto, molti di noi stanno utilizzando WordPress al di l\u00e0 della gestione dei contenuti di base a questo punto, ma ci\u00f2 non significa che non dovremmo sfruttare le sue funzioni e API integrate quando possibile.<\/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>Considera questo un corso accelerato nella creazione di modelli di archivio personalizzati e tutte le funzionalit\u00e0 che li circondano.<\/p>\n","protected":false},"author":1,"featured_media":236214,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[896,804,720,865],"tags":[1168],"class_list":["post-231403","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-php-6","category-sviluppatore","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231403","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=231403"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231403\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/236214"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=231403"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=231403"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=231403"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}