/** * 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)); } }