如何挂接自定义折扣以更改WooCommerce上的WC_ORDER总价?

时间:2018-09-27 作者:John Doe

我正在编写WooCommerce上的WordPress插件。这个插件基本上允许WooCommerce分配store credits 无论何时登录的客户下了标记为Completed 付款后。然后,这些门店积分可用于抵消客户未来订单的成本。例如,如果我购买价值10美元的商品,我可能会得到1美元的商店积分。我可以使用任何金额的店铺积分来抵消未来的购买,例如,我可以选择使用0.50美元的积分来抵消下一个订单的0.50美元。

我在WP Admin中找到用于分配客户商店积分的挂钩没有问题,但我在前端添加挂钩以允许客户在订单中使用他们的商店积分时遇到了问题。

目前,我将以下函数连接到woocommerce_checkout_order_processed 操作,记录客户打算在订单上使用的门店信用额:

function woocommerce_checkout_order_processed($order_id) {
    $offset_amt = floatval($_POST[\'use-store-credit\']);
    // This line is a glorified update_post_meta call.
    Helpers\\Order::set_offset_cost_amount($order_id,$offset_amt);
}
但我认为将其保存为元键与WP_OrderWP_Cart 这是一个坏主意,因为一旦提交了订单,我就必须挂接订单呈现的每个页面(包括WP Admin中的页面),并手动修改订单总数,因为WP_Order 将记录无店铺信用抵销的总额。

我认为把这家商店的信用抵消作为折扣或负费用挂钩会更好,但是I don\'t know which hooks to use or where in the process I should do that. 我应该在结账前将其挂在购物车上,还是在结账后将其挂在订单上?

2 个回复
最合适的回答,由SO网友:Matt Royal 整理而成

我建议在订单中添加一张“虚拟”优惠券,代表商店信用。

在结账之前,优惠券会在购物车页面上应用,这是我可以加入的地方。

您可以使用类似woocommerce_cart_subtotal 根据下面的示例进行筛选:

function royal_woocommerce_filter_checkout_for_coupons( $subtotal, $compound, $cart ) {     

        // Your logic to get store credit value for a user will go here
        $store_credit = 20;

        // We only need to add a store credit coupon if they have store credit
        if($store_credit > 0){

            // Setup our virtual coupon
            $coupon_name = \'store-credit\';
            $coupon = array($coupon_name => $store_credit);

            // Apply the store credit coupon to the cart & update totals
            $cart->applied_coupons = array($coupon_name);
            $cart->set_discount_total($store_credit);
            $cart->set_total( $cart->get_subtotal() - $store_credit);
            $cart->coupon_discount_totals = $coupon;
        }

    return $subtotal; 
}

add_filter( \'woocommerce_cart_subtotal\', \'royal_woocommerce_filter_checkout_for_coupons\', 10, 3 );

SO网友:lastant

以编程方式添加虚拟优惠券而不干扰常规优惠券的正确方法:

add_action(\'woocommerce_before_calculate_totals\', function(WC_Cart $cart) {
  $cart->applied_coupons = array_diff($cart->applied_coupons, [\'store-credit\']);

  // add your conditions for applying the virtual coupon
  $cart->applied_coupons[] = \'store-credit\';
});

// specify discount data, here give 10% discount
add_filter(\'woocommerce_get_shop_coupon_data\', function($false, $data, $coupon) {
  switch($data) {
    case \'store-credit\':
      $coupon->set_virtual(true);
      $coupon->set_discount_type(\'percent\');
      $coupon->set_amount(10);
      return $coupon;
  }
}, 10, 3);

// Optional: remove the \'Coupon:\' label
add_filter(\'woocommerce_cart_totals_coupon_html\', function($coupon_html, $coupon, $discount_amount_html) {
  if (in_array($coupon->get_code(), [\'store-credit\']))
    return $discount_amount_html;
  
  return $coupon_html;
}, 10, 3);

// Optional: set a custom label
add_filter(\'woocommerce_cart_totals_coupon_label\', function($label, $coupon) {
  switch ($coupon->get_code()) {
    case \'store-credit\':
      return \'Store Credit\';
  }
  return $label;
}, 10, 3);

结束

相关推荐