/** * Check if membership is also a subscription * * @access public * @param bool $is_subscription * @param int $product_id * @param bool */ public function membership_is_subscription($is_subscription, $product_id) { return Subscriptio_Subscription_Product::is_subscription($product_id); }
/** * Handle new WooCommerce orders * * @access public * @param int $order_id * @param array $posted * @return void */ public function new_order_placed($order_id, $posted) { $order = new WC_Order($order_id); $order_items = $order->get_items(); $order_meta = Subscriptio::unwrap_post_meta(get_post_meta($order->id)); // Iterate over all items and look for subscription products purchased foreach ($order_items as $order_item_key => $order_item) { // Get appropriate product and variation IDs $variation_id = (isset($order_item['variation_id']) && !empty($order_item['variation_id'])) ? $order_item['variation_id'] : null; $product_id = $variation_id ? $order_item['variation_id'] : $order_item['product_id']; $product = new WC_Product($product_id); $product_post_meta = Subscriptio::unwrap_post_meta(get_post_meta($product_id)); // Proceed only if this product is a subscription if (!isset($product_post_meta['_subscriptio']) || $product_post_meta['_subscriptio'] != 'yes') { continue; } // Start logging transaction $transaction = new Subscriptio_Transaction(null, 'new_order', null, $order_id, $order_item['product_id'], $variation_id); // Check if this subscription product looks ok if (!Subscriptio_Subscription_Product::is_ok($product_post_meta)) { $transaction->update_result('error'); $transaction->update_note(__('Invalid subscription product configuration.', 'subscriptio')); continue; } // Check if we have renewal order properties if (!isset($this->renewal_orders['by_line_item_id'][$order_item_key])) { $transaction->update_result('error'); $transaction->update_note(__('Failed saving subscription properties for renewal orders.', 'subscriptio')); continue; } // Everything seems to be ok, lets create a new subscription try { $subscription = new Subscriptio_Subscription(); $subscription_id = $subscription->create_from_order_item($order, $order_meta, $order_item_key, $order_item, $product, $product_post_meta, $this->renewal_orders['by_line_item_id'][$order_item_key]); $transaction->update_result('success'); $transaction->add_subscription_id($subscription_id); $transaction->update_note(__('Subscription successfully created.', 'subscriptio')); } catch (Exception $e) { $transaction->update_result('error'); $transaction->update_note($e->getMessage()); } } // Reset temporary storage $this->renewal_orders = array( 'by_cart_item_key' => array(), 'by_line_item_id' => array(), ); }
/** * Check if cart contains subscription product * * @access public * @return bool */ public static function cart_contains_subscription() { global $woocommerce; if (!empty($woocommerce->cart->cart_contents)) { foreach ($woocommerce->cart->cart_contents as $item) { if (Subscriptio_Subscription_Product::is_subscription($item['variation_id'] ? $item['variation_id'] : $item['product_id'])) { return true; } } } return false; }
/** * Change frontent cart item price with Subscription price (cosmetic change) * * @access public * @param float $price_now * @param array $cart_item * @param string $cart_item_key * @return string */ public function change_cart_item_price_html($price, $cart_item, $cart_item_key) { $id = !empty($cart_item['variation_id']) ? $cart_item['variation_id'] : $cart_item['product_id']; // Check if given item is subscription if (Subscriptio_Subscription_Product::is_subscription($id)) { // Is subtotal? $is_subtotal = current_filter() == 'woocommerce_cart_item_subtotal' ? true : false; // Format checkout price html and return return Subscriptio_Subscription_Product::get_formatted_subscription_price($id, $is_subtotal, $cart_item['quantity'], $cart_item['data']->price); } return $price; }
/** * Get formatted recurring amount * * @access public * @return string */ public function get_formatted_recurring_amount() { return Subscriptio_Subscription_Product::format_recurring_amount($this->renewal_order_total, $this->price_time_unit, $this->price_time_value, $this->renewal_order_currency); }
/** * Return formatted subscription price to be displayed on product pages and cart * * @access public * @param int $id * @param bool $is_checkout * @param int $quantity * @param float $price_now * @param bool $is_variable * @param bool $variations_equal * @return string */ public static function get_formatted_subscription_price($id, $is_checkout = false, $quantity = 1, $price_now = null, $is_variable = false, $variations_equal = false) { $meta = Subscriptio::unwrap_post_meta(get_post_meta($id)); $recurring_price = Subscriptio_Subscription_Product::get_recurring_price($id); // Check if product is configured properly, if not - revert to standard price display if (!isset($meta['_subscriptio_price_time_unit']) || !isset($meta['_subscriptio_price_time_value'])) { return Subscriptio::get_formatted_price($recurring_price, get_woocommerce_currency()); } // Cart/checkout page? if ($is_checkout) { $recurring_price_html = self::format_recurring_amount(($recurring_price * $quantity), $meta['_subscriptio_price_time_unit'], $meta['_subscriptio_price_time_value']); // Payable now differs from recurring amount? if ($price_now != $recurring_price) { $html_now = Subscriptio::get_formatted_price(($price_now * $quantity), get_woocommerce_currency()); return sprintf(__('%1$s now then %2$s', 'subscriptio'), $html_now, $recurring_price_html); } else { return self::format_recurring_amount(($price_now * $quantity), $meta['_subscriptio_price_time_unit'], $meta['_subscriptio_price_time_value']); } } // Other pages else { $recurring_price_html = self::format_recurring_amount($recurring_price, $meta['_subscriptio_price_time_unit'], $meta['_subscriptio_price_time_value']); // Any signup fee? if (!empty($meta['_subscriptio_signup_fee'])) { $signup_fee = Subscriptio::get_formatted_price($meta['_subscriptio_signup_fee'], get_woocommerce_currency()); } // Any free trial? if (!empty($meta['_subscriptio_free_trial_time_value'])) { $time_units = Subscriptio::get_time_units(); if (isset($time_units[$meta['_subscriptio_free_trial_time_unit']]) && is_numeric($meta['_subscriptio_free_trial_time_value'])) { $free_trial = $meta['_subscriptio_free_trial_time_value'] . ' ' . call_user_func($time_units[$meta['_subscriptio_free_trial_time_unit']]['translation_callback'], $meta['_subscriptio_free_trial_time_unit'], $meta['_subscriptio_free_trial_time_value']); } else { $free_trial = ''; } } // Free trial & Signup fee if (!empty($meta['_subscriptio_signup_fee']) && !empty($meta['_subscriptio_free_trial_time_value'])) { if ($is_variable && !$variations_equal) { return sprintf(__('From %1$s', 'subscriptio'), $recurring_price_html); } else { return sprintf(__('%1$s with a free trial of %2$s and a sign-up fee of %3$s', 'subscriptio'), $recurring_price_html, $free_trial, $signup_fee); } } // Free trial else if (!empty($meta['_subscriptio_free_trial_time_value'])) { if ($is_variable && !$variations_equal) { return sprintf(__('From %1$s', 'subscriptio'), $recurring_price_html); } else { return sprintf(__('%1$s with a free trial of %2$s', 'subscriptio'), $recurring_price_html, $free_trial); } } // Signup fee else if (!empty($meta['_subscriptio_signup_fee'])) { if ($is_variable && !$variations_equal) { return sprintf(__('From %1$s', 'subscriptio'), $recurring_price_html); } else { return sprintf(__('%1$s with a sign-up fee of %2$s', 'subscriptio'), $recurring_price_html, $signup_fee); } } // Plain recurring price else { if ($is_variable && !$variations_equal) { return sprintf(__('From %s', 'subscriptio'), $recurring_price_html); } else { return $recurring_price_html; } } } }