{"id":233625,"date":"2023-02-18T16:58:00","date_gmt":"2023-02-18T13:58:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233625"},"modified":"2022-11-11T00:42:36","modified_gmt":"2022-11-10T21:42:36","slug":"przewodnik-po-tym-jak-dodac-niestandardowe-oplaty-do-woocommerce-checkout-za-pomoca-kodu","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/przewodnik-po-tym-jak-dodac-niestandardowe-oplaty-do-woocommerce-checkout-za-pomoca-kodu\/","title":{"rendered":"Przewodnik po tym, jak doda\u0107 niestandardowe op\u0142aty do WooCommerce Checkout za pomoc\u0105 kodu"},"content":{"rendered":"\n<p>W niekt\u00f3rych przypadkach konieczne mo\u017ce by\u0107 dodanie op\u0142aty do sumy koszyka. Czasami tylko wtedy, gdy spe\u0142niony jest okre\u015blony warunek, na przyk\u0142ad w zale\u017cno\u015bci od sum koszyka lub miejsca wysy\u0142ki. Dzi\u0119ki WooCommerce dodanie op\u0142aty jest do\u015b\u0107 \u0142atwe \u2013 o wiele \u0142atwiejsze ni\u017c w rzeczywisto\u015bci dodanie rabatu. W tym po\u015bcie dowiemy si\u0119, jak doda\u0107 niestandardow\u0105 op\u0142at\u0119 do WooCommerce.<\/p>\n<p>WooCommerce ma wbudowan\u0105 funkcj\u0119 w obiekcie koszyka do dodawania op\u0142at. Wszystko, czego potrzebujesz, to podpi\u0105\u0107 si\u0119 pod w\u0142a\u015bciw\u0105 akcj\u0119 i za pomoc\u0105 dostarczonego obiektu koszyka wywo\u0142a\u0107 funkcj\u0119, aby doda\u0107 op\u0142at\u0119. WooCommerce automatycznie wy\u015bwietli op\u0142aty w koszyku i sumach kasowych. Ty decydujesz o etykiecie i wysoko\u015bci op\u0142aty.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152845-61e4fc291b3a1.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-152845-61e4fc291b3a1.png\" alt=\"Przewodnik po tym, jak doda\u0107 niestandardowe op\u0142aty do WooCommerce Checkout za pomoc\u0105 kodu\" ><\/a><\/p>\n<p>Nale\u017cy pami\u0119ta\u0107, \u017ce kwota op\u0142aty <strong>nie mo\u017ce by\u0107 ujemna<\/strong> \u2013 co daje klientowi rabat. Ten \u201ehack&quot; dzia\u0142a\u0142 wcze\u015bniej w starszych wersjach WooCommerce, ale ju\u017c nie.<\/p>\n<p>Przejd\u017amy do szczeg\u00f3\u0142\u00f3w kodu! Jedyny haczyk, o kt\u00f3ry musisz si\u0119 martwi\u0107, to <code>woocommerce_cart_calculate_fees<\/code>. Wewn\u0105trz tego haka mo\u017cesz z\u0142apa\u0107 przedmiot koszyka, wywo\u0142uj\u0105c <code>WC()-&gt;cart<\/code>. Za pomoc\u0105 tego obiektu mo\u017cesz wywo\u0142a\u0107 <code>add_fee()<\/code>, kt\u00f3ry akceptuje cztery parametry (prawdopodobnie potrzebujesz tylko dw\u00f3ch pierwszych); <code>add_fee($fee_name, $amount_in_float, $taxable_boolean, $tax_class_string)<\/code>. Pierwsze dwa s\u0105 oczywiste. Trzeci parametr to warto\u015b\u0107 logiczna, kt\u00f3ra decyduje o tym, czy op\u0142ata podlega opodatkowaniu, czy nie. A czwarty to podanie klasy podatkowej op\u0142aty (je\u015bli trzeci parametr jest prawdziwy). Ale mo\u017ce pozosta\u0107 puste dla standardowej klasy podatkowej.<\/p>\n<h2>Dodanie sta\u0142ej op\u0142aty<\/h2>\n<p>Dodanie op\u0142aty niestandardowej odbywa si\u0119 w najprostszej formie:<\/p>\n<pre><code>add_action('woocommerce_cart_calculate_fees', function() {\n    if (is_admin() &amp;&amp; !defined('DOING_AJAX')) {\n        return;\n    }\n    WC()-&gt;cart-&gt;add_fee(__('A small fee', 'txtdomain'), 5);\n});<\/code><\/pre>\n<p>Pierwszym krokiem jest uniemo\u017cliwienie dodawania op\u0142aty, je\u015bli jeste\u015bmy w admin lub je\u015bli Ajax jest w toku. Nast\u0119pnie wywo\u0142ujemy <code>add_fee()<\/code>obiekt koszyka. Spowoduje to dodanie op\u0142aty o nazwie \u201eMa\u0142a op\u0142ata&#8221; o warto\u015bci 5. Warto\u015b\u0107 b\u0119dzie w dowolnej walucie, kt\u00f3r\u0105 masz w swoim sklepie. Je\u015bli waluta sklepu jest ustawiona na dolary, wynosi 5 dolar\u00f3w. Dostosuj nazw\u0119 i ilo\u015b\u0107 do swoich potrzeb.<\/p>\n<h2>Dodanie op\u0142aty jako procent sumy koszyka<\/h2>\n<p>Je\u015bli chcesz, aby kwota op\u0142aty by\u0142a procentem sumy koszyka, wystarczy obliczy\u0107 j\u0105 inaczej. Pami\u0119taj, \u017ce zawsze mamy dost\u0119p do obiektu koszyka przez wywo\u0142anie <code>WC()-&gt;cart<\/code>i st\u0105d mo\u017cemy pobra\u0107 sumy.<\/p>\n<pre><code>add_action('woocommerce_cart_calculate_fees', function() {\n    if (is_admin() &amp;&amp; !defined('DOING_AJAX')) {\n        return;\n    }\n    $percentage = 0.05;  \/\/ Percentage (5%) in float\n    $percentage_fee = (WC()-&gt;cart-&gt;get_cart_contents_total() + WC()-&gt;cart-&gt;get_shipping_total()) * $percentage;\n\u00a0\n    WC()-&gt;cart-&gt;add_fee(__('A small fee', 'txtdomain'), $percentage_fee);\n});<\/code><\/pre>\n<p>Powy\u017cszy kod doda op\u0142at\u0119 w wysoko\u015bci 5% sumy koszyka, czyli sumy pozycji koszyka (<code>get_cart_contents_total()<\/code>) plus koszt wysy\u0142ki koszyka (<code>get_shipping_total()<\/code>). Dostosuj stawk\u0119 i sumy, kt\u00f3re chcesz uwzgl\u0119dni\u0107 lub wykluczy\u0107.<\/p>\n<p>To ca\u0142kiem mi\u0142e, ale w niekt\u00f3rych przypadkach mo\u017cemy chcie\u0107 dostosowa\u0107, kiedy doda\u0107 op\u0142at\u0119. Mo\u017ce chcesz doda\u0107 op\u0142at\u0119 tylko za okre\u015blon\u0105 metod\u0119 wysy\u0142ki, metod\u0119 p\u0142atno\u015bci lub na podstawie sumy koszyka. Proces jest taki sam, po prostu doliczamy op\u0142at\u0119 tylko wtedy, gdy spe\u0142nione s\u0105 nasze warunki.<\/p>\n<h2>Dodanie op\u0142aty w zale\u017cno\u015bci od sum koszyka<\/h2>\n<p>Za\u0142\u00f3\u017cmy, \u017ce chcesz doda\u0107 op\u0142at\u0119 tylko wtedy, gdy sumy koszyka s\u0105 poni\u017cej okre\u015blonej kwoty. Za\u0142\u00f3\u017cmy, \u017ce chcesz doda\u0107 op\u0142at\u0119 za obs\u0142ug\u0119 ma\u0142ych kwot. Mo\u017cesz to zrobi\u0107 tak:<\/p>\n<pre><code>add_action('woocommerce_cart_calculate_fees', function() {\n    if (is_admin() &amp;&amp; !defined('DOING_AJAX')) {\n        return;\n    }\n\u00a0\n    $cart_total = WC()-&gt;cart-&gt;get_cart_contents_total();  \/\/ This is excluding shipping\n    if ($cart_total &lt; 500) {\n        WC()-&gt;cart-&gt;add_fee(__('Fee for small transactions', 'txtdomain'), 50);\n    }\n});<\/code><\/pre>\n<p>U\u017cyj <code>WC()-&gt;cart-&gt;get_cart_contents_total()<\/code>, aby uzyska\u0107 liczb\u0119 zmiennoprzecinkow\u0105 sumy koszyka, z wy\u0142\u0105czeniem koszt\u00f3w wysy\u0142ki. (Je\u015bli chcesz uwzgl\u0119dni\u0107 r\u00f3wnie\u017c wysy\u0142k\u0119, sp\u00f3jrz powy\u017cej na dodanie op\u0142aty procentowej za to, jak uzyska\u0107 sumy koszt\u00f3w wysy\u0142ki). Nast\u0119pnie dokonaj por\u00f3wna\u0144.<\/p>\n<p>Mo\u017cesz r\u00f3wnie\u017c odwr\u00f3ci\u0107 go i zdecydowa\u0107 si\u0119 na dodanie op\u0142aty, je\u015bli koszyk przekroczy\u0142 pewien limit.<\/p>\n<h2>Dodanie op\u0142aty w zale\u017cno\u015bci od lokalizacji wysy\u0142ki<\/h2>\n<p>Mo\u017cesz r\u00f3wnie\u017c doda\u0107 op\u0142at\u0119 w zale\u017cno\u015bci od lokalizacji wysy\u0142ki, na przyk\u0142ad wed\u0142ug kraju. Podobnie jak przy pobieraniu obiektu koszyka, mo\u017cemy u\u017cy\u0107 <code>WC()-&gt;customer<\/code>do obiektu klienta. Pami\u0119taj, \u017ce gdy klient nie jest zalogowany i nie dotar\u0142 jeszcze do kasy i nie poda\u0142 swojego adresu, warto\u015bci obiektu klienta b\u0119d\u0105 puste lub warto\u015bci domy\u015blne ustawione w Twoim sklepie.<\/p>\n<p>Konieczna jest znajomo\u015b\u0107 kodu kraju \u2013 oto <a href=\"http:\/\/creatingawebstore.com\/woocommerce-country-codes-and-state-codes-list.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u0142adne odniesienie do kodu kraju<\/a>. Oto przyk\u0142ad dodawania op\u0142aty, je\u015bli klient pochodzi z Norwegii.<\/p>\n<pre><code>add_action('woocommerce_cart_calculate_fees', function() {\n    if (is_admin() &amp;&amp; !defined('DOING_AJAX')) {\n        return;\n    }\n\u00a0\n    $shipping_country = WC()-&gt;customer-&gt;get_shipping_country(); \n    if ($shipping_country == 'NO') {\n        WC()-&gt;cart-&gt;add_fee(__('Fee for shipping to Norway', 'txtdomain'), 50);\n    }\n});<\/code><\/pre>\n<h2>Doliczanie op\u0142aty w zale\u017cno\u015bci od wybranej metody wysy\u0142ki<\/h2>\n<p>Uzyskanie metody wysy\u0142ki jest nieco trudniejsze, poniewa\u017c zale\u017cy od sesji u\u017cytkownika i nie ma \u201e\u0142adnego, zrozumia\u0142ego formatu&#8221;. Aktualnie wybran\u0105 metod\u0119 wysy\u0142ki mo\u017cesz uzyska\u0107 za pomoc\u0105 <code>WC()-&gt;session-&gt;get('chosen_shipping_methods')<\/code>. Zauwa\u017c, \u017ce m\u00f3wi \u201emetody&#8221;, a nie \u201emetoda&#8221;, wi\u0119c zwraca tablic\u0119. Zwykle tablica zawiera jeden element, przy czym ka\u017cdy element sk\u0142ada si\u0119 z ci\u0105g\u00f3w identyfikatora wysy\u0142ki, dwukropka i identyfikatora po nim. Polecam u\u017cywa\u0107 metod napisowych PHP, aby sprawdzi\u0107, czy ci\u0105g zawiera identyfikator \u2013 na przyk\u0142ad <code>strpos()<\/code>\u2013 a nie czy jest r\u00f3wny.<\/p>\n<pre><code>add_action('woocommerce_cart_calculate_fees', function() {\n    if (is_admin() &amp;&amp; !defined('DOING_AJAX')) {\n        return;\n    }\n\u00a0\n    $chosen_shipping_method = WC()-&gt;session-&gt;get('chosen_shipping_methods');\n\u00a0\n    if (strpos($chosen_shipping_method[0], 'flat_rate') !== false) {\n        WC()-&gt;cart-&gt;add_fee(__('Fee for flat rate shipping', 'txtdomain'), 50);\n    }\n});<\/code><\/pre>\n<h2>Dodanie op\u0142aty w zale\u017cno\u015bci od wybranej metody p\u0142atno\u015bci<\/h2>\n<p>Je\u015bli chcesz doda\u0107 op\u0142at\u0119 w zale\u017cno\u015bci od wybranej bramki p\u0142atno\u015bci, mo\u017cesz pobra\u0107 aktualnie wybran\u0105 bramk\u0119 p\u0142atno\u015bci <code>WC()-&gt;session-&gt;get('chosen_payment_method')<\/code>i dokona\u0107 por\u00f3wnania z jej nazw\u0105 (np. dla Paypal zwr\u00f3ci\u0142by <code>'paypal'<\/code>). Mo\u017cesz jednak zauwa\u017cy\u0107, \u017ce gdy klient prze\u0142\u0105cza si\u0119 mi\u0119dzy bramkami p\u0142atniczymi w kasie, op\u0142ata nie jest dynamicznie dodawana ani usuwana. Musisz wi\u0119c doda\u0107 dodatkowy Javascript, aby zapewni\u0107, \u017ce WooCommerce zaktualizuje koszyk, aby Twoja op\u0142ata dzia\u0142a\u0142a konsekwentnie.<\/p>\n<pre><code>add_action('woocommerce_cart_calculate_fees', function() {\n    if (is_admin() &amp;&amp; !defined('DOING_AJAX')) {\n        return;\n    }\n\u00a0\n    $chosen_payment_method = WC()-&gt;session-&gt;get('chosen_payment_method');\n    if ($chosen_payment_method == 'paypal') {\n        WC()-&gt;cart-&gt;add_fee(__('Paypal Fee', 'txtdomain'), 50);\n    }\n});\n\u00a0\nadd_action('woocommerce_review_order_before_payment', function() {\n    ?&gt;&lt;script type=\"text\/javascript\"&gt;\n        (function($){\n            $('form.checkout').on('change', 'input[name^=\"payment_method\"]', function() {\n                $('body').trigger('update_checkout');\n            });\n        })(jQuery);\n    &lt;\/script&gt;&lt;?php\n});<\/code><\/pre>\n<p>Aby doda\u0107 JavaScript, do kt\u00f3rego si\u0119 podpinamy, <code>woocommerce_review_order_before_payment<\/code>kt\u00f3ry wyst\u0119puje tu\u017c przed okienkiem p\u0142atno\u015bci w kasie i wysy\u0142amy skrypt wbudowany. Wszystko, co robi kod, to uruchamianie haka WooCommerce za ka\u017cdym razem, <code>update_checkout<\/code>gdy zmienia si\u0119 wyb\u00f3r metody p\u0142atno\u015bci. Gwarantuje to, \u017ce wszystkie niezb\u0119dne metody PHP i hooki s\u0105 uruchamiane (w tym hak op\u0142aty) za ka\u017cdym razem, gdy koszyk jest aktualizowany.<\/p>\n<h2>Dodanie op\u0142aty w zale\u017cno\u015bci od tego, kt\u00f3re produkty s\u0105 w koszyku<\/h2>\n<p>Wspomnia\u0142em o tym wcze\u015bniej, ale wspomn\u0119 jeszcze raz: Masz pe\u0142ny dost\u0119p do obiektu koszyka za pomoc\u0105 <code>WC()-&gt;cart<\/code>, wi\u0119c mo\u017cesz przeszuka\u0107 zawarto\u015b\u0107 koszyka pod k\u0105tem okre\u015blonego identyfikatora produktu i doda\u0107 op\u0142at\u0119, je\u015bli istnieje w koszyku.<\/p>\n<p>Korzystanie <code>WC()-&gt;cart-&gt;get_cart_contents()<\/code>zwraca tablic\u0119 wszystkich produkt\u00f3w w koszyku. Mo\u017cesz przej\u015b\u0107 przez to za pomoc\u0105 prostej <code>foreach<\/code>p\u0119tli i sprawdzi\u0107 ka\u017cdy produkt pod k\u0105tem po\u017c\u0105danego stanu, lub je\u015bli chcesz po prostu sprawdzi\u0107 identyfikatory, mo\u017cesz wyodr\u0119bni\u0107 wszystkie identyfikatory produkt\u00f3w w jednym wierszu, tak jak poni\u017cej:<\/p>\n<pre><code>$products_in_cart = WC()-&gt;cart-&gt;get_cart_contents();\n$product_ids_in_cart = array_column(array_values($products_in_cart), 'product_id');\n\/\/ Now you can use e.g. in_array() to check for certain product IDs.<\/code><\/pre>\n<p>Poni\u017cszy przyk\u0142ad pokazuje, jak mo\u017cna doda\u0107 op\u0142at\u0119 w zale\u017cno\u015bci od tego, czy w koszyku znajduje si\u0119 produkt o okre\u015blonym ID:<\/p>\n<pre><code>add_action('woocommerce_cart_calculate_fees', function() {\n    if (is_admin() &amp;&amp; !defined('DOING_AJAX')) {\n        return;\n    }\n\u00a0\n    $really_expensive_product_id = 12;  \/\/ product ID that triggers a fee\n\u00a0\n    $products_in_cart = WC()-&gt;cart-&gt;get_cart_contents();\n    $product_ids_in_cart = array_column(array_values($products_in_cart), 'product_id');\n    if (in_array($really_expensive_product_id, $product_ids_in_cart)) {\n        WC()-&gt;cart-&gt;add_fee(__('Fee for really expensive product', 'txtdomain'), 50);\n    }\n});<\/code><\/pre>\n<p>Mo\u017cesz r\u00f3wnie\u017c u\u017cy\u0107 podobnych operacji do wyodr\u0119bnienia ilo\u015bci, je\u015bli musisz doda\u0107 op\u0142at\u0119, gdy klient dodaje naprawd\u0119 du\u017c\u0105 ilo\u015b\u0107 czego\u015b.<\/p>\n<h2>Podsumowuj\u0105c<\/h2>\n<p>W tym po\u015bcie pokazano, jak doda\u0107 op\u0142at\u0119 niestandardow\u0105 oraz pi\u0119\u0107 przyk\u0142ad\u00f3w, jak doda\u0107 op\u0142at\u0119 w zale\u017cno\u015bci od okre\u015blonych warunk\u00f3w. Te warunki by\u0142y wszystkim, co spotka\u0142em i mog\u0142em wymy\u015bli\u0107, i powinny przynajmniej da\u0107 wskaz\u00f3wki, jak zdoby\u0107 informacje, aby jeszcze bardziej dostosowa\u0107 swoje warunki. Daj mi zna\u0107, czy pracowa\u0142y dla Ciebie, czy znalaz\u0142e\u015b inny stan, o kt\u00f3rym nie pomy\u015bla\u0142em!<\/p>\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 przewodnik pokazuje, jak doda\u0107 niestandardow\u0105 op\u0142at\u0119 do sum koszyka WooCommerce, a tak\u017ce doda\u0107 j\u0105 w zale\u017cno\u015bci od lokalizacji wysy\u0142ki lub metody p\u0142atno\u015bci.<\/p>\n","protected":false},"author":1,"featured_media":224911,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[897,721,721,897,1110,815,845,845,856,856,866,866,815],"tags":[1169],"class_list":["post-233625","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kod","category-deweloper","category-n-a","category-wtyczki","category-samouczki","category-woocommerce-7","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233625","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=233625"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233625\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/224911"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=233625"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=233625"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=233625"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}