Единственная доступная функция, позволяющая программно сделать скидку на Заказ , - это обман Fee API . Для информации, этот трюк не рекомендуется woocommerce, но используется многими людьми , поскольку в Woocommerce нет функции скидок вне Купонов.
Следующая функция позволит вам сделать фиксированную скидку на любую сумму или процентную скидку.Заказ должен существовать (для сохранения до) .
Код функции (для версий Woocommerce 3.2 +) :
/**
* 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();
}
Код помещается в файл function.php вашей активной дочерней темы (active theme).Проверено и работает.
ИСПОЛЬЗОВАНИЕ Примеры:
1) Фиксированная скидка из $12
(сдинамический $order_id
):
wc_order_add_discount( $order_id, __("Fixed discount"), 12 );
![enter image description here](https://i.stack.imgur.com/l4omm.png)
2) Процентная скидка из 5%
(с динамическим $order_id
):
wc_order_add_discount( $order_id, __("Discount (5%)"), '5%' );
![enter image description here](https://i.stack.imgur.com/8sCUB.png)
Сумма (или процент) также может быть динамической переменной…