以编程方式向Woocommerce 3.2+中的订单添加折扣

时间:2018-10-04 12:35:13

标签: php wordpress woocommerce discount

在woocommerce中,我们可以使用Coupons功能(固定金额,百分比金额...)为任何订单添加折扣。

在折扣金额可以是任何金额的情况下,是否可以通过编程将折扣金额添加到任何订单?

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

  

唯一以编程方式为订单打折的可用功能,是在欺骗费用API 有关信息,woocommerce不推荐使用此技巧,而是许多人使用的,因为Coupons之外的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文件中。经过测试,可以正常工作。


用法示例:

1) $12 的固定折扣(带有动态$order_id):

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

enter image description here

2) 5% (使用动态$order_id)的折扣

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

enter image description here

  

金额(或百分比)也可以是动态变量...

答案 1 :(得分:0)

实际上,您可以在计算税款等之前就进行钩子,小计,应用折扣,完成:) 它会自动申请订单消息,也可以通过适当的方式在后端显示。即使移除挂钩,有关折扣的信息仍会保留在订单信息中。

// 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);
}