Saltar al contenido

Agregue un descuento mediante programación a un pedido en Woocommerce 3.2+

Queremos darte la mejor información que hemos encontrado por todo internet. Esperamos que te sea de utilidad y si deseas aportar alguna mejora hazlo libremente.

Solución:

La única función disponible para hacer un descuento programáticamente para un pedido., está engañando al API de tarifa. Para obtener información, woocommerce no recomienda este truco, pero utilizado por muchas personas ya que no hay una función de descuento en Woocommerce fuera de los Cupones.

La siguiente función le permitirá realizar un descuento fijo de cualquier monto o un porcentaje de descuento. El orden necesita existir (ser salvo antes) a..

El código de función (Para las versiones 3.2+ de Woocommerce):

/**
 * Add a discount to an Orders programmatically
 * (Using the FEE API - A negative fee)
 *
 * @since  3.2.0
 * @param  int     $order_id  The order ID. Required.
 * @param  string  $title  The label name for the discount. Required.
 * @param  mixed   $amount  Fixed amount (float) or percentage based on the subtotal. Required.
 * @param  string  $tax_class  The tax Class. '' by default. Optional.
 */
function wc_order_add_discount( $order_id, $title, $amount, $tax_class = '' ) 
    $order    = wc_get_order($order_id);
    $subtotal = $order->get_subtotal();
    $item     = new WC_Order_Item_Fee();

    if ( strpos($amount, '%') !== false ) 
        $percentage = (float) str_replace( array('%', ' '), array('', ''), $amount );
        $percentage = $percentage > 100 ? -100 : -$percentage;
        $discount   = $percentage * $subtotal / 100;
     else 
        $discount = (float) str_replace( ' ', '', $amount );
        $discount = $discount > $subtotal ? -$subtotal : -$discount;
    

    $item->set_tax_class( $tax_class );
    $item->set_name( $title );
    $item->set_amount( $discount );
    $item->set_total( $discount );

    if ( '0' !== $item->get_tax_class() && 'taxable' === $item->get_tax_status() && wc_tax_enabled() ) 
        $tax_for   = array(
            'country'   => $order->get_shipping_country(),
            'state'     => $order->get_shipping_state(),
            'postcode'  => $order->get_shipping_postcode(),
            'city'      => $order->get_shipping_city(),
            'tax_class' => $item->get_tax_class(),
        );
        $tax_rates = WC_Tax::find_rates( $tax_for );
        $taxes     = WC_Tax::calc_tax( $item->get_total(), $tax_rates, false );
        print_pr($taxes);

        if ( method_exists( $item, 'get_subtotal' ) ) 
            $subtotal_taxes = WC_Tax::calc_tax( $item->get_subtotal(), $tax_rates, false );
            $item->set_taxes( array( 'total' => $taxes, 'subtotal' => $subtotal_taxes ) );
            $item->set_total_tax( array_sum($taxes) );
         else 
            $item->set_taxes( array( 'total' => $taxes ) );
            $item->set_total_tax( array_sum($taxes) );
        
        $has_taxes = true;
     else 
        $item->set_taxes( false );
        $has_taxes = false;
    
    $item->save();

    $order->add_item( $item );
    $order->calculate_totals( $has_taxes );
    $order->save();

El código va en el archivo function.php de su tema hijo activo (tema activo). Probado y funciona.


Ejemplos de uso:

1) Descuento fijo de $12 (con una dinámica $order_id):

wc_order_add_discount( $order_id, __("Fixed discount"), 12 );

ingrese la descripción de la imagen aquí

2) Porcentaje de descuento de 5% (con una dinámica $order_id):

wc_order_add_discount( $order_id, __("Discount (5%)"), '5%' );

ingrese la descripción de la imagen aquí

La cantidad (o el porcentaje) también puede ser una variable dinámica …

En realidad, puede hacer un gancho antes de calcular los impuestos, etc., obtener el subtotal, aplicar el descuento, listo 🙂 Se aplica automáticamente al mensaje de pedido, etc., también es visible en el backend de manera adecuada. Incluso después de quitar el gancho, la información sobre el descuento permanece en la información del pedido.

// Hook before calculate fees
add_action('woocommerce_cart_calculate_fees' , 'add_user_discounts');
/**
 * Add custom fee if more than three article
 * @param WC_Cart $cart
 */
function add_user_discounts( WC_Cart $cart )
    //any of your rules
    // Calculate the amount to reduce
    $discount = $cart->get_subtotal() * 0.5;

    $cart->add_fee( 'Test discount 50%', -$discount);

Si te animas, eres capaz de dejar un artículo acerca de qué le añadirías a este escrito.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *