{"id":233404,"date":"2023-02-13T15:43:00","date_gmt":"2023-02-13T12:43:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233404"},"modified":"2022-11-10T23:30:38","modified_gmt":"2022-11-10T20:30:38","slug":"guia-cambiar-precios-en-woocommerce-por-codigo","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/guia-cambiar-precios-en-woocommerce-por-codigo\/","title":{"rendered":"Gu\u00eda: cambiar precios en WooCommerce por c\u00f3digo"},"content":{"rendered":"\n<p>Esta publicaci\u00f3n es para usted que desea agregar un c\u00f3digo que ajuste los precios en su tienda web WordPress <a href=\"https:\/\/woocommerce.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WooCommerce<\/a>. Puede aumentar los precios o descontarlos. Y c\u00f3mo y de d\u00f3nde vienen los ajustes, depende totalmente de tu caso. Su tienda web podr\u00eda operar con descuentos porcentuales establecidos en cada usuario registrado, una configuraci\u00f3n global personalizada en la configuraci\u00f3n de WooCommerce, una suma fija codificada o algo establecido en cada producto o categor\u00eda de producto.<\/p>\n<p>He intentado que el c\u00f3digo sea lo m\u00e1s general posible para que puedas ajustarlo a tu caso. En mi caso, los ajustes de precio provienen de un porcentaje de descuento agregado como meta del usuario.<\/p>\n<p>El c\u00f3digo se actualiza para que funcione con WooCommerce 3.x y superior. No puedo garantizar que funcione para versiones inferiores.<\/p>\n<h2>Paso 1: crea un lugar para tu c\u00f3digo<\/h2>\n<p>El primer paso es f\u00e1cil; necesitas un lugar para agregar tu c\u00f3digo. Esto depende completamente de ti. Puede agregar esto directamente en su tema <code>functions.php<\/code>, o en alg\u00fan lugar de sus archivos de complemento. Me gusta trabajar con clases que mantendr\u00e1n todo muy bien junto en un solo lugar. En aras de la simplicidad, colocar\u00e9 la clase en un subdirectorio <code>\/src\/<\/code>en mi tema, la incluir\u00e9 y crear\u00e9 una instancia en <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 este paso para adaptarlo a su caso.<\/p>\n<h2>Paso 2: Decida c\u00f3mo deber\u00edan funcionar los ajustes de precios<\/h2>\n<p>Es posible que este paso ya le resulte claro: aqu\u00ed es donde necesita saber c\u00f3mo y d\u00f3nde obtener el ajuste de precio. El objetivo final debe ser un n\u00famero con el que sumas, restas, multiplicas o divides los precios.<\/p>\n<p>En mi caso tengo una meta de usuario sobre cada usuario que contiene un porcentaje de descuento; un n\u00famero entre 0 y 99. El administrador del sitio puede establecer un descuento para cada usuario. No mostrar\u00e9 el c\u00f3digo para agregar el metacampo del usuario, ya que es posible que no sea para usted y se puede hacer f\u00e1cilmente con, por ejemplo <a href=\"https:\/\/www.advancedcustomfields.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">, Campos personalizados avanzados<\/a>.<\/p>\n<p>En mi clase mantengo una variable de clase que en el constructor se establecer\u00e1 en un multiplicador. Dependiendo de si un usuario ha iniciado sesi\u00f3n, buscar\u00e9 el descuento guardado del usuario y crear\u00e9 un multiplicador a partir de \u00e9l. Por defecto, el multiplicador debe ser 1. Precio 1 = mismo precio que antes. Pero para un descuento de, por ejemplo, el 10 %, el multiplicador ser\u00eda 0,9. Precio 0,9 = precio rebajado con un 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>Ahora que tengo un multiplicador listo para usar, es hora de analizar c\u00f3mo ajustar los precios en WooCommerce.<\/p>\n<h2>Paso 3: filtros de precios en WooCommerce<\/h2>\n<p>En WooCommerce hay un filtro para tipos de productos simples, agrupados y externos, y otro para tipos de productos variables. Le recomiendo que agregue ambos filtros para cubrir todos los tipos de productos. Adem\u00e1s de esto, WooCommerce opera con tres filtros de precios adicionales:<\/p>\n<ul>\n<li>Precios regulares (<code>woocommerce_product_get_regular_price<\/code>y <code>woocommerce_product_variation_get_regular_price<\/code>)<\/li>\n<li>Precios de venta (<code>woocommerce_product_get_sale_price<\/code>y <code>woocommerce_product_variation_get_sale_price<\/code>)<\/li>\n<li>El precio activo actual (<code>woocommerce_product_get_price<\/code>y <code>woocommerce_product_variation_get_price<\/code>). El precio activo actual se obtendr\u00e1 del precio regular o del precio de venta.<\/li>\n<\/ul>\n<p>Ahora, puede simplemente filtrar el precio activo actual y cancelarlo, pero depende de c\u00f3mo desee manejar la visualizaci\u00f3n de precios en su tienda web. Recuerda que los productos en oferta por defecto muestran el precio antiguo (precio normal) tachado y el precio de oferta (precio activo) al lado. Si filtra solo <code>x_get_price<\/code>y un producto est\u00e1 en oferta, se mostrar\u00e1 el precio anterior sin descuento.<\/p>\n<p>Por eso, elijo filtrar tanto el precio actual activo (<code>x_get_price<\/code>) como el precio normal (<code>x_get_regular_price<\/code>), porque no quiero confundir a los usuarios de mi tienda web.<\/p>\n<h3>Escribir el filtro de precios<\/h3>\n<p>Los cuatro filtros se referir\u00e1n a la misma funci\u00f3n. Dentro de la funci\u00f3n, simplemente multiplicamos el precio provisto con la variable de clase. Recuerde que si no se establece ning\u00fan descuento, el multiplicador es 1, lo que da como resultado que no cambie el precio.<\/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>Tenga en cuenta que todos los filtros proporcionan el objeto del producto como segundo par\u00e1metro. Si desea ajustar los precios seg\u00fan los productos, puede ajustar el c\u00f3digo para hacerlo.<\/p>\n<p>Si revisa su tienda web mientras est\u00e1 conectado como un usuario con un descuento, \u00a1ahora deber\u00eda ver precios con descuento! Sin embargo, a\u00fan no hemos terminado. WooCommerce realiz\u00f3 algunos cambios en 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\">lea m\u00e1s aqu\u00ed<\/a>) que afectan los precios din\u00e1micos para productos variables.<\/p>\n<h3>Manejo de precios de productos variables<\/h3>\n<p>Para que los precios din\u00e1micos funcionen en productos variables, debe agregar los filtros mencionados en la publicaci\u00f3n del blog vinculada anteriormente; <code>woocommerce_variation_prices_price<\/code>(y el filtro de precio regular correspondiente <code>woocommerce_variation_prices_regular_price<\/code>), <strong>y<\/strong> el filtro <code>woocommerce_get_variation_prices_hash<\/code>. El filtro hash est\u00e1 manejando el cach\u00e9 interno de WooCommerce, y debemos decirle a WooCommerce que lo borre correctamente cuando modifiquemos los precios por c\u00f3digo.<\/p>\n<p>Los primeros dos filtros de precios siguen el mismo procedimiento que <code>adjustPrice()<\/code>, sin embargo, les asigno una funci\u00f3n diferente porque los par\u00e1metros son diferentes. En cuanto a la funci\u00f3n de filtro hash, debemos agregarla a la matriz hash para identificar cu\u00e1ndo se debe borrar el cach\u00e9. Agregar el ID de usuario es una buena idea ya que el multiplicador es \u00fanico para cada usuario.<\/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>\u00a1Finalmente, eso deber\u00eda ser todo!<\/p>\n<p>Tenga en cuenta que tiene acceso al objeto de producto completo en todos los filtros (incluso al objeto de variaci\u00f3n en los dos \u00faltimos). Esto es \u00fatil para los casos en los que desea ajustar los precios en funci\u00f3n de la informaci\u00f3n del producto; como excluir ciertos productos del descuento o aplicar un descuento basado en las categor\u00edas de un producto. Deber\u00eda ser bastante sencillo para usted ajustar el c\u00f3digo a lo que necesita para su caso.<\/p>\n<h2>El c\u00f3digo final completo<\/h2>\n<p>Como de costumbre, espero que hayas aprendido algo siguiendo esta publicaci\u00f3n paso a paso, pero proporcionar\u00e9 la clase completa como referencia:<\/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\">Fuente de grabaci\u00f3n:  <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 c\u00f3mo ajustar los precios en su tienda web WordPress WooCommerce usando c\u00f3digo. Los ejemplos incluyen porcentaje de descuento o suma fija.<\/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":[892,892,810,1110,810,840,840,851,851,861,861],"tags":[1172],"class_list":{"0":"post-233404","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-codigo","9":"category-complementos","10":"category-n-a","12":"category-tutoriales","14":"category-woocommerce-2","16":"category-wordpress-2","18":"tag-affiai-es"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233404","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=233404"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233404\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/223696"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=233404"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=233404"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=233404"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}