WooCommerce从管理订单中的自定义字段中动态添加费用

时间:2019-11-28 20:43:42

标签: php ajax wordpress woocommerce

我在WooCommerce管理员订单(WooCommerce>订单>编辑/添加新商品)中添加了带有自定义字段的部分,用于向订单中添加百分比费用。原因是WooCommerce当前无法可靠地添加根据订单的税前小计计算的百分比费用(通过“添加项目”>“添加费用”以正常方式添加百分比还会添加并计算税收)。

这有效,但是我想将其转换为使用AJAX。另请注意,这是关于添加自定义字段以在订单管理员后端而不是前端结帐上增加费用!

请查看我的部分截图,其中包含自定义字段,以突出显示添加费用: screenshot of custom fields to add fee

此处正在编辑中;忽略“保存到客户”复选框,因为它来自第三方插件: screenshot of custom fields to add fee being edited

如果“在订单上加费用?”启用切换,输入费用名称和费用百分比,将添加费用。切换,费用名称和费用百分比另存为订单元。费用对象已创建并添加到订单中。

我不会共享将自定义字段添加到WooCommerce管理员的代码,但这是用于将那些与费用相关的选项保存到订单中的代码:

// Sanitize and save custom metadata selection
add_action('woocommerce_process_shop_order_meta', 'save_custom_meta_value');
function save_custom_meta_value($order_id) {
  update_post_meta($order_id, 'add_fee_toggle', wc_clean($_POST['add_fee_toggle']));
  update_post_meta($order_id, 'add_fee_name', wc_clean($_POST['add_fee_name']));
  update_post_meta($order_id, 'add_fee_percentage', wc_clean($_POST['add_fee_percentage']));
}

以下是从这些选项创建费用对象的代码:

if( $add_fee_toggle ) :
  $order_id = $order->get_id();
  $fee_name = get_post_meta( $order->id, 'add_fee_name', true );
  $fee_percentage = get_post_meta( $order->id, 'add_fee_percentage', true ) / 100;
  $subtotal = $order->get_subtotal();
  $fee_amount = $subtotal * $fee_percentage;
  // Set up the fee object
  $fee = array(
    'name' => $fee_name,
    'amount' => $fee_amount,
    'taxable' => true,
    'tax_class' => ''
  );

  debug_to_console( $add_fee_toggle );
  add_custom_percentage_fee($fee, $order_id);
  update_post_meta( $order->id, 'add_fee_toggle', '0' );
endif;

下面是将费用对象添加到订单中的代码:

/* Add custom fee to the order using custom field ** TEST */
function add_custom_percentage_fee($fee, $order_id) {

  // Add fee to the order
  $item_id = wc_add_order_item( $order_id, array(
    'order_item_name' => $fee['name'],
    'order_item_type' => 'fee'
  ) );
  if ( ! $item_id ) {
    return false;
  }
  if ( $fee['taxable'] ) {
    wc_add_order_item_meta( $item_id, '_tax_class', $fee['tax_class'] );
  } else {
    wc_add_order_item_meta( $item_id, '_tax_class', '0');
  }

  wc_add_order_item_meta( $item_id, '_line_total', wc_format_decimal( $fee['amount'] ) );
  wc_add_order_item_meta( $item_id, '_line_tax', wc_format_decimal( $fee['tax'] ));

  // Save tax data - Since 2.2
  $tax_data = array_map( 'wc_format_decimal', $fee['tax_data'] );
  wc_add_order_item_meta( $item_id, '_line_tax_data', array( 'total' => $tax_data ) );

  do_action( 'woocommerce_order_add_fee', $order_id, $item_id, $fee );
}

此方法有效,但需要保存,然后重新计算订单。我想将其转换为使用AJAX,因此管理员无需保存并重新计算即可添加费用

我几乎没有使用AJAX的经验,主要是在前端,而从未在WooCommerce后端。知道如何将其转换为使用AJAX动态添加费用(无需页面刷新或手动重新计算)吗?

任何见解都会有所帮助。谢谢!

0 个答案:

没有答案