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 );
2) Porcentaje de descuento de 5%
(con una dinámica $order_id
):
wc_order_add_discount( $order_id, __("Discount (5%)"), '5%' );
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.