{"id":230764,"date":"2022-11-30T17:43:00","date_gmt":"2022-11-30T14:43:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230764"},"modified":"2022-11-09T23:53:36","modified_gmt":"2022-11-09T20:53:36","slug":"regole-di-riscrittura-personalizzate-e-modelli-di-pagina-in-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/regole-di-riscrittura-personalizzate-e-modelli-di-pagina-in-wordpress\/","title":{"rendered":"Regole di riscrittura personalizzate e modelli di pagina in WordPress"},"content":{"rendered":"\n<p><strong><a href=\"https:\/\/codex.wordpress.org\/Rewrite_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">L&#8217; API<\/a><\/strong> di riscrittura di WordPress \u00e8 una solida API presupponendo che tu abbia dimestichezza con le espressioni regolari.<\/p>\n<p>E, onestamente, anche se non lo sei, strumenti come <strong><a href=\"https:\/\/www.phpliveregex.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP Live RegEx<\/a><\/strong> rendono davvero facile testare il tuo codice prima di inserirlo nella <code>add_rewrite_rule<\/code>chiamata API.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163543-61e7543bc96ee.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-163543-61e7543bc96ee.png\" alt=\"Regole di riscrittura personalizzate e modelli di pagina in WordPress\" ><\/a><\/p>\n<p>Tuttavia, ci sono momenti in cui potresti trovarti in una situazione in cui devi lavorare con regole di riscrittura e modelli di pagina. E quando questo \u00e8 il caso, non \u00e8 sempre cos\u00ec semplice come effettuare una semplice chiamata con una singola espressione regolare.<\/p>\n<p>La ragione? Se hai pi\u00f9 pagine che utilizzano lo stesso modello, non avrai sempre la pagina situata nello stesso indice nella query eseguita su ciascuna pagina.<\/p>\n<p>A tal fine, dobbiamo gestirlo in un modo leggermente diverso rispetto, ad esempio, al semplice accesso a un indice numerico di informazioni nella query globale.<\/p>\n<h2>Riscrivi regole e modelli di pagina<\/h2>\n<p>Per prima cosa, supponiamo di avere due modelli (che non sono in un ordine particolare):<\/p>\n<ol>\n<li>template-alpha.php<\/li>\n<li>template-beta.php<\/li>\n<\/ol>\n<p>E poi supponiamo di voler impostare un URL personalizzato per le pagine ciascuna delle quali utilizza uno di questi modelli.<\/p>\n<p>Questo sarebbe suddiviso nei seguenti passaggi:<\/p>\n<ol>\n<li>Scorri i post nella query,<\/li>\n<li>Archivia il post utilizzando il modello nel rispettivo array,<\/li>\n<li>Imposta le regole di riscrittura per ogni post con una determinata query.<\/li>\n<\/ol>\n<p>Per questo esempio, manterr\u00f2 le regole di riscrittura piuttosto semplici. Dopotutto, le espressioni regolari possono essere abbastanza difficili da seguire, quindi provare a seguirle mentre si ha a che fare con l&#8217;oggetto Query, pi\u00f9 array e gestire le regole pu\u00f2 essere un po&#8217; troppo.<\/p>\n<p>Detto questo, ecco un codice di esempio suddiviso in base ai passaggi precedenti. Alla fine del post, condivider\u00f2 uno snippet che riunisce tutto in alcune funzioni separate in modo da poter vedere come tutto ci\u00f2 si adatta insieme.<\/p>\n<p>Detto questo, ecco come gestire tutto quanto sopra.<\/p>\n<h3>1 Aggiunta di regole di riscrittura<\/h3>\n<p>Innanzitutto, dobbiamo leggere alcune informazioni dall&#8217;oggetto query globale di WordPress per trovare tutte le pagine a cui sono applicati dei modelli.<\/p>\n<p>Per fare ci\u00f2, possiamo leggere le informazioni <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-00-read-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dall&#8217;oggetto query globale in una variabile locale<\/a><\/strong>. Questo rende facile uscire dal resto del codice se non c&#8217;\u00e8 niente con cui lavorare.<\/p>\n<pre><code>&lt;?php \n\n$query = $this-&gt;query-&gt;query([\n    'post_type' =&gt; 'page',\n    'meta_key' =&gt; '_wp_page_template',\n    'meta_value' =&gt; ['template-alpha.php', 'template-beta.php'],\n]);\n\nif (!$query) {\n    return;\n}\n\n\/\/ More to come...\n<\/code><\/pre>\n<h3>2 Memorizzare le informazioni rilevanti in un array<\/h3>\n<p>Supponendo che ci siano pagine con modelli, procederemo con <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-001-store-templated-pages-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l&#8217;archiviazione di ciascuna pagina<\/a><\/strong> in array in modo da poter gestire facilmente le rispettive regole di riscrittura.<\/p>\n<pre><code>&lt;?php\n\nforeach ($query as $post) {\n    $slug = get_page_template_slug($post-&gt;ID);\n\n    if ('template-alpha.php' === $slug) {\n        $this-&gt;alphaPages[] = $post;\n    }\n\n    if ('template-find-a-camp.php' === $slug) {\n        $this-&gt;betaPages[] = $post;\n    }\n}\n<\/code><\/pre>\n<p>Si noti che in quanto sopra, faccio riferimento a un array globale. Supponiamo che questo sia semplicemente inizializzato come un array vuoto nel costruttore della classe.<\/p>\n<h3>3 Impostare le regole di riscrittura<\/h3>\n<p>Ora che abbiamo due array, uno per ogni modello e le pagine che lo contengono, possiamo scorrere attraverso di essi e assegnare regole di riscrittura per ciascuna di quelle pagine.<\/p>\n<p>Ad esempio, supponiamo che per un modello, ad esempio alfa, vogliamo impostare regole di riscrittura per gli Stati Uniti e gli stati.<\/p>\n<p><strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-02-country-state-rules-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Ecco il codice<\/a><\/strong> per<code>template-alpha.php<\/code>:<\/p>\n<pre><code>&lt;?php\n\nadd_rewrite_tag('%country%', '([^&amp;]+)');\nadd_rewrite_tag('%state%', '([^&amp;]+)');\n\nforeach ($this-&gt;alphaPages as $post) {\n    add_rewrite_rule(\n        '^'.$post-&gt;post_name.'\/([^\/]*)\/([^\/]*)\/?',\n        'index.php?page_id='.$post-&gt;ID.'&amp;country=$matches[1]&amp;state=$matches[2]',\n        'top'\n    );\n\n    add_rewrite_rule(\n        '^'.$post-&gt;post_name.'\/([^\/]*)\/?',\n        'index.php?page_id='.$post-&gt;ID.'&amp;country=$matches[1]',\n        'top'\n    );\n}\n<\/code><\/pre>\n<p>Ed <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-03-acme-id-rules-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ecco il codice<\/a><\/strong> per <code>template-beta.php<\/code>:<\/p>\n<pre><code>&lt;?php\n\nadd_rewrite_tag('%acme-id%', '([^&amp;]+)');\n\nforeach ($this-&gt;betaPages as $post) {\n    add_rewrite_rule(\n        '^(.*)?\/([A-Za-z0-9-]+-)(d+)\/?',\n        'index.php?page_id='.$post-&gt;ID.'&amp;acme-id=$matches[3]',\n        'top'\n    );\n}\n<\/code><\/pre>\n<p>Naturalmente, le espressioni regolari utilizzate nel codice sopra sono semplicemente a scopo dimostrativo. Il tuo sar\u00e0 per tutto ci\u00f2 che \u00e8 necessario per il tuo progetto.<\/p>\n<h3>4 Tutti insieme adesso<\/h3>\n<p>\u00c8 importante suddividere tutte queste funzionalit\u00e0 nei propri metodi in modo che possano essere facilmente incapsulate e testate, se necessario.<\/p>\n<p>A tal fine, ecco come apparir\u00e0 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-04-final-functions-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">il codice completo :<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\npublic function addRewriteRules()\n{\n    $query = $this-&gt;query-&gt;query([\n        'post_type' =&gt; 'page',\n        'meta_key' =&gt; '_wp_page_template',\n        'meta_value' =&gt; ['template-alpha.php', 'template-beta.php'],\n    ]);\n\n    if (!$query) {\n        return;\n    }\n\n    $this-&gt;setPageTypes($query);\n    $this-&gt;setAlphaRewriteRules();\n    $this-&gt;setBetaRewriteRules();\n}\n\nprivate function setPageTypes($query)\n{\n    foreach ($query as $post) {\n        $slug = get_page_template_slug($post-&gt;ID);\n\n        if ('template-alpha.php' === $slug) {\n            $this-&gt;alphaPages[] = $post;\n        }\n\n        if ('template-find-a-camp.php' === $slug) {\n            $this-&gt;betaPages[] = $post;\n        }\n    }\n}\n\nprivate function setAlphaRewriteRules()\n{\n    add_rewrite_tag('%country%', '([^&amp;]+)');\n    add_rewrite_tag('%state%', '([^&amp;]+)');\n\n    foreach ($this-&gt;alphaRules as $post) {\n        add_rewrite_rule(\n            '^'.$post-&gt;post_name.'\/([^\/]*)\/([^\/]*)\/?',\n            'index.php?page_id='.$post-&gt;ID.'&amp;country=$matches[1]&amp;state=$matches[2]',\n            'top'\n        );\n\n        add_rewrite_rule(\n            '^'.$post-&gt;post_name.'\/([^\/]*)\/?',\n            'index.php?page_id='.$post-&gt;ID.'&amp;country=$matches[1]',\n            'top'\n        );\n    }\n}\n\nprivate function setBetaRewriteRules()\n{\n    add_rewrite_tag('%acme-id%', '([^&amp;]+)');\n\n    foreach ($this-&gt;betaPages as $post) {\n        add_rewrite_rule(\n            '^(.*)?\/([A-Za-z0-9-]+-)(d+)\/?',\n            'index.php?page_id='.$post-&gt;ID.'&amp;acme-id=$matches[3]',\n            'top'\n        );\n    }\n}\n<\/code><\/pre>\n<p>Ricorda, per\u00f2; questo \u00e8 solo basato sul codice demo condiviso in questo post. Quando stai lavorando al tuo progetto, le espressioni regolari, i modelli e cos\u00ec via varieranno.<\/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>Ci sono momenti in cui potresti trovarti in una situazione in cui devi lavorare con regole di riscrittura e modelli di pagina.<\/p>\n","protected":false},"author":1,"featured_media":163544,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[896,720,844,865],"tags":[1168],"class_list":["post-230764","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-sviluppatore","category-tutorial","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/230764","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=230764"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/230764\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/163544"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=230764"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=230764"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=230764"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}