{"id":229841,"date":"2022-11-05T16:51:00","date_gmt":"2022-11-05T13:51:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229841"},"modified":"2022-11-09T16:37:15","modified_gmt":"2022-11-09T13:37:15","slug":"miglioramenti-alla-leggibilita-di-wp_query-per-manutenzione","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/miglioramenti-alla-leggibilita-di-wp_query-per-manutenzione\/","title":{"rendered":"Miglioramenti alla leggibilit\u00e0 di WP_Query (per manutenzione)"},"content":{"rendered":"\n<p>Lavorare con <a href=\"https:\/\/tommcfarlin.com\/passing-variables-in-wordpress-wp-query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query<\/a>, specialmente quando stai facendo un lavoro personalizzato al di fuori del solito &quot;prendi alcuni post e mostrali su un modello&quot; pu\u00f2 essere potente. Ci\u00f2 \u00e8 particolarmente vero per alcuni degli argomenti avanzati (come l&#8217;utilizzo di <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Meta_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Meta_Query<\/a>, per esempio) .<\/p>\n<p>\u00c8 anche bello che impostare il processo abbia un modo standard di fare le cose. Vale a dire:<\/p>\n<ol>\n<li>Definisci gli argomenti,<\/li>\n<li>Istanzia WP_Query,<\/li>\n<li>Controlla se ci sono post,<\/li>\n<li>Passa attraverso di loro,<\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=g2JNxeWO_wA\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Finiscili<\/a>.<\/li>\n<\/ol>\n<div class=\"sds-iframe-wrapper fitvidsignore\" style=\"position:relative;padding-top:56.25%;max-width:100%;\"><iframe allowfullscreen style=\"position:absolute;top:0;left:0;width:100%;height:100%;\" src=\"\/\/www.youtube.com\/embed\/g2JNxeWO_wA\" frameborder=\"0\"><\/iframe><\/div>\n<p>Ma se arrivi al punto in cui stai eseguendo un lavoro avanzato come lavorare con un tipo di post personalizzato da una soluzione di terze parti, dover caricare i file multimediali, determinare se esiste qualcosa prima di eseguire effettivamente qualsiasi lavoro con esso, allora pu\u00f2 essere un un po&#8217; pi\u00f9 complicato da lavorare, no?<\/p>\n<p>Ho scoperto che, come con qualsiasi cosa nella programmazione, scomporlo in moduli molto pi\u00f9 leggibili (o funzioni o pezzi o come preferisci chiamarli) pu\u00f2 rendere molto pi\u00f9 facile lavorare con.<\/p>\n<p>Quindi, ecco un modo in cui vado a lavorare per apportare miglioramenti alla leggibilit\u00e0 di WP_Query in una variet\u00e0 di cose che ho fatto di recente.<\/p>\n<h2>Miglioramenti alla leggibilit\u00e0 di WP_Query<\/h2>\n<p>Prima di passare attraverso qualsiasi esempio, vale la pena sottolineare che ci sono alcune cose che il modo in cui WP_Query \u00e8 impostato che non possiamo fare.<\/p>\n<p>Ad esempio, una volta che la query \u00e8 stata istanziata, potremmo non essere in grado di fare cose molto pi\u00f9 avanzate con essa (voglio dire, impostare qualsiasi unit test che non richieda il core di WordPress sar\u00e0 impossibile).<\/p>\n<p>Questo \u00e8 il volto di uno che non pu\u00f2 seguire il tuo codice.<\/p>\n<p>Detto questo, ecco un esempio di come pu\u00f2 apparire quando inizi e quindi come pu\u00f2 essere rifattorizzato per avere funzioni pi\u00f9 piccole, ognuna delle quali \u00e8 pi\u00f9 intenzionale di un metodo lungo.<\/p>\n<h3>Un esempio<\/h3>\n<p>Per questo post, diciamo che devo interrogare il database per tutti i post e i post pubblicati e voglio ordinarli in base all&#8217;ID.<\/p>\n<p>Successivamente, voglio determinare se alcuni strumenti di terze parti hanno assegnato alcuni metadati che corrispondono a un modello che posso assegnare in seguito a livello di codice dato un tema che ho.<\/p>\n<p>Forse la versione iniziale del codice potrebbe assomigliare <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-00-wp-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">a questa<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/\/ Assume this is defined within the context of a class.\nconst MAPPING = [\n        'employers'       =&gt; 'page-past-word.php',\n        'biography'       =&gt; 'page-biography.php',\n        'accomplishments' =&gt; 'page-csv.php',\n    ];\n\n\/* Snip the rest of the class for brevity *\/\n\npublic function map_templates() {\n\n  $args = [\n    'post_type'      =&gt; array( 'post', 'page' ),\n    'post_status'    =&gt; 'publish',\n    'orderby'        =&gt; 'ID',\n    'order'          =&gt; 'ASC',\n    'posts_per_page' =&gt; -1,\n  ];\n  $template_query = new WP_Query( $args );\n\n    if ($template_query-&gt;have_posts()) {\n        while ($template_query-&gt;have_posts()) {\n            $template_query-&gt;the_post();\n\n            $template_id = get_post_meta( $post_id, 'third_party_template_id', true );\n            if ('' === $template_id) {\n                continue;\n            }\n\n                \/\/ The third-party's template post name can be used to map our custom template.\n            $template_info = get_post( $template_id );\n            $template_name = $template_info-&gt;post_name;\n\n            if (isset( self::MAPPING[ $template_name ])) {\n\n                $template_file = self::MAPPING[ $template_name ];\n                update_post_meta( $post_id, '_wp_page_template', $template_file );\n            }\n        }\n    }\n}\n<\/code><\/pre>\n<p>\u00c8 un sacco di codice per fare un bel po&#8217; di lavoro per una funzione. Per lo meno, espone tutto ci\u00f2 che deve accadere, non \u00e8 vero?<\/p>\n<p>Prima di continuare a leggere, nota che l&#8217;array di mappatura \u00e8 solo un esempio, ma le chiavi rappresentano la meta chiave per\u00a0 mapparlo e questo ci aiuta a mappare definendo il <strong>valore<\/strong> <strong>_wp_page_template<\/strong> quando arriva il momento di mapparlo su file template WordPress effettivi.<\/p>\n<p>Quindi come pu\u00f2 essere scomposto?<\/p>\n<h3>1 Calcia il tutto<\/h3>\n<p>La prima cosa che vogliamo fare \u00e8 creare una funzione che metta in moto l&#8217;intera cosa. Ci sono alcuni modi in cui puoi scegliere di farlo.<\/p>\n<p>Ecco come ho scelto <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-01-map-page-templates-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">di farlo<\/a> :<\/p>\n<pre><code>&lt;?php\n\npublic function map_page_templates() {\n\n  $posts = $this-&gt;load_posts_and_pages();\n  if ($posts-&gt;have_posts()) {\n    $this-&gt;assign_templates( $posts );\n  }\n}<\/code><\/pre>\n<p>In poche parole, utilizzer\u00e0 alcune funzioni di supporto \u2013 tutte che documenter\u00f2 di seguito \u2013 e quindi assegner\u00e0 qualsiasi modello che abbiamo nell&#8217;array di mappatura definito sopra.<\/p>\n<h3>2 Carica post e pagine<\/h3>\n<p>Naturalmente, la prima cosa che vogliamo fare \u00e8 impostare una funzione da chiamare che restituir\u00e0 use i risultati della query:<\/p>\n<pre><code>&lt;?php\n\nprivate function load_posts_and_pages() {\n\n  $args = [\n    'post_type'      =&gt; array( 'post', 'page' ),\n    'post_status'    =&gt; 'publish',\n    'orderby'        =&gt; 'ID',\n    'order'          =&gt; 'ASC',\n    'posts_per_page' =&gt; -1,\n  ];\n  $posts = new WP_Query( $args );\n\n  return $posts;\n}\n<\/code><\/pre>\n<p>Ci\u00f2 restituisce i risultati della query. In questo modo, possiamo determinare se abbiamo bisogno di fare del lavoro aggiuntivo che diciamo nel succo del passaggio precedente:<\/p>\n<pre><code>&lt;?php\n\npublic function map_page_templates() {\n\n  $posts = $this-&gt;load_posts_and_pages();\n  if ($posts-&gt;have_posts()) {\n    $this-&gt;assign_templates( $posts );\n  }\n}<\/code><\/pre>\n<p>Se no, allora abbiamo finito. Altrimenti, ovviamente, andiamo avanti.<\/p>\n<h3>3 Recuperare l&#8217;ID modello di terze parti<\/h3>\n<p>Successivamente, l&#8217;idea di assegnare i modelli, come mostrato nel codice sopra, sembra abbastanza semplice, ma ci sono alcune cose che dobbiamo fare prima:<\/p>\n<ol>\n<li>scorrere i post,<\/li>\n<li>prendi l&#8217;ID di terze parti del modello,<\/li>\n<li>prendi il nome del modello di terze parti,<\/li>\n<li>assegnare il modello dalla costante di mappatura definita in precedenza nella classe.<\/li>\n<\/ol>\n<p>L&#8217;iterazione iniziale della funzione potrebbe essere <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-03-assign-templates-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">simile a questa<\/a> :<\/p>\n<pre><code>&lt;?php\n\nprivate function assign_templates( WP_Query $posts) {\n\n  while ($posts-&gt;have_posts()) {\n    $posts-&gt;the_post();\n\n    $template_id = $this-&gt;get_template_id( get_the_ID() );\n    if ('' === $template_id) {\n      continue;\n    }\n\n    $template_name = $this-&gt;get_template_name( $template_id );\n    if (null === $template_name) {\n      continue;\n    }\n\n    $this-&gt;assign_template( get_the_ID(), $template_name );\n  }\n  wp_reset_postdata();\n}\n<\/code><\/pre>\n<p>Ma come puoi vedere, ci sono ancora funzioni di supporto che necessitano di definizioni. Cose come la possibilit\u00e0 di ottenere l&#8217;ID del modello, il nome del modello e, infine, assegnare il modello.<\/p>\n<p>Si noti, tuttavia, che se una qualsiasi delle funzioni di supporto non restituisce un valore utile, si continua con il ciclo. Questo \u00e8 necessario se non altro per assicurarci che non stiamo cercando di mappare modelli che non esistono (ma trovo che renda anche un po&#8217; pi\u00f9 facile la lettura).<\/p>\n<h3>4 Trovare il file su cui mappare l&#8217;ID modello<\/h3>\n<p>Successivamente, una piccola funzione pu\u00f2 essere utilizzata per esaminare l&#8217;ID del modello di terze parti e determinare se possiamo mappare questo valore alle pagine che esistono <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-04-get-template-id-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">nel nostro database<\/a>.<\/p>\n<pre><code>&lt;?php\n\nprivate function get_template_id( $post_id) {\n\n  $template_id = get_post_meta( $post_id, 'third_party_template_id', true );\n  return $template_id;\n}\n<\/code><\/pre>\n<p>In caso contrario, possiamo restituire una stringa vuota e quindi avere la funzione che ha invocato questo particolare controllo per vedere se vale la pena continuare con il ciclo che abbiamo definito.<\/p>\n<h3>5 Prendi il nome del modello<\/h3>\n<p>Supponendo di avere un ID post valido, ora dobbiamo <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-05-get-template-name-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">recuperare il nome del modello<\/a> dall&#8217;array di mappatura definito in precedenza nel post:<\/p>\n<pre><code>&lt;?php\n\nprivate function get_template_name( $template_id) {\n\n  $template_info = get_post( $template_id );\n  $template_name = $template_info-&gt;post_name;\n\n  if (isset( self::MAPPING[ $template_name ])) {\n    return $template_name;\n  } else {\n    return null;\n  }\n}\n<\/code><\/pre>\n<p>Ecco il problema: restituiremo il nome del modello o restituiremo un valore nullo. Ancora una volta, questo \u00e8 cos\u00ec che possiamo determinare se \u00e8 necessario continuare con il ciclo di assegnazione dei modelli o meno.<\/p>\n<h3>6 Assegna il modello<\/h3>\n<p>Infine, possiamo prendere l&#8217;ID del modello fornito dalla terza parte e usarlo per <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-06-assign-template-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">mappare il file<\/a> che abbiamo incluso con il nostro lavoro come descritto in precedenza nel post:<\/p>\n<pre><code>&lt;?php\n\nprivate function assign_template( $post_id, $template_name) {\n\n  $template_file = self::MAPPING[ $template_name ];\n  update_post_meta( $post_id, '_wp_page_template', $template_file );\n}\n<\/code><\/pre>\n<p>E questo \u00e8 in definitiva il modo in cui puoi creare codice e funzioni molto pi\u00f9 piccoli, pi\u00f9 facili da leggere e pi\u00f9 facili da usare quando lavori con query leggermente pi\u00f9 complicate.<\/p>\n<h2>E quindi, miglioramenti della leggibilit\u00e0<\/h2>\n<p>Per coloro che sono abituati a scrivere leggendo metodi lunghi o facendo cose nel modo in cui gran parte dei tutorial sul Web mostrano come fare cose in WordPress, questo pu\u00f2 sembrare un sacco di codice inutile.<\/p>\n<p>Ma considera questo:<\/p>\n<ol>\n<li>I metodi pi\u00f9 lunghi sono pi\u00f9 difficili da leggere,<\/li>\n<li>Possono essere pi\u00f9 difficili da eseguire il debug,<\/li>\n<li>E non scompongono il problema in pezzi pi\u00f9 gestibili.<\/li>\n<\/ol>\n<p>Certo, mi piacerebbe suddividerlo in ancora pi\u00f9 classi con le loro responsabilit\u00e0, e credo che si possa fare, ma data la natura di WP_Query, richiederebbe un po&#8217; pi\u00f9 di lavoro.<\/p>\n<p>Quindi ho cercato di trovare pi\u00f9 vie di mezzo possibile.<\/p>\n<p>Se stai lavorando con usi anche leggermente pi\u00f9 avanzati di WP_Query, ti consiglio almeno di considerare di scomporlo in parti pi\u00f9 piccole.<\/p>\n<p>Questo aiuta a curare la leggibilit\u00e0, potenzialmente qualsiasi manutenibilit\u00e0, e a scrivere codice pi\u00f9 pulito piuttosto che un metodo lungo con troppe condizionali e fare affidamento su una variet\u00e0 di altri dati.<\/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>Lavorare con la leggibilit\u00e0 di WP_Query pu\u00f2 essere difficile. Ecco un esempio di come scompongo l&#8217;uso dell&#8217;API in alcuni dei miei lavori.<\/p>\n","protected":false},"author":1,"featured_media":220946,"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-229841","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\/229841","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=229841"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/229841\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/220946"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=229841"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=229841"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=229841"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}