/**
  * Returns all available subscription schemes for displaying single-product options (product-level).
  *
  * @return array
  */
 public static function get_product_subscription_schemes($product)
 {
     $schemes = array();
     $supported_types = WCS_ATT()->get_supported_product_types();
     if (in_array($product->product_type, $supported_types)) {
         // Get product-level subscription schemes stored in product meta
         $product_schemes = get_post_meta($product->id, '_wcsatt_schemes', true);
         if ($product_schemes) {
             foreach ($product_schemes as $scheme) {
                 $scheme['scope'] = 'cart-item';
                 $schemes[] = $scheme;
             }
         }
     }
     return apply_filters('wcsatt_product_subscription_schemes', $schemes, $product);
 }
 /**
  * Load scripts and styles.
  *
  * @return void
  */
 public static function admin_scripts()
 {
     global $post;
     // Get admin screen id.
     $screen = get_current_screen();
     $screen_id = $screen ? $screen->id : '';
     $add_scripts = false;
     $suffix = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? '' : '.min';
     if (in_array($screen_id, array('edit-product', 'product'))) {
         $add_scripts = true;
         $writepanel_dependencies = array('jquery', 'jquery-ui-datepicker', 'wc-admin-meta-boxes', 'wc-admin-product-meta-boxes');
     } elseif ($screen_id === 'woocommerce_page_wc-settings' && isset($_GET['tab']) && $_GET['tab'] === 'subscriptions') {
         $add_scripts = true;
         $writepanel_dependencies = array('jquery', 'jquery-ui-datepicker');
     }
     if ($add_scripts) {
         wp_register_script('wcsatt_writepanel', WCS_ATT()->plugin_url() . '/assets/js/wcsatt-write-panels' . $suffix . '.js', $writepanel_dependencies, WCS_ATT::VERSION);
         wp_register_style('wcsatt_writepanel_css', WCS_ATT()->plugin_url() . '/assets/css/wcsatt-write-panels.css', array('woocommerce_admin_styles'), WCS_ATT::VERSION);
         wp_enqueue_style('wcsatt_writepanel_css');
     }
     // WooCommerce admin pages.
     if (in_array($screen_id, array('product', 'woocommerce_page_wc-settings'))) {
         wp_enqueue_script('wcsatt_writepanel');
         $params = array('add_subscription_scheme_nonce' => wp_create_nonce('wcsatt_add_subscription_scheme'), 'subscription_lengths' => wcs_get_subscription_ranges(), 'wc_ajax_url' => admin_url('admin-ajax.php'), 'post_id' => is_object($post) ? $post->ID : '', 'wc_plugin_url' => WC()->plugin_url());
         wp_localize_script('wcsatt_writepanel', 'wcsatt_admin_params', $params);
     }
 }
 /**
  * Load scripts and styles.
  *
  * @return void
  */
 public static function admin_scripts()
 {
     global $post;
     $suffix = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? '' : '.min';
     // Get admin screen id
     $screen = get_current_screen();
     // Product metaboxes
     if (in_array($screen->id, array('edit-product', 'product'))) {
         wp_register_script('wcsatt_writepanel', WCS_ATT()->plugin_url() . '/assets/js/wcsatt-write-panels' . $suffix . '.js', array('jquery', 'jquery-ui-datepicker', 'wc-admin-meta-boxes', 'wc-admin-product-meta-boxes'), WCS_ATT::VERSION);
         wp_register_style('wcsatt_writepanel_css', WCS_ATT()->plugin_url() . '/assets/css/wcsatt-write-panels.css', array('woocommerce_admin_styles'), WCS_ATT::VERSION);
     }
     // WooCommerce admin pages
     if (in_array($screen->id, array('product'))) {
         wp_enqueue_script('wcsatt_writepanel');
         $params = array('add_subscription_scheme_nonce' => wp_create_nonce('wcsatt_add_subscription_scheme'), 'subscription_lengths' => wcs_get_subscription_ranges(), 'wc_ajax_url' => admin_url('admin-ajax.php'), 'post_id' => $post->ID, 'wc_plugin_url' => WC()->plugin_url());
         wp_localize_script('wcsatt_writepanel', 'wcsatt_admin_params', $params);
     }
     if (in_array($screen->id, array('edit-product', 'product'))) {
         wp_enqueue_style('wcsatt_writepanel_css');
     }
 }
 /**
  * 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;
 }
 /**
  * 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;
 }
         * Show row meta on the plugin screen.
         *
         * @param	mixed $links Plugin Row Meta
         * @param	mixed $file  Plugin Base file
         * @return	array
         */
        public function plugin_meta_links($links, $file, $data, $status)
        {
            if ($file == plugin_basename(__FILE__)) {
                $author1 = '<a href="' . $data['AuthorURI'] . '">' . $data['Author'] . '</a>';
                $author2 = '<a href="http://somewherewarm.net/">SomewhereWarm</a>';
                $links[1] = sprintf(__('By %s'), sprintf(__('%s and %s'), $author1, $author2));
            }
            return $links;
        }
    }
}
// end class_exists check
/**
 * Returns the main instance of WCS_ATT to prevent the need to use globals.
 *
 * @since  1.0.0
 * @return WooCommerce Cart Subscriptions
 */
function WCS_ATT()
{
    return WCS_ATT::instance();
}
// Launch the whole plugin
$GLOBALS['woocommerce_subscriptions_cart'] = WCS_ATT();
 /**
  * Override the WooCommerce "Add to Cart" button text with "Sign Up Now".
  *
  * @since 1.1.1
  */
 public static function add_to_cart_text($button_text)
 {
     global $product;
     $product_schemes = get_post_meta($product->id, '_wcsatt_schemes', true);
     $force_subscription = get_post_meta($product->id, '_wcsatt_force_subscription', true);
     if (in_array($product->product_type, WCS_ATT()->get_supported_product_types()) && $product_schemes) {
         if ('yes' === $force_subscription) {
             $button_text = get_option(WC_Subscriptions_Admin::$option_prefix . '_add_to_cart_button_text', __('Sign Up Now', WCS_ATT::TEXT_DOMAIN));
         }
     }
     return apply_filters('wcsatt_add_to_cart_text', $button_text);
 }
         * Show row meta on the plugin screen.
         *
         * @param	mixed $links Plugin Row Meta
         * @param	mixed $file  Plugin Base file
         * @return	array
         */
        public function plugin_meta_links($links, $file, $data, $status)
        {
            if ($file == plugin_basename(__FILE__)) {
                $author1 = '<a href="' . $data['AuthorURI'] . '">' . $data['Author'] . '</a>';
                $author2 = '<a href="http://somewherewarm.net/">SomewhereWarm</a>';
                $links[1] = sprintf(__('By %s'), sprintf(__('%s and %s'), $author1, $author2));
            }
            return $links;
        }
    }
}
// end class_exists check
/**
 * Returns the main instance of WCS_ATT to prevent the need to use globals.
 *
 * @since  1.0.0
 * @return WooCommerce Subscribe All the Things
 */
function WCS_ATT()
{
    return WCS_ATT::instance();
}
// Launch the whole plugin.
$GLOBALS['woocommerce_subscribe_all_the_things'] = WCS_ATT();
 /**
  * Displays cart item options for purchasing a product once or creating a subscription from it.
  *
  * @param  string $subtotal
  * @param  array  $cart_item
  * @param  string $cart_item_key
  * @return string
  */
 public static function convert_to_sub_options($subtotal, $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 $subtotal;
     }
     if (!$show_convert_to_sub_options) {
         return $subtotal;
     }
     // 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;
         }
     }
     $options = array();
     $active_subscription_scheme_id = WCS_ATT_Schemes::get_active_subscription_scheme_id($cart_item);
     if ($allow_one_time_option) {
         $options[] = array('id' => '0', 'description' => __('only this time', WCS_ATT::TEXT_DOMAIN), 'selected' => $active_subscription_scheme_id === '0');
     }
     foreach ($subscription_schemes as $subscription_scheme) {
         $subscription_scheme_id = $subscription_scheme['id'];
         if ($cart_item['data']->is_converted_to_sub === 'yes' && $subscription_scheme_id === $active_subscription_scheme_id) {
             // if the cart item is converted to a sub, create the subscription price suffix using the already-populated subscription properties
             $sub_suffix = WC_Subscriptions_Product::get_price_string($cart_item['data'], array('subscription_price' => false));
         } else {
             // if the cart item has not been converted to a sub, populate the product with the subscription properties, generate the suffix and reset
             $_cloned = clone $cart_item['data'];
             $_cloned->is_converted_to_sub = 'yes';
             $_cloned->subscription_period = $subscription_scheme['subscription_period'];
             $_cloned->subscription_period_interval = $subscription_scheme['subscription_period_interval'];
             $_cloned->subscription_length = $subscription_scheme['subscription_length'];
             $sub_suffix = WC_Subscriptions_Product::get_price_string($_cloned, array('subscription_price' => false));
         }
         $options[] = array('id' => $subscription_scheme_id, 'description' => $sub_suffix, '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 $subtotal;
     }
     // Grab subtotal without Subs formatting
     remove_filter('woocommerce_cart_product_subtotal', 'WC_Subscriptions_Cart' . '::get_formatted_product_subtotal', 11, 4);
     remove_filter('woocommerce_cart_item_subtotal', __CLASS__ . '::convert_to_sub_options', 1000, 3);
     $subtotal = apply_filters('woocommerce_cart_item_subtotal', WC()->cart->get_product_subtotal($cart_item['data'], $cart_item['quantity']), $cart_item, $cart_item_key);
     add_filter('woocommerce_cart_item_subtotal', __CLASS__ . '::convert_to_sub_options', 1000, 3);
     add_filter('woocommerce_cart_product_subtotal', 'WC_Subscriptions_Cart' . '::get_formatted_product_subtotal', 11, 4);
     ob_start();
     wc_get_template('cart-item-options.php', array('options' => $options, 'cart_item_key' => $cart_item_key), false, WCS_ATT()->plugin_path() . '/templates/');
     $convert_to_sub_options = ob_get_clean();
     $subtotal = $subtotal . $convert_to_sub_options;
     return $subtotal;
 }