hooks(); } /** * Initiator. */ public static function get_instance() { if ( !self::$instance ) { self::$instance = new self; } return self::$instance; } /** * Adds actions/filters. */ public function hooks() { global $nectar_options; // Empty Mini Cart Content. if( isset($nectar_options['ajax-cart-style']) && 'slide_in_click' === $nectar_options['ajax-cart-style'] ) { add_action( 'woocommerce_after_mini_cart', array($this, 'empty_minicart_buttons'), 10); } // Mini Cart QTY AJAX. add_action( 'wp_ajax_nectar_minicart_update_quantity', array($this, 'update_cart_quantity' ) ); add_action( 'wp_ajax_nopriv_nectar_minicart_update_quantity', array($this, 'update_cart_quantity' ) ); // Single Product AJAX Add to Cart if( isset($nectar_options['ajax-add-to-cart']) && '1' === $nectar_options['ajax-add-to-cart']) { $editing_subscription = isset($_GET['switch-subscription']) ? true : false; if ( !$editing_subscription ) { add_action( 'wp_ajax_nectar_ajax_add_to_cart', array($this, 'add_to_cart' ) ); add_action( 'wp_ajax_nopriv_nectar_ajax_add_to_cart', array($this, 'add_to_cart' ) ); } } } /** * Adds in the WooCommerce minicart buttons * even when the cart is empty. */ public static function empty_minicart_buttons() { if( WC()->cart->is_empty() ) { echo '

'; do_action( 'woocommerce_widget_shopping_cart_total' ); echo '

'; do_action('woocommerce_widget_shopping_cart_buttons'); echo '
'; } } /** * Compatibility for WooCommerce Min/Max Quantities plugin. */ public static function get_minmax_quantities($item_key) { $minimum_quantity = 0; $maximum_quantity = 0; // Check for WooCommerce min/max variation quantity. if( class_exists('WC_Min_Max_Quantities') ) { $product = WC()->cart->get_cart_item($item_key); if( $product && isset( $product['variation_id'] ) ) { $variation_id = $product['variation_id']; $product_id = $product['product_id']; $min_max_rules = get_post_meta( $variation_id, 'min_max_rules', true ); if ( 'yes' === $min_max_rules ) { $maximum_quantity = absint( get_post_meta( $variation_id, 'variation_maximum_allowed_quantity', true ) ); $minimum_quantity = absint( get_post_meta( $variation_id, 'variation_minimum_allowed_quantity', true ) ); // If the Minimum Quantity is not set on variation level, fall back to the parent's. if ( 0 === $maximum_quantity ) { $maximum_quantity = absint( get_post_meta( $product_id, 'maximum_allowed_quantity', true ) ); } // If the Maximum Quantity is not set on variation level, fall back to the parent's. if ( 0 === $minimum_quantity ) { $minimum_quantity = absint( get_post_meta( $product_id, 'minimum_allowed_quantity', true ) ); } } else { // default to product min/max $maximum_quantity = absint( get_post_meta( $product_id, 'maximum_allowed_quantity', true ) ); $minimum_quantity = absint( get_post_meta( $product_id, 'minimum_allowed_quantity', true ) ); } } // endif $product has variation_id } // endif WC_Min_Max_Quantities is active return [ 'min' => $minimum_quantity, 'max' => $maximum_quantity ]; } /** * AJAX callback to update the minicart quantity. */ public static function update_cart_quantity() { if( !isset($_POST['quantity']) || !isset($_POST['item_key']) || !function_exists('WC') ) { wp_die(); } $quantity = absint( $_POST['quantity'] ); $item_key = sanitize_text_field( $_POST['item_key'] ); // Check for WooCommerce min/max variation quantity. $min_max_quantities = self::get_minmax_quantities($item_key); $maximum_quantity = $min_max_quantities['max']; $minimum_quantity = $min_max_quantities['min']; if ( $maximum_quantity && $quantity > $maximum_quantity ) { $quantity = $maximum_quantity; } if ( $minimum_quantity && $quantity < $minimum_quantity ) { $quantity = $minimum_quantity; } // Check to make sure the item exists. if ( !WC()->cart->get_cart_item( $item_key ) ) { wp_die(); } WC()->cart->set_quantity( $item_key, $quantity, true ); WC()->cart->calculate_totals(); $cart_item = WC()->cart->get_cart_item($item_key); $item_price = WC()->cart->get_product_price( $cart_item['data'] ); wp_send_json( array( 'item' => $cart_item, 'item_price' => apply_filters( 'woocommerce_cart_item_price', $item_price, $cart_item, $item_key ), 'subtotal' => WC()->cart->get_cart_subtotal(), 'item_count' => WC()->cart->get_cart_contents_count() ) ); wp_die(); } /** * AJAX callback for add to cart. */ public static function add_to_cart() { if( !isset($_POST['add-to-cart']) || !function_exists('WC') ) { wp_die(); } // Triggers WooCommerce to add to the cart. $product_id = absint( $_POST['add-to-cart'] ); // Check for errors to output. $error_notices = wc_get_notices('error'); wc_clear_notices(); if( empty($error_notices) ) { do_action( 'woocommerce_ajax_added_to_cart', $product_id ); } // Get updated fragments. ob_start(); woocommerce_mini_cart(); $mini_cart = ob_get_clean(); $data = array( 'fragments' => apply_filters( 'woocommerce_add_to_cart_fragments', array( 'div.widget_shopping_cart_content' => '
' . $mini_cart . '
', ) ), 'cart_hash' => WC()->cart->get_cart_hash(), 'notices' => $error_notices ); // Send the data. wp_send_json( $data ); wp_die(); } } } /** * Initialize the Nectar_Woo_Cart class */ Nectar_Woo_Cart::get_instance();