WooCommerce: Añadir producto al carrito con precio anular?


$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 carrito 1 tiempo. Pero el problema que estoy teniendo es que quiero ser capaz de anular completamente el precio del producto... por lo que puedo decir, lo único que puedo hacer es aplicar un cupón al Carrito.

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

Author: dcolumbus, 2012-09-08

9 answers

Aquí está el código para el precio superior 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);
    }
}

Espero que sea útil...

 50
Author: Ratnakar - StoreApps,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-01 10:50:32

Debe introducir una instrucción if para verificar el id 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 llames:

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

Solo se agregará este producto con precio anulado, otros productos agregados al carrito serán ignorados por precios anulados.

Espero que esto sea útil.

 43
Author: Ratnakar - StoreApps,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-22 13:24:15

He probado todas las muestras de código anteriores y la última woocommerce 3.0 no es compatible con ninguno de los ejemplos anteriores. Use el código debajo y funcione 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);   
    }
}
 10
Author: Saran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-12 01:38:33

Después del lanzamiento de woocommerce versión 3.0.0 precio del producto se actualiza en agregar al carrito utilizando la función set_price (price price). El ejemplo se da a continuación :

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

 6
Author: Mohd Jafar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-06 07:44:16

Para la última versión de Wordpress y Woocommerce, utilice así

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); 
    }
}
 3
Author: sumon cse-sust,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-11 09:05:00

Con WooCommerce 2.5 encontré que este es un proceso de 2 partes. El primer paso es cambiar la visualización en tiempo de ejecución de los precios cuando se agrega al carrito a través del filtro woocommerce_add_cart_item. La segunda parte es establecer los datos de sesión persistentes que se leen durante el proceso de pago a través del filtro woocommerce_get_cart_item_from_session. Esto parece ser más rápido que conectar los filtros calcular totales (como woocommerce_before_calculate_totals), ya que se ejecutan con mucha frecuencia en WooCommerce.

Más detalles aquí: woocommerce cambiar el precio mientras agregar al carrito

 1
Author: Lance Cleveland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:21

Para todos los que llegaron aquí desde Google. Lo anterior ahora está en desuso cuando descubrí la actualización a WooCommerce 3.0.1.

En lugar de lo anterior, ahora necesita usar set_price en 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 la gente en el futuro:)

 1
Author: danyo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-07 09:24:57

Para hacerlo dinámico ( anular el precio para cada artículo en el carrito por separado ), debe guardar el precio del producto anular en la sesión con la clave del artículo del carrito como clave de sesión utilizando el gancho woocommerce_add_to_cart.

Utilizando estos valores de sesión, puede calcular el Total correcto del carrito y hacer que el precio alterado aparezca también en el Artículo del pedido

 1
Author: Sark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-01 07:08:07

Así es como lo hice, primero agrego mi precio personalizado a cart_item_data que puede guardar datos personalizados en artículos del carrito, luego uso woocommerce_before_calculate_totals, loop el carrito y añado el precio agregado anteriormente.

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'];
    }
}
 0
Author: tobros91,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-28 14:25:35