{"id":233950,"date":"2023-02-25T11:28:00","date_gmt":"2023-02-25T08:28:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233950"},"modified":"2022-11-11T13:21:42","modified_gmt":"2022-11-11T10:21:42","slug":"tutorial-sul-tema-wordpress-per-principianti-parte-12-query-post-personalizzata","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/tutorial-sul-tema-wordpress-per-principianti-parte-12-query-post-personalizzata\/","title":{"rendered":"Tutorial sul tema WordPress per principianti \u2013 Parte 12: Query post personalizzata"},"content":{"rendered":"\n<p>In questa lezione finale impariamo come scrivere la tua query di post e scorrerli senza interrompere il ciclo padre nel modello. Creeremo una parte del modello per i singoli post che mostra i post correlati nella stessa categoria.<\/p>\n<p>Quello che faremo in questa lezione \u00e8 una query sui post correlati nella nostra visualizzazione post singolo, che mostra un massimo di 3 post, di tipo post, nella stessa categoria o categorie del post in cui ci troviamo, escludere il post corrente stesso, e randomizza i post mostrati. Esamineremo anche le strategie per non rovinare il ciclo nidificato.<\/p>\n<h2>Modello di post correlati<\/h2>\n<p>Facciamo in modo che i post correlati siano una parte del modello, di cui abbiamo appreso nella <a href=\"http:\/\/awhitepixel.com\/blog\/wordpress-theme-tutorial-for-beginners-part-10-fleshing-out-templates\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">parte 10<\/a>. In questo modo non complichiamo eccessivamente <code>single.php<\/code>e rendiamo il nostro codice pi\u00f9 riutilizzabile. Posiziona la richiesta di questa nuova parte del modello dove desideri. Lo posizioner\u00f2 subito prima di richiedere il modello di commenti:<\/p>\n<pre><code>...\n    &lt;\/article&gt;\n    &lt;?php \n    get_template_part('related-posts');\n    if (comments_open()) {\n        comments_template();\n    }\n    endwhile;\n...<\/code><\/pre>\n<p>Ora, creiamo un nuovo file vuoto nella nostra cartella del tema e chiamiamolo <code>related-posts.php<\/code>. Con questo file siamo pronti per tuffarci nella creazione di una query post personalizzata.<\/p>\n<h2>Interrogazione post personalizzata<\/h2>\n<p>Se vuoi fare una query personalizzata dei post, hai alcune opzioni, ma ti consiglio di abituarti alla classe <code>WP_Query<\/code>. Aggiungi <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">questa pagina della documentazione ai<\/a> segnalibri, poich\u00e9 le farai spesso riferimento, perch\u00e9 ci sono cos\u00ec tante opzioni. Ti mostrer\u00f2 un esempio pratico di impostazione di una query facendo riferimento alla documentazione per ciascuna specifica che vogliamo aggiungere.<\/p>\n<p>Se vuoi saperne di pi\u00f9 su come interrogare i post, ho <a href=\"http:\/\/awhitepixel.com\/blog\/how-to-query-posts-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">un post<\/a> che approfondisce proprio questo.<\/p>\n<p>Per creare una query post personalizzata, chiameremo <code>new WP_Query()<\/code>, passeremo un array di argomenti e memorizzeremo il suo risultato in una variabile. E poi useremo lo stesso identico ciclo che abbiamo usato prima nei nostri modelli (<a href=\"http:\/\/awhitepixel.com\/blog\/wordpress-theme-tutorial-for-beginners-part-4-accessing-posts-with-the-loop\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dai un&#8217;occhiata al ciclo originale qui<\/a> per confrontare). Ma dobbiamo dire al ciclo di passare attraverso la variabile, invece di quella globale (che \u00e8 il singolo post).<\/p>\n<p>Ecco come apparir\u00e0 il ciclo quando lo aggiungi a una query personalizzata:<\/p>\n<pre><code>$related_posts = new WP_Query([\n    \/\/ Arguments here\n]);\nif ($related_posts-&gt;have_posts()) {\n    while ($related_posts-&gt;have_posts()): $related_posts-&gt;the_post();\n        \/\/ Access to each post here\n    endwhile;\n    wp_reset_postdata();\n}<\/code><\/pre>\n<p>Come puoi vedere, il ciclo \u00e8 esattamente lo stesso, usando <code>have_posts<\/code>e <code>the_post<\/code>. La differenza \u00e8 che li chiamiamo <code>$related_posts<\/code>sull&#8217;oggetto. Se saltiamo la <code>$related_posts<\/code>parte, WordPress presume automaticamente che sia la query globale dei post.<\/p>\n<p>Potresti anche notare la chiamata alla funzione <code>wp_reset_postdata()<\/code>subito dopo il ciclo. Questo \u00e8 il modo in cui &quot;ripuliamo dopo noi stessi&quot; dopo una query personalizzata con <code>WP_Query<\/code>. Ricorda che <code>the_post()<\/code>imposta l&#8217;oggetto post globale in modo che possiamo usare <code>the_title()<\/code>ecc. E poich\u00e9 siamo gi\u00e0 all&#8217;interno di un ciclo (quello in <code>single.php<\/code>), dobbiamo assicurarci puliamo e reimpostiamo il post al singolo post dopo che abbiamo finito. Se non reimpostamo i dati dei post, qualsiasi cosa dopo questo far\u00e0 riferimento all&#8217;ultimo post correlato che abbiamo esaminato. Questo pu\u00f2 essere un grosso problema! Nel nostro esempio abbiamo avere un modello di commenti che segua questo. Tralasciando il ripristino, il modello di commento mostrer\u00e0 i commenti dell&#8217;ultimo post correlato nel ciclo. E non il singolo post che stiamo effettivamente guardando!<\/p>\n<h3>Implementazione del nostro ciclo personalizzato<\/h3>\n<p>Bene, iniziamo a implementare il ciclo personalizzato nel nostro <code>related-posts.php<\/code>. Ho aggiunto un wrapper e un titolo, ma come al solito puoi regolare l&#8217;HTML come desideri:<\/p>\n<pre><code>&lt;div class=\"related-posts\"&gt;\n    &lt;h2&gt;&lt;?php _e('Related posts', 'wptutorial'); ?&gt;&lt;\/h2&gt;\n    &lt;?php\n    $related_posts = new WP_Query([\n    ]);\n    if ($related_posts-&gt;have_posts()) {\n        while ($related_posts-&gt;have_posts()): $related_posts-&gt;the_post();\n\u00a0\n        endwhile;\n        wp_reset_postdata();\n    }\n    ?&gt;\n&lt;\/div&gt;<\/code><\/pre>\n<p>Ora vedremo il potere della riutilizzabilit\u00e0 nelle parti del modello. Diciamo che all&#8217;interno di questo ciclo personalizzato vogliamo mostrare esattamente lo stesso contenuto che facciamo nel nostro <code>content-loop.php<\/code>, che utilizziamo nei nostri modelli di archivio. Tutto quello che dobbiamo fare \u00e8 richiedere questa parte del modello all&#8217;interno del nostro ciclo personalizzato, siamo tutti pronti a gestire l&#8217;output di ogni post!<\/p>\n<pre><code>...\n    while ($related_posts-&gt;have_posts()): $related_posts-&gt;the_post();\n        get_template_part('content-loop');\n    endwhile;\n...<\/code><\/pre>\n<p>Ora non resta che aggiungere gli argomenti alla nostra query di post, assicurandoci di recuperare ci\u00f2 che vogliamo. Esaminiamo gli argomenti uno per uno.<\/p>\n<h2>Costruire gli argomenti per la nostra query post personalizzata<\/h2>\n<p>Non vogliamo recuperare pi\u00f9 post di 3. Nella documentazione (sezione &#8220;Parametri di impaginazione&quot;) l&#8217;argomento per questo \u00e8 <code>posts_per_page<\/code>. Quindi aggiungiamo l&#8217;elemento array:<\/p>\n<pre><code>'posts_per_page' =&gt; 3<\/code><\/pre>\n<p>Vogliamo assicurarci che WordPress recuperi i post e non le pagine o qualcos&#8217;altro. In &#8220;Parametri tipo post&#8221; troviamo:<\/p>\n<pre><code>'post_type' =&gt; 'post'<\/code><\/pre>\n<p>Vogliamo evitare che il singolo post in cui ci troviamo appaia nella nostra query sui post correlati, perch\u00e9 non ha senso, giusto? La documentazione ci dice in &quot;Parametri post e pagina&quot; che possiamo aggiungere l&#8217;ID post in un array per <code>post__not_in<\/code>:<\/p>\n<pre><code>'post__not_in' =&gt; [get_the_ID()]<\/code><\/pre>\n<p>Vogliamo anche randomizzare i post; perch\u00e9 per impostazione predefinita recuperer\u00e0 gli ultimi post pubblicati e questo pu\u00f2 diventare rapidamente piuttosto ripetitivo mentre si passano i post. Fortunatamente WordPress ha una funzione per questo nel modo in cui ordina i post; in &#8220;Ordina e ordina per parametri&#8221; troviamo:<\/p>\n<pre><code>'orderby' =&gt; 'rand'<\/code><\/pre>\n<p>Infine, vogliamo interrogare i post che si trovano all&#8217;interno delle stesse categorie del post in cui ci troviamo. Per fare ci\u00f2, dobbiamo prima, prima degli argomenti della query, portare le categorie al singolo post in cui ci troviamo. In &quot;Parametri di categoria&quot; vediamo che possiamo fornire una matrice di ID di categoria a <code>category__in<\/code>. Fortunatamente WordPress ha una funzione per ottenere gli ID di categoria per un post; <code>wp_get_post_categories()<\/code>che possiamo usare direttamente come valore del parametro. Perfetto!<\/p>\n<p>Ecco la query finale e i suoi argomenti:<\/p>\n<pre><code>...\n&lt;?php\n    $post_cats = wp_get_post_categories(get_the_ID());\n    $related_posts = new WP_Query([\n        'post_type' =&gt; 'post',\n        'posts_per_page' =&gt; 3,\n        'category__in' =&gt; $post_cats,\n        'post__not_in' =&gt; [get_the_ID()],\n        'orderby' =&gt; 'rand'\n    ]);\n    if ($related_posts-&gt;have_posts()) {\n...<\/code><\/pre>\n<p>Aggiorna e dovresti vedere 3 post elencati nella parte inferiore della visualizzazione singola. Aggiorna pi\u00f9 volte per vedere che cambiano perch\u00e9 abbiamo detto a WordPress di randomizzarli. Nota: se hai meno di 3 post nella stessa categoria, riceverai meno di 3 post.<\/p>\n<p>Questo \u00e8 tutto! Ora sai come interrogare qualsiasi post desideri. La <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pagina della documentazione di WP_Query<\/a> \u00e8 estremamente utile per modificare la tua query, perch\u00e9 qui ci sono davvero possibilit\u00e0 illimitate. Ti incoraggio a giocare con i parametri e forse provare a creare una parte del modello separata da utilizzare per i post correlati.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In questa lezione sul tema WordPress impari come scrivere la tua query di post e scorrerli senza interrompere il ciclo principale nel modello.<\/p>\n","protected":false},"author":1,"featured_media":223852,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[918,896,896,720,835,918,1110,835,928,720,928,844,844,865,865],"tags":[1168],"class_list":["post-233950","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-altro","category-codice","category-sviluppatore","category-guida-per-principianti","category-n-a","category-soggetti","category-tutorial","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233950","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=233950"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233950\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/223852"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=233950"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=233950"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=233950"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}