2012-09-08 15 views
29
$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.WooCommerce: ¿Agregar producto al carro con anulación de precio?

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

+0

Comprobar este enlace https muy útil: //www.cloudways .com/blog/change-woocommerce-price-display/ – Sourabh

Respuesta

46

Este es el código para anular precio del producto en el carrito

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); 
    } 
} 

Esperamos que sea útil ...

+0

¡Muchas gracias! ¿Tienes bastante experiencia con WooCommerce? – dcolumbus

+5

Esto actualiza el carrito. Pero aún en el icono de carrito rápido en la parte superior, se muestra el precio real del producto. Cualquier gancho? –

+1

disculpa por topar con esto .... ¿funciona lo anterior con variaciones? – danyo

41

Es necesario introducir una declaración if para el control de 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 añadir este código, cuando se le llama:

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

el producto sólo se añadirán con precio reemplazado, otros productos añadidos a la cesta será ignorado para anular los precios.

Espero que esto sea útil.

+1

¿Cómo puedo establecer un precio personalizado en función de la entrada del usuario? Este precio personalizado está codificado. ¿Alguna sugerencia? Algo así como función add_custom_price ($ cart_object, $ precio_personalizado) – shish

+1

¿cómo puedo obtener dinámicamente el id. De producto objetivo del producto del que se hace clic en el botón Agregar al carrito? –

+2

Parece que estas dos respuestas se deben combinar. – Kirby

1

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.

mediante el uso de estos valores de sesión se puede calcular correctamente la compra total y hacer que el precio alterado aparecen en el Artículo de la orden, así

Se puede plantear la siguiente guide para los detalles completos con un ejemplo.

1

Con WooCommerce 2.5 encontré 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 change price while add to cart

+0

¿es posible agregar el precio personalizado de cada producto en el carro en lugar de iterar sobre los productos de carro agregados? –

0

Ésta es la forma en que lo hice, primero agrego mi precio personalizado a cart_item_data bruja puede guardar los datos personalizados al carrito de elementos, entonces yo uso woocommerce_before_calculate_totals, debe pasar el carrito y añadir a la ya precio agregado

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']; 
    } 
} 
1

Para todos los que llegaron 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 tiene que usar set_price en lugar de price

He aquí 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 ayuda a las personas en el futuro :)

7

He tratado todas las muestras de códigos anteriores y la última versión de woocommerce 3.0 no admiten 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); 
    } 
} 
+0

Prueba mi ejemplo anterior. – danyo

+0

Esa opción no me funcionó. –

+0

¿Has probado el código exacto? Tengo esto funcionando en un plugin premium en vivo con 1000 de instalaciones. ¿Qué versión de WooCommerce tienes instalada? – danyo

6

Después del lanzamiento de woocommerce versión 3.0.0, el precio del producto se actualiza al agregarlo al carrito utilizando la función set_price ($ price). Se da el ejemplo 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

3

Para los Wordpress y WooCommerce última versión, por favor utilice como 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); 
    } 
} 
Cuestiones relacionadas