{"id":669,"date":"2026-10-06T10:00:00","date_gmt":"2026-10-06T08:00:00","guid":{"rendered":"https:\/\/aarkly.com\/?p=669"},"modified":"2026-07-21T13:09:20","modified_gmt":"2026-07-21T11:09:20","slug":"wordpress-wp-query-custom-queries","status":"publish","type":"post","link":"https:\/\/aarkly.com\/it\/wordpress-wp-query-custom-queries\/","title":{"rendered":"WordPress WP_Query: Guida alle Query Personalizzate"},"content":{"rendered":"<h2 class=\"wp-block-heading\">Cos&#8217;\u00e8 WP_Query<\/h2>\n\n<p class=\"wp-block-paragraph\">WP_Query \u00e8 la classe fondamentale di WordPress per eseguire query sul database e recuperare post. Sostituisce le query SQL dirette con un&#8217;interfaccia object-oriented che gestisce automaticamente cache, filtri, e compatibilit\u00e0. Ogni pagina di WordPress utilizza WP_Query internamente, ma crearne di personalizzate permette di visualizzare esattamente i contenuti desiderati in qualsiasi contesto: homepage personalizzata, slider, widget, o sezioni tematiche.<\/p>\n\n<h2 class=\"wp-block-heading\">Parametri Base di WP_Query<\/h2>\n\n<p class=\"wp-block-paragraph\">I parametri di WP_Query si dividono in categorie: post_type (page, post, custom), post_status (publish, draft), orderby (date, title, meta_value), posts_per_page, e category__in\/tag__in. Puoi combinare parametri multipli per query complesse: $query = new WP_Query(array(&#8216;post_type&#8217; => &#8216;product&#8217;, &#8216;posts_per_page&#8217; => 10, &#8216;meta_key&#8217; => &#8216;price&#8217;, &#8216;orderby&#8217; => &#8216;meta_value_num&#8217;, &#8216;order&#8217; => &#8216;ASC&#8217;)).<\/p>\n\n<h2 class=\"wp-block-heading\">Meta Query e Tax Query<\/h2>\n\n<p class=\"wp-block-paragraph\">Le meta_query permettono di filtrare post basati su campi personalizzati con operatori di confronto (==, !=, >, <, LIKE, EXISTS). Le tax_query filtrano per termini di tassonomia. Entrambi supportano relazioni (AND\/OR) per condizioni multiple. Esempio avanzato: recupera tutti i post con prezzo tra 10 e 50 nella categoria 'promozioni' escludendo quelli esauriti.<\/p>\n\n<h2 class=\"wp-block-heading\">Performance delle Query<\/h2>\n\n<p class=\"wp-block-paragraph\">WP_Query mal ottimizzato \u00e8 la principale causa di rallentamenti in WordPress. Best practice: usa &#8216;no_found_rows&#8217; => true per disabilitare il conteggio totale quando non serve (paginazione non necessaria), &#8216;fields&#8217; => &#8216;ids&#8217; per recuperare solo gli ID, e &#8216;update_post_meta_cache&#8217;\/&#8217;update_post_term_cache&#8217; => false per evitare query aggiuntive. Questi parametri riducono drasticamente il tempo di esecuzione.<\/p>\n\n<h2 class=\"wp-block-heading\">Paginazione e Loop<\/h2>\n\n<p class=\"wp-block-paragraph\">La paginazione con WP_Query richiede attenzione: usa &#8216;paged&#8217; => get_query_var(&#8216;paged&#8217;) per rispettare la navigazione utente, e &#8216;max_num_pages&#8217; con paginate_links() per generare i link di paginazione. Il loop standard (while $query->have_posts()) deve sempre terminare con wp_reset_postdata() per ripristinare il contesto globale.<\/p>\n\n<h2 class=\"wp-block-heading\">Cache con WP_Query<\/h2>\n\n<p class=\"wp-block-paragraph\">WordPress cache automaticamente i risultati di WP_Query tramite l&#8217;object cache. Per query personalizzate ripetute, usa wp_cache_get\/set per memorizzare risultati. Il parametro &#8216;cache_results&#8217; \u00e8 true per default, ma funziona solo con un object cache persistente (Redis, Memcached). Senza, ogni richiesta riesegue le query SQL completi.<\/p>\n\n<h2 class=\"wp-block-heading\">Query per Custom Post Types<\/h2>\n\n<p class=\"wp-block-paragraph\">I custom post types si integrano nativamente con WP_Query. Usa &#8216;post_type&#8217; => array(&#8216;product&#8217;, &#8216;post&#8217;) per combinare tipi. I meta box dei CPT sono accessibili tramite meta_query. Per CPT gerarchici come &#8216;page&#8217;, &#8216;post_parent&#8217; e &#8216;child_of&#8217; permettono query padre-figlio. Le relazioni tra CPT si gestiscono con meta_query collegando post ID.<\/p>\n\n<h2 class=\"wp-block-heading\">Query per Date e Autori<\/h2>\n\n<p class=\"wp-block-paragraph\">Filtra per data con year\/month\/day, &#8216;date_query&#8217; per intervalli complessi inclusi before\/after con operatori di confronto. Per autori, &#8216;author&#8217; (ID singolo) o &#8216;author__in&#8217;\/&#8217;author__not_in&#8217; per multipli. &#8216;author_name&#8217; accetta lo slug. Questi parametri sono utili per archivi personalizzati: post dell&#8217;ultimo mese, articoli di un autore specifico, o contenuti stagionali.<\/p>\n\n<h2 class=\"wp-block-heading\">Debugging di WP_Query<\/h2>\n\n<p class=\"wp-block-paragraph\">Strumenti come Query Monitor mostrano tutte le query WP_Query eseguite, i loro parametri, il tempo di esecuzione, e le query SQL generate. Puoi anche usare $query->request per vedere la query SQL finale, e $query->explain per l&#8217;analisi EXPLAIN. Il debugging rivela query N+1, mancanza di indici, e parametri inefficienti.<\/p>\n\n<h2 class=\"wp-block-heading\">Conclusione<\/h2>\n\n<p class=\"wp-block-paragraph\">WP_Query \u00e8 uno strumento potente che richiede comprensione profonda per essere usato efficientemente. I parametri di ottimizzazione come no_found_rows e fields=ids sono essenziali per siti con molti post. Combina meta_query, tax_query, e date_query per query complesse, e usa sempre wp_reset_postdata(). Con WP_Query ben scritto, puoi creare esperienze dinamiche senza impattare le performance.<\/p>","protected":false},"excerpt":{"rendered":"<p>Cos&#8217;\u00e8 WP_Query WP_Query \u00e8 la classe fondamentale di WordPress per eseguire query sul database e recuperare post. Sostituisce le query SQL dirette con un&#8217;interfaccia object-oriented che gestisce automaticamente cache, filtri, e compatibilit\u00e0. Ogni pagina di WordPress utilizza WP_Query internamente, ma crearne di personalizzate permette di visualizzare esattamente i contenuti desiderati in qualsiasi contesto: homepage personalizzata, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1108,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ai_primary_source":"","visibility_scope":"","ai_summary":"","ai_intent":"","ai_related_resources":"","ai_priority":0,"ai_entity_type":"","ai_is_based_on":"","ai_citations":"","ai_mentions":"","ai_speakable_selector":"","ai_chunk_hints":"","footnotes":""},"categories":[6],"tags":[47,45,46],"ai_visibility":[],"class_list":["post-669","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress","tag-php-development","tag-wordpress-development","tag-wordpress-performance-2"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":7}},"_links":{"self":[{"href":"https:\/\/aarkly.com\/it\/wp-json\/wp\/v2\/posts\/669","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aarkly.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/aarkly.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/aarkly.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/aarkly.com\/it\/wp-json\/wp\/v2\/comments?post=669"}],"version-history":[{"count":1,"href":"https:\/\/aarkly.com\/it\/wp-json\/wp\/v2\/posts\/669\/revisions"}],"predecessor-version":[{"id":883,"href":"https:\/\/aarkly.com\/it\/wp-json\/wp\/v2\/posts\/669\/revisions\/883"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/aarkly.com\/it\/wp-json\/wp\/v2\/media\/1108"}],"wp:attachment":[{"href":"https:\/\/aarkly.com\/it\/wp-json\/wp\/v2\/media?parent=669"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/aarkly.com\/it\/wp-json\/wp\/v2\/categories?post=669"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/aarkly.com\/it\/wp-json\/wp\/v2\/tags?post=669"},{"taxonomy":"ai_visibility","embeddable":true,"href":"https:\/\/aarkly.com\/it\/wp-json\/wp\/v2\/ai_visibility?post=669"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}