function order_delete_items()
 {
     if (!wp_verify_nonce($_REQUEST['wcml_nonce'], 'order_delete_items')) {
         echo json_encode(array('error' => __('Invalid nonce', 'wpml-wcml')));
         die;
     }
     if (isset($_POST['order_id'])) {
         global $wpdb;
         $items = $wpdb->get_results($wpdb->prepare("SELECT order_item_id FROM {$wpdb->prefix}woocommerce_order_items WHERE order_id = '%d'", $_POST['order_id']));
         foreach ($items as $item) {
             wc_delete_order_item(absint($item->order_item_id));
         }
     }
 }
 /**
  * Update order.
  *
  * @param WP_REST_Request $request Full details about the request.
  * @param WP_Post $post Post data.
  * @return int|WP_Error
  */
 protected function update_order($request, $post)
 {
     try {
         $update_totals = false;
         $order = wc_get_order($post);
         $order_args = array('order_id' => $order->id);
         // Customer note.
         if (isset($request['customer_note'])) {
             $order_args['customer_note'] = $request['customer_note'];
         }
         // Customer ID.
         if (isset($request['customer_id']) && $request['customer_id'] != $order->get_user_id()) {
             // Make sure customer exists.
             if (false === get_user_by('id', $request['customer_id'])) {
                 throw new WC_REST_Exception('woocommerce_rest_invalid_customer_id', __('Customer ID is invalid.', 'woocommerce'), 400);
             }
             update_post_meta($order->id, '_customer_user', $request['customer_id']);
         }
         // Update addresses.
         if (is_array($request['billing'])) {
             $this->update_address($order, $request['billing'], 'billing');
         }
         if (is_array($request['shipping'])) {
             $this->update_address($order, $request['shipping'], 'shipping');
         }
         $lines = array('line_item' => 'line_items', 'shipping' => 'shipping_lines', 'fee' => 'fee_lines', 'coupon' => 'coupon_lines');
         foreach ($lines as $line_type => $line) {
             if (isset($request[$line]) && is_array($request[$line])) {
                 $update_totals = true;
                 foreach ($request[$line] as $item) {
                     // Item ID is always required.
                     if (!array_key_exists('id', $item)) {
                         throw new WC_REST_Exception('woocommerce_rest_invalid_item_id', __('Order item ID is required.', 'woocommerce'), 400);
                     }
                     // Create item.
                     if (is_null($item['id'])) {
                         $this->set_item($order, $line_type, $item, 'create');
                     } elseif ($this->item_is_null($item)) {
                         // Delete item.
                         wc_delete_order_item($item['id']);
                     } else {
                         // Update item.
                         $this->set_item($order, $line_type, $item, 'update');
                     }
                 }
             }
         }
         // Set payment method.
         if (!empty($request['payment_method'])) {
             update_post_meta($order->id, '_payment_method', $request['payment_method']);
         }
         if (!empty($request['payment_method_title'])) {
             update_post_meta($order->id, '_payment_method_title', $request['payment_method']);
         }
         if ($order->needs_payment() && isset($request['set_paid']) && true === $request['set_paid']) {
             $order->payment_complete(!empty($request['transaction_id']) ? $request['transaction_id'] : '');
         }
         // Set order currency.
         if (isset($request['currency'])) {
             update_post_meta($order->id, '_order_currency', $request['currency']);
         }
         // If items have changed, recalculate order totals.
         if ($update_totals) {
             $order->calculate_totals();
         }
         // Update meta data.
         if (!empty($request['meta_data']) && is_array($request['meta_data'])) {
             $this->update_meta_data($order->id, $request['meta_data']);
         }
         // Update the order post to set customer note/modified date.
         wc_update_order($order_args);
         // Order status.
         if (!empty($request['status'])) {
             $order->update_status($request['status'], isset($request['status_note']) ? $request['status_note'] : '');
         }
         return $order->id;
     } catch (WC_REST_Exception $e) {
         return new WP_Error($e->getErrorCode(), $e->getMessage(), array('status' => $e->getCode()));
     }
 }
 /**
  * Remove an order item
  */
 public function remove_order_item()
 {
     global $wpdb;
     check_ajax_referer('order-item', 'security');
     $order_item_ids = $_POST['order_item_ids'];
     if (sizeof($order_item_ids) > 0) {
         foreach ($order_item_ids as $id) {
             wc_delete_order_item(absint($id));
         }
     }
     die;
 }
 /**
  * Remove an order tax
  */
 public static function remove_order_tax()
 {
     check_ajax_referer('order-item', 'security');
     if (!current_user_can('edit_shop_orders')) {
         die(-1);
     }
     $order_id = absint($_POST['order_id']);
     $rate_id = absint($_POST['rate_id']);
     wc_delete_order_item($rate_id);
     // Return HTML items
     $order = wc_get_order($order_id);
     $data = get_post_meta($order_id);
     include 'admin/meta-boxes/views/html-order-items.php';
     die;
 }
/**
 * @deprecated
 */
function woocommerce_delete_order_item($item_id)
{
    return wc_delete_order_item($item_id);
}
 /**
  * Edit an order
  *
  * @since 2.2
  * @param int $id the order ID
  * @param array $data
  * @return array
  */
 public function edit_order($id, $data)
 {
     try {
         if (!isset($data['order'])) {
             throw new WC_API_Exception('woocommerce_api_missing_order_data', sprintf(__('No %1$s data specified to edit %1$s', 'woocommerce'), 'order'), 400);
         }
         $data = $data['order'];
         $update_totals = false;
         $id = $this->validate_request($id, $this->post_type, 'edit');
         if (is_wp_error($id)) {
             return $id;
         }
         $data = apply_filters('woocommerce_api_edit_order_data', $data, $id, $this);
         $order = wc_get_order($id);
         if (empty($order)) {
             throw new WC_API_Exception('woocommerce_api_invalid_order_id', __('Order ID is invalid', 'woocommerce'), 400);
         }
         $order_args = array('order_id' => $order->get_id());
         // Customer note.
         if (isset($data['note'])) {
             $order_args['customer_note'] = $data['note'];
         }
         // Customer ID.
         if (isset($data['customer_id']) && $data['customer_id'] != $order->get_user_id()) {
             // Make sure customer exists.
             if (false === get_user_by('id', $data['customer_id'])) {
                 throw new WC_API_Exception('woocommerce_api_invalid_customer_id', __('Customer ID is invalid', 'woocommerce'), 400);
             }
             update_post_meta($order->get_id(), '_customer_user', $data['customer_id']);
         }
         // Billing/shipping address.
         $this->set_order_addresses($order, $data);
         $lines = array('line_item' => 'line_items', 'shipping' => 'shipping_lines', 'fee' => 'fee_lines', 'coupon' => 'coupon_lines');
         foreach ($lines as $line_type => $line) {
             if (isset($data[$line]) && is_array($data[$line])) {
                 $update_totals = true;
                 foreach ($data[$line] as $item) {
                     // Item ID is always required.
                     if (!array_key_exists('id', $item)) {
                         $item['id'] = null;
                     }
                     // Create item.
                     if (is_null($item['id'])) {
                         $this->set_item($order, $line_type, $item, 'create');
                     } elseif ($this->item_is_null($item)) {
                         // Delete item.
                         wc_delete_order_item($item['id']);
                     } else {
                         // Update item.
                         $this->set_item($order, $line_type, $item, 'update');
                     }
                 }
             }
         }
         // Payment method (and payment_complete() if `paid` == true and order needs payment).
         if (isset($data['payment_details']) && is_array($data['payment_details'])) {
             // Method ID.
             if (isset($data['payment_details']['method_id'])) {
                 update_post_meta($order->get_id(), '_payment_method', $data['payment_details']['method_id']);
             }
             // Method title.
             if (isset($data['payment_details']['method_title'])) {
                 update_post_meta($order->get_id(), '_payment_method_title', $data['payment_details']['method_title']);
             }
             // Mark as paid if set.
             if ($order->needs_payment() && isset($data['payment_details']['paid']) && true === $data['payment_details']['paid']) {
                 $order->payment_complete(isset($data['payment_details']['transaction_id']) ? $data['payment_details']['transaction_id'] : '');
             }
         }
         // Set order currency.
         if (isset($data['currency'])) {
             if (!array_key_exists($data['currency'], get_woocommerce_currencies())) {
                 throw new WC_API_Exception('woocommerce_invalid_order_currency', __('Provided order currency is invalid', 'woocommerce'), 400);
             }
             update_post_meta($order->get_id(), '_order_currency', $data['currency']);
         }
         // If items have changed, recalculate order totals.
         if ($update_totals) {
             $order->calculate_totals();
         }
         // Update order meta.
         if (isset($data['order_meta']) && is_array($data['order_meta'])) {
             $this->set_order_meta($order->get_id(), $data['order_meta']);
         }
         // Update the order post to set customer note/modified date.
         wc_update_order($order_args);
         // Order status.
         if (!empty($data['status'])) {
             $order->update_status($data['status'], isset($data['status_note']) ? $data['status_note'] : '', true);
         }
         wc_delete_shop_order_transients($order->get_id());
         do_action('woocommerce_api_edit_order', $order->get_id(), $data, $this);
         return $this->get_order($id);
     } catch (WC_Data_Exception $e) {
         return new WP_Error($e->getErrorCode(), $e->getMessage(), array('status' => 400));
     } catch (WC_API_Exception $e) {
         return new WP_Error($e->getErrorCode(), $e->getMessage(), array('status' => $e->getCode()));
     }
 }
Beispiel #7
0
 /**
  * Remove an order tax
  */
 public static function remove_order_tax()
 {
     check_ajax_referer('order-item', 'security');
     if (!current_user_can('edit_shop_orders')) {
         die(-1);
     }
     $order_id = absint($_POST['order_id']);
     if (!wp_get_post_parent_id($order_id)) {
         $rate_id = absint($_POST['rate_id']);
         $parent_order = wc_get_order($order_id);
         $parent_taxes = $parent_order->get_taxes();
         $suborder_ids = self::get_suborder($order_id);
         $parent_tax_to_remove = $parent_taxes[$rate_id];
         foreach ($suborder_ids as $suborder_id) {
             $suborder = wc_get_order($suborder_id);
             $suborder_taxes = $suborder->get_taxes();
             foreach ($suborder_taxes as $suborder_tax_key => $suborder_tax_item) {
                 $suborder_tax_item['rate_id'] == $parent_tax_to_remove['rate_id'] && $suborder_tax_item['name'] == $parent_tax_to_remove['name'] && $suborder_tax_item['label'] == $parent_tax_to_remove['label'] && wc_delete_order_item($suborder_tax_key);
             }
         }
     } else {
         //is suborder
         //TODO: Suborder sub-routine
     }
 }
 /**
  * Save meta box data
  */
 public static function save($post_id, $post)
 {
     global $wpdb;
     // Save tax rows
     $total_tax = 0;
     $total_shipping_tax = 0;
     if (isset($_POST['order_taxes_id'])) {
         $get_values = array('order_taxes_id', 'order_taxes_rate_id', 'order_taxes_amount', 'order_taxes_shipping_amount');
         foreach ($get_values as $value) {
             ${$value} = isset($_POST[$value]) ? $_POST[$value] : array();
         }
         foreach ($order_taxes_id as $item_id => $value) {
             if ($item_id == 'new') {
                 foreach ($value as $new_key => $new_value) {
                     $rate_id = absint($order_taxes_rate_id[$item_id][$new_key]);
                     if ($rate_id) {
                         $rate = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}woocommerce_tax_rates WHERE tax_rate_id = %s", $rate_id));
                         $label = $rate->tax_rate_name ? $rate->tax_rate_name : WC()->countries->tax_or_vat();
                         $compound = $rate->tax_rate_compound ? 1 : 0;
                         $code = array();
                         $code[] = $rate->tax_rate_country;
                         $code[] = $rate->tax_rate_state;
                         $code[] = $rate->tax_rate_name ? $rate->tax_rate_name : 'TAX';
                         $code[] = absint($rate->tax_rate_priority);
                         $code = strtoupper(implode('-', array_filter($code)));
                     } else {
                         $code = '';
                         $label = WC()->countries->tax_or_vat();
                     }
                     // Add line item
                     $new_id = wc_add_order_item($post_id, array('order_item_name' => wc_clean($code), 'order_item_type' => 'tax'));
                     // Add line item meta
                     if ($new_id) {
                         wc_update_order_item_meta($new_id, 'rate_id', $rate_id);
                         wc_update_order_item_meta($new_id, 'label', $label);
                         wc_update_order_item_meta($new_id, 'compound', $compound);
                         if (isset($order_taxes_amount[$item_id][$new_key])) {
                             wc_update_order_item_meta($new_id, 'tax_amount', wc_format_decimal($order_taxes_amount[$item_id][$new_key]));
                             $total_tax += wc_format_decimal($order_taxes_amount[$item_id][$new_key]);
                         }
                         if (isset($order_taxes_shipping_amount[$item_id][$new_key])) {
                             wc_update_order_item_meta($new_id, 'shipping_tax_amount', wc_format_decimal($order_taxes_shipping_amount[$item_id][$new_key]));
                             $total_shipping_tax += wc_format_decimal($order_taxes_shipping_amount[$item_id][$new_key]);
                         }
                     }
                 }
             } else {
                 $item_id = absint($item_id);
                 $rate_id = absint($order_taxes_rate_id[$item_id]);
                 if ($rate_id) {
                     $rate = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}woocommerce_tax_rates WHERE tax_rate_id = %s", $rate_id));
                     $label = $rate->tax_rate_name ? $rate->tax_rate_name : WC()->countries->tax_or_vat();
                     $compound = $rate->tax_rate_compound ? 1 : 0;
                     $code = array();
                     $code[] = $rate->tax_rate_country;
                     $code[] = $rate->tax_rate_state;
                     $code[] = $rate->tax_rate_name ? $rate->tax_rate_name : 'TAX';
                     $code[] = absint($rate->tax_rate_priority);
                     $code = strtoupper(implode('-', array_filter($code)));
                 } else {
                     $code = '';
                     $label = WC()->countries->tax_or_vat();
                 }
                 $wpdb->update($wpdb->prefix . "woocommerce_order_items", array('order_item_name' => wc_clean($code)), array('order_item_id' => $item_id), array('%s'), array('%d'));
                 wc_update_order_item_meta($item_id, 'rate_id', $rate_id);
                 wc_update_order_item_meta($item_id, 'label', $label);
                 wc_update_order_item_meta($item_id, 'compound', $compound);
                 if (isset($order_taxes_amount[$item_id])) {
                     wc_update_order_item_meta($item_id, 'tax_amount', wc_format_decimal($order_taxes_amount[$item_id]));
                     $total_tax += wc_format_decimal($order_taxes_amount[$item_id]);
                 }
                 if (isset($order_taxes_shipping_amount[$item_id])) {
                     wc_update_order_item_meta($item_id, 'shipping_tax_amount', wc_format_decimal($order_taxes_shipping_amount[$item_id]));
                     $total_shipping_tax += wc_format_decimal($order_taxes_shipping_amount[$item_id]);
                 }
             }
         }
     }
     // Update totals
     update_post_meta($post_id, '_order_tax', wc_format_decimal($total_tax));
     update_post_meta($post_id, '_order_shipping_tax', wc_format_decimal($total_shipping_tax));
     update_post_meta($post_id, '_order_discount', wc_format_decimal($_POST['_order_discount']));
     update_post_meta($post_id, '_order_total', wc_format_decimal($_POST['_order_total']));
     // Shipping Rows
     $order_shipping = 0;
     if (isset($_POST['shipping_method_id'])) {
         $get_values = array('shipping_method_id', 'shipping_method_title', 'shipping_method', 'shipping_cost');
         foreach ($get_values as $value) {
             ${$value} = isset($_POST[$value]) ? $_POST[$value] : array();
         }
         foreach ($shipping_method_id as $item_id => $value) {
             if ($item_id == 'new') {
                 foreach ($value as $new_key => $new_value) {
                     $method_id = wc_clean($shipping_method[$item_id][$new_key]);
                     $method_title = wc_clean($shipping_method_title[$item_id][$new_key]);
                     $cost = wc_format_decimal($shipping_cost[$item_id][$new_key]);
                     $new_id = wc_add_order_item($post_id, array('order_item_name' => $method_title, 'order_item_type' => 'shipping'));
                     if ($new_id) {
                         wc_add_order_item_meta($new_id, 'method_id', $method_id);
                         wc_add_order_item_meta($new_id, 'cost', $cost);
                     }
                     $order_shipping += $cost;
                 }
             } else {
                 $item_id = absint($item_id);
                 $method_id = wc_clean($shipping_method[$item_id]);
                 $method_title = wc_clean($shipping_method_title[$item_id]);
                 $cost = wc_format_decimal($shipping_cost[$item_id]);
                 $wpdb->update($wpdb->prefix . "woocommerce_order_items", array('order_item_name' => $method_title), array('order_item_id' => $item_id), array('%s'), array('%d'));
                 wc_update_order_item_meta($item_id, 'method_id', $method_id);
                 wc_update_order_item_meta($item_id, 'cost', $cost);
                 $order_shipping += $cost;
             }
         }
     }
     // Delete rows
     if (isset($_POST['delete_order_item_id'])) {
         $delete_ids = $_POST['delete_order_item_id'];
         foreach ($delete_ids as $id) {
             wc_delete_order_item(absint($id));
         }
     }
     delete_post_meta($post_id, '_shipping_method');
     delete_post_meta($post_id, '_shipping_method_title');
     update_post_meta($post_id, '_order_shipping', $order_shipping);
 }
 /**
  * Update an order.
  *
  * ## OPTIONS
  *
  * <id>
  * : Product ID
  *
  * [--<field>=<value>]
  * : One or more fields to update.
  *
  * ## AVAILABLE FIELDS
  *
  * For available fields, see: wp wc order create --help
  *
  * ## EXAMPLES
  *
  *    wp wc order update 123 --status=completed
  *
  * @todo  gedex
  * @since 2.5.0
  */
 public function update($args, $assoc_args)
 {
     try {
         $id = $args[0];
         $data = apply_filters('woocommerce_cli_update_order_data', $this->unflatten_array($assoc_args));
         $update_totals = false;
         $order = wc_get_order($id);
         if (empty($order)) {
             throw new WC_CLI_Exception('woocommerce_cli_invalid_order_id', __('Order ID is invalid', 'woocommerce'));
         }
         $order_args = array('order_id' => $order->id);
         // customer note
         if (isset($data['note'])) {
             $order_args['customer_note'] = $data['note'];
         }
         // order status
         if (!empty($data['status'])) {
             $order->update_status($data['status'], isset($data['status_note']) ? $data['status_note'] : '');
         }
         // customer ID
         if (isset($data['customer_id']) && $data['customer_id'] != $order->get_user_id()) {
             // make sure customer exists
             if (false === get_user_by('id', $data['customer_id'])) {
                 throw new WC_CLI_Exception('woocommerce_cli_invalid_customer_id', __('Customer ID is invalid', 'woocommerce'));
             }
             update_post_meta($order->id, '_customer_user', $data['customer_id']);
         }
         // billing/shipping address
         $this->set_order_addresses($order, $data);
         $lines = array('line_item' => 'line_items', 'shipping' => 'shipping_lines', 'fee' => 'fee_lines', 'coupon' => 'coupon_lines');
         foreach ($lines as $line_type => $line) {
             if (isset($data[$line]) && is_array($data[$line])) {
                 $update_totals = true;
                 foreach ($data[$line] as $item) {
                     // item ID is always required
                     if (!array_key_exists('id', $item)) {
                         throw new WC_CLI_Exception('woocommerce_invalid_item_id', __('Order item ID is required', 'woocommerce'));
                     }
                     // create item
                     if (is_null($item['id'])) {
                         $this->set_item($order, $line_type, $item, 'create');
                     } elseif ($this->item_is_null($item)) {
                         // delete item
                         wc_delete_order_item($item['id']);
                     } else {
                         // update item
                         $this->set_item($order, $line_type, $item, 'update');
                     }
                 }
             }
         }
         // payment method (and payment_complete() if `paid` == true and order needs payment)
         if (isset($data['payment_details']) && is_array($data['payment_details'])) {
             // method ID
             if (isset($data['payment_details']['method_id'])) {
                 update_post_meta($order->id, '_payment_method', $data['payment_details']['method_id']);
             }
             // method title
             if (isset($data['payment_details']['method_title'])) {
                 update_post_meta($order->id, '_payment_method_title', $data['payment_details']['method_title']);
             }
             // mark as paid if set
             if ($order->needs_payment() && isset($data['payment_details']['paid']) && $this->is_true($data['payment_details']['paid'])) {
                 $order->payment_complete(isset($data['payment_details']['transaction_id']) ? $data['payment_details']['transaction_id'] : '');
             }
         }
         // set order currency
         if (isset($data['currency'])) {
             if (!array_key_exists($data['currency'], get_woocommerce_currencies())) {
                 throw new WC_CLI_Exception('woocommerce_invalid_order_currency', __('Provided order currency is invalid', 'woocommerce'));
             }
             update_post_meta($order->id, '_order_currency', $data['currency']);
         }
         // set order number
         if (isset($data['order_number'])) {
             update_post_meta($order->id, '_order_number', $data['order_number']);
         }
         // if items have changed, recalculate order totals
         if ($update_totals) {
             $order->calculate_totals();
         }
         // update order meta
         if (isset($data['order_meta']) && is_array($data['order_meta'])) {
             $this->set_order_meta($order->id, $data['order_meta']);
         }
         // update the order post to set customer note/modified date
         wc_update_order($order_args);
         wc_delete_shop_order_transients($order->id);
         do_action('woocommerce_cli_update_order', $order->id, $data);
         WP_CLI::success("Updated order {$order->id}.");
     } catch (WC_CLI_Exception $e) {
         WP_CLI::error($e->getMessage());
     }
 }
 /**
  * Delete all order items
  * @param $order_id
  */
 private function delete_order_items($order_id)
 {
     global $wpdb;
     $order_item_ids = $wpdb->get_col($wpdb->prepare("\n\t\t\tSELECT      order_item_id\n\t\t\tFROM        {$wpdb->prefix}woocommerce_order_items\n\t\t\tWHERE       order_id = %d\n\t\t", $order_id));
     foreach ($order_item_ids as $item_id) {
         wc_delete_order_item($item_id);
     }
 }
 /**
  * Remove an order tax
  */
 public static function remove_order_tax()
 {
     check_ajax_referer('order-item', 'security');
     $order_id = absint($_POST['order_id']);
     $rate_id = absint($_POST['rate_id']);
     wc_delete_order_item($rate_id);
     // Return HTML items
     $order = new WC_Order($order_id);
     $data = get_post_meta($order_id);
     include 'admin/meta-boxes/views/html-order-items.php';
     die;
 }
 /**
  * Removes the booking from an order
  * when the order includes only bookings which require confirmation
  *
  * @param int $booking_id
  */
 public function remove_cancelled_booking($booking_id)
 {
     global $wpdb;
     $booking = get_wc_booking($booking_id);
     $order = $booking->get_order();
     $bookings = array();
     foreach ($order->get_items() as $order_item_id => $item) {
         if ($item[__('Booking ID', 'woocommerce-bookings')] == $booking_id) {
             wc_delete_order_item($order_item_id);
             $order->calculate_totals();
             $order->add_order_note(sprintf(__('The product %s has been removed from the order because the booking #%d cannot be confirmed.', 'woocommerce-bookings'), $item['name'], $booking_id), true);
         }
     }
 }
 /**
  * Remove duplicate tax column from renewal orders
  *
  * @since 4.2
  */
 public function remove_duplicate_renewal_taxes($renewal_order, $original_order)
 {
     global $wpdb;
     $original_taxes = $original_order->get_items('recurring_tax');
     $new_taxes = $renewal_order->get_taxes();
     $to_remove = array();
     foreach ($original_taxes as $tax_item_id => $data) {
         if ($data['rate_id'] != WT_RATE_ID) {
             continue;
         }
         foreach ($new_taxes as $tax_id => $tax_data) {
             if ($tax_data['tax_amount'] == $data['tax_amount'] && $tax_data['rate_id'] == $data['rate_id']) {
                 $to_remove[] = $tax_id;
             }
         }
     }
     foreach ($to_remove as $tax_item_id) {
         wc_delete_order_item($tax_item_id);
     }
 }
 /**
  * When a new order is inserted, add subscriptions related order meta.
  *
  * @since 1.0
  */
 public static function add_order_meta($order_id, $posted)
 {
     global $woocommerce;
     if (!WC_Subscriptions_Cart::cart_contains_subscription_renewal('child') && WC_Subscriptions_Order::order_contains_subscription($order_id)) {
         // This works because the 'woocommerce_add_order_item_meta' runs before the 'woocommerce_checkout_update_order_meta' hook
         // Set the recurring totals so totals display correctly on order page
         update_post_meta($order_id, '_order_recurring_discount_cart', WC_Subscriptions_Cart::get_recurring_discount_cart());
         update_post_meta($order_id, '_order_recurring_discount_total', WC_Subscriptions_Cart::get_recurring_discount_total());
         update_post_meta($order_id, '_order_recurring_shipping_tax_total', WC_Subscriptions_Cart::get_recurring_shipping_tax_total());
         update_post_meta($order_id, '_order_recurring_shipping_total', WC_Subscriptions_Cart::get_recurring_shipping_total());
         update_post_meta($order_id, '_order_recurring_tax_total', WC_Subscriptions_Cart::get_recurring_total_tax());
         update_post_meta($order_id, '_order_recurring_total', WC_Subscriptions_Cart::get_recurring_total());
         // Set the recurring payment method - it starts out the same as the original by may change later
         update_post_meta($order_id, '_recurring_payment_method', get_post_meta($order_id, '_payment_method', true));
         update_post_meta($order_id, '_recurring_payment_method_title', get_post_meta($order_id, '_payment_method_title', true));
         $order = new WC_Order($order_id);
         $order_fees = $order->get_fees();
         // the fee order items have already been set, we just need to to add the recurring total meta
         $cart_fees = $woocommerce->cart->get_fees();
         foreach ($order->get_fees() as $item_id => $order_fee) {
             // Find the matching fee in the cart
             foreach ($cart_fees as $fee_index => $cart_fee) {
                 if (sanitize_title($order_fee['name']) == $cart_fee->id) {
                     woocommerce_add_order_item_meta($item_id, '_recurring_line_total', wc_format_decimal($cart_fee->recurring_amount));
                     woocommerce_add_order_item_meta($item_id, '_recurring_line_tax', wc_format_decimal($cart_fee->recurring_tax));
                     unset($cart_fees[$fee_index]);
                     break;
                 }
             }
         }
         // Get recurring taxes into same format as _order_taxes
         $order_recurring_taxes = array();
         foreach (WC_Subscriptions_Cart::get_recurring_taxes() as $tax_key => $tax_amount) {
             $item_id = woocommerce_add_order_item($order_id, array('order_item_name' => $woocommerce->cart->tax->get_rate_code($tax_key), 'order_item_type' => 'recurring_tax'));
             if ($item_id) {
                 wc_add_order_item_meta($item_id, 'rate_id', $tax_key);
                 wc_add_order_item_meta($item_id, 'label', WC()->cart->tax->get_rate_label($tax_key));
                 wc_add_order_item_meta($item_id, 'compound', absint(WC()->cart->tax->is_compound($tax_key) ? 1 : 0));
                 wc_add_order_item_meta($item_id, 'tax_amount', wc_format_decimal(isset(WC()->cart->recurring_taxes[$tax_key]) ? WC()->cart->recurring_taxes[$tax_key] : 0));
                 wc_add_order_item_meta($item_id, 'shipping_tax_amount', wc_format_decimal(isset(WC()->cart->recurring_shipping_taxes[$tax_key]) ? WC()->cart->recurring_shipping_taxes[$tax_key] : 0));
             }
         }
         $payment_gateways = $woocommerce->payment_gateways->payment_gateways();
         if ('yes' == get_option(WC_Subscriptions_Admin::$option_prefix . '_turn_off_automatic_payments', 'no')) {
             update_post_meta($order_id, '_wcs_requires_manual_renewal', 'true');
         } elseif (isset($payment_gateways[$posted['payment_method']]) && !$payment_gateways[$posted['payment_method']]->supports('subscriptions')) {
             update_post_meta($order_id, '_wcs_requires_manual_renewal', 'true');
         }
         $cart_item = WC_Subscriptions_Cart::cart_contains_subscription_renewal();
         if (isset($cart_item['subscription_renewal']) && 'parent' == $cart_item['subscription_renewal']['role']) {
             update_post_meta($order_id, '_original_order', $cart_item['subscription_renewal']['original_order']);
         }
         // WC 2.1+
         if (!WC_Subscriptions::is_woocommerce_pre_2_1()) {
             // Recurring coupons
             if ($applied_coupons = $woocommerce->cart->get_coupons()) {
                 foreach ($applied_coupons as $code => $coupon) {
                     $item_id = woocommerce_get_order_item_meta($order_id, array('order_item_name' => $code, 'order_item_type' => 'coupon'));
                     // Add line item meta
                     if ($item_id) {
                         woocommerce_add_order_item_meta($item_id, 'recurring_discount_amount', isset($woocommerce->cart->recurring_coupon_discount_amounts[$code]) ? $woocommerce->cart->recurring_coupon_discount_amounts[$code] : 0);
                     }
                 }
             }
             // Add recurring shipping order items
             if (WC_Subscriptions_Cart::cart_contains_subscriptions_needing_shipping()) {
                 $packages = $woocommerce->shipping->get_packages();
                 $checkout = $woocommerce->checkout();
                 foreach ($packages as $i => $package) {
                     if (isset($package['rates'][$checkout->shipping_methods[$i]])) {
                         $method = $package['rates'][$checkout->shipping_methods[$i]];
                         $item_id = woocommerce_add_order_item($order_id, array('order_item_name' => $method->label, 'order_item_type' => 'recurring_shipping'));
                         if ($item_id) {
                             woocommerce_add_order_item_meta($item_id, 'method_id', $method->id);
                             woocommerce_add_order_item_meta($item_id, 'cost', WC_Subscriptions::format_total($method->cost));
                             do_action('woocommerce_subscriptions_add_recurring_shipping_order_item', $order_id, $item_id, $i);
                         }
                     }
                 }
             }
             // Remove shipping on original order if it was added but is not required
             if (!WC_Subscriptions_Cart::charge_shipping_up_front()) {
                 foreach ($order->get_shipping_methods() as $order_item_id => $shipping_method) {
                     wc_delete_order_item($order_item_id);
                 }
             }
         } else {
             update_post_meta($order_id, '_recurring_shipping_method', get_post_meta($order_id, '_shipping_method', true), true);
             update_post_meta($order_id, '_recurring_shipping_method_title', get_post_meta($order_id, '_shipping_method_title', true), true);
         }
     }
 }
 /**
  * Delete items that were not present in updated CSV when merging
  *
  * @since 3.0.0
  * @param array $existing
  * @param array $updated
  */
 private function delete_removed_items($existing, $updated)
 {
     if (count($existing) != count($updated)) {
         // if this order item was not updated, it must be removed from the order
         foreach ($existing as $order_item_id => $item) {
             if (!in_array($order_item_id, $updated)) {
                 wc_delete_order_item($order_item_id);
             }
         }
     }
 }