/** * Returns a string representing the details of the subscription. * * For example "$20 per Month for 3 Months with a $10 sign-up fee". * * @param WC_Product|int $product A WC_Product object or ID of a WC_Product. * @param array $inclusions An associative array of flags to indicate how to calculate the price and what to include, values: * 'tax_calculation' => false to ignore tax, 'include_tax' or 'exclude_tax' To indicate that tax should be added or excluded respectively * 'subscription_length' => true to include subscription's length (default) or false to exclude it * 'sign_up_fee' => true to include subscription's sign up fee (default) or false to exclude it * 'price' => string a price to short-circuit the price calculations and use in a string for the product * @since 1.0 */ public static function get_price_string($product, $include = array()) { if (!is_object($product)) { $product = WC_Subscriptions::get_product($product); } if (!self::is_subscription($product)) { return; } $include = wp_parse_args($include, array('tax_calculation' => false, 'subscription_price' => true, 'subscription_period' => true, 'subscription_length' => true, 'sign_up_fee' => true, 'trial_length' => true)); $include = apply_filters('woocommerce_subscriptions_product_price_string_inclusions', $include, $product); $base_price = self::get_price($product); if (true === $include['sign_up_fee']) { $sign_up_fee = self::get_sign_up_fee($product); } elseif (false !== $include['sign_up_fee']) { // Allow override of product's sign-up fee $sign_up_fee = $include['sign_up_fee']; } else { $sign_up_fee = 0; } if ($include['tax_calculation'] != false) { if ($include['tax_calculation'] == 'exclude_tax') { // Subtract Tax $tax_per_period = self::calculate_tax_for_subscription($base_price, $product); if (isset($include['price'])) { $price = $include['price']; } else { $price = woocommerce_price($base_price - $tax_per_period); } if ($sign_up_fee > 0) { $sign_up_tax = self::calculate_tax_for_subscription($sign_up_fee, $product); $sign_up_fee = $sign_up_fee - $sign_up_tax; } } else { // Add Tax $tax_per_period = self::calculate_tax_for_subscription($base_price, $product, true); if (isset($include['price'])) { $price = $include['price']; } else { $price = woocommerce_price($base_price + $tax_per_period); } if ($sign_up_fee > 0) { $sign_up_tax = self::calculate_tax_for_subscription($sign_up_fee, $product, true); $sign_up_fee = $sign_up_fee - $sign_up_tax; } } } else { if (isset($include['price'])) { $price = $include['price']; } else { $price = woocommerce_price($base_price); } } $billing_interval = self::get_interval($product); $subscription_length = self::get_length($product); $trial_length = self::get_trial_length($product); $trial_period = self::get_trial_period($product); if (is_numeric($sign_up_fee)) { $sign_up_fee = woocommerce_price($sign_up_fee); } if ($include['subscription_length']) { $ranges = WC_Subscriptions_Manager::get_subscription_ranges(self::get_period($product)); } if ($include['subscription_length'] && $subscription_length != 0) { $include_length = true; } else { $include_length = false; } $subscription_string = ''; if ($include['subscription_price'] && $include['subscription_period']) { // Allow extensions to not show price or billing period e.g. Name Your Price if ($include_length && $subscription_length == $billing_interval) { $subscription_string = $price; // Only for one billing period so show "$5 for 3 months" instead of "$5 every 3 months for 3 months" } else { $subscription_string = sprintf(_n(' %s / %s', ' %s every %s', $billing_interval, 'woocommerce-subscriptions'), $price, WC_Subscriptions_Manager::get_subscription_period_strings($billing_interval, self::get_period($product))); } } elseif ($include['subscription_price']) { $subscription_string = $price; } elseif ($include['subscription_period']) { $subscription_string = sprintf(_n('%s', 'every %s', $billing_interval, 'woocommerce-subscriptions'), WC_Subscriptions_Manager::get_subscription_period_strings($billing_interval, self::get_period($product))); } // Add the length to the end if ($include_length) { $subscription_string = sprintf(__('%s for %s', 'woocommerce-subscriptions'), $subscription_string, $ranges[$subscription_length]); } if ($include['trial_length'] && $trial_length != 0) { $trial_string = WC_Subscriptions_Manager::get_subscription_trial_period_strings($trial_length, $trial_period); $subscription_string = sprintf(__('%s with %s free trial', 'woocommerce-subscriptions'), $subscription_string, $trial_string); } if ($include['sign_up_fee'] && self::get_sign_up_fee($product) > 0) { $subscription_string = sprintf(__('%s and a %s sign-up fee', 'woocommerce-subscriptions'), $subscription_string, $sign_up_fee); } return apply_filters('woocommerce_subscriptions_product_price_string', $subscription_string, $product, $include); }
/** * Returns a string representing the details of the subscription. * * For example "$20 per Month for 3 Months with a $10 sign-up fee". * * @param WC_Product|int $product A WC_Product object or ID of a WC_Product. * @param array $inclusions An associative array of flags to indicate how to calculate the price and what to include, values: * 'tax_calculation' => false to ignore tax, 'include_tax' or 'exclude_tax' To indicate that tax should be added or excluded respectively * 'subscription_length' => true to include subscription's length (default) or false to exclude it * 'sign_up_fee' => true to include subscription's sign up fee (default) or false to exclude it * 'price' => string a price to short-circuit the price calculations and use in a string for the product * @since 1.0 */ public static function get_price_string($product, $include = array()) { global $wp_locale; if (!is_object($product)) { $product = WC_Subscriptions::get_product($product); } if (!self::is_subscription($product)) { return; } $include = wp_parse_args($include, array('tax_calculation' => get_option('woocommerce_tax_display_shop'), 'subscription_price' => true, 'subscription_period' => true, 'subscription_length' => true, 'sign_up_fee' => true, 'trial_length' => true)); $include = apply_filters('woocommerce_subscriptions_product_price_string_inclusions', $include, $product); $base_price = self::get_price($product); if (true === $include['sign_up_fee']) { $sign_up_fee = self::get_sign_up_fee($product); } elseif (false !== $include['sign_up_fee']) { // Allow override of product's sign-up fee $sign_up_fee = $include['sign_up_fee']; } else { $sign_up_fee = 0; } if ($include['tax_calculation'] != false) { if (in_array($include['tax_calculation'], array('exclude_tax', 'excl'))) { // Subtract Tax if (isset($include['price'])) { $price = $include['price']; } else { $price = $product->get_price_excluding_tax(1, $include['price']); } if (true === $include['sign_up_fee']) { $sign_up_fee = $product->get_sign_up_fee_excluding_tax(); } } else { // Add Tax if (isset($include['price'])) { $price = $include['price']; } else { $price = $product->get_price_including_tax(); } if (true === $include['sign_up_fee']) { $sign_up_fee = $product->get_sign_up_fee_including_tax(); } } } else { if (isset($include['price'])) { $price = $include['price']; } else { $price = woocommerce_price($base_price); } } $price .= ' <span class="subscription-details">'; $billing_interval = self::get_interval($product); $billing_period = self::get_period($product); $subscription_length = self::get_length($product); $trial_length = self::get_trial_length($product); $trial_period = self::get_trial_period($product); if (is_numeric($sign_up_fee)) { $sign_up_fee = woocommerce_price($sign_up_fee); } if ($include['subscription_length']) { $ranges = WC_Subscriptions_Manager::get_subscription_ranges($billing_period); } if ($include['subscription_length'] && $subscription_length != 0) { $include_length = true; } else { $include_length = false; } $subscription_string = ''; if ($include['subscription_price'] && $include['subscription_period']) { // Allow extensions to not show price or billing period e.g. Name Your Price if ($include_length && $subscription_length == $billing_interval) { $subscription_string = $price; // Only for one billing period so show "$5 for 3 months" instead of "$5 every 3 months for 3 months" } elseif (WC_Subscriptions_Synchroniser::is_product_synced($product) && in_array($billing_period, array('week', 'month', 'year'))) { $payment_day = WC_Subscriptions_Synchroniser::get_products_payment_day($product); switch ($billing_period) { case 'week': $payment_day_of_week = WC_Subscriptions_Synchroniser::get_weekday($payment_day); if (1 == $billing_interval) { // e.g. $5 every Wednesday $subscription_string = sprintf(__('%s every %s', 'woocommerce-subscriptions'), $price, $payment_day_of_week); } else { // e.g. $5 every 2 weeks on Wednesday $subscription_string = sprintf(__('%s every %s on %s', 'woocommerce-subscriptions'), $price, WC_Subscriptions_Manager::get_subscription_period_strings($billing_interval, $billing_period), $payment_day_of_week); } break; case 'month': if (1 == $billing_interval) { // e.g. $15 on the 15th of each month if ($payment_day > 27) { $subscription_string = sprintf(__('%s on the last day of each month', 'woocommerce-subscriptions'), $price); } else { $subscription_string = sprintf(__('%s on the %s of each month', 'woocommerce-subscriptions'), $price, WC_Subscriptions::append_numeral_suffix($payment_day)); } } else { // e.g. $15 on the 15th of every 3rd month if ($payment_day > 27) { $subscription_string = sprintf(__('%s on the last day of every %s month', 'woocommerce-subscriptions'), $price, WC_Subscriptions::append_numeral_suffix($billing_interval)); } else { $subscription_string = sprintf(__('%s on the %s day of every %s month', 'woocommerce-subscriptions'), $price, WC_Subscriptions::append_numeral_suffix($payment_day), WC_Subscriptions::append_numeral_suffix($billing_interval)); } } break; case 'year': if (1 == $billing_interval) { // e.g. $15 on March 15th each year $subscription_string = sprintf(__('%s on %s %s each year', 'woocommerce-subscriptions'), $price, $wp_locale->month[$payment_day['month']], WC_Subscriptions::append_numeral_suffix($payment_day['day'])); } else { // e.g. $15 on March 15th every 3rd year $subscription_string = sprintf(__('%s on %s %s every %s year', 'woocommerce-subscriptions'), $price, $wp_locale->month[$payment_day['month']], WC_Subscriptions::append_numeral_suffix($payment_day['day']), WC_Subscriptions::append_numeral_suffix($billing_interval)); } break; } } else { $subscription_string = sprintf(_n('%s / %s', ' %s every %s', $billing_interval, 'woocommerce-subscriptions'), $price, WC_Subscriptions_Manager::get_subscription_period_strings($billing_interval, $billing_period)); } } elseif ($include['subscription_price']) { $subscription_string = $price; } elseif ($include['subscription_period']) { $subscription_string = sprintf(_n('%s', 'every %s', $billing_interval, 'woocommerce-subscriptions'), WC_Subscriptions_Manager::get_subscription_period_strings($billing_interval, $billing_period)); } // Add the length to the end if ($include_length) { $subscription_string = sprintf(__('%s for %s', 'woocommerce-subscriptions'), $subscription_string, $ranges[$subscription_length]); } if ($include['trial_length'] && $trial_length != 0) { $trial_string = WC_Subscriptions_Manager::get_subscription_trial_period_strings($trial_length, $trial_period); $subscription_string = sprintf(__('%s with %s free trial', 'woocommerce-subscriptions'), $subscription_string, $trial_string); } if ($include['sign_up_fee'] && self::get_sign_up_fee($product) > 0) { $subscription_string = sprintf(__('%s and a %s sign-up fee', 'woocommerce-subscriptions'), $subscription_string, $sign_up_fee); } $subscription_string .= '</span>'; return apply_filters('woocommerce_subscriptions_product_price_string', $subscription_string, $product, $include); }
/** * Returns a string representing the details of the subscription. * * For example "$20 per Month for 3 Months with a $10 sign-up fee". * * @param $product WC_Product | Int A WC_Product object or ID of a WC_Product. * @param $inclusions array An associative array of flags to indicate how to calculate the price and what to include, values: * 'tax_calculation' => false to ignore tax, 'include_tax' or 'exclude_tax' To indicate that tax should be added or excluded respectively * 'subscription_length' => true to include subscription's length (default) or false to exclude it * 'sign_up_fee' => true to include subscription's sign up fee (default) or false to exclude it * 'price' => string a price to short-circuit the price calculations and use in a string for the product * @since 1.0 */ public static function get_price_string($product, $include = array()) { if (!is_object($product)) { $product = new WC_Product($product); } // Shouldn't matter if product is variation as all we need is the product_type if (!self::is_subscription($product)) { return; } $include = wp_parse_args($include, array('tax_calculation' => false, 'subscription_length' => true, 'sign_up_fee' => true, 'trial_length' => true)); $base_price = self::get_price($product); $sign_up_fee = self::get_sign_up_fee($product); if ($include['tax_calculation'] != false) { if ($include['tax_calculation'] == 'exclude_tax') { // Subtract Tax $tax_per_period = self::calculate_tax_for_subscription($base_price, $product); if (isset($include['price'])) { $price = $include['price']; } else { $price = woocommerce_price($base_price - $tax_per_period); } if ($sign_up_fee > 0) { $sign_up_tax = self::calculate_tax_for_subscription($sign_up_fee, $product); $sign_up_fee = $sign_up_fee - $sign_up_tax; } } else { // Add Tax $tax_per_period = self::calculate_tax_for_subscription($base_price, $product, true); if (isset($include['price'])) { $price = $include['price']; } else { $price = woocommerce_price($base_price + $tax_per_period); } if ($sign_up_fee > 0) { $sign_up_tax = self::calculate_tax_for_subscription($sign_up_fee, $product, true); $sign_up_fee = $sign_up_fee - $sign_up_tax; } } } else { if (isset($include['price'])) { $price = $include['price']; } else { $price = woocommerce_price($base_price); } } $billing_interval = self::get_interval($product); $subscription_length = self::get_length($product); $trial_length = self::get_trial_length($product); $trial_period = self::get_trial_period($product); if ($include['subscription_length']) { $ranges = WC_Subscriptions_Manager::get_subscription_ranges(self::get_period($product)); } if ($include['subscription_length'] && $subscription_length != 0) { $include_length = true; } else { $include_length = false; } if ($include_length && $subscription_length == $billing_interval) { $subscription_string = $price; } else { $subscription_string = sprintf(_n(' %s / %s', ' %s every %s', $billing_interval, WC_Subscriptions::$text_domain), $price, WC_Subscriptions_Manager::get_subscription_period_strings($billing_interval, self::get_period($product))); } // Add the length to the end if ($include_length) { $subscription_string = sprintf(__('%s for %s', WC_Subscriptions::$text_domain), $subscription_string, $ranges[$subscription_length]); } if ($include['trial_length'] && $trial_length != 0) { $trial_string = WC_Subscriptions_Manager::get_subscription_trial_period_strings($trial_length, $trial_period); $subscription_string = sprintf(__('%s with %s free trial', WC_Subscriptions::$text_domain), $subscription_string, $trial_string); } if ($include['sign_up_fee'] && self::get_sign_up_fee($product) > 0) { $subscription_string = sprintf(__('%s and a %s sign-up fee', WC_Subscriptions::$text_domain), $subscription_string, woocommerce_price($sign_up_fee)); } return apply_filters('woocommerce_subscriptions_product_price_string', $subscription_string, $product, $include); }