{"id":233417,"date":"2023-02-13T15:38:00","date_gmt":"2023-02-13T12:38:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233417"},"modified":"2022-11-10T23:35:08","modified_gmt":"2022-11-10T20:35:08","slug":"przewodnik-zmien-ceny-w-woocommerce-wedlug-kodu","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/przewodnik-zmien-ceny-w-woocommerce-wedlug-kodu\/","title":{"rendered":"Przewodnik: Zmie\u0144 ceny w WooCommerce wed\u0142ug kodu"},"content":{"rendered":"\n<p>Ten post jest dla tych, kt\u00f3rzy chc\u0105 doda\u0107 kod, kt\u00f3ry dostosuje ceny w Twoim sklepie internetowym WordPress <a href=\"https:\/\/woocommerce.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WooCommerce<\/a>. Mo\u017cesz albo podnie\u015b\u0107 ceny, albo je zdyskontowa\u0107. A jak i sk\u0105d przyjd\u0105 korekty, zale\u017cy wy\u0142\u0105cznie od twojego przypadku. Tw\u00f3j sklep internetowy mo\u017ce dzia\u0142a\u0107 z rabatami procentowymi ustawionymi dla ka\u017cdego zarejestrowanego u\u017cytkownika, niestandardowym ustawieniem globalnym w ustawieniach WooCommerce, sta\u0142\u0105 kwot\u0105 zakodowan\u0105 na sztywno lub czym\u015b ustawionym dla ka\u017cdego produktu lub kategorii produktu.<\/p>\n<p>Stara\u0142em si\u0119, aby kod by\u0142 jak najbardziej og\u00f3lny, aby\u015b m\u00f3g\u0142 dostosowa\u0107 go do swojego przypadku. W moim przypadku korekty cen pochodz\u0105 z procentowego rabatu dodanego jako meta u\u017cytkownika.<\/p>\n<p>Kod zosta\u0142 zaktualizowany, aby dzia\u0142a\u0142 dla WooCommerce 3.x i nowszych. Nie mog\u0119 zagwarantowa\u0107, \u017ce zadzia\u0142a w ni\u017cszych wersjach.<\/p>\n<h2>Krok 1: Zr\u00f3b miejsce na sw\u00f3j kod<\/h2>\n<p>Pierwszy krok jest \u0142atwy; potrzebujesz miejsca na dodanie kodu. To zale\u017cy wy\u0142\u0105cznie od Ciebie. Mo\u017cesz doda\u0107 to bezpo\u015brednio w motywie <code>functions.php<\/code>lub gdzie\u015b w plikach wtyczek. Lubi\u0119 pracowa\u0107 z klasami, kt\u00f3re \u0142adnie trzymaj\u0105 wszystko w jednym miejscu. Dla uproszczenia umieszcz\u0119 klas\u0119 w podkatalogu <code>\/src\/<\/code>w moim motywie, a nast\u0119pnie do\u0142\u0105cz\u0119 j\u0105 i stworz\u0119 w programie <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>Zmodyfikuj ten krok, aby pasowa\u0142 do Twojego przypadku.<\/p>\n<h2>Krok 2: Zdecyduj, jak powinny dzia\u0142a\u0107 korekty cen<\/h2>\n<p>Ten krok mo\u017ce by\u0107 ju\u017c dla Ciebie jasny \u2013 tutaj musisz wiedzie\u0107, jak i gdzie uzyska\u0107 korekt\u0119 ceny. Celem ko\u0144cowym powinna by\u0107 liczba, przez kt\u00f3r\u0105 dodajesz, odejmujesz, mno\u017cysz lub dzielisz ceny.<\/p>\n<p>W moim przypadku mam meta u\u017cytkownika na ka\u017cdym u\u017cytkowniku, kt\u00f3ra zawiera zni\u017ck\u0119 procentow\u0105; liczba od 0 do 99. Administrator strony mo\u017ce ustawi\u0107 zni\u017ck\u0119 dla ka\u017cdego u\u017cytkownika. Nie poka\u017c\u0119 kodu dodawania pola meta u\u017cytkownika, poniewa\u017c mo\u017ce to nie by\u0107 dla Ciebie i mo\u017cna to \u0142atwo zrobi\u0107 za pomoc\u0105 np. <a href=\"https:\/\/www.advancedcustomfields.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Zaawansowanych p\u00f3l niestandardowych<\/a>.<\/p>\n<p>W swojej klasie trzymam zmienn\u0105 klasy, kt\u00f3ra w konstruktorze b\u0119dzie ustawiona na mno\u017cnik. W zale\u017cno\u015bci od tego, czy u\u017cytkownik jest zalogowany, pobior\u0119 zapisany rabat od u\u017cytkownika i stworz\u0119 z niego mno\u017cnik. Domy\u015blnie mno\u017cnik powinien wynosi\u0107 1. Cena 1 = taka sama cena jak poprzednio. Ale dla rabatu np. 10% mno\u017cnik wyni\u00f3s\u0142by 0,9. Cena 0,9 = cena obni\u017cona o 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>Teraz, gdy mam gotowy mno\u017cnik, nadszed\u0142 czas, aby przyjrze\u0107 si\u0119 faktycznemu dostosowaniu cen w WooCommerce.<\/p>\n<h2>Krok 3: Filtry cen w WooCommerce<\/h2>\n<p>W WooCommerce jest jeden filtr dla prostych, pogrupowanych i zewn\u0119trznych typ\u00f3w produkt\u00f3w, a drugi dla zmiennych typ\u00f3w produkt\u00f3w. Zalecam dodanie obu filtr\u00f3w, aby uwzgl\u0119dni\u0107 wszystkie typy produkt\u00f3w. Opr\u00f3cz tego WooCommerce dzia\u0142a z trzema dodatkowymi filtrami cen:<\/p>\n<ul>\n<li>Ceny regularne (<code>woocommerce_product_get_regular_price<\/code>i <code>woocommerce_product_variation_get_regular_price<\/code>)<\/li>\n<li>Ceny sprzeda\u017cy (<code>woocommerce_product_get_sale_price<\/code>i <code>woocommerce_product_variation_get_sale_price<\/code>)<\/li>\n<li>Aktualna aktywna cena (<code>woocommerce_product_get_price<\/code>i <code>woocommerce_product_variation_get_price<\/code>). Aktualna aktywna cena zostanie pobrana z ceny zwyk\u0142ej lub ceny promocyjnej.<\/li>\n<\/ul>\n<p>Teraz mo\u017cesz po prostu przefiltrowa\u0107 aktualn\u0105 aktywn\u0105 cen\u0119 i nazwa\u0107 j\u0105 na dzie\u0144, ale zale\u017cy to od tego, jak chcesz obs\u0142ugiwa\u0107 wy\u015bwietlanie cen w swoim sklepie internetowym. Pami\u0119taj, \u017ce produkty w wyprzeda\u017cy domy\u015blnie wy\u015bwietlaj\u0105 star\u0105 cen\u0119 (cena zwyk\u0142a) w przekre\u015bleniu, a obok niej cen\u0119 promocyjn\u0105 (cena aktywna). Je\u015bli filtrujesz tylko <code>x_get_price<\/code>, a produkt jest w sprzeda\u017cy, stara cena b\u0119dzie wy\u015bwietlana bez rabatu.<\/p>\n<p>Z tego powodu decyduj\u0119 si\u0119 filtrowa\u0107 zar\u00f3wno aktywn\u0105 cen\u0119 bie\u017c\u0105c\u0105 (<code>x_get_price<\/code>) jak i cen\u0119 regularn\u0105 (<code>x_get_regular_price<\/code>), poniewa\u017c nie chc\u0119 myli\u0107 u\u017cytkownik\u00f3w mojego sklepu internetowego.<\/p>\n<h3>Pisanie filtra cen<\/h3>\n<p>Wszystkie cztery filtry odnosz\u0105 si\u0119 do tej samej funkcji. Wewn\u0105trz funkcji po prostu mno\u017cymy podan\u0105 cen\u0119 przez zmienn\u0105 class. Pami\u0119taj, \u017ce je\u015bli nie ustawiono rabatu, mno\u017cnik wynosi 1, co skutkuje brakiem zmiany ceny.<\/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>Pami\u0119taj, \u017ce wszystkie filtry podaj\u0105 obiekt produktu jako drugi parametr. Je\u015bli chcesz dostosowa\u0107 ceny w zale\u017cno\u015bci od produkt\u00f3w, mo\u017cesz w tym celu dostosowa\u0107 kod.<\/p>\n<p>Je\u015bli sprawdzisz sw\u00f3j sklep internetowy b\u0119d\u0105c zalogowanym jako u\u017cytkownik ze zni\u017ck\u0105, powiniene\u015b zobaczy\u0107 teraz obni\u017cone ceny! Jednak jeszcze nie sko\u0144czyli\u015bmy. WooCommerce wprowadzi\u0142 pewne zmiany w wersji 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\">wi\u0119cej tutaj<\/a> ), kt\u00f3re wp\u0142ywaj\u0105 na dynamiczn\u0105 wycen\u0119 produkt\u00f3w zmiennych.<\/p>\n<h3>Obs\u0142uga zmiennych cen produkt\u00f3w<\/h3>\n<p>Aby dynamiczna wycena dzia\u0142a\u0142a na produktach zmiennych, nale\u017cy doda\u0107 filtry wymienione w po\u015bcie na blogu, do kt\u00f3rego link znajduje si\u0119 powy\u017cej; <code>woocommerce_variation_prices_price<\/code>(i odpowiadaj\u0105cy mu zwyk\u0142y filtr cenowy <code>woocommerce_variation_prices_regular_price<\/code>) <strong>oraz<\/strong> filtr <code>woocommerce_get_variation_prices_hash<\/code>. Filtr mieszaj\u0105cy obs\u0142uguje wewn\u0119trzn\u0105 pami\u0119\u0107 podr\u0119czn\u0105 WooCommerce &#8211; i musimy powiedzie\u0107 WooCommerce, aby wyczy\u015bci\u0142 j\u0105 poprawnie, gdy zmodyfikujemy ceny wed\u0142ug kodu.<\/p>\n<p>Pierwsze dwa filtry cenowe post\u0119puj\u0105 tak samo jak <code>adjustPrice()<\/code>, jednak przypisuj\u0119 im inn\u0105 funkcj\u0119, poniewa\u017c parametry s\u0105 r\u00f3\u017cne. Je\u015bli chodzi o funkcj\u0119 hash filter, musimy doda\u0107 do tablicy hash, aby okre\u015bli\u0107, kiedy pami\u0119\u0107 podr\u0119czna powinna zosta\u0107 wyczyszczona. Dodanie identyfikatora u\u017cytkownika to dobry pomys\u0142, poniewa\u017c mno\u017cnik jest unikalny dla ka\u017cdego u\u017cytkownika.<\/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>Wreszcie tak powinno by\u0107!<\/p>\n<p>Pami\u0119taj, \u017ce masz dost\u0119p do pe\u0142nego obiektu produktu we wszystkich filtrach (nawet do obiektu odmiany w ostatnich dw\u00f3ch). Jest to przydatne w przypadkach, gdy chcesz dostosowa\u0107 ceny na podstawie informacji o produkcie; takie jak wykluczenie niekt\u00f3rych produkt\u00f3w z rabatu lub zastosowanie rabatu na podstawie kategorii produktu. Dostosowanie kodu do tego, czego potrzebujesz w swoim przypadku, powinno by\u0107 ca\u0142kiem proste.<\/p>\n<h2>Pe\u0142ny kod ko\u0144cowy<\/h2>\n<p>Jak zwykle mam nadziej\u0119, \u017ce nauczy\u0142e\u015b si\u0119 czego\u015b, \u015bledz\u0105c krok po kroku ten post, ale udost\u0119pni\u0119 pe\u0142n\u0105 klas\u0119 w celach informacyjnych:<\/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\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ten samouczek wyja\u015bnia, jak dostosowa\u0107 ceny w sklepie internetowym WordPress WooCommerce za pomoc\u0105 kodu. Przyk\u0142ady obejmuj\u0105 procent rabatu lub sta\u0142\u0105 sum\u0119.<\/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":[897,897,1110,815,845,845,856,856,866,866,815],"tags":[1169],"class_list":{"0":"post-233417","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-kod","9":"category-n-a","10":"category-wtyczki","11":"category-samouczki","13":"category-woocommerce-7","15":"category-wordpress-7","18":"tag-affiai-pl"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233417","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=233417"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233417\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/223696"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=233417"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=233417"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=233417"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}