{"id":233391,"date":"2023-02-13T15:21:00","date_gmt":"2023-02-13T12:21:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233391"},"modified":"2022-11-10T23:26:46","modified_gmt":"2022-11-10T20:26:46","slug":"guide-aendra-priser-i-woocommerce-efter-kod","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/guide-aendra-priser-i-woocommerce-efter-kod\/","title":{"rendered":"Guide: \u00c4ndra priser i WooCommerce efter kod"},"content":{"rendered":"\n<p>Det h\u00e4r inl\u00e4gget \u00e4r f\u00f6r dig som vill l\u00e4gga till kod som justerar priserna i din WordPress <a href=\"https:\/\/woocommerce.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WooCommerce webshop<\/a>. Du kan antingen h\u00f6ja priserna eller rabattera dem. Och hur och varifr\u00e5n justeringarna kommer beror helt p\u00e5 ditt fall. Din webbshop kan fungera med procentuella rabatter som \u00e4r inst\u00e4llda p\u00e5 varje registrerad anv\u00e4ndare, en anpassad global inst\u00e4llning i WooCommerce-inst\u00e4llningar, en h\u00e5rdkodad fast summa eller n\u00e5got som \u00e4r inst\u00e4llt p\u00e5 varje produkt eller produktkategori.<\/p>\n<p>Jag har f\u00f6rs\u00f6kt g\u00f6ra koden s\u00e5 generell som m\u00f6jligt s\u00e5 att du kan anpassa den efter ditt fall. I mitt fall kommer prisjusteringarna fr\u00e5n en procentuell rabatt som lagts till som anv\u00e4ndarmeta.<\/p>\n<p>Koden \u00e4r uppdaterad f\u00f6r att fungera f\u00f6r WooCommerce 3.x och h\u00f6gre. Jag kan inte garantera att det kommer att fungera f\u00f6r l\u00e4gre versioner.<\/p>\n<h2>Steg 1: Skapa en plats f\u00f6r din kod<\/h2>\n<p>Det f\u00f6rsta steget \u00e4r enkelt; du beh\u00f6ver en plats f\u00f6r att l\u00e4gga till din kod. Detta beror helt p\u00e5 dig. Du kan l\u00e4gga till detta direkt i ditt tema <code>functions.php<\/code>eller n\u00e5gonstans i dina plugin-filer. Jag gillar att arbeta med klasser som kommer att h\u00e5lla ihop allt fint p\u00e5 ett st\u00e4lle. F\u00f6r enkelhetens skull l\u00e4gger jag till klassen en underkatalog <code>\/src\/<\/code>i mitt tema och inkluderar och instansierar den i <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>\u00c4ndra detta steg f\u00f6r att passa ditt fall.<\/p>\n<h2>Steg 2: Best\u00e4m hur prisjusteringarna ska fungera<\/h2>\n<p>Det h\u00e4r steget kanske redan \u00e4r klart f\u00f6r dig \u2013 det \u00e4r h\u00e4r du beh\u00f6ver veta hur och var du kan f\u00e5 prisjusteringen. Slutm\u00e5let ska vara ett tal som du adderar, subtraherar, multiplicerar eller dividerar priserna med.<\/p>\n<p>I mitt fall har jag en anv\u00e4ndarmeta p\u00e5 varje anv\u00e4ndare som inneh\u00e5ller en procentuell rabatt; ett tal mellan 0 och 99. Webbplatsadministrat\u00f6ren kan s\u00e4tta en rabatt p\u00e5 varje anv\u00e4ndare. Jag kommer inte att visa koden f\u00f6r att l\u00e4gga till anv\u00e4ndarmetaf\u00e4ltet, eftersom detta kanske inte \u00e4r f\u00f6r dig och det g\u00f6rs enkelt med t.ex. <a href=\"https:\/\/www.advancedcustomfields.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Advanced Custom Fields<\/a>.<\/p>\n<p>I min klass har jag en klassvariabel som i konstruktorn kommer att st\u00e4llas till en multiplikator. Beroende p\u00e5 om en anv\u00e4ndare \u00e4r inloggad h\u00e4mtar jag den sparade rabatten fr\u00e5n anv\u00e4ndaren och skapar en multiplikator fr\u00e5n den. Som standard ska multiplikatorn vara 1. Pris 1 = samma pris som tidigare. Men f\u00f6r en rabatt p\u00e5 till exempel 10 % skulle multiplikatorn vara 0,9. Pris 0,9 = pris rabatterat med 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>Nu n\u00e4r jag har en f\u00e4rdig att anv\u00e4nda multiplikator, \u00e4r det dags att unders\u00f6ka faktiskt justera priser i WooCommerce.<\/p>\n<h2>Steg 3: Prisfilter i WooCommerce<\/h2>\n<p>I WooCommerce finns det ett filter f\u00f6r enkla, grupperade och externa produkttyper, och ett annat f\u00f6r variabla produkttyper. Jag rekommenderar att du l\u00e4gger till b\u00e5da filtren f\u00f6r att t\u00e4cka alla produkttyper. Ut\u00f6ver detta arbetar WooCommerce med tre ytterligare prisfilter:<\/p>\n<ul>\n<li>Ordinarie priser (<code>woocommerce_product_get_regular_price<\/code>och <code>woocommerce_product_variation_get_regular_price<\/code>)<\/li>\n<li>F\u00f6rs\u00e4ljningspriser (<code>woocommerce_product_get_sale_price<\/code>och <code>woocommerce_product_variation_get_sale_price<\/code>)<\/li>\n<li>Det aktuella aktiva priset (<code>woocommerce_product_get_price<\/code>och <code>woocommerce_product_variation_get_price<\/code>). Det aktuella aktiva priset kommer att h\u00e4mtas fr\u00e5n antingen ordinarie pris eller reapris.<\/li>\n<\/ul>\n<p>Nu kan du helt enkelt filtrera det aktuella aktiva priset och kalla det en dag, men det beror p\u00e5 hur du vill hantera visningen av priser i din webbshop. Kom ih\u00e5g att produkter p\u00e5 rea som standard visar det gamla priset (ordinarie pris) genomstruket och reapriset (aktivt pris) bredvid. Om du endast filtrerar <code>x_get_price<\/code>och en produkt \u00e4r p\u00e5 rea, kommer det gamla priset att visas utan rabatt.<\/p>\n<p>P\u00e5 grund av detta v\u00e4ljer jag att filtrera b\u00e5de det aktiva aktuella priset (<code>x_get_price<\/code>) och det ordinarie priset (<code>x_get_regular_price<\/code>), eftersom jag inte vill f\u00f6rvirra mina webbshopsanv\u00e4ndare.<\/p>\n<h3>Skriver prisfiltret<\/h3>\n<p>Alla fyra filtren kommer att h\u00e4nvisa till samma funktion. Inuti funktionen multiplicerar vi helt enkelt det angivna priset med klassvariabeln. Kom ih\u00e5g att om ingen rabatt \u00e4r satt \u00e4r multiplikatorn 1 vilket resulterar i att priset inte \u00e4ndras.<\/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>Observera att alla filter tillhandah\u00e5ller produktobjektet som andra parameter. Om du ville justera priser beroende p\u00e5 produkter kan du justera koden f\u00f6r att g\u00f6ra det.<\/p>\n<p>Om du kollar din webshop samtidigt som du \u00e4r inloggad som anv\u00e4ndare med rabatt s\u00e5 ska du nu se rabatterade priser! Men vi \u00e4r inte riktigt klara \u00e4n. WooCommerce gjorde n\u00e5gra \u00e4ndringar i 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\">l\u00e4s mer h\u00e4r<\/a>) som p\u00e5verkar dynamisk priss\u00e4ttning f\u00f6r r\u00f6rliga produkter.<\/p>\n<h3>Hantera r\u00f6rliga produktpriser<\/h3>\n<p>F\u00f6r att f\u00e5 dynamisk priss\u00e4ttning att fungera p\u00e5 variabla produkter b\u00f6r du l\u00e4gga till de filter som n\u00e4mns i blogginl\u00e4gget l\u00e4nkat ovan; <code>woocommerce_variation_prices_price<\/code>(och motsvarande ordinarie prisfilter <code>woocommerce_variation_prices_regular_price<\/code>), <strong>och<\/strong> filtret <code>woocommerce_get_variation_prices_hash<\/code>. Hashfiltret hanterar WooCommerces interna cache \u2013 och vi m\u00e5ste s\u00e4ga till WooCommerce att rensa det ordentligt n\u00e4r vi \u00e4ndrar priserna med kod.<\/p>\n<p>De tv\u00e5 f\u00f6rsta prisfiltren f\u00f6ljer samma procedur som <code>adjustPrice()<\/code>, men jag tilldelar dem en annan funktion eftersom parametrarna \u00e4r olika. N\u00e4r det g\u00e4ller hash-filterfunktionen m\u00e5ste vi l\u00e4gga till hash-arrayen f\u00f6r att identifiera n\u00e4r cachen ska rensas. Att l\u00e4gga till anv\u00e4ndar-ID \u00e4r en bra id\u00e9 eftersom multiplikatorn \u00e4r unik f\u00f6r varje anv\u00e4ndare.<\/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>\u00c4ntligen borde det vara det!<\/p>\n<p>Observera att du har tillg\u00e5ng till hela produktobjektet i alla filter (\u00e4ven variationsobjekt i de tv\u00e5 sista). Detta \u00e4r anv\u00e4ndbart i fall d\u00e5 du vill justera priser baserat p\u00e5 produktinformation; som att utesluta vissa produkter fr\u00e5n rabatt, eller till\u00e4mpa en rabatt baserat p\u00e5 en produkts kategorier. Det borde vara ganska enkelt f\u00f6r dig att justera koden till vad du beh\u00f6ver f\u00f6r ditt fall.<\/p>\n<h2>Den fullst\u00e4ndiga slutkoden<\/h2>\n<p>Som vanligt hoppas jag att du har l\u00e4rt dig n\u00e5got genom att f\u00f6lja det h\u00e4r inl\u00e4gget steg f\u00f6r steg, men jag ger hela klassen som referens:<\/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\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Den h\u00e4r handledningen f\u00f6rklarar hur du justerar priserna i din WordPress WooCommerce-webbshop med hj\u00e4lp av kod. Exempel \u00e4r rabattprocent eller fast summa.<\/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":[901,848,901,1110,818,818,848,858,858,868,868],"tags":[1173],"class_list":["post-233391","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-koda","category-handledningar","category-n-a","category-plugins-3","category-woocommerce-9","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233391","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=233391"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233391\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/223696"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=233391"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=233391"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=233391"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}