{"id":233796,"date":"2023-02-21T13:54:00","date_gmt":"2023-02-21T10:54:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233796"},"modified":"2022-11-11T12:27:25","modified_gmt":"2022-11-11T09:27:25","slug":"tutorial-endpoint-url-personalizzati-con-lapi-di-riscrittura-di-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/tutorial-endpoint-url-personalizzati-con-lapi-di-riscrittura-di-wordpress\/","title":{"rendered":"Tutorial: Endpoint URL personalizzati con l&#8217;API di riscrittura di WordPress"},"content":{"rendered":"\n<p>Hai mai desiderato di poter estendere singoli post, pagine o tipi di post personalizzati con un modello personalizzato che mantiene la propria struttura URL? <a href=\"https:\/\/codex.wordpress.org\/Rewrite_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Con l&#8217; API di riscrittura<\/a> di WordPress questo \u00e8 completamente possibile e non \u00e8 affatto difficile.<\/p>\n<p>In questo tutorial vedremo come aggiungere una singola visualizzazione del tipo di post personalizzato con un altro slug che carica un modello diverso. In altre parole, se un singolo post di tipo personalizzato ha l&#8217;URL &quot;example.com\/destination\/venice\/&quot;, puoi aggiungere regole URL per pagine separate con informazioni correlate a ciascuna destinazione, ad esempio &quot;example.com\/destination\/venice\/&quot; \/attivit\u00e0\/&quot; e &#8220;example.com\/destination\/venice\/attractions\/&#8221;.<\/p>\n<p>Se sei interessato a come aggiungere endpoint alla pagina &quot;Il mio account&quot; di WooCommerce, ho un <a href=\"https:\/\/awhitepixel.com\/blog\/how-to-add-custom-endpoints-to-my-account-page-in-woocommerce\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">altro post<\/a> proprio su questo!<\/p>\n<p>L&#8217;API di riscrittura di WordPress ha molte funzioni utili per scrivere le tue regole URL personalizzate. Potresti aver visto la funzione pi\u00f9 conosciuta e ampia; <code>add_rewrite_rule()<\/code>. Questo tutorial utilizza tuttavia il simile <code>add_rewrite_endpoint()<\/code>, che \u00e8 molto utile per aggiungere &quot;endpoint&quot; URL (in pratica aggiungendo slug URL personalizzati dopo qualcosa che gi\u00e0 esiste, ad esempio dopo la fine di un singolo post o una singola categoria). \u00c8 possibile ottenere lo stesso risultato utilizzando, <code>add_rewrite_rule()<\/code>ma il processo di aggiunta degli endpoint \u00e8 pi\u00f9 semplice.<\/p>\n<h2>Cosa faremo<\/h2>\n<p>Questa guida presumer\u00e0 che abbiamo creato due tipi di post personalizzati; &#8216;film&#8217; e &#8216;attore&#8217;. La regola del permalink per un singolo film \u00e8 &quot;example.com\/movie\/fight-club\/&quot; e per un singolo attore &quot;example.com\/actor\/brad-pitt\/&quot;. Vogliamo una pagina separata per ogni film che mostri tutti gli attori in quel film, che si trova su &quot;example.com\/movie\/fight-club\/actors\/&quot; e allo stesso modo una pagina separata per ogni attore che mostri tutti i film in cui l&#8217;attore \u00e8 stato, che si trova su &quot;example.com\/actor\/brad-pitt\/movies\/&quot;.<\/p>\n<p>Non entrer\u00f2 nei dettagli su come aggiungere questi due tipi di post personalizzati; se hai bisogno di aiuto per fare questa parte, ti consiglio di leggere il mio post su <a href=\"https:\/\/awhitepixel.com\/blog\/how-to-create-custom-post-types-and-custom-taxonomies\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">come aggiungere tipi di post personalizzati<\/a>.<\/p>\n<h2>Scrivere il codice<\/h2>\n<p>Il primo passo \u00e8 chiamare <code>add_rewrite_endpoint()<\/code>una funzione agganciata a <code>init<\/code>(generalmente tutte le funzioni nell&#8217;API di riscrittura sono agganciate a <code>init<\/code>). per registrare i nostri due endpoint desiderati; &#8216;film&#8217; e &#8216;attori&#8217;. La <a href=\"https:\/\/codex.wordpress.org\/Rewrite_API\/add_rewrite_endpoint\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">funzione<\/a> accetta due argomenti; prima l&#8217;endpoint desiderato (ad es. &#8216;film&#8217;), e in secondo luogo una costante per la posizione in cui l&#8217;endpoint dovrebbe &quot;vivere&quot; (ad es. pagine, autore, archivi, ecc.). Guarda la documentazione per quali costanti puoi usare; come per questo esempio il generale <code>EP_PERMALINK<\/code>va bene:<\/p>\n<pre><code>add_action('init', function() {\n    add_rewrite_endpoint('movies', EP_PERMALINK);\n    add_rewrite_endpoint('actors', EP_PERMALINK);\n});<\/code><\/pre>\n<p>NB: Se il tuo tipo di post personalizzato \u00e8 gerarchico, ovvero ha <code>'hierarchical' =&gt; true<\/code>nel suo <code>register_post_type()<\/code>, devi cambiare la costante <code>EP_PERMALINK<\/code>con <code>EP_PAGES<\/code>.<\/p>\n<p>Dopo aver salvato questo codice, devi andare su Impostazioni&gt; Permalink e fare semplicemente clic sul pulsante Salva per aggiornare i permalink. Ogni volta che aggiungi o modifichi una regola di riscrittura, devi aggiornare i tuoi permalink affinch\u00e9 funzionino!<\/p>\n<h3>Gestione della query vars<\/h3>\n<p>Il modo in cui tu come sviluppatore di temi o plugin puoi capire se mostrare o meno i modelli per questi endpoint, \u00e8 controllando &quot;query vars&quot;; fondamentalmente l&#8217;oggetto query globale di WordPress. Lo facciamo chiamando <code>get_query_var()<\/code>con la query come argomento (&quot;film&quot; o &quot;attori&quot;).<\/p>\n<p>Se hai lavorato con <code>add_rewrite_rule()<\/code>o <code>get_query_var()<\/code>prima, potresti gi\u00e0 essere consapevole del fatto che WordPress non aggiunge automaticamente query personalizzate vars. Di solito dovresti filtrare <code>query_vars<\/code>e aggiungere le tue variabili personalizzate per fare in modo che WordPress le popoli. Tuttavia <code>add_rewrite_endpoint()<\/code>lo fa automaticamente per noi.<\/p>\n<p>Tuttavia, se proviamo a chiamarlo <code>get_query_var('movies')<\/code>non sembrer\u00e0 mai impostato. Questo perch\u00e9 presume che debba avere un valore per essere impostato. Le regole dell&#8217;endpoint presuppongono che tutto ci\u00f2 che viene dopo l&#8217;endpoint sia il valore. Ad esempio &quot;example.com\/actor\/brad-pitt\/movies\/some-value\/&quot; funzionerebbe, perch\u00e9 in questa pagina <code>get_query_var('movies')<\/code>restituirebbe il valore &#8216;some-value&#8217;. Ma non \u00e8 quello che vogliamo, vogliamo che funzioni solo con il singolo endpoint. Per risolvere questo problema, dobbiamo collegarci al <code>request<\/code>filtro di WordPress e informare WordPress che se siamo ai nostri endpoint, la query vars dovrebbe aggiungere l&#8217;endpoint con un valore (lo abbiamo semplicemente impostato su <code>true<\/code>).<\/p>\n<pre><code>add_filter('request', function($vars) {\n    if (isset($vars['movies'])) {\n        $vars['movies'] = true;\n    }\n    if (isset($vars['actors'])) {\n        $vars['actors'] = true;\n    }\n    return $vars;\n});<\/code><\/pre>\n<p>Se provi ora a usare <code>get_query_vars('movies')<\/code>quando su &quot;example.com\/actor\/brad-pitt\/movies\/&quot; otterresti il \u200b\u200bvalore <code>true<\/code>(l&#8217;importante \u00e8 che sia stato effettivamente impostato).<\/p>\n<h3>Modello di caricamento<\/h3>\n<p>Il passo successivo \u00e8 decidere cosa dovrebbe accadere su questi due endpoint; o in altre parole, quali modelli vuoi caricare. Questa parte dipende da te, potresti agganciarti <code>template_redirect<\/code>ma \u00e8 davvero consigliato solo se vuoi eseguire un reindirizzamento effettivo. Consiglio di agganciarsi al <code>template_include<\/code>filtro e dire semplicemente a WordPress quali modelli utilizzare quando siamo ai nostri endpoint personalizzati. Supponiamo che il tema abbia i modelli PHP <code>single-actor-movies.php<\/code>per &#8220;example.com\/actor\/\/movies\/ e <code>single-movie-actors.php<\/code>per &#8220;example.com\/movie\/\/acts\/&#8221;.<\/p>\n<pre><code>add_filter('template_include', function($template) {\n    if (is_singular() &amp;&amp; get_query_var('movies')) {\n        $post = get_queried_object();\n        return locate_template(['single-actor-movies.php']);\n    }\n    if (is_singular() &amp;&amp; get_query_var('actors')) {\n        $post = get_queried_object();\n        return locate_template(['single-movie-actors.php']);\n    }\n    return $template;\n});<\/code><\/pre>\n<p>Con questo filtro attivo, WordPress dovrebbe caricare i modelli forniti per i nostri endpoint personalizzati, e all&#8217;interno di questi modelli l&#8217; <code>$post<\/code>oggetto globale sarebbe l&#8217;oggetto post singolo correlato prima dell&#8217;endpoint, ad esempio l&#8217;oggetto post del singolo attore quando siamo al modello per mostrare tutto film in cui \u00e8 apparso l&#8217;attore. Questo ci rende facile interrogare le informazioni che vogliamo mostrare.<\/p>\n<h2>Ottenere l&#8217;URL del tuo endpoint<\/h2>\n<p>Avere i nostri endpoint e pagine personalizzati va bene e dandy, ma da qualche parte dovresti collegarti a quelli. Ad esempio, nel modello di film singolo vorresti un collegamento &quot;Vedi tutti gli attori&quot; che va al tuo endpoint.<\/p>\n<p>Sfortunatamente non esiste una funzione WordPress cos\u00ec semplice per questo. Dovrai creare tu stesso l&#8217;URL. Consiglio di utilizzare <code>[get_site_url](https:\/\/developer.wordpress.org\/reference\/functions\/get_site_url\/)()<\/code>per gli endpoint a livello di sito o, nel caso precedente, faresti riferimento a un post specifico con <code>[get_the_permalink](https:\/\/developer.wordpress.org\/reference\/functions\/get_the_permalink\/)()<\/code>(o all&#8217;interno del ciclo o fornendo un ID post) e aggiungendo l&#8217;endpoint dopo di esso, in questo modo:<\/p>\n<pre><code>echo get_the_permalink(). '\/actors';<\/code><\/pre>\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>Questo tutorial ti mostra come estendere il tuo tipo di post personalizzato con un modello personalizzato che mantiene la propria struttura URL, utilizzando l&#8217;API di riscrittura di WordPress.<\/p>\n","protected":false},"author":1,"featured_media":152349,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[896,896,720,835,1110,835,720,844,844,865,865],"tags":[1168],"class_list":["post-233796","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-sviluppatore","category-guida-per-principianti","category-n-a","category-tutorial","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233796","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=233796"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233796\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/152349"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=233796"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=233796"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=233796"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}