yith tienda páginas productos precios plugin personalizar insertar entradas carrito atributos php wordpress class woocommerce

php - tienda - WooCommerce: ¿Agregar producto al carro con anulación de precio?



woocommerce sin precios (9)

$replace_order = new WC_Cart(); $replace_order->empty_cart( true ); $replace_order->add_to_cart( "256", "1");

El código anterior agrega el producto 256 al carro 1 vez. Pero el problema que tengo es que quiero poder anular completamente el precio del producto ... por lo que puedo decir, lo único que puedo hacer es aplicar un cupón al carrito.

¿Hay alguna manera de anular completamente el precio a algo totalmente personalizado?


Aquí está el código para anular el precio del producto en el carro

add_action( ''woocommerce_before_calculate_totals'', ''add_custom_price'' ); function add_custom_price( $cart_object ) { $custom_price = 10; // This will be your custome price foreach ( $cart_object->cart_contents as $key => $value ) { $value[''data'']->price = $custom_price; // for WooCommerce version 3+ use: // $value[''data'']->set_price($custom_price); } }

Espero que sea útil ...


Así es como lo hice, primero agregué mi precio personalizado a cart_item_data que puede guardar datos personalizados en los artículos del carrito, luego uso woocommerce_before_calculate_totals, doy un bucle al carro y agrego el precio agregado previamente.

function add_donation_to_cart() { $cart_item_data = array(''price'' => $_REQUEST[''donate_amount'']); $woocommerce->cart->add_to_cart( 5395, 1, '''', array(), $cart_item_data); } add_action( ''woocommerce_before_calculate_totals'', ''add_custom_price'' ); function add_custom_price( $cart ) { foreach ( $cart->cart_contents as $key => $value ) { $value[''data'']->price = $value[''price'']; } }


Con WooCommerce 2.5 descubrí que se trata de un proceso de dos partes. El primer paso es cambiar la visualización del precio en tiempo de ejecución cuando se agrega al carro a través del filtro woocommerce_add_cart_item. La segunda parte es establecer los datos de sesión persistentes que se leen durante la comprobación a través del filtro woocommerce_get_cart_item_from_session. Esto parece ser más rápido que conectar los filtros de totales de cálculo (como woocommerce_before_calculate_totals) ya que se ejecutan con mucha frecuencia en WooCommerce.

Más detalles aquí: woocommerce cambia el precio mientras lo agregas al carrito


Debe introducir una declaración if para verificar la identificación del producto, en el código anterior:

add_action( ''woocommerce_before_calculate_totals'', ''add_custom_price'' ); function add_custom_price( $cart_object ) { $custom_price = 10; // This will be your custome price $target_product_id = 598; foreach ( $cart_object->cart_contents as $value ) { if ( $value[''product_id''] == $target_product_id ) { $value[''data'']->price = $custom_price; } /* // If your target product is a variation if ( $value[''variation_id''] == $target_product_id ) { $value[''data'']->price = $custom_price; } */ } }

Agregue este código en cualquier lugar y asegúrese de que este código sea siempre ejecutable.

Después de agregar este código, cuando llame:

global $woocommerce; $woocommerce->cart->add_to_cart(598);

Solo se agregará este producto con el precio anulado, otros productos agregados al carrito se ignorarán por sobrepasar los precios.

Esperamos que esto sea útil.


Después del lanzamiento de woocommerce versión 3.0.0, el precio del producto se actualiza al agregar al carro usando la función set_price ($ price). El ejemplo se da de la siguiente manera:

add_action( ''woocommerce_before_calculate_totals'', ''mj_custom_price'' ); function mj_custom_price( $cart_object ) { $woo_ver = WC()->version; $custom_price = 10; foreach ( $cart_object->cart_contents as $key => $value ) { if($woo_ver < "3.0.0" && $woo_ver < "2.7.0") { $value[''data'']->price = $custom_price; } else { $value[''data'']->set_price($custom_price); } } }

Muchas gracias


He intentado todas las muestras de código anteriores y el último woocommerce 3.0 no es compatible con ninguno de los ejemplos anteriores. Usa el código a continuación y funciona perfectamente para mí.

add_action( ''woocommerce_before_calculate_totals'', ''add_custom_price'' ); function add_custom_price( $cart_object ) { $custom_price = 10; // This will be your custom price foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) { $cart_item[''data'']->set_price($custom_price); } }


Para la última versión de Wordpress y WooCommerce, por favor use esto

add_action( ''woocommerce_before_calculate_totals'', ''add_custom_price'' ); function add_custom_price( $cart_object ) { foreach ( $cart_object->cart_contents as $key => $value ) { $custom_price = 5; $value[''data'']->set_price($custom_price); } }


Para que sea dinámico (anule el precio de cada artículo en el carro por separado), debe guardar el precio del producto de anulación en sesión con la tecla de elemento del carrito como clave de sesión utilizando el gancho woocommerce_add_to_cart .

Al usar estos valores de sesión, puede calcular el total correcto del carrito y hacer que el precio alterado también aparezca en el artículo del pedido.


Para todos los que llegaron aquí de Google. Lo anterior ahora está en desuso ya que descubrí que estoy actualizando a WooCommerce 3.0.1.

En lugar de lo anterior, ahora necesita usar set_price lugar de price

Aquí hay un ejemplo:

add_action( ''woocommerce_before_calculate_totals'', ''add_custom_price'' ); function add_custom_price( $cart_object ) { $custom_price = 10; // This will be your custome price foreach ( $cart_object->cart_contents as $key => $value ) { $value[''data'']->set_price = $custom_price; } }

Espero que esto ayude a las personas en el futuro :)