/** * Returns subscription schemes for cart-level options. * Cart-level options will be displayed only if no cart-item is found with its own product-level subscription scheme. * This means that subscription options defined at product-level and "legacy" subscription-type products will "block" the display of cart-level options. * * In this case, cart-level options will be displayed at cart-item level. * * Must be called after all cart session data has been loaded. * * @return array|boolean */ public static function get_cart_subscription_schemes() { $wcs_prefix = WC_Subscriptions_Admin::$option_prefix; $cart_level_subs_active = get_option($wcs_prefix . '_enable_cart_subscriptions', 'no'); $cart_level_schemes = array(); $cart_level_schemes_keys = array(); if ($cart_level_subs_active === 'yes') { $cart_level_schemes = get_option($wcs_prefix . '_subscribe_to_cart_schemes', array()); } if (empty($cart_level_schemes)) { return false; } foreach ($cart_level_schemes as $cart_level_scheme) { $cart_level_schemes_keys[] = $cart_level_scheme['id']; } foreach (WC()->cart->cart_contents as $cart_item) { if (!WCS_ATT_Cart::is_supported_product_type($cart_item)) { return false; } if ($cart_item_level_schemes = self::get_subscription_schemes($cart_item, 'cart-item')) { return false; } if (WC_Subscriptions_Product::is_subscription($cart_item['product_id'])) { return false; } } return $cart_level_schemes; }
* @param array $cart_item * @return boolean */ public static function is_convertible_to_sub($cart_item) { $product_id = $cart_item['product_id']; $is_convertible = true; if (WC_Subscriptions_Product::is_subscription($product_id)) { $is_convertible = false; } return $is_convertible; } /** * True if the product corresponding to a cart item is one of the types supported by the plugin. * * @param array $cart_item * @return boolean */ public static function is_supported_product_type($cart_item) { $product = $cart_item['data']; $product_type = $cart_item['data']->product_type; $supported_types = WCS_ATT()->get_supported_product_types(); if (in_array($product_type, $supported_types)) { return true; } return false; } } WCS_ATT_Cart::init();
/** * Displays cart item options for purchasing a product once or creating a subscription from it. * * @param string $price * @param array $cart_item * @param string $cart_item_key * @return string */ public static function convert_to_sub_cart_item_options($price, $cart_item, $cart_item_key) { $subscription_schemes = WCS_ATT_Schemes::get_cart_item_subscription_schemes($cart_item); $show_convert_to_sub_options = apply_filters('wcsatt_show_cart_item_options', !empty($subscription_schemes), $cart_item, $cart_item_key); $is_mini_cart = did_action('woocommerce_before_mini_cart') && !did_action('woocommerce_after_mini_cart'); // currently show options only in cart if (!is_cart() || $is_mini_cart) { return $price; } if (!$show_convert_to_sub_options) { return $price; } // Allow one-time purchase option? $allow_one_time_option = true; $product_level_schemes = WCS_ATT_Schemes::get_subscription_schemes($cart_item, 'cart-item'); $has_product_level_schemes = empty($product_level_schemes) ? false : true; if ($has_product_level_schemes) { $force_subscription = get_post_meta($cart_item['product_id'], '_wcsatt_force_subscription', true); if ($force_subscription === 'yes') { $allow_one_time_option = false; } } $price_overrides_exist = WCS_ATT_Schemes::subscription_price_overrides_exist($subscription_schemes); $reset_product = wc_get_product($cart_item['product_id']); $options = array(); $active_subscription_scheme_id = WCS_ATT_Schemes::get_active_subscription_scheme_id($cart_item); if ($allow_one_time_option) { if ($price_overrides_exist) { if ($active_subscription_scheme_id === '0') { $description = $price; } else { $description = WC()->cart->get_product_price($reset_product); } } else { $description = __('only now', WCS_ATT::TEXT_DOMAIN); } $options[] = array('id' => '0', 'description' => $description, 'selected' => $active_subscription_scheme_id === '0'); } foreach ($subscription_schemes as $subscription_scheme) { $subscription_scheme_id = $subscription_scheme['id']; if ($price_overrides_exist) { if ($active_subscription_scheme_id === $subscription_scheme_id) { $description = $price; } else { $converted_product = clone $reset_product; $dummy_cart_item = $cart_item; $dummy_cart_item['data'] = $converted_product; // Apply the subscription scheme id to the dummy cart item. $dummy_cart_item['wccsub_data']['active_subscription_scheme_id'] = $subscription_scheme_id; // Convert the dummy cart item using the applied id. $dummy_cart_item = WCS_ATT_Cart::convert_to_sub($dummy_cart_item); // Get the price of the dummy cart item. $description = WC()->cart->get_product_price($dummy_cart_item['data']); } } else { if ($active_subscription_scheme_id === $subscription_scheme_id) { $description = WC_Subscriptions_Product::get_price_string($cart_item['data'], array('subscription_price' => false)); } else { $converted_product = clone $reset_product; $dummy_cart_item = $cart_item; $dummy_cart_item['data'] = $converted_product; // Apply the subscription scheme id to the dummy cart item. $dummy_cart_item['wccsub_data']['active_subscription_scheme_id'] = $subscription_scheme_id; // Convert the dummy cart item using the applied id. $dummy_cart_item = WCS_ATT_Cart::convert_to_sub($dummy_cart_item); // Use the dummy cart item to obtain the description. $description = WC_Subscriptions_Product::get_price_string($dummy_cart_item['data'], array('subscription_price' => false)); } } $options[] = array('id' => $subscription_scheme_id, 'description' => $description, 'selected' => $active_subscription_scheme_id === $subscription_scheme_id); } // If there's just one option to display, it means that one-time purchases are not allowed and there's only one sub scheme on offer -- so don't show any options if (count($options) === 1) { return $price; } // Grab price without Subs formatting remove_filter('woocommerce_cart_product_price', 'WC_Subscriptions_Cart' . '::cart_product_price', 10, 2); remove_filter('woocommerce_cart_item_price', __CLASS__ . '::convert_to_sub_cart_item_options', 1000, 3); $price = apply_filters('woocommerce_cart_item_price', WC()->cart->get_product_price($cart_item['data']), $cart_item, $cart_item_key); add_filter('woocommerce_cart_item_price', __CLASS__ . '::convert_to_sub_cart_item_options', 1000, 3); add_filter('woocommerce_cart_product_price', 'WC_Subscriptions_Cart' . '::cart_product_price', 10, 2); ob_start(); $classes = $price_overrides_exist ? array('overrides_exist') : array(); wc_get_template('cart-item-options.php', array('options' => $options, 'cart_item_key' => $cart_item_key, 'classes' => implode(' ', $classes)), false, WCS_ATT()->plugin_path() . '/templates/'); $convert_to_sub_options = ob_get_clean(); if ($price_overrides_exist) { $price = $convert_to_sub_options; } else { $price = $price . $convert_to_sub_options; } return $price; }
/** * Returns subscription schemes for cart-level options. * Cart-level options will be displayed only if no cart-item is found with its own product-level subscription scheme. * This means that subscription options defined at product-level and "legacy" subscription-type products will "block" the display of cart-level options. * * In this case, cart-level options will be displayed at cart-item level. * * Must be called after all cart session data has been loaded. * * @return array|boolean */ public static function get_cart_subscription_schemes() { $cart_level_schemes = array(); $cart_level_schemes_keys = array(); $cart_level_schemes = get_option('wcsatt_subscribe_to_cart_schemes', array()); if (empty($cart_level_schemes)) { return false; } foreach ($cart_level_schemes as $cart_level_scheme) { $cart_level_schemes_keys[] = $cart_level_scheme['id']; } foreach (WC()->cart->cart_contents as $cart_item) { if (!WCS_ATT_Cart::is_supported_product_type($cart_item)) { return false; } if ($cart_item_level_schemes = self::get_subscription_schemes($cart_item, 'cart-item')) { return false; } if (WC_Subscriptions_Product::is_subscription($cart_item['product_id'])) { return false; } } return $cart_level_schemes; }