/**
  * Save pre-order options
  *
  * @since 1.0
  * @param int $post_id the ID of the product being saved
  */
 public function save_product_tab_options($post_id)
 {
     // don't save any settings if there are active pre-orders
     if (WC_Pre_Orders_Product::product_has_active_pre_orders($post_id)) {
         return;
     }
     // pre-orders enabled
     if (isset($_POST['_wc_pre_orders_enabled']) && 'yes' === $_POST['_wc_pre_orders_enabled']) {
         update_post_meta($post_id, '_wc_pre_orders_enabled', 'yes');
     } else {
         update_post_meta($post_id, '_wc_pre_orders_enabled', 'no');
     }
     /*
      * Save the availability date/time
      *
      * The date/time a pre-order is released is saved as a unix timestamp adjusted for the site's timezone. For example,
      * when an admin sets a pre-order to be released on 2013-06-25 12pm EST (UTC-4), it is saved as a timestamp equivalent
      * to 2013-12-25 4pm UTC. This makes the pre-order release check much easier, as it's a simple timestamp comparison,
      * because the release datetime and the current time are both in UTC.
      */
     if (!empty($_POST['_wc_pre_orders_availability_datetime'])) {
         try {
             // get datetime object from site timezone
             $datetime = new DateTime($_POST['_wc_pre_orders_availability_datetime'], new DateTimeZone(WC_Pre_Orders_Product::get_wp_timezone_string()));
             // get the unix timestamp (adjusted for the site's timezone already)
             $timestamp = $datetime->format('U');
             // don't allow availability dates in the past
             if ($timestamp <= time()) {
                 $timestamp = '';
             }
             // set the availability datetime
             update_post_meta($post_id, '_wc_pre_orders_availability_datetime', $timestamp);
         } catch (Exception $e) {
             global $wc_pre_orders;
             $wc_pre_orders->log($e->getMessage());
         }
     } else {
         delete_post_meta($post_id, '_wc_pre_orders_availability_datetime');
     }
     // pre-order fee
     if (isset($_POST['_wc_pre_orders_fee']) && is_numeric($_POST['_wc_pre_orders_fee'])) {
         update_post_meta($post_id, '_wc_pre_orders_fee', $_POST['_wc_pre_orders_fee']);
     }
     // when to charge pre-order amount
     if (isset($_POST['_wc_pre_orders_when_to_charge']) && isset($_POST['_wc_pre_orders_enabled']) && 'yes' === $_POST['_wc_pre_orders_enabled']) {
         update_post_meta($post_id, '_wc_pre_orders_when_to_charge', 'upon_release' === $_POST['_wc_pre_orders_when_to_charge'] ? 'upon_release' : 'upfront');
     }
     do_action('wc_pre_orders_save_product_options', $post_id);
 }
 /**
  * Change the release date for  pre-orders by updating the availability date for the pre-ordered product to a new date in the future
  *
  * @since 1.0
  * @param object|int $product the product to change the release date for all pre-orders for
  * @param string $new_availability_date the new availability date
  * @param string $message an optional message to include in communications to the customer
  */
 public static function change_release_date_for_all_pre_orders($product, $new_availability_date, $message = '')
 {
     if (!is_object($product)) {
         $product = get_product($product);
     }
     // get new availability date timestamp
     try {
         // get datetime object from site timezone
         $datetime = new DateTime($new_availability_date, new DateTimeZone(WC_Pre_Orders_Product::get_wp_timezone_string()));
         // get the unix timestamp (adjusted for the site's timezone already)
         $timestamp = $datetime->format('U');
         // don't allow availability dates in the past
         if ($timestamp <= time()) {
             $timestamp = '';
         }
     } catch (Exception $e) {
         global $wc_pre_orders;
         $wc_pre_orders->log($e->getMessage());
         $timestamp = '';
     }
     // set new availability date for product
     update_post_meta($product->id, '_wc_pre_orders_availability_datetime', $timestamp);
     // get associated orders
     $orders = self::get_all_pre_orders_by_product($product);
     // fire action for each order
     foreach ($orders as $order) {
         if (!is_object($order)) {
             $order = new WC_Order($order);
         }
         // only delay active pre-orders
         if ('active' !== WC_Pre_Orders_Order::get_pre_order_status($order)) {
             continue;
         }
         // add 'release date changed' order note for admins
         $order->add_order_note(sprintf(__('Pre-Order Release Date Changed to %s', 'wc-pre-orders'), WC_Pre_Orders_Product::get_localized_availability_date($product, __('N/A', 'wc-pre-orders'))));
         do_action('wc_pre_orders_pre_order_date_changed', array('order' => $order, 'availability_date' => $new_availability_date, 'message' => $message));
     }
 }