以编程方式将优惠券应用于WooCommerce3中的订单

时间:2018-01-10 13:29:46

标签: php wordpress woocommerce orders coupon

我正在开发一个直接创建订单的插件(没有购物车)并应用优惠券。在woo API的3.0版本中,函数add_coupon()已被弃用,而不是您添加到订单中的WC_Order_Item_Coupon对象。

创建优惠券

$coupon = new WC_Order_Item_Coupon();
$coupon->set_props(array('code' => $coupon, 'discount' => $discount_total, 
'discount_tax' => 0));
$coupon->save();

这很成功。我可以致电$coupon->get_discount()验证。

然后我将优惠券添加到订单中并重新计算总数:

$order->add_item($item);
$order->calculate_totals($discount_total);
$order->save(); 

登录wp-admin我可以看到显示优惠券代码的订单。但是,优惠券对订单项或总计没有影响。

误解了api v3.0打算如何处理优惠券?

2 个答案:

答案 0 :(得分:2)

好的,所以我玩了一会儿,看起来在V3中的东西更加手动。

将一个WC_Order_Item_Coupon项添加到woo订单就可以了。它将优惠券对象添加到订单对象。没有进行任何计算,产品系列项目保持不变。您必须手动迭代产品项目并通过计算行项目总计和小计来自行应用优惠券。 calculate_totals()然后按预期进行。

// Create the coupon
global $woocommerce;
$coupon = new WC_Coupon($coupon_code);

// Get the coupon discount amount (My coupon is a fixed value off)
$discount_total = $coupon->get_amount();

// Loop through products and apply the coupon discount
foreach($order->get_items() as $order_item){
    $product_id = $order_item->get_product_id();

    if($this->coupon_applies_to_product($coupon, $product_id)){
        $total = $order_item->get_total();
        $order_item->set_subtotal($total);
        $order_item->set_total($total - $discount_total);
        $order_item->save();
    }
}
$order->save();

我写了一个帮助函数,以确保优惠券适用于有问题的产品coupon_applies_to_product()。严格不需要,因为我在代码中完全创建了订单..但我在其他地方使用它,所以添加它。

// Add the coupon to the order
$item = new WC_Order_Item_Coupon();
$item->set_props(array('code' => $coupon_code, 'discount' => $discount_total, 'discount_tax' => 0));
$order->add_item($item);
$order->save();

您现在可以在wp-admin中获得格式正确的订单,其中包含显示特定折扣+优惠券代码等的订单项。

答案 1 :(得分:2)

如何使用WC_Abstract_Order::apply_coupon

/**
 * Apply a coupon to the order and recalculate totals.
 *
 * @since 3.2.0
 * @param string|WC_Coupon $raw_coupon Coupon code or object.
 * @return true|WP_Error True if applied, error if not.
 */
public function apply_coupon( $raw_coupon )

这是我的代码。

$user = wp_get_current_user();

$order = new WC_Order();
$order->set_status('completed');
$order->set_customer_id($user->ID);
$order->add_product($product , 1); // This is an existing SIMPLE product
$order->set_currency( get_woocommerce_currency() );
$order->set_prices_include_tax( 'yes' === get_option( 'woocommerce_prices_include_tax' ) );
$order->set_customer_ip_address( WC_Geolocation::get_ip_address() );
$order->set_customer_user_agent( wc_get_user_agent() );
$order->set_address([
    'first_name' => $user->first_name,
    'email'      => $user->user_email,
], 'billing' );
// $order->calculate_totals();  // You don't need this

$order->apply_coupon($coupon_code);

$order->save();