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