{"id":233413,"date":"2023-02-13T15:23:00","date_gmt":"2023-02-13T12:23:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233413"},"modified":"2022-11-10T23:33:32","modified_gmt":"2022-11-10T20:33:32","slug":"opas-muuta-hintoja-woocommercessa-koodin-mukaan","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/opas-muuta-hintoja-woocommercessa-koodin-mukaan\/","title":{"rendered":"Opas: Muuta hintoja WooCommercessa koodin mukaan"},"content":{"rendered":"\n<p>T\u00e4m\u00e4 viesti on sinulle, joka haluat lis\u00e4t\u00e4 koodin, joka s\u00e4\u00e4t\u00e4\u00e4 hintoja WordPress <a href=\"https:\/\/woocommerce.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WooCommerce<\/a> -verkkokaupassasi. Voit joko korottaa hintoja tai alentaa niit\u00e4. Ja miten ja mist\u00e4 s\u00e4\u00e4d\u00f6t tulevat, riippuu t\u00e4ysin tapauksestasi. Verkkokauppasi voi toimia kullekin rekister\u00f6ityneelle k\u00e4ytt\u00e4j\u00e4lle asetettujen prosenttiosuuksien alennuksella, mukautetulla maailmanlaajuisella asetuksella WooCommerce-asetuksissa, kiinte\u00e4sti koodatulla kiinte\u00e4ll\u00e4 summalla tai jollakin jokaiselle tuotteelle tai tuoteryhm\u00e4lle asetettuna.<\/p>\n<p>Olen yritt\u00e4nyt tehd\u00e4 koodista mahdollisimman yleisen, jotta voit muokata sit\u00e4 tapauksesi mukaan. Minun tapauksessani hinnanmuutokset tulevat k\u00e4ytt\u00e4j\u00e4n metana lis\u00e4tyst\u00e4 prosentuaalisesta alennuksesta.<\/p>\n<p>Koodi on p\u00e4ivitetty toimimaan WooCommerce 3.x:lle ja uudemmille. En voi taata, ett\u00e4 se toimii vanhemmissa versioissa.<\/p>\n<h2>Vaihe 1: Tee koodillesi paikka<\/h2>\n<p>Ensimm\u00e4inen askel on helppo; tarvitset paikan koodin lis\u00e4\u00e4miseen. T\u00e4m\u00e4 riippuu t\u00e4ysin sinusta. Voit lis\u00e4t\u00e4 t\u00e4m\u00e4n suoraan teemaasi <code>functions.php<\/code>tai jonnekin laajennustiedostoihisi. Haluan ty\u00f6skennell\u00e4 luokkien kanssa, jotka pit\u00e4v\u00e4t kaiken kauniisti yhdess\u00e4 paikassa. Yksinkertaisuuden vuoksi laitan luokalle alihakemiston teemaani <code>\/src\/<\/code>ja sis\u00e4llyt\u00e4n ja instantoin sen <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>Muokkaa t\u00e4t\u00e4 vaihetta tapauksesi mukaan.<\/p>\n<h2>Vaihe 2: P\u00e4\u00e4t\u00e4, miten hinnans\u00e4\u00e4t\u00f6jen tulisi toimia<\/h2>\n<p>T\u00e4m\u00e4 vaihe saattaa olla sinulle jo selv\u00e4 \u2013 t\u00e4ss\u00e4 sinun on tiedett\u00e4v\u00e4, miten ja mist\u00e4 saat hinnanmuutoksen. Lopullisen tavoitteen tulee olla luku, jolla hinnat lis\u00e4t\u00e4\u00e4n, v\u00e4hennet\u00e4\u00e4n, kerrotaan tai jaetaan.<\/p>\n<p>Minun tapauksessani jokaisella k\u00e4ytt\u00e4j\u00e4ll\u00e4 on k\u00e4ytt\u00e4j\u00e4n meta, joka sis\u00e4lt\u00e4\u00e4 prosentuaalisen alennuksen; numero v\u00e4lilt\u00e4 0 &#8211; 99. Sivuston yll\u00e4pit\u00e4j\u00e4 voi asettaa alennuksen jokaiselle k\u00e4ytt\u00e4j\u00e4lle. En n\u00e4yt\u00e4 koodia k\u00e4ytt\u00e4j\u00e4n metakent\u00e4n lis\u00e4\u00e4miseksi, koska t\u00e4m\u00e4 ei ehk\u00e4 ole sinua varten ja se on helppo tehd\u00e4 esim. <a href=\"https:\/\/www.advancedcustomfields.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Advanced Custom Fields -kentill\u00e4<\/a>.<\/p>\n<p>Luokassani pid\u00e4n luokkamuuttujaa, joka constructorissa asetetaan kertoimeksi. Riippuen siit\u00e4, onko k\u00e4ytt\u00e4j\u00e4 kirjautunut sis\u00e4\u00e4n, haen tallennetun alennuksen k\u00e4ytt\u00e4j\u00e4lt\u00e4 ja luon siit\u00e4 kertoimen. Oletusarvoisesti kertoimen tulee olla 1. Hinta 1 = sama hinta kuin ennen. Mutta esimerkiksi 10 %:n alennuksella kerroin olisi 0,9. Hinta 0,9 = hinta alennettu 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>Nyt kun minulla on k\u00e4ytt\u00f6valmis kerroin, on aika tutkia hintojen s\u00e4\u00e4t\u00e4mist\u00e4 WooCommercessa.<\/p>\n<h2>Vaihe 3: Hintasuodattimet WooCommercessa<\/h2>\n<p>WooCommercessa on yksi suodatin yksinkertaisille, ryhmitetyille ja ulkoisille tuotetyypeille ja toinen muuttuville tuotetyypeille. Suosittelen, ett\u00e4 lis\u00e4\u00e4t molemmat suodattimet kattamaan kaikki tuotetyypit. T\u00e4m\u00e4n lis\u00e4ksi WooCommerce toimii kolmella lis\u00e4hintasuodattimella:<\/p>\n<ul>\n<li>Normaalihinnat (<code>woocommerce_product_get_regular_price<\/code>ja <code>woocommerce_product_variation_get_regular_price<\/code>)<\/li>\n<li>Alennushinnat (<code>woocommerce_product_get_sale_price<\/code>ja <code>woocommerce_product_variation_get_sale_price<\/code>)<\/li>\n<li>Nykyinen aktiivinen hinta (<code>woocommerce_product_get_price<\/code>ja <code>woocommerce_product_variation_get_price<\/code>). Nykyinen aktiivinen hinta noudetaan joko normaalihinnasta tai alennushinnasta.<\/li>\n<\/ul>\n<p>Nyt voit yksinkertaisesti suodattaa nykyisen aktiivisen hinnan ja kutsua sit\u00e4 p\u00e4iv\u00e4ksi, mutta se riippuu siit\u00e4, kuinka haluat k\u00e4sitell\u00e4 hintojen n\u00e4ytt\u00e4mist\u00e4 verkkokaupassasi. Muista, ett\u00e4 oletusarvoisesti myynniss\u00e4 olevissa tuotteissa n\u00e4kyy vanha hinta (normaalihinta) yliviivattuina ja sen vieress\u00e4 alennushinta (aktiivinen hinta). Jos suodatat vain <code>x_get_price<\/code>ja tuote on alennuksessa, vanha hinta n\u00e4ytet\u00e4\u00e4n alennuksella.<\/p>\n<p>T\u00e4st\u00e4 syyst\u00e4 p\u00e4\u00e4t\u00e4n suodattaa sek\u00e4 aktiivisen nykyhinnan (<code>x_get_price<\/code>) ett\u00e4 normaalihinnan (<code>x_get_regular_price<\/code>), koska en halua h\u00e4mment\u00e4\u00e4 verkkokauppani k\u00e4ytt\u00e4ji\u00e4.<\/p>\n<h3>Hintasuodattimen kirjoittaminen<\/h3>\n<p>Kaikki nelj\u00e4 suodatinta viittaavat samaan toimintoon. Funktion sis\u00e4ll\u00e4 kerrotaan vain annettu hinta luokkamuuttujalla. Muista, ett\u00e4 jos alennusta ei ole asetettu, kerroin on 1, jolloin hinta ei muutu.<\/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>Huomaa, ett\u00e4 kaikki suodattimet tarjoavat tuoteobjektin toisena parametrina. Jos halusit muokata hintoja tuotteiden mukaan, voit muokata koodia niin tehd\u00e4ksesi.<\/p>\n<p>Jos tarkistat verkkokauppasi ollessasi kirjautuneena sis\u00e4\u00e4n alennuksella, sinun pit\u00e4isi nyt n\u00e4hd\u00e4 alennettuja hintoja! Emme kuitenkaan ole viel\u00e4 t\u00e4ysin valmiita. WooCommerce teki joitain muutoksia 2.4.7:\u00e4\u00e4n (<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\">lue lis\u00e4\u00e4 t\u00e4\u00e4lt\u00e4<\/a> ), jotka vaikuttavat muuttuvien tuotteiden dynaamiseen hinnoitteluun.<\/p>\n<h3>Vaihtelevien tuotteiden hintojen k\u00e4sittely<\/h3>\n<p>Jotta dynaaminen hinnoittelu toimisi muuttuvissa tuotteissa, sinun tulee lis\u00e4t\u00e4 yll\u00e4 linkitetyss\u00e4 blogikirjoituksessa mainitut suodattimet. <code>woocommerce_variation_prices_price<\/code>(ja vastaava normaalihintasuodatin <code>woocommerce_variation_prices_regular_price<\/code>) <strong>ja<\/strong> suodatin <code>woocommerce_get_variation_prices_hash<\/code>. Hajautussuodatin k\u00e4sittelee WooCommercen sis\u00e4ist\u00e4 v\u00e4limuistia \u2013 ja meid\u00e4n on pyydett\u00e4v\u00e4 WooCommercea tyhjent\u00e4m\u00e4\u00e4n se oikein, kun muokkaamme hintoja koodilla.<\/p>\n<p>Kaksi ensimm\u00e4ist\u00e4 hintasuodatinta noudattavat samaa menettely\u00e4 kuin <code>adjustPrice()<\/code>, mutta m\u00e4\u00e4rit\u00e4n niille eri toiminnon, koska parametrit ovat erilaiset. Mit\u00e4 tulee hash-suodatintoimintoon, meid\u00e4n on lis\u00e4tt\u00e4v\u00e4 hash-taulukkoon tunnistaaksemme, milloin v\u00e4limuisti tulee tyhjent\u00e4\u00e4. K\u00e4ytt\u00e4j\u00e4tunnuksen lis\u00e4\u00e4minen on hyv\u00e4 idea, koska kerroin on yksil\u00f6llinen jokaiselle k\u00e4ytt\u00e4j\u00e4lle.<\/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>Lopulta sen pit\u00e4isi olla!<\/p>\n<p>Huomaa, ett\u00e4 sinulla on p\u00e4\u00e4sy koko tuoteobjektiin kaikissa suodattimissa (my\u00f6s muunnelmaobjektissa kahdessa viimeisess\u00e4). T\u00e4m\u00e4 on hy\u00f6dyllist\u00e4 tapauksissa, joissa haluat s\u00e4\u00e4t\u00e4\u00e4 hintoja tuotetietojen perusteella; kuten sulkemalla pois tietyt tuotteet alennuksesta tai soveltamalla alennusta tuotteen luokkiin. Sinun pit\u00e4isi olla melko yksinkertaista s\u00e4\u00e4t\u00e4\u00e4 koodia tarpeisiisi.<\/p>\n<h2>T\u00e4ydellinen lopullinen koodi<\/h2>\n<p>Kuten tavallista, toivon, ett\u00e4 olet oppinut jotain seuraamalla t\u00e4t\u00e4 viesti\u00e4 vaihe vaiheelta, mutta annan koko luokan viitteeksi:<\/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\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>T\u00e4m\u00e4 opetusohjelma selitt\u00e4\u00e4, kuinka voit s\u00e4\u00e4t\u00e4\u00e4 hintoja WordPress WooCommerce -verkkokaupassasi koodin avulla. Esimerkkej\u00e4 ovat alennusprosentti tai kiinte\u00e4 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":[895,895,813,1110,843,813,843,854,854,864,864],"tags":[1166],"class_list":{"0":"post-233413","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-koodi","9":"category-laajennuksia","10":"category-n-a","11":"category-opetusohjelmia","14":"category-woocommerce-5","16":"category-wordpress-5","18":"tag-affiai-fi"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/233413","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=233413"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/233413\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/223696"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=233413"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=233413"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=233413"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}