{"id":233635,"date":"2023-02-18T16:05:00","date_gmt":"2023-02-18T13:05:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233635"},"modified":"2022-11-11T00:45:39","modified_gmt":"2022-11-10T21:45:39","slug":"come-aggiungere-endpoint-personalizzati-alla-pagina-il-mio-account-in-woocommerce","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/come-aggiungere-endpoint-personalizzati-alla-pagina-il-mio-account-in-woocommerce\/","title":{"rendered":"Come aggiungere endpoint personalizzati alla pagina Il mio account in WooCommerce"},"content":{"rendered":"\n<p>Questo post spiega come aggiungere endpoint personalizzati alla pagina &quot;Il mio account&quot; di <a href=\"https:\/\/woocommerce.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WooCommerce<\/a>. Possiamo renderlo accessibile in due modi: come scheda personalizzata o come pulsante per ciascun ordine nella scheda &quot;Ordini&quot;.<\/p>\n<p>La pagina &quot;Il mio account&quot; di WooCommerce utilizza la funzionalit\u00e0 integrata di WordPress per gli endpoint che semplifica la regolazione o l&#8217;aggiunta dei propri endpoint. Se non hai dimestichezza con gli endpoint, ti consiglio di leggere il mio post che approfondisce <a href=\"https:\/\/awhitepixel.com\/blog\/adding-custom-url-endpoints-with-wordpress-rewrite-api\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">come aggiungere endpoint personalizzati in WordPress<\/a>.<\/p>\n<p>Il modo in cui rendi accessibile il tuo endpoint personalizzato per l&#8217;utente da &quot;Il mio account&quot; dipende interamente dalle esigenze del tuo negozio online. Se desideri semplicemente una pagina generale per ulteriori informazioni, puoi aggiungere questa pagina come scheda a s\u00e9 stante. Se tuttavia desideri che il tuo endpoint sia correlato a ciascun ordine, devi aggiungere il tuo endpoint a ciascuna riga dell&#8217;ordine nella scheda &quot;Ordini&quot;. In questo post esamineremo entrambi i metodi.<\/p>\n<h2>Aggiunta di una scheda personalizzata e di un endpoint a &quot;Il mio account&quot;<\/h2>\n<p>Per esempio, supponiamo che il nostro negozio online venda software e abbiamo bisogno di un posto dove mostrare le chiavi di licenza dei nostri clienti nella loro pagina &quot;Il mio account&quot;. Aggiungeremo una scheda personalizzata &quot;Chiavi di licenza&quot; che dovrebbe restituire tutte le chiavi di licenza valide registrate per quell&#8217;utente.<\/p>\n<h3>Aggiunta di un endpoint personalizzato<\/h3>\n<p>Nel codice del nostro tema <code>functions.php<\/code>o del plugin, aggiungiamo prima il nostro endpoint personalizzato utilizzando <code>add_rewrite_endpoint()<\/code>. Come primo argomento a questo forniamo una chiave univoca. Nell&#8217;esempio seguente ho chiamato l&#8217;endpoint &#8216; <code>license-keys<\/code>&#8216;.<\/p>\n<pre><code>add_action('init', function() {\n    add_rewrite_endpoint('license-keys', EP_ROOT | EP_PAGES);\n});<\/code><\/pre>\n<p>Tieni presente che WordPress aggiunge automaticamente la nostra chiave per interrogare vars durante l&#8217;utilizzo <code>add_rewrite_endpoint()<\/code>, quindi non \u00e8 necessario filtrare <code>query_vars<\/code>.<\/p>\n<p>Se riscontri errori &quot;404 non trovato&quot;, devi aggiornare i tuoi permalink. Puoi farlo andando su Impostazioni&gt; Permalink e fai semplicemente clic su Salva. Ogni volta che apportiamo modifiche ai permalink o agli endpoint, dobbiamo farlo.<\/p>\n<h3>Aggiunta di una scheda personalizzata<\/h3>\n<p>Il passaggio successivo consiste nell&#8217;aggiungere una scheda alle schede della pagina &quot;Il mio account&quot;. Lo facciamo con il filtro <code>woocommerce_account_menu_items<\/code>. L&#8217;array fornito dal filtro contiene tutti i tasti di tabulazione e la relativa etichetta.<\/p>\n<p>Puoi semplicemente aggiungere la tua scheda alla fine dell&#8217;array, ma se vuoi un maggiore controllo su dove dovrebbe apparire la tua scheda, devi manipolare l&#8217;array usando le funzioni PHP. Nell&#8217;esempio sopra lo voglio alla fine, ma prima della scheda &quot;Esci&quot;. Quindi estraggo la scheda &quot;Esci&quot;, inserisco la mia scheda e quindi rimetto la scheda &quot;Esci&quot; dopo.<\/p>\n<pre><code>add_filter('woocommerce_account_menu_items', function($items) {\n    $logout = $items['customer-logout'];\n    unset($items['customer-logout']);\n    $items['license-keys'] = __('License keys', 'txtdomain');\n    $items['customer-logout'] = $logout;\n    return $items;\n});<\/code><\/pre>\n<p>Se aggiorni la pagina Il mio account ora, dovresti vedere la tua scheda apparire prima di &quot;Esci&quot;. Cliccandoci sopra si accede all&#8217;URL &#8221; <code>&lt;example.com&gt;\/my-account\/license-keys\/<\/code>&#8220;. Tuttavia non vedrai nulla di cambiamento quando fai clic sulla scheda. Questo perch\u00e9 non abbiamo definito cosa produrre. Questo \u00e8 il nostro prossimo passo.<\/p>\n<h3>Rendering del contenuto della scheda personalizzata<\/h3>\n<p>WooCommerce offre l&#8217;hook <code>woocommerce_account_&lt;endpoint key&gt;_endpoint<\/code>per l&#8217;output di contenuti in &quot;Il mio account&quot;, dove si sostituisce con la chiave dell&#8217;endpoint personalizzata. Nel nostro esempio l&#8217;hook corretto sarebbe <code>woocommerce_account_license-keys_endpoint<\/code>.<\/p>\n<pre><code>add_action('woocommerce_account_license-keys_endpoint', function() {\n    _e('Your license keys', 'txtdomain');\n});<\/code><\/pre>\n<p>Per quanto riguarda l&#8217;output effettivo della scheda, dipende interamente da te. Potresti fare una query, recuperare alcune informazioni e quindi emetterle. Tuttavia si consiglia di utilizzare i modelli per l&#8217;output dell&#8217;HTML invece di produrre l&#8217;output HTML completo direttamente all&#8217;interno della nostra funzione. WooCommerce offre ottime funzionalit\u00e0 per i modelli, quindi lo useremo.<\/p>\n<p>Utilizzando <code>wc_get_template()<\/code>possiamo fornire un modello personalizzato (non \u00e8 necessario che sia uno dei modelli di WooCommerce). Come secondo argomento possiamo definire variabili che verranno passate al file template. Seguendo la struttura stabilita di WooCommerce, creiamo un modello WooCommerce personalizzato che abbiamo <code>call license-keys.php<\/code>nella <code>&lt;theme&gt;\/woocommerce\/myaccount\/<\/code>cartella.<\/p>\n<pre><code>add_action('woocommerce_account_license-keys_endpoint', function() {\n    $licenses = [];  \/\/ Replace with function to return licenses for current logged in user\n    wc_get_template('myaccount\/license-keys.php', [\n        'licenses' =&gt; $licenses\n    ]);\n});<\/code><\/pre>\n<p>Vai avanti e crea un file vuoto <code>&lt;theme&gt;\/woocommerce\/myaccount\/license-keys.php<\/code>. All&#8217;interno di questo \u00e8 dove definisci l&#8217;output della tua scheda personalizzata. Abbiamo anche accesso a tutte le variabili che abbiamo passato nell&#8217;array <code>wc_get_template()<\/code>. Quindi nel nostro caso la <code>$licenses<\/code>variabile sar\u00e0 disponibile e popolata con le informazioni che abbiamo passato dalla nostra funzione di endpoint. Puoi trasmettere tutte le variabili di cui hai bisogno.<\/p>\n<h2>Aggiunta di un endpoint e di un pulsante personalizzato a ciascun ordine nella pagina &quot;Il mio account&quot;.<\/h2>\n<p>Continuiamo con lo stesso esempio sopra; supponendo che il tuo negozio online venda software e tu debba mostrare le chiavi di licenza del cliente da qualche parte. Ma invece di aggiungere una scheda personalizzata per mostrarli tutti, forse preferisci mostrare le chiavi di licenza collegate a un ordine specifico? Potremmo aggiungere un pulsante personalizzato accanto a &quot;Visualizza&quot; nella panoramica degli ordini in Il mio account:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152793-61e4fade776a4.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-152793-61e4fade776a4.png\" alt=\"Come aggiungere endpoint personalizzati alla pagina Il mio account in WooCommerce\" ><\/a><\/p>\n<p>Iniziamo facendo lo stesso che abbiamo fatto sopra: registrazione di un endpoint personalizzato:<\/p>\n<h3>Registra un endpoint personalizzato<\/h3>\n<pre><code>add_action('init', function() {\n    add_rewrite_endpoint('license-keys', EP_ROOT | EP_PAGES);\n});<\/code><\/pre>\n<p>Non dimenticare di svuotare i permalink (vai su Impostazioni &gt; Permalink e premi il pulsante Salva)!<\/p>\n<h3>Aggiungi un&#8217;azione personalizzata (e un pulsante)<\/h3>\n<p>Il passaggio successivo consiste nell&#8217;aggiungere il pulsante utilizzando il filtro <code>woocommerce_my_account_my_orders_actions<\/code>. Come secondo argomento di questo filtro ottieni l&#8217;oggetto order. Questo \u00e8 molto utile; vogliamo controllare che l&#8217;ordine sia completato e pagato, in modo da non mostrare le chiavi di licenza per ordini non pagati o annullati. Con l&#8217;oggetto dell&#8217;ordine otteniamo anche l&#8217;ID dell&#8217;ordine che \u00e8 molto probabilmente necessario per interrogare le chiavi di licenza per i prodotti in quell&#8217;ordine. Nel codice qui sotto controllo semplicemente se lo stato dell&#8217;ordine \u00e8 completato o meno. Probabilmente dovrai aggiungere il tuo codice per verificare se ci sono o meno chiavi di licenza da mostrare per ordine.<\/p>\n<p>Per aggiungere un&#8217;azione personalizzata \u00e8 necessario fornire una chiave univoca e un array con valori autoesplicativi per &#8216; <code>url<\/code>&#8216; e &#8216; <code>name<\/code>&#8216;. Per quanto riguarda l&#8217;URL, utilizziamo la funzione di WordPress per restituire l&#8217;URL dell&#8217;endpoint: <code>wc_get_endpoint_url()<\/code>. Poich\u00e9 abbiamo bisogno di passare anche l&#8217;ID dell&#8217;ordine, impostiamo l&#8217;ID dell&#8217;ordine come secondo argomento per questa funzione, che risulta nel seguente URL: <code>&lt;example.com&gt;\/my-account\/license-keys\/&lt;order ID&gt;\/<\/code>.<\/p>\n<pre><code>add_filter('woocommerce_my_account_my_orders_actions', function($actions, $order) {\n    if ($order-&gt;get_status() == 'completed') {\n        $actions['view-license-keys'] = [\n            'url' =&gt; wc_get_endpoint_url('license-keys', $order-&gt;get_id()),\n            'name' =&gt; __('View license keys', 'txtdomain')\n        ];\n    }\n    return $actions;\n}, 10, 2);<\/code><\/pre>\n<p>Questo dovrebbe aggiungere un nuovo pulsante per ogni ordine completato:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152793-61e4fadf850fe.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-152793-61e4fadf850fe.png\" alt=\"Come aggiungere endpoint personalizzati alla pagina Il mio account in WooCommerce\" ><\/a><\/p>\n<p>Ora tutto ci\u00f2 di cui abbiamo bisogno \u00e8 il modello da mostrare per l&#8217;endpoint <code>license-keys<\/code>.<\/p>\n<h3>Rendering dell&#8217;endpoint<\/h3>\n<p>Il modo in cui funzionano gli endpoint in WordPress \u00e8 che qualunque cosa venga dopo l&#8217;endpoint \u00e8 il valore di quella variabile di query; o in altre parole; quando visitiamo ad esempio l&#8217;URL <code>&lt;example.com&gt;\/my-account\/license-keys\/204\/<\/code>che possiamo utilizzare <code>get_query_var('license-keys')<\/code>per ottenere l&#8217;ID dell&#8217;ordine; 204.<\/p>\n<p>Per l&#8217;output del contenuto per il nostro endpoint personalizzato, ci colleghiamo a <code>woocommerce_account_&lt;endpoint key&gt;_endpoint<\/code>quale nel nostro caso sarebbe <code>woocommerce_account_license-keys_endpoint<\/code>. All&#8217;interno di quella funzione possiamo usare <code>get_query_var()<\/code>per ottenere l&#8217;ID dell&#8217;ordine e con quella query l&#8217;ordine per eventuali chiavi di licenza.<\/p>\n<pre><code>add_action('woocommerce_account_license-keys_endpoint', function() {\n    $order_id = get_query_var('license-keys');\n    $licenses = [];  \/\/ Function to return licenses for order ID\n\u00a0\n    wc_get_template('myaccount\/license-keys.php', [\n        'licenses' =&gt; $licenses,\n        'order_id' =&gt; $order_id\n    ]);\n});<\/code><\/pre>\n<p>L&#8217;output HTML effettivo del tuo modello personalizzato &quot; <code>myaccount\/license-keys.php<\/code>&quot; dipende interamente dalle tue esigenze. Presumibilmente avresti utilizzato l&#8217;ID ordine per raccogliere le chiavi di licenza in un array e passarlo al modello per un buon output. Nel codice sopra sto anche passando l&#8217;ID dell&#8217;ordine in modo che sia accessibile come <code>$order_id<\/code>all&#8217;interno del modello (ad esempio per l&#8217;output di un bel titolo &quot;Chiavi di licenza per l&#8217;ordine n. 204&quot;).<\/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>Questo post spiegher\u00e0 come aggiungere endpoint personalizzati a &#8220;Il mio account&#8221; di WooCommerce; sia come scheda propria, sia come pulsante per ciascun ordine nella scheda &#8220;Ordini&#8221;.<\/p>\n","protected":false},"author":1,"featured_media":223696,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[1110,814,814,844,844,855,855,865,865],"tags":[1168],"class_list":["post-233635","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-n-a","category-plugin-2","category-tutorial","category-woocommerce-6","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233635","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=233635"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233635\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/223696"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=233635"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=233635"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=233635"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}