问题描述
在 woocommerce 中,我们可以使用优惠券功能(固定金额、百分比金额……)为任何订单添加折扣.
In woocommerce, we can add a discount to any order using Coupons feature (fixed amount, percent amount…).
是否可以以编程方式向任何订单添加折扣金额,其中折扣金额可以是任何金额?
Is it possible to add discount amount to any order programmatically where the discount amount can be any amount?
任何帮助将不胜感激.
推荐答案
以下功能将允许您进行任何金额或百分比折扣的固定折扣.订单需要存在(之前保存).
The following function will allow you to make a fixed discount of any amount or a percentage discount. The order need to exist (to be saved before).
函数代码(适用于 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 文件中.经测试有效.
Code goes in function.php file of your active child theme (active theme). Tested and works.
用法示例:
1) $12
的固定折扣(带有动态 $order_id
):
wc_order_add_discount( $order_id, __("Fixed discount"), 12 );
2) 5%
的百分比折扣(带有动态 $order_id
):
wc_order_add_discount( $order_id, __("Discount (5%)"), '5%' );
金额(或百分比)也可以是一个动态变量...
这篇关于以编程方式向 Woocommerce 3.2+ 中的订单添加折扣的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!