以编程方式向 Woocommerce 3.2+ 中的订单添加折扣 [英] Add a discount programmatically to an Order in Woocommerce 3.2+

查看:26
本文介绍了以编程方式向 Woocommerce 3.2+ 中的订单添加折扣的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在 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?

任何帮助将不胜感激.

推荐答案

以编程方式为订单打折的唯一可用功能是欺骗费用 API.有关信息,woocommerce 不推荐此技巧,但很多人都在使用,因为优惠券之外的 Woocommerce 中没有折扣功能.

The only available feature to make a discount programmatically for an Order, is tricking the Fee API. For info, this trick is not recommended by woocommerce, but used by many people as there is not a discount feature in Woocommerce outside Coupons.

以下功能将允许您进行任何金额或百分比折扣的固定折扣.订单需要存在(之前保存).

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%' );

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

The amount (or the percentage) can be also a dynamic variable…

这篇关于以编程方式向 Woocommerce 3.2+ 中的订单添加折扣的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆