{"id":233446,"date":"2023-02-13T15:55:00","date_gmt":"2023-02-13T12:55:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233446"},"modified":"2022-11-10T23:43:43","modified_gmt":"2022-11-10T20:43:43","slug":"guia-alterar-precos-no-woocommerce-por-codigo","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/guia-alterar-precos-no-woocommerce-por-codigo\/","title":{"rendered":"Guia: Alterar pre\u00e7os no WooCommerce por c\u00f3digo"},"content":{"rendered":"\n<p>Este post \u00e9 para voc\u00ea que deseja adicionar um c\u00f3digo que ajuste os pre\u00e7os em sua loja virtual WordPress <a href=\"https:\/\/woocommerce.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WooCommerce<\/a>. Voc\u00ea pode aumentar os pre\u00e7os ou descont\u00e1-los. E como e de onde v\u00eam os ajustes, depende inteiramente do seu caso. Sua loja virtual pode operar com descontos percentuais definidos para cada usu\u00e1rio registrado, uma configura\u00e7\u00e3o global personalizada nas configura\u00e7\u00f5es do WooCommerce, uma soma fixa codificada ou algo definido em cada produto ou categoria de produto.<\/p>\n<p>Eu tentei fazer o c\u00f3digo o mais geral poss\u00edvel para que voc\u00ea possa ajust\u00e1-lo ao seu caso. No meu caso os ajustes de pre\u00e7o v\u00eam de um desconto percentual adicionado como meta do usu\u00e1rio.<\/p>\n<p>O c\u00f3digo \u00e9 atualizado para funcionar no WooCommerce 3.xe acima. N\u00e3o posso garantir que funcionar\u00e1 para vers\u00f5es inferiores.<\/p>\n<h2>Etapa 1: crie um lugar para seu c\u00f3digo<\/h2>\n<p>O primeiro passo \u00e9 f\u00e1cil; voc\u00ea precisa de um lugar para adicionar seu c\u00f3digo. Isso depende inteiramente de voc\u00ea. Voc\u00ea pode adicionar isso diretamente no seu tema <code>functions.php<\/code>ou em algum lugar em seus arquivos de plugin. Eu gosto de trabalhar com classes que v\u00e3o manter tudo bem junto em um s\u00f3 lugar. Por uma quest\u00e3o de simplicidade, colocarei a classe em um subdiret\u00f3rio <code>\/src\/<\/code>no meu tema e o incluirei e instanciarei em <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>Modifique esta etapa para se adequar ao seu caso.<\/p>\n<h2>Etapa 2: decidir como os ajustes de pre\u00e7o devem funcionar<\/h2>\n<p>Este passo j\u00e1 pode estar claro para voc\u00ea \u2013 \u00e9 aqui que voc\u00ea precisa saber como e onde obter o ajuste de pre\u00e7o. O objetivo final deve ser um n\u00famero com o qual voc\u00ea soma, subtrai, multiplica ou divide os pre\u00e7os.<\/p>\n<p>No meu caso tenho uma meta de usu\u00e1rio em cada usu\u00e1rio que cont\u00e9m uma porcentagem de desconto; um n\u00famero entre 0 e 99. O administrador do site pode definir um desconto para cada usu\u00e1rio. N\u00e3o mostrarei o c\u00f3digo para adicionar o meta campo do usu\u00e1rio, pois isso pode n\u00e3o ser para voc\u00ea e \u00e9 feito facilmente com, por exemplo, <a href=\"https:\/\/www.advancedcustomfields.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Advanced Custom Fields<\/a>.<\/p>\n<p>Na minha classe eu mantenho uma vari\u00e1vel de classe que no construtor ser\u00e1 definida como um multiplicador. Dependendo se um usu\u00e1rio est\u00e1 logado, vou buscar o desconto salvo do usu\u00e1rio e criar um multiplicador a partir dele. Como padr\u00e3o, o multiplicador deve ser 1. Pre\u00e7o 1 = mesmo pre\u00e7o de antes. Mas para um desconto de, por exemplo, 10%, o multiplicador seria 0,9. Pre\u00e7o 0,9 = pre\u00e7o com desconto de 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>Agora que tenho um multiplicador pronto para usar, \u00e9 hora de analisar o ajuste de pre\u00e7os no WooCommerce.<\/p>\n<h2>Passo 3: Filtros de pre\u00e7os no WooCommerce<\/h2>\n<p>No WooCommerce h\u00e1 um filtro para tipos de produtos simples, agrupados e externos e outro para tipos de produtos vari\u00e1veis. Eu recomendo que voc\u00ea adicione os dois filtros para cobrir todos os tipos de produtos. Al\u00e9m disso, o WooCommerce opera com tr\u00eas filtros de pre\u00e7os adicionais:<\/p>\n<ul>\n<li>Pre\u00e7os normais (<code>woocommerce_product_get_regular_price<\/code>e <code>woocommerce_product_variation_get_regular_price<\/code>)<\/li>\n<li>Pre\u00e7os de venda (<code>woocommerce_product_get_sale_price<\/code>e <code>woocommerce_product_variation_get_sale_price<\/code>)<\/li>\n<li>O pre\u00e7o ativo atual (<code>woocommerce_product_get_price<\/code>e <code>woocommerce_product_variation_get_price<\/code>). O pre\u00e7o ativo atual ser\u00e1 obtido do pre\u00e7o normal ou do pre\u00e7o de venda.<\/li>\n<\/ul>\n<p>Agora, voc\u00ea pode simplesmente filtrar o pre\u00e7o ativo atual e cham\u00e1-lo de um dia, mas depende de como voc\u00ea deseja lidar com a exibi\u00e7\u00e3o de pre\u00e7os em sua loja virtual. Lembre-se de que os produtos em promo\u00e7\u00e3o por padr\u00e3o mostram o pre\u00e7o antigo (pre\u00e7o normal) tachado e o pre\u00e7o de venda (pre\u00e7o ativo) ao lado. Se voc\u00ea filtrar apenas <code>x_get_price<\/code>e um produto estiver em promo\u00e7\u00e3o, o pre\u00e7o antigo ser\u00e1 mostrado sem desconto.<\/p>\n<p>Por isso, escolho filtrar tanto o pre\u00e7o atual ativo (<code>x_get_price<\/code>) quanto o pre\u00e7o normal (<code>x_get_regular_price<\/code>), pois n\u00e3o quero confundir os usu\u00e1rios da minha loja virtual.<\/p>\n<h3>Escrevendo o filtro de pre\u00e7os<\/h3>\n<p>Todos os quatro filtros se referem \u00e0 mesma fun\u00e7\u00e3o. Dentro da fun\u00e7\u00e3o, simplesmente multiplicamos o pre\u00e7o fornecido pela vari\u00e1vel de classe. Lembre-se de que, se nenhum desconto for definido, o multiplicador ser\u00e1 1, o que n\u00e3o resultar\u00e1 em altera\u00e7\u00e3o no pre\u00e7o.<\/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>Observe que todos os filtros fornecem o objeto do produto como segundo par\u00e2metro. Se voc\u00ea quiser ajustar os pre\u00e7os dependendo dos produtos, poder\u00e1 ajustar o c\u00f3digo para isso.<\/p>\n<p>Se voc\u00ea verificar sua loja virtual enquanto estiver conectado como usu\u00e1rio com desconto, agora ver\u00e1 pre\u00e7os com desconto! No entanto, ainda n\u00e3o terminamos. O WooCommerce fez algumas altera\u00e7\u00f5es na vers\u00e3o 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\">leia mais aqui<\/a>) que afetam os pre\u00e7os din\u00e2micos de produtos vari\u00e1veis.<\/p>\n<h3>Como lidar com pre\u00e7os de produtos vari\u00e1veis<\/h3>\n<p>Para fazer a precifica\u00e7\u00e3o din\u00e2mica funcionar em produtos vari\u00e1veis, voc\u00ea deve adicionar os filtros mencionados na postagem do blog vinculada acima; <code>woocommerce_variation_prices_price<\/code>(e o filtro de pre\u00e7o normal correspondente <code>woocommerce_variation_prices_regular_price<\/code>) <strong>e<\/strong> o filtro <code>woocommerce_get_variation_prices_hash<\/code>. O filtro de hash est\u00e1 lidando com o cache interno do WooCommerce \u2013 e precisamos dizer ao WooCommerce para limp\u00e1-lo corretamente quando modificarmos os pre\u00e7os por c\u00f3digo.<\/p>\n<p>Os dois primeiros filtros de pre\u00e7o seguem o mesmo procedimento de <code>adjustPrice()<\/code>, por\u00e9m eu atribuo uma fun\u00e7\u00e3o diferente para eles porque os par\u00e2metros s\u00e3o diferentes. Quanto \u00e0 fun\u00e7\u00e3o de filtro de hash, precisamos adicionar ao array de hash para identificar quando o cache deve ser limpo. Adicionar o ID do usu\u00e1rio \u00e9 uma boa ideia, pois o multiplicador \u00e9 exclusivo para cada usu\u00e1rio.<\/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>Finalmente, deve ser isso!<\/p>\n<p>Observe que voc\u00ea tem acesso ao objeto produto completo em todos os filtros (at\u00e9 o objeto varia\u00e7\u00e3o nos dois \u00faltimos). Isso \u00e9 \u00fatil para os casos em que voc\u00ea deseja ajustar os pre\u00e7os com base nas informa\u00e7\u00f5es do produto; como excluir determinados produtos do desconto ou aplicar um desconto com base nas categorias de um produto. Deve ser bastante simples para voc\u00ea ajustar o c\u00f3digo para o que voc\u00ea precisa para o seu caso.<\/p>\n<h2>O c\u00f3digo final completo<\/h2>\n<p>Como de costume, espero que voc\u00ea tenha aprendido algo seguindo este post passo a passo, mas vou fornecer a classe completa para refer\u00eancia:<\/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\">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 tutorial explica como ajustar os pre\u00e7os em sua loja virtual WordPress WooCommerce usando c\u00f3digo. Os exemplos incluem porcentagem de desconto ou soma fixa.<\/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":[898,898,1110,816,816,846,846,857,857,867,867],"tags":[1170],"class_list":["post-233446","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","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\/233446","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=233446"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233446\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/223696"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=233446"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=233446"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=233446"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}