{"id":233450,"date":"2023-02-13T15:44:00","date_gmt":"2023-02-13T12:44:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233450"},"modified":"2022-11-10T23:45:24","modified_gmt":"2022-11-10T20:45:24","slug":"guida-modifica-i-prezzi-in-woocommerce-in-base-al-codice","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/guida-modifica-i-prezzi-in-woocommerce-in-base-al-codice\/","title":{"rendered":"Guida: modifica i prezzi in WooCommerce in base al codice"},"content":{"rendered":"\n<p>Questo post \u00e8 per te che vuoi aggiungere un codice che regola i prezzi nel tuo negozio web <a href=\"https:\/\/woocommerce.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WooCommerce<\/a> di WordPress. Puoi aumentare i prezzi o scontarli. E come e da dove arrivano gli aggiustamenti, dipende interamente dal tuo caso. Il tuo negozio online potrebbe operare con sconti percentuali impostati su ciascun utente registrato, un&#8217;impostazione globale personalizzata nelle impostazioni di WooCommerce, una somma fissa codificata o qualcosa impostato su ogni prodotto o categoria di prodotto.<\/p>\n<p>Ho cercato di rendere il codice il pi\u00f9 generale possibile in modo da poterlo adattare al tuo caso. Nel mio caso gli adeguamenti dei prezzi derivano da uno sconto percentuale aggiunto come meta utente.<\/p>\n<p>Il codice \u00e8 stato aggiornato per funzionare con WooCommerce 3.x e versioni successive. Non posso garantire che funzioner\u00e0 per le versioni precedenti.<\/p>\n<h2>Passaggio 1: crea un posto per il tuo codice<\/h2>\n<p>Il primo passo \u00e8 facile; hai bisogno di un posto per aggiungere il tuo codice. Questo dipende interamente da te. Puoi aggiungerlo direttamente nel tuo tema <code>functions.php<\/code>o da qualche parte nei file del tuo plugin. Mi piace lavorare con classi che manterranno tutto bene insieme in un unico posto. Per semplicit\u00e0 inserir\u00f2 la classe in una sottodirectory <code>\/src\/<\/code>nel mio tema, la includer\u00f2 e la istanziar\u00f2 in <code>functions.php<\/code>.<\/p>\n<pre><code>&lt;?php\nclass ChangePrices {\n    public function __construct() {\n    }\n}<\/code><\/pre>\n<pre><code>require_once(get_stylesheet_directory().'\/src\/ChangePrices.php');\nnew ChangePrices();<\/code><\/pre>\n<p>Modifica questo passaggio per adattarlo al tuo caso.<\/p>\n<h2>Passaggio 2: decidi come dovrebbero funzionare gli adeguamenti dei prezzi<\/h2>\n<p>Questo passaggio potrebbe gi\u00e0 essere chiaro per te: \u00e8 qui che devi sapere come e dove ottenere l&#8217;adeguamento del prezzo. L&#8217;obiettivo finale dovrebbe essere un numero con cui sommare, sottrarre, moltiplicare o dividere i prezzi.<\/p>\n<p>Nel mio caso ho un meta utente su ogni utente che contiene uno sconto percentuale; un numero compreso tra 0 e 99. L&#8217;amministratore del sito pu\u00f2 impostare uno sconto su ciascun utente. Non mostrer\u00f2 il codice per aggiungere il meta campo utente, poich\u00e9 potrebbe non essere adatto a te ed \u00e8 facilmente eseguibile con ad esempio <a href=\"https:\/\/www.advancedcustomfields.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Advanced Custom Fields<\/a>.<\/p>\n<p>Nella mia classe conservo una variabile di classe che nel costruttore verr\u00e0 impostata su un moltiplicatore. A seconda che un utente abbia effettuato l&#8217;accesso, prelever\u00f2 lo sconto salvato dall&#8217;utente e creer\u00f2 un moltiplicatore da esso. Di default il moltiplicatore dovrebbe essere 1. Prezzo 1 = stesso prezzo di prima. Ma per uno sconto ad esempio del 10% il moltiplicatore sarebbe 0,9. Prezzo 0,9 = prezzo scontato del 10%.<\/p>\n<pre><code>&lt;?php\nclass ChangePrices {\n    private $user_discount_multiplier;\n\u00a0\n    public function __construct() {\n        $this-&gt;user_discount_multiplier = $this-&gt;getUserDiscount();\n    }\n\u00a0\n    public function getUserDiscount() {\n        if ((is_admin() &amp;&amp; !defined('DOING_AJAX')) || (!is_user_logged_in())) {\n            return 1;\n        }\n\u00a0\n        $user = wp_get_current_user();\n        $discount = (int)get_user_meta($user-&gt;ID, 'webshop_discount_percentage', true);\n\u00a0\n        return ($discount &lt; 1 || $discount &gt; 99)? 1: abs(($discount\/100)-1);\n    }\n}<\/code><\/pre>\n<p>Ora che ho un moltiplicatore pronto per l&#8217;uso, \u00e8 tempo di esaminare l&#8217;effettiva regolazione dei prezzi in WooCommerce.<\/p>\n<h2>Passaggio 3: filtri dei prezzi in WooCommerce<\/h2>\n<p>In WooCommerce c&#8217;\u00e8 un filtro per i tipi di prodotto semplici, raggruppati ed esterni e un altro per i tipi di prodotto variabili. Ti consiglio di aggiungere entrambi i filtri per coprire tutti i tipi di prodotto. Oltre a questo, WooCommerce opera con tre filtri di prezzo aggiuntivi:<\/p>\n<ul>\n<li>Prezzi normali (<code>woocommerce_product_get_regular_price<\/code>e <code>woocommerce_product_variation_get_regular_price<\/code>)<\/li>\n<li>Prezzi di vendita (<code>woocommerce_product_get_sale_price<\/code>e <code>woocommerce_product_variation_get_sale_price<\/code>)<\/li>\n<li>Il prezzo attivo corrente (<code>woocommerce_product_get_price<\/code>e <code>woocommerce_product_variation_get_price<\/code>). Il prezzo attivo corrente verr\u00e0 recuperato dal prezzo normale o dal prezzo scontato.<\/li>\n<\/ul>\n<p>Ora puoi semplicemente filtrare il prezzo attivo corrente e chiamarlo un giorno, ma dipende da come vuoi gestire la visualizzazione dei prezzi nel tuo negozio online. Ricorda che i prodotti in saldo per impostazione predefinita mostrano il vecchio prezzo (prezzo normale) barrato e il prezzo scontato (prezzo attivo) accanto ad esso. Se filtri solo <code>x_get_price<\/code>e un prodotto \u00e8 in vendita, il vecchio prezzo verr\u00e0 mostrato non scontato.<\/p>\n<p>Per questo motivo, scelgo di filtrare sia il prezzo corrente attivo (<code>x_get_price<\/code>) che il prezzo normale (<code>x_get_regular_price<\/code>), perch\u00e9 non voglio confondere gli utenti del mio negozio online.<\/p>\n<h3>Scrivere il filtro del prezzo<\/h3>\n<p>Tutti e quattro i filtri faranno riferimento alla stessa funzione. All&#8217;interno della funzione moltiplichiamo semplicemente il prezzo fornito per la variabile di classe. Ricorda che se non viene impostato alcuno sconto, il moltiplicatore \u00e8 1 che non comporta alcuna variazione di prezzo.<\/p>\n<pre><code>&lt;?php\nclass ChangePrices {\n    private $user_discount_multiplier;\n\u00a0\n    public function __construct() {\n        $this-&gt;user_discount_multiplier = $this-&gt;getUserDiscount();\n\u00a0\n        add_filter('woocommerce_product_get_price', [$this, 'adjustPrice'], 99, 2);\n        add_filter('woocommerce_product_get_regular_price', [$this, 'adjustPrice'], 99, 2);\n        add_filter('woocommerce_product_variation_get_price', [$this, 'adjustPrice'], 99, 2);\n        add_filter('woocommerce_product_variation_get_regular_price', [$this, 'adjustPrice'], 99, 2);\n    }\n\u00a0\n    public function adjustPrice($price, $product) {\n        return $price * $this-&gt;user_discount_multiplier;\n    }\n\u00a0\n    public function getUserDiscount() {\n        ....<\/code><\/pre>\n<p>Si noti che tutti i filtri forniscono l&#8217;oggetto prodotto come secondo parametro. Se desideri modificare i prezzi in base ai prodotti, puoi modificare il codice per farlo.<\/p>\n<p>Se controlli il tuo negozio online mentre sei connesso come utente con uno sconto, ora dovresti vedere i prezzi scontati! Tuttavia, non abbiamo ancora finito. WooCommerce ha apportato alcune modifiche alla 2.4.7 (<a href=\"https:\/\/woocommerce.wordpress.com\/2015\/09\/14\/caching-and-dynamic-pricing-upcoming-changes-to-the-get_variation_prices-method\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">leggi di pi\u00f9 qui<\/a>) che influiscono sui prezzi dinamici per i prodotti variabili.<\/p>\n<h3>Gestione dei prezzi variabili dei prodotti<\/h3>\n<p>Per far funzionare i prezzi dinamici su prodotti variabili, dovresti aggiungere i filtri menzionati nel post del blog collegato sopra; <code>woocommerce_variation_prices_price<\/code>(e il filtro del prezzo normale corrispondente <code>woocommerce_variation_prices_regular_price<\/code>) <strong>e<\/strong> il filtro <code>woocommerce_get_variation_prices_hash<\/code>. Il filtro hash gestisce la cache interna di WooCommerce e dobbiamo dire a WooCommerce di cancellarla correttamente quando modifichiamo i prezzi in base al codice.<\/p>\n<p>I primi due filtri di prezzo seguono la stessa procedura di <code>adjustPrice()<\/code>, tuttavia assegno loro una funzione diversa perch\u00e9 i parametri sono diversi. Per quanto riguarda la funzione di filtro hash, dobbiamo aggiungere all&#8217;array hash per identificare quando la cache deve essere cancellata. L&#8217;aggiunta dell&#8217;ID utente \u00e8 una buona idea poich\u00e9 il moltiplicatore \u00e8 unico per ogni utente.<\/p>\n<pre><code>&lt;?php\nclass ChangePrices {\n    private $user_discount_multiplier;\n\u00a0\n    public function __construct() {\n        $this-&gt;user_discount_multiplier = $this-&gt;getUserDiscount();\n\u00a0\n        add_filter('woocommerce_product_get_price', [$this, 'adjustPrice'], 99, 2);\n        add_filter('woocommerce_product_get_regular_price', [$this, 'adjustPrice'], 99, 2);\n        add_filter('woocommerce_product_variation_get_price', [$this, 'adjustPrice'], 99, 2);\n        add_filter('woocommerce_product_variation_get_regular_price', [$this, 'adjustPrice'], 99, 2);\n\u00a0\n        add_filter('woocommerce_variation_prices_price', [$this, 'adjustVariablePrice'], 99, 3);\n        add_filter('woocommerce_variation_prices_regular_price', [$this, 'adjustVariablePrice'], 99, 3);\n        add_filter('woocommerce_get_variation_prices_hash', [$this, 'variationPricesHash']);\n    }\n\u00a0\n    public function variationPricesHash($hash) {\n        $hash[] = get_current_user_id();\n        return $hash;\n    }\n    public function adjustVariablePrice($price, $variation, $product) {\n        return $price * $this-&gt;user_discount_multiplier;\n    }\n\u00a0\n    public function adjustPrice($price, $product) {\n        ...<\/code><\/pre>\n<p>Finalmente dovrebbe essere cos\u00ec!<\/p>\n<p>Nota che hai accesso all&#8217;oggetto prodotto completo in tutti i filtri (anche l&#8217;oggetto variazione negli ultimi due). Ci\u00f2 \u00e8 utile nei casi in cui desideri modificare i prezzi in base alle informazioni sul prodotto; come escludere determinati prodotti dallo sconto o applicare uno sconto in base alle categorie di un prodotto. Dovrebbe essere abbastanza semplice per te adattare il codice a ci\u00f2 di cui hai bisogno per il tuo caso.<\/p>\n<h2>Il codice finale completo<\/h2>\n<p>Come al solito spero che tu abbia imparato qualcosa seguendo questo post passo dopo passo, ma fornir\u00f2 la classe completa come riferimento:<\/p>\n<pre><code>&lt;?php\nclass ChangePrices {\n\u00a0\n    var $user_discount_multiplier;\n\u00a0\n    public function __construct() {\n        $this-&gt;user_discount_multiplier = $this-&gt;getUserDiscount();\n\u00a0\n        add_filter('woocommerce_product_get_price', [$this, 'adjustPrice'], 99, 2);\n        add_filter('woocommerce_product_get_regular_price', [$this, 'adjustPrice'], 99, 2);\n        add_filter('woocommerce_product_variation_get_price', [$this, 'adjustPrice'], 99, 2);\n        add_filter('woocommerce_product_variation_get_regular_price', [$this, 'adjustPrice'], 99, 2);\n\u00a0\n        add_filter('woocommerce_variation_prices_price', [$this, 'adjustVariablePrice'], 99, 3);\n        add_filter('woocommerce_variation_prices_regular_price', [$this, 'adjustVariablePrice'], 99, 3);\n\u00a0\n        add_filter('woocommerce_get_variation_prices_hash', [$this, 'variationPricesHash']);\n    }\n\u00a0\n    public function variationPricesHash($hash) {\n        $hash[] = get_current_user_id();\n        return $hash;\n    }\n\u00a0\n    public function adjustVariablePrice($price, $variation, $product) {\n        return $price * $this-&gt;user_discount_multiplier;\n    }\n\u00a0\n    public function adjustPrice($price, $product) {\n        return $price * $this-&gt;user_discount_multiplier;\n    }\n\u00a0\n    public function getUserDiscount() {\n        if ((is_admin() &amp;&amp; !defined('DOING_AJAX')) || (!is_user_logged_in())) {\n            return 1;\n        }\n\u00a0\n        $user = wp_get_current_user();\n        $discount = (int)get_user_meta($user-&gt;ID, 'webshop_discount_percentage', true);\n\u00a0\n        return ($discount &lt; 1 || $discount &gt; 99)? 1: abs(($discount\/100)-1);\n    }\n}<\/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 spiega come regolare i prezzi nel tuo negozio web WooCommerce WordPress usando il codice. Gli esempi includono la percentuale di sconto o la somma fissa.<\/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":[896,896,1110,814,814,844,844,855,855,865,865],"tags":[1168],"class_list":["post-233450","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","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\/233450","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=233450"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233450\/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=233450"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=233450"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=233450"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}