{"id":233615,"date":"2023-02-18T16:53:00","date_gmt":"2023-02-18T13:53:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233615"},"modified":"2022-11-11T00:39:21","modified_gmt":"2022-11-10T21:39:21","slug":"guia-sobre-como-adicionar-taxas-personalizadas-ao-woocommerce-checkout-por-codigo","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/guia-sobre-como-adicionar-taxas-personalizadas-ao-woocommerce-checkout-por-codigo\/","title":{"rendered":"Guia sobre como adicionar taxas personalizadas ao WooCommerce Checkout por c\u00f3digo"},"content":{"rendered":"\n<p>H\u00e1 alguns casos em que voc\u00ea pode precisar adicionar uma taxa aos totais do carrinho. \u00c0s vezes, apenas se uma determinada condi\u00e7\u00e3o for atendida, por exemplo, dependendo dos totais do carrinho ou do local de envio. Com o WooCommerce, adicionar uma taxa \u00e9 muito f\u00e1cil \u2013 muito mais f\u00e1cil do que adicionar um desconto de fato. Neste post vamos aprender como adicionar uma taxa personalizada ao WooCommerce.<\/p>\n<p>O WooCommerce possui uma fun\u00e7\u00e3o integrada no objeto do carrinho para adicionar taxas. Tudo o que voc\u00ea precisa \u00e9 conectar-se \u00e0 a\u00e7\u00e3o correta e, com o objeto cart fornecido, chamar uma fun\u00e7\u00e3o para adicionar uma taxa. O WooCommerce exibir\u00e1 automaticamente as taxas no carrinho e nos totais de checkout. Voc\u00ea decide o r\u00f3tulo e o valor da taxa.<\/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=\"Guia sobre como adicionar taxas personalizadas ao WooCommerce Checkout por c\u00f3digo\" ><\/a><\/p>\n<p>\u00c9 importante observar que o valor da taxa <strong>n\u00e3o pode ser negativo<\/strong> \u2013 dando assim um desconto ao cliente. Esse &#8220;hack&quot; costumava funcionar antes em vers\u00f5es mais antigas do WooCommerce, mas n\u00e3o mais.<\/p>\n<p>Vamos aos detalhes do c\u00f3digo! O \u00fanico gancho com o qual voc\u00ea precisa se preocupar \u00e9 <code>woocommerce_cart_calculate_fees<\/code>. Dentro deste gancho voc\u00ea pode obter o objeto cart chamando <code>WC()-&gt;cart<\/code>. Com esse objeto voc\u00ea pode chamar <code>add_fee()<\/code>que aceita quatro par\u00e2metros (voc\u00ea provavelmente s\u00f3 precisa dos dois primeiros); <code>add_fee($fee_name, $amount_in_float, $taxable_boolean, $tax_class_string)<\/code>. Os dois primeiros s\u00e3o autoexplicativos. O terceiro par\u00e2metro \u00e9 um booleano que decide se a taxa \u00e9 tribut\u00e1vel ou n\u00e3o. E o quarto \u00e9 para fornecer uma classe de imposto para a taxa (se o terceiro par\u00e2metro for verdadeiro). Mas pode ser deixado em branco para a classe fiscal padr\u00e3o.<\/p>\n<h2>Adicionando uma taxa fixa<\/h2>\n<p>A adi\u00e7\u00e3o de uma taxa personalizada \u00e9 feita em sua forma mais simples, como esta:<\/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>O primeiro passo \u00e9 evitar adicionar uma taxa se estivermos no admin ou se o Ajax estiver em andamento. Em seguida, chamamos <code>add_fee()<\/code>o objeto cart. Isso adicionar\u00e1 uma taxa chamada &#8220;Uma pequena taxa&#8221; com o valor de 5. O valor ser\u00e1 em qualquer moeda que voc\u00ea tenha em sua loja. Se a moeda da loja estiver definida para d\u00f3lares, ela se torna $ 5. Ajuste o nome e o valor de acordo com suas necessidades.<\/p>\n<h2>Adicionando uma taxa como uma porcentagem dos totais do carrinho<\/h2>\n<p>Se voc\u00ea quiser que o valor da taxa seja uma porcentagem do total do carrinho, basta calcul\u00e1-lo de maneira diferente. Lembre-se que sempre temos acesso ao objeto do carrinho chamando <code>WC()-&gt;cart<\/code>e a partir disso podemos buscar os totais.<\/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>O c\u00f3digo acima adicionar\u00e1 uma taxa que equivale a 5% do total do carrinho, que \u00e9 o total de itens do carrinho (<code>get_cart_contents_total()<\/code>) mais o custo de envio do carrinho (<code>get_shipping_total()<\/code>). Ajuste a taxa e quais totais incluir ou excluir no que voc\u00ea precisa.<\/p>\n<p>Portanto, isso \u00e9 muito bom, mas em alguns casos podemos querer personalizar quando adicionar uma taxa. Talvez voc\u00ea queira adicionar uma taxa apenas para um determinado m\u00e9todo de envio, m\u00e9todo de pagamento ou com base no total do carrinho. O processo \u00e9 o mesmo, apenas adicionamos a taxa somente se nossas condi\u00e7\u00f5es forem atendidas.<\/p>\n<h2>Adicionando uma taxa dependendo dos totais do carrinho<\/h2>\n<p>Digamos que voc\u00ea queira adicionar uma taxa apenas se os totais do carrinho estiverem abaixo de um determinado valor. Suponha que voc\u00ea queira adicionar uma taxa para lidar com pequenas quantias. Voc\u00ea poderia fazer assim:<\/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>Use <code>WC()-&gt;cart-&gt;get_cart_contents_total()<\/code>para obter o n\u00famero flutuante do total do carrinho, excluindo o frete. (Se voc\u00ea quiser incluir o frete tamb\u00e9m, veja acima na adi\u00e7\u00e3o de taxa percentual para saber como obter os totais de frete). Ent\u00e3o fa\u00e7a suas compara\u00e7\u00f5es.<\/p>\n<p>Voc\u00ea tamb\u00e9m pode virar e decidir adicionar uma taxa se o carrinho estiver acima de um determinado limite.<\/p>\n<h2>Adicionando uma taxa dependendo do local de envio<\/h2>\n<p>Voc\u00ea tamb\u00e9m pode adicionar uma taxa dependendo do local de envio, por exemplo, por pa\u00eds. Da mesma forma que obter o objeto do carrinho, podemos usar <code>WC()-&gt;customer<\/code>para o objeto do cliente. Tenha em mente que quando o cliente n\u00e3o est\u00e1 logado e ainda n\u00e3o chegou ao caixa e preencheu seu endere\u00e7o, os valores do objeto cliente estar\u00e3o vazios ou os padr\u00f5es definidos em sua loja.<\/p>\n<p>Voc\u00ea precisar\u00e1 saber o c\u00f3digo do pa\u00eds \u2013 aqui est\u00e1 uma <a href=\"http:\/\/creatingawebstore.com\/woocommerce-country-codes-and-state-codes-list.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">boa refer\u00eancia de c\u00f3digo do pa\u00eds<\/a>. Aqui est\u00e1 um exemplo de adi\u00e7\u00e3o de uma taxa se o cliente for da Noruega.<\/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>Adicionando uma taxa dependendo do m\u00e9todo de envio escolhido<\/h2>\n<p>Obter o m\u00e9todo de envio \u00e9 um pouco mais complicado, pois depende da sess\u00e3o do usu\u00e1rio e n\u00e3o vem em um &#8220;formato agrad\u00e1vel e compreens\u00edvel&#8221;. Voc\u00ea pode obter o m\u00e9todo de envio escolhido atual com <code>WC()-&gt;session-&gt;get('chosen_shipping_methods')<\/code>. Observe que ele diz &#8220;m\u00e9todos&#8221; e n\u00e3o &#8220;m\u00e9todo&#8221;, ent\u00e3o isso retorna uma matriz. Normalmente, o array cont\u00e9m um elemento, onde cada elemento consiste em strings de ID de envio, dois pontos e um ID depois dele. Eu recomendo usar m\u00e9todos de string PHP para verificar se a string cont\u00e9m o ID \u2013 por exemplo <code>strpos()<\/code>\u2013 e n\u00e3o se \u00e9 igual.<\/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>Adicionando uma taxa dependendo do m\u00e9todo de pagamento escolhido<\/h2>\n<p>Se voc\u00ea quiser adicionar uma taxa dependendo de qual gateway de pagamento foi escolhido, voc\u00ea pode obter o gateway de pagamento escolhido atual <code>WC()-&gt;session-&gt;get('chosen_payment_method')<\/code>e fazer uma compara\u00e7\u00e3o com seu nome (por exemplo, para Paypal retornaria <code>'paypal'<\/code>). No entanto, voc\u00ea pode notar que quando o cliente est\u00e1 alternando entre os gateways de pagamento no checkout, a taxa n\u00e3o \u00e9 adicionada ou removida dinamicamente. Portanto, voc\u00ea precisar\u00e1 adicionar algum Javascript adicional para garantir que o WooCommerce atualize o carrinho para que sua taxa funcione de forma consistente.<\/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>Para adicionar o Javascript, conectamos o <code>woocommerce_review_order_before_payment<\/code>que ocorre logo antes da caixa de pagamento no checkout e sa\u00edda do script inline. Tudo o que o c\u00f3digo faz \u00e9 acionar o gancho do WooCommerce <code>update_checkout<\/code>sempre que a escolha do m\u00e9todo de pagamento \u00e9 alterada. Isso garante que todos os m\u00e9todos e ganchos PHP necess\u00e1rios sejam executados (incluindo o gancho de taxa) toda vez que o carrinho for atualizado.<\/p>\n<h2>Adicionando uma taxa dependendo de quais produtos est\u00e3o no carrinho<\/h2>\n<p>J\u00e1 mencionei isso antes, mas vou mencion\u00e1-lo novamente: voc\u00ea tem acesso total ao objeto do carrinho com <code>WC()-&gt;cart<\/code>, ent\u00e3o voc\u00ea pode pesquisar o conte\u00fado do carrinho por um ID de produto espec\u00edfico e adicionar uma taxa se ele existir no carrinho.<\/p>\n<p>Usando <code>WC()-&gt;cart-&gt;get_cart_contents()<\/code>retorna uma matriz de todos os produtos no carrinho. Voc\u00ea pode fazer um loop por isso com um loop simples <code>foreach<\/code>e verificar cada produto na condi\u00e7\u00e3o desejada ou, se simplesmente quiser verificar os IDs, poder\u00e1 extrair todos os IDs do produto em uma linha, assim:<\/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>O exemplo abaixo mostra como voc\u00ea pode adicionar uma taxa dependendo do carrinho conter um produto de um determinado 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>Voc\u00ea tamb\u00e9m pode usar opera\u00e7\u00f5es semelhantes para extrair quantidades se precisar adicionar uma taxa quando um cliente adicionar uma quantidade muito grande de algo.<\/p>\n<h2>Para concluir<\/h2>\n<p>Este post mostrou como adicionar uma taxa personalizada e, por meio de cinco exemplos, como adicionar uma taxa dependendo de determinadas condi\u00e7\u00f5es. Essas condi\u00e7\u00f5es foram tudo o que encontrei e pude pensar, e elas devem, no m\u00ednimo, dar dicas sobre como obter informa\u00e7\u00f5es para personalizar ainda mais suas condi\u00e7\u00f5es. Deixe-me saber se eles funcionaram para voc\u00ea, ou se voc\u00ea encontrou outra condi\u00e7\u00e3o que eu n\u00e3o pensei!<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Este guia mostra como adicionar uma taxa personalizada aos totais do carrinho WooCommerce e tamb\u00e9m adicion\u00e1-la dependendo do local de envio ou do m\u00e9todo de pagamento.<\/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":[898,898,722,722,1110,816,816,846,846,857,857,867,867],"tags":[1170],"class_list":["post-233615","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-n-a","category-plug-ins","category-tutoriais","category-woocommerce-8","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233615","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=233615"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233615\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/224911"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=233615"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=233615"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=233615"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}