{"id":233611,"date":"2023-02-17T09:26:00","date_gmt":"2023-02-17T06:26:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233611"},"modified":"2022-11-11T00:38:15","modified_gmt":"2022-11-10T21:38:15","slug":"come-aggiungere-in-modo-programmatico-uno-sconto-personalizzato-a-woocommerce-checkout","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/come-aggiungere-in-modo-programmatico-uno-sconto-personalizzato-a-woocommerce-checkout\/","title":{"rendered":"Come aggiungere in modo programmatico uno sconto personalizzato a WooCommerce Checkout"},"content":{"rendered":"\n<p>In questo post vedremo come aggiungere sconti in modo programmatico e automatico. Per fare ci\u00f2 utilizziamo la funzionalit\u00e0 coupon di WooCommerce ma la rendiamo automatica e nascondiamo il fatto che si tratta di un coupon per i clienti. Ho cercato di mantenere il codice il pi\u00f9 generale possibile in quanto le condizioni per l&#8217;applicazione degli sconti possono variare molto per chiunque legga questo.<\/p>\n<h2>Perch\u00e9 i coupon sono il modo per farlo<\/h2>\n<p>Nelle versioni precedenti di WooCommerce avevamo alcune opzioni (&quot;hackish&quot;) per aggiungere sconti con il codice, ad esempio fornendo un numero negativo <code>add_fee()<\/code>o lavorando con <code>get_discounted_price()<\/code>. Sfortunatamente questi metodi non funzionano pi\u00f9 o sono considerati legacy e verranno rimossi nelle versioni successive. Il modo strutturalmente buono per aggiungere sconti \u00e8 utilizzare la funzionalit\u00e0 coupon integrata in WooCommerce.<\/p>\n<p>Tuttavia un coupon generalmente non pu\u00f2 essere applicato automaticamente a un carrello. Richiede al cliente di digitare manualmente un codice coupon che deve essere stato fornito. In alcuni negozi online vuoi solo uno sconto applicato automaticamente quando una determinata condizione \u00e8 stata soddisfatta senza che il cliente debba fare nulla. Questo \u00e8 ci\u00f2 che sistemeremo usando il codice.<\/p>\n<h2>Sconti personalizzati con coupon<\/h2>\n<p>Dovrai creare un coupon con un codice e configurarlo con i parametri che desideri. Potrai applicarlo, rimuoverlo e modificare diversi output ovunque il coupon sia visibile per il cliente. Facoltativamente, se non desideri effettivamente che i coupon siano disponibili per i clienti nel tuo negozio online, esamineremo alcuni semplici trucchi per nascondere le opzioni per inserire manualmente i codici coupon.<\/p>\n<p>Nell&#8217;esempio di codice seguente sto raggruppando tutto il codice correlato in una classe PHP. Questo aiuta per un codice pi\u00f9 pulito ma \u00e8 particolarmente utile perch\u00e9 vogliamo fare riferimento al codice coupon pi\u00f9 volte. Definirla come una variabile di classe \u00e8 meglio che ripeterla in pi\u00f9 funzioni.<\/p>\n<h3>Crea il tuo sconto come coupon<\/h3>\n<p>Il primo passo \u00e8 creare il coupon che sar\u00e0 il &#8220;segnaposto&quot; del tuo sconto. Il pi\u00f9 semplice \u00e8 semplicemente crearne uno nell&#8217;amministratore di WooCommerce (WooCommerce &gt; Coupon &gt; Aggiungi coupon).<\/p>\n<p>Se desideri creare il coupon in modo programmatico, un coupon \u00e8 in realt\u00e0 un post con cui puoi creare <code>wp_insert_post()<\/code>, ma devi fare attenzione a creare il post del coupon solo una volta. WooCommerce ha una breve <a href=\"https:\/\/docs.woocommerce.com\/document\/create-a-coupon-programatically\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">guida su come creare un coupon in modo programmatico<\/a>.<\/p>\n<p>Fornisci uno slug univoco come codice coupon e imposta come minimo l&#8217;importo dello sconto (una percentuale o una tariffa fissa). Per quanto riguarda l&#8217;esempio di codice riportato di seguito, ho creato un codice coupon &#8216; <code>example<\/code>&#8216; (consiglio di utilizzare un nome pi\u00f9 creativo e appropriato per il tuo).<\/p>\n<h3>Creazione della classe PHP che conterr\u00e0 tutto il nostro codice<\/h3>\n<p>Passiamo finalmente alla codifica! Puoi definire questa classe direttamente all&#8217;interno del tuo tema <code>functions.php<\/code>, nel codice del plugin o in un file separato incluso.<\/p>\n<pre><code>class AWPCustomDiscount {\n    private $coupon_code = 'example';\n\u00a0\n    public function __construct() {\n\u00a0\n    }\n}\nnew AWPCustomDiscount();<\/code><\/pre>\n<p>Dai un nome alla tua classe come preferisci e sostituisci la variabile di classe <code>$coupon_code<\/code>con quello che hai chiamato il tuo coupon. Non dimenticare di inizializzare la classe dopo alla fine (<code>new AWPCustomDiscount()<\/code>).<\/p>\n<p>Se prima hai programmato orientato agli oggetti, questo dovrebbe esserti familiare. In caso contrario, non preoccuparti, dovrebbe essere semplice da seguire. Aggiungeremo alcune funzioni qui dentro e faremo riferimento al codice coupon con <code>$this-&gt;coupon_code<\/code>. Iniziamo con il codice responsabile dell&#8217;effettiva aggiunta del coupon quando le condizioni sono soddisfatte.<\/p>\n<h3>Applicazione del coupon in modo programmatico<\/h3>\n<p>Per esperienza ho imparato che l&#8217;aggancio del codice per l&#8217;applicazione e la rimozione dei coupon funziona meglio e in modo pi\u00f9 coerente utilizzando i due hook seguenti; uno per il carrello (<code>woocommerce_before_cart<\/code>) e uno per la cassa (<code>woocommerce_before_checkout_form<\/code>).<\/p>\n<p>All&#8217;interno della funzione tutto ci\u00f2 che dobbiamo fare \u00e8 verificare le condizioni desiderate. WooCommerce offre funzioni per ottenere l&#8217;oggetto carrello <code>with WC()-&gt;cart<\/code>che possiamo utilizzare per ottenere tutte le informazioni di cui abbiamo bisogno sul carrello come i suoi articoli e totali. A titolo di esempio il codice sottostante applicher\u00e0 uno sconto se il totale del carrello (esclusi eventuali sconti) \u00e8 superiore a un determinato importo.<\/p>\n<p>Dovremmo anche assicurarci che, se le condizioni non sono soddisfatte, dovremmo rimuovere lo sconto se \u00e8 stato aggiunto in precedenza. Nel nostro esempio, immaginiamo che il cliente abbia superato l&#8217;importo massimo, ma poi \u00e8 andato al carrello, ha rimosso alcuni articoli e quindi \u00e8 tornato al di sotto dell&#8217;importo richiesto. Poich\u00e9 i coupon non vengono applicati automaticamente, anche tutti i coupon applicati devono essere rimossi in modo programmatico.<\/p>\n<h4>Usando<code>apply_coupon<\/code><\/h4>\n<p>I coupon vengono aggiunti all&#8217;oggetto carrello <code>apply_coupon()<\/code>fornendo il codice coupon come parametro e vengono rimossi dall&#8217;oggetto carrello <code>remove_coupon()<\/code>con il codice coupon come parametro. Abbastanza semplice. Possiamo anche utilizzare la funzione cos\u00ec opportunamente denominata <code>get_applied_coupons()<\/code>nell&#8217;oggetto carrello per verificare se il nostro coupon \u00e8 gi\u00e0 stato applicato.<\/p>\n<pre><code>    ...\n    public function __construct() {\n        add_action('woocommerce_before_cart', [$this, 'addDiscount']);\n        add_action('woocommerce_before_checkout_form', [$this, 'addDiscount']);\n    }\n\u00a0\n    function addDiscount() {\n        if (is_admin() &amp;&amp; !defined('DOING_AJAX')) {\n            return;\n        }\n        if (WC()-&gt;cart-&gt;get_subtotal() &gt; 500) {\n            \/\/ add discount, if not added already\n            if (!in_array($this-&gt;coupon_code, WC()-&gt;cart-&gt;get_applied_coupons())) {\n                WC()-&gt;cart-&gt;apply_coupon($this-&gt;coupon_code);\n            }\n        } else {\n            \/\/ remove discount if it was previously added\n            WC()-&gt;cart-&gt;remove_coupon($this-&gt;coupon_code);\n        }\n    }\n    ...<\/code><\/pre>\n<p>Se non hai familiarit\u00e0 con l&#8217;utilizzo di PHP orientato agli oggetti in WordPress; ecco un breve riassunto di come funziona quanto sopra: La <code>__construct()<\/code>funzione verr\u00e0 eseguita ogni volta che la classe viene inizializzata, cosa che facciamo subito dopo la classe. All&#8217;interno <code>__construct()<\/code>di solito aggiungi tutti i ganci come faresti normalmente, ad esempio all&#8217;interno <code>functions.php<\/code>. Affinch\u00e9 WordPress possa trovare le nostre funzioni all&#8217;interno della nostra classe, dobbiamo dire all&#8217;hook di fare riferimento a una funzione definita in un array composto da <code>$this<\/code>(l&#8217;oggetto classe) e il nome della funzione.<\/p>\n<p>All&#8217;interno della funzione <code>addDiscount()<\/code>programmiamo nelle nostre condizioni. Nell&#8217;esempio sopra prendo il totale del carrello utilizzando <code>WC()-&gt;cart-&gt;get_subtotal()<\/code>e lo confronto con le mie condizioni, essendo superiore a 500.<\/p>\n<p>Nota: se devi recuperare e confrontare i totali del carrello, tieni presente che la maggior parte dei totali sono coupon inclusi. Ad esempio il pi\u00f9 familiare <code>WC()-&gt;cart-&gt;get_cart_contents_total()<\/code>restituir\u00e0 il totale prima della spedizione ma includeva gli sconti; il che significa che se il tuo sconto \u00e8 stato precedentemente applicato, questo totale non sar\u00e0 corretto da confrontare.<\/p>\n<p>Puoi chiamare <code>apply_coupon()<\/code>senza controllare se il coupon \u00e8 gi\u00e0 stato applicato (l&#8217; <code>if<\/code>assegno alla riga n. 14), perch\u00e9 la funzione <code>apply_coupon()<\/code>stessa si assicurer\u00e0 di non aggiungerlo nuovamente se era stato applicato prima. Tuttavia questo <code>if<\/code>controllo impedisce al cliente di ricevere un messaggio di errore che dice &quot;Il coupon \u00e8 gi\u00e0 stato applicato&quot; ogni volta che il carrello viene aggiornato.<\/p>\n<p>Ecco come apparir\u00e0 il tuo sconto nei totali del carrello nel carrello e nella cassa:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152866-61e4fcd750a7d.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-152866-61e4fcd750a7d.png\" alt=\"Come aggiungere in modo programmatico uno sconto personalizzato a WooCommerce Checkout\" ><\/a><\/p>\n<h4>Le tue condizioni per lo sconto<\/h4>\n<p>Le condizioni per il tuo coupon dipendono interamente da te e dalle tue esigenze. Ho impostato alcune condizioni di esempio per <a href=\"https:\/\/awhitepixel.com\/blog\/guide-on-how-to-add-custom-fees-to-woocommerce-checkout\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l&#8217;aggiunta di una tariffa personalizzata in un post precedente<\/a>, ad esempio a seconda del luogo di spedizione o dei prodotti nel carrello. Puoi anche confrontare la data odierna se desideri fare uno sconto speciale per Natale o Halloween, o fare uno sconto in base alle condizioni del cliente che ha effettuato l&#8217;accesso.<\/p>\n<p>Se preferisci applicare il coupon in base alle impostazioni che hai impostato sul coupon stesso, ad esempio escludere o includere determinati ID prodotto, puoi farlo anche tu. Puoi istanziare un oggetto del coupon dal codice coupon, in questo modo:<\/p>\n<pre><code>$coupon = new WC_Coupon($this-&gt;coupon_code);<\/code><\/pre>\n<p>Con quell&#8217;oggetto coupon hai accesso a tutte le funzioni per recuperare le impostazioni che hai impostato sul coupon. Ad esempio, ottenere gli ID prodotto che devono essere inclusi per il coupon:<\/p>\n<pre><code>$required_products = $coupon-&gt;get_product_ids();<\/code><\/pre>\n<p>Fare riferimento alla <a href=\"https:\/\/docs.woocommerce.com\/wc-apidocs\/class-WC_Coupon.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">documentazione per la classe WC_Coupon<\/a> per vedere come ottenere ci\u00f2 di cui hai bisogno.<\/p>\n<h3>Correggi l&#8217;etichetta visibile del coupon<\/h3>\n<p>Il coupon dovrebbe ormai essere aggiunto e rimosso quando il tuo carrello soddisfa o non soddisfa le condizioni stabilite in <code>addDiscount()<\/code>. Tuttavia, nella tabella dei totali sia nel carrello che nella cassa, lo sconto viene visualizzato come &quot;Coupon: esempio&quot; (o qualunque sia il tuo codice coupon). Questo non \u00e8 buono! Fortunatamente \u00e8 facile cambiare questa etichetta usando il filtro <code>woocommerce_cart_totals_coupon_label<\/code>. Aggiungeremo il filtro al nostro <code>__construct()<\/code>e definiremo una funzione:<\/p>\n<pre><code>    ...\n    public function __construct() {\n        add_action('woocommerce_before_cart', [$this, 'addDiscount']);\n        add_action('woocommerce_before_checkout_form', [$this, 'addDiscount']);\n        add_filter('woocommerce_cart_totals_coupon_label', [$this, 'discountLabel'], 10, 2);\n    }\n\u00a0\n    function discountLabel($label, $coupon) {\n        if ($coupon-&gt;code == $this-&gt;coupon_code) {\n            return __('Custom discount', 'txtdomain');\n        }\n        return $label;\n    }\n    ...<\/code><\/pre>\n<p>Con il filtro otteniamo l&#8217;accesso all&#8217;oggetto coupon come secondo parametro. Con l&#8217;oggetto coupon possiamo verificarne la propriet\u00e0, <code>code<\/code>indipendentemente dal fatto che corrisponda o meno al nostro codice coupon personalizzato. In tal caso, restituiamo l&#8217;etichetta che desideriamo. Regola l&#8217;output dell&#8217;etichetta come preferisci. In caso contrario, restituiamo l&#8217;etichetta del coupon predefinita.<\/p>\n<h3>Rimuovere l&#8217;opzione utente per rimuovere lo sconto<\/h3>\n<p>Un&#8217;altra cosa che potresti aver notato nella visualizzazione del nostro sconto nel carrello e nella cassa \u00e8 che ha ricevuto un link &quot;[Rimuovi]&quot; dopo il suo importo. Questo \u00e8 il comportamento predefinito dei coupon in WooCommerce, ma nel nostro caso non \u00e8 desiderabile. Sia perch\u00e9 potrebbe confondere i clienti sia perch\u00e9 il nostro codice lo riapplica dopo la rimozione.<\/p>\n<p>WooCommerce fornisce il filtro <code>woocommerce_cart_totals_coupon_html<\/code>per l&#8217;output dell&#8217;importo. Fortunatamente WooCommerce fornisce l&#8217;output HTML solo dell&#8217;importo stesso come terzo parametro di questo filtro. Possiamo semplicemente restituirlo invece di assicurarci che il nostro sconto sia presentato correttamente con valuta e tutto il resto.<\/p>\n<pre><code>    ...\n    public function __construct() {\n        add_action('woocommerce_before_cart', [$this, 'addDiscount']);\n        add_action('woocommerce_before_checkout_form', [$this, 'addDiscount']);\n        add_filter('woocommerce_cart_totals_coupon_label', [$this, 'discountLabel'], 10, 2);\n        add_filter('woocommerce_cart_totals_coupon_html', [$this, 'discountHtml'], 10, 3);\n    }\n\u00a0\n    function discountHtml($coupon_html, $coupon, $discount_amount_html) {\n        if ($coupon-&gt;code == $this-&gt;coupon_code) {\n            return $discount_amount_html;\n        }\n        return $coupon_html;\n    }\n    ...<\/code><\/pre>\n<h3>Facoltativo: nascondere la funzionalit\u00e0 del coupon per i clienti<\/h3>\n<p>I coupon devono essere attivati \u200b\u200bin WooCommerce affinch\u00e9 la nostra funzionalit\u00e0 di sconto funzioni, ma tieni presente che ci\u00f2 aggiunger\u00e0 l&#8217;opzione per i clienti che inseriranno manualmente i codici coupon sia nel carrello che nella cassa. Se non vuoi mostrare che il tuo negozio online ha la funzionalit\u00e0 coupon e, in particolare, impedire ai clienti di inserire manualmente i codici coupon, puoi farlo anche tu.<\/p>\n<h4>Rimozione dalla cassa<\/h4>\n<p>Rimuovere la funzionalit\u00e0 del coupon dalla cassa \u00e8 facile e pu\u00f2 essere eseguita all&#8217;interno della nostra classe. Rimuoviamo semplicemente il gancio che rende &#8220;scatola&#8221; il coupon, in questo modo:<\/p>\n<pre><code>    ...\n    public function __construct() {\n        add_action('woocommerce_before_cart', [$this, 'addDiscount']);\n        add_action('woocommerce_before_checkout_form', [$this, 'addDiscount']);\n        add_filter('woocommerce_cart_totals_coupon_label', [$this, 'discountLabel'], 10, 2);\n        add_filter('woocommerce_cart_totals_coupon_html', [$this, 'discountHtml'], 10, 3);\n        remove_action('woocommerce_before_checkout_form', 'woocommerce_checkout_coupon_form', 10);\n    }\n    ...<\/code><\/pre>\n<h4>Rimuovendolo dal carrello<\/h4>\n<p>Sfortunatamente, rimuovere la funzionalit\u00e0 del codice coupon nel carrello non \u00e8 cos\u00ec facile in quanto \u00e8 codificato in un modello. Dovrai sovrascrivere il modello di carrello di WooCommerce per rimuovere la funzionalit\u00e0 del coupon. Copia il file <code>pluginswoocommercetemplatescartcart.php<\/code>in <code>your-themewoocommercecartcart.php<\/code>.<\/p>\n<p>I file modello di WooCommerce cambiano costantemente, quindi darti un numero di riga esatto non sarebbe di aiuto. Ma troverai il codice che emette l&#8217;input e il pulsante per il coupon vicino alla parte inferiore del file; un po&#8217; cos\u00ec:<\/p>\n<pre><code>...\n&lt;?php if (wc_coupons_enabled()) { ?&gt;\n    &lt;div class=\"coupon\"&gt;\n        &lt;label for=\"coupon_code\"&gt;&lt;?php esc_html_e( 'Coupon:', 'woocommerce' ); ?&gt;&lt;\/label&gt; &lt;input type=\"text\" name=\"coupon_code\" class=\"input-text\" id=\"coupon_code\" value=\"\" placeholder=\"&lt;?php esc_attr_e( 'Coupon code', 'woocommerce' ); ?&gt;\" \/&gt; &lt;button type=\"submit\" class=\"button\" name=\"apply_coupon\" value=\"&lt;?php esc_attr_e( 'Apply coupon', 'woocommerce' ); ?&gt;\"&gt;&lt;?php esc_attr_e( 'Apply coupon', 'woocommerce' ); ?&gt;&lt;\/button&gt;\n        &lt;?php do_action( 'woocommerce_cart_coupon' ); ?&gt;\n    &lt;\/div&gt;\n&lt;?php } ?&gt;\n...<\/code><\/pre>\n<p>Quello che devi fare \u00e8 commentare l&#8217;output relativo al coupon. Consiglio di aggiungere un commento PHP con <code>\/*<\/code>subito prima del <code>if<\/code>-check e chiuderlo con <code>*\/<\/code>subito dopo la parentesi di chiusura. Cos\u00ec:<\/p>\n<pre><code>...\n&lt;?php \/* if (wc_coupons_enabled()) { ?&gt;\n    &lt;div class=\"coupon\"&gt;\n        &lt;label for=\"coupon_code\"&gt;&lt;?php esc_html_e( 'Coupon:', 'woocommerce' ); ?&gt;&lt;\/label&gt; &lt;input type=\"text\" name=\"coupon_code\" class=\"input-text\" id=\"coupon_code\" value=\"\" placeholder=\"&lt;?php esc_attr_e( 'Coupon code', 'woocommerce' ); ?&gt;\" \/&gt; &lt;button type=\"submit\" class=\"button\" name=\"apply_coupon\" value=\"&lt;?php esc_attr_e( 'Apply coupon', 'woocommerce' ); ?&gt;\"&gt;&lt;?php esc_attr_e( 'Apply coupon', 'woocommerce' ); ?&gt;&lt;\/button&gt;\n        &lt;?php do_action( 'woocommerce_cart_coupon' ); ?&gt;\n    &lt;\/div&gt;\n&lt;?php } *\/ ?&gt;\n...<\/code><\/pre>\n<p>A questo punto la funzionalit\u00e0 coupon del tuo negozio online dovrebbe essere virtualmente nascosta ai clienti! Ma il tuo sconto personalizzato dovrebbe funzionare perfettamente.<\/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>In questo tutorial vedremo come aggiungere uno sconto in modo programmatico in WooCommerce. Usiamo i coupon ma lo rendiamo automatico e nascondiamo che si tratta di un coupon.<\/p>\n","protected":false},"author":1,"featured_media":152867,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[918,896,896,918,1110,814,814,844,844,855,855,865,865],"tags":[1168],"class_list":["post-233611","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-altro","category-codice","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\/233611","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=233611"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233611\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/152867"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=233611"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=233611"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=233611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}