*/ class Addonify_Floating_Cart_Public { /** * The ID of this plugin. * * @since 1.0.0 * @access private * @var string $plugin_name The ID of this plugin. */ private $plugin_name; /** * The version of this plugin. * * @since 1.0.0 * @access private * @var string $version The current version of this plugin. */ private $version; /** * Floating cart enabled. * * @since 1.0.0 * @access private * @var boolean $cart_enabled Floating cart enabled. */ private $cart_enabled; /** * Strings from settings. * * @since 1.2.5 * * @access public * @var string $strings_from_setting Strings enabled from setting. */ public $strings_from_setting; /** * Enabled shipping address update. * * @since 1.2.6 * * @access public * @var boolean $is_shipping_address_updatable Shipping address update enabled. */ public $shipping_address_updatable; /** * Security token error message. * * @since 1.2.6 * * @access public * @var string $security_token_error_message ecurity token error message. */ public $security_token_error_message; /** * Coupon code removal message. * * @since 1.2.6 * * @access public * @var string $coupon_code_removal_message Coupon code removal message. */ public $coupon_code_removal_message; /** * Initialize the class and set its properties. * * @since 1.0.0 * @param string $plugin_name The name of the plugin. * @param string $version The version of this plugin. */ public function __construct( $plugin_name, $version ) { $this->plugin_name = $plugin_name; $this->version = $version; } /** * Public Init Function */ public function init() { $this->cart_enabled = ( addonify_floating_cart_get_option( 'enable_floating_cart' ) === '1' ); if ( ! $this->cart_enabled ) { return; } $this->strings_from_setting = addonify_floating_cart_get_option( 'enable_cart_labels_from_plugin' ); $this->security_token_error_message = esc_html__( 'Invalid security token.', 'addonify-floating-cart' ); $this->coupon_code_removal_message = esc_html__( 'Coupon has been removed.', 'addonify-floating-cart' ); if ( '1' === $this->strings_from_setting ) { $saved_security_token_error_message = addonify_floating_cart_get_option( 'invalid_security_token_message' ); if ( $saved_security_token_error_message ) { $this->security_token_error_message = $saved_security_token_error_message; } $saved_coupon_code_removal_message = addonify_floating_cart_get_option( 'coupon_removed_message' ); if ( $saved_coupon_code_removal_message ) { $this->coupon_code_removal_message = $saved_coupon_code_removal_message; } } $this->shipping_address_updatable = ( addonify_floating_cart_get_option( 'display_shipping_cost_in_cart_subtotal' ) === '1' && 'yes' === get_option( 'woocommerce_enable_shipping_calc' ) ) ? true : false; $this->register_ajax_actions(); add_filter( 'woocommerce_add_to_cart_fragments', array( $this, 'add_to_cart_ajax' ) ); } /** * Register ajax actions. */ public function register_ajax_actions() { if ( is_cart() || is_checkout() ) { return; } add_action( 'wp_ajax_addonify_floating_cart_add_to_cart', array( $this, 'add_to_cart' ) ); add_action( 'wp_ajax_nopriv_addonify_floating_cart_add_to_cart', array( $this, 'add_to_cart' ) ); add_action( 'wp_ajax_addonify_floating_cart_remove_from_cart', array( $this, 'remove_from_cart' ) ); add_action( 'wp_ajax_nopriv_addonify_floating_cart_remove_from_cart', array( $this, 'remove_from_cart' ) ); add_action( 'wp_ajax_addonify_floating_cart_restore_in_cart', array( $this, 'restore_in_cart' ) ); add_action( 'wp_ajax_nopriv_addonify_floating_cart_restore_in_cart', array( $this, 'restore_in_cart' ) ); add_action( 'wp_ajax_addonify_floating_cart_update_cart_item', array( $this, 'update_cart_item' ) ); add_action( 'wp_ajax_nopriv_addonify_floating_cart_update_cart_item', array( $this, 'update_cart_item' ) ); add_action( 'wp_ajax_addonify_floating_cart_apply_coupon', array( $this, 'apply_coupon' ) ); add_action( 'wp_ajax_nopriv_addonify_floating_cart_apply_coupon', array( $this, 'apply_coupon' ) ); add_action( 'wp_ajax_addonify_floating_cart_remove_coupon', array( $this, 'remove_coupon' ) ); add_action( 'wp_ajax_nopriv_addonify_floating_cart_remove_coupon', array( $this, 'remove_coupon' ) ); add_action( 'wp_ajax_addonify_floating_update_shipping_info', array( $this, 'update_shipping_info' ) ); add_action( 'wp_ajax_nopriv_addonify_floating_update_shipping_info', array( $this, 'update_shipping_info' ) ); add_action( 'wp_ajax_addonify_floating_update_shipping_method', array( $this, 'update_shipping_method' ) ); add_action( 'wp_ajax_nopriv_addonify_floating_update_shipping_method', array( $this, 'update_shipping_method' ) ); add_action( 'wp_ajax_addonify_floating_cart_refresh_cart_fragments', array( $this, 'refresh_cart_fragments' ) ); add_action( 'wp_ajax_nopriv_addonify_floating_cart_refresh_cart_fragments', array( $this, 'refresh_cart_fragments' ) ); add_shortcode( 'afc_cart_icon', array( $this, 'cart_toggle_button' ) ); } /** * Register the stylesheets for the public-facing side of the site. * * @since 1.0.0 */ public function enqueue_styles() { if ( is_cart() || is_checkout() || ! $this->cart_enabled ) { return; } wp_enqueue_style( 'notyf', plugin_dir_url( __FILE__ ) . 'assets/libs/notfy/notfy.min.css', array(), '3-afc', 'all' ); wp_enqueue_style( 'perfect-scrollbar', plugin_dir_url( __FILE__ ) . 'assets/libs/perfect-scrollbar/perfect-scrollbar.min.css', array(), '1.5.3-afc', 'all' ); if ( $this->shipping_address_updatable ) { wp_enqueue_style( 'select2', plugin_dir_url( __FILE__ ) . 'assets/libs/select2/select2.min.css', array(), '4.0.3-afc', 'all' ); } wp_enqueue_style( $this->plugin_name, plugin_dir_url( __FILE__ ) . 'assets/build/public.min.css', array(), $this->version, 'all' ); if ( (int) addonify_floating_cart_get_option( 'load_styles_from_plugin' ) === 1 ) { $inline_css = $this->dynamic_css(); $custom_css = addonify_floating_cart_get_option( 'custom_css' ); if ( $custom_css ) { $inline_css .= $custom_css; } $inline_css = $this->minify_css( $inline_css ); wp_add_inline_style( $this->plugin_name, $inline_css ); } } /** * Register the JavaScript for the public-facing side of the site. * * @since 1.0.0 */ public function enqueue_scripts() { if ( is_cart() || is_checkout() || ! $this->cart_enabled ) { return; } if ( did_action( 'woocommerce_init' ) ) { $states = array(); $countries = WC()->countries->get_allowed_countries(); foreach ( $countries as $i => $country ) { $states[ $i ] = WC()->countries->get_states( $i ); } } wp_enqueue_script( 'notyf', plugin_dir_url( __FILE__ ) . 'assets/libs/notfy/notfy.min.js', array(), '3-afc', true ); wp_enqueue_script( 'perfect-scrollbar', plugin_dir_url( __FILE__ ) . 'assets/libs/perfect-scrollbar/perfect-scrollbar.min.js', array(), '1.5.3-afc', true ); if ( $this->shipping_address_updatable ) { wp_enqueue_script( 'selectWoo', plugin_dir_url( __FILE__ ) . 'assets/libs/selectWoo/selectWoo.full.min.js', array(), '1.0.10-afc', true ); } wp_enqueue_script( $this->plugin_name . '-public', plugin_dir_url( __FILE__ ) . 'assets/build/public.min.js', array( 'jquery', 'wp-i18n' ), $this->version, true ); $added_to_cart_notification_text = esc_html__( '{product_name} has been added to cart.', 'addonify-floating-cart' ); $show_cart_button_label = esc_html__( 'Show Cart', 'addonify-floating-cart' ); if ( '1' === $this->strings_from_setting ) { $saved_added_to_cart_notification_text = addonify_floating_cart_get_option( 'added_to_cart_notification_text' ); if ( $saved_added_to_cart_notification_text ) { $added_to_cart_notification_text = $saved_added_to_cart_notification_text; } $saved_show_cart_button_label = addonify_floating_cart_get_option( 'show_cart_button_label' ); if ( $saved_show_cart_button_label ) { $show_cart_button_label = $saved_show_cart_button_label; } } wp_localize_script( $this->plugin_name . '-public', 'addonifyFloatingCartJSObject', array( 'ajax_url' => admin_url( 'admin-ajax.php' ), 'ajax_add_to_cart_action' => 'addonify_floating_cart_add_to_cart', 'ajax_restore_in_cart_action' => 'addonify_floating_cart_restore_in_cart', 'ajax_remove_from_cart_action' => 'addonify_floating_cart_remove_from_cart', 'ajax_update_cart_item_action' => 'addonify_floating_cart_update_cart_item', 'ajax_apply_coupon' => 'addonify_floating_cart_apply_coupon', 'ajax_remove_coupon' => 'addonify_floating_cart_remove_coupon', 'ajax_refresh_cart_fragments' => 'addonify_floating_cart_refresh_cart_fragments', 'shippingAddressUpdatable' => $this->shipping_address_updatable, 'updateShippingInfo' => 'addonify_floating_update_shipping_info', 'updateShippingMethod' => 'addonify_floating_update_shipping_method', 'nonce' => wp_create_nonce( 'addonify-floating-cart-ajax-nonce' ), 'addonifyFloatingCartNotifyShow' => addonify_floating_cart_get_option( 'display_toast_notification' ), 'addonifyFloatingCartNotifyDuration' => (int) addonify_floating_cart_get_option( 'close_notification_after_time' ) * 1000, 'addonifyFloatingCartNotifyDismissible' => addonify_floating_cart_get_option( 'display_close_notification_button' ), 'displayToastNotificationButton' => addonify_floating_cart_get_option( 'display_show_cart_button' ), 'addonifyFloatingCartNotifyMessage' => $added_to_cart_notification_text, 'toast_notification_display_position' => addonify_floating_cart_get_option( 'toast_notification_display_position' ), 'openCartModalOnTriggerButtonHover' => addonify_floating_cart_get_option( 'open_cart_modal_on_trigger_button_mouse_hover' ), 'open_cart_modal_after_click_on_view_cart' => addonify_floating_cart_get_option( 'open_cart_modal_after_click_on_view_cart' ), 'open_cart_modal_immediately_after_add_to_cart' => addonify_floating_cart_get_option( 'open_cart_modal_immediately_after_add_to_cart' ), 'show_cart_button_label' => $show_cart_button_label, 'toastNotificationButton' => $this->toast_notification_button_template(), 'hideTriggerButtonIfCartIsEmpty' => addonify_floating_cart_get_option( 'hide_modal_toggle_button_on_empty_cart' ), 'hideCartOnOverlayClicked' => addonify_floating_cart_get_option( 'close_cart_modal_on_overlay_click' ), 'states' => $states, 'customToggleBtnClass' => addonify_floating_cart_get_option( 'custom_class_to_toggle_button' ), 'hideScreenWhenCouponIsApplied' => addonify_floating_cart_get_option( 'hide_screen_when_coupon_applied' ), 'hideScreenWhenShippingAddressUpdated' => addonify_floating_cart_get_option( 'hide_screen_when_shipping_address_updated' ), ) ); } /** * Callback function for `add_shortcode( 'afc_cart_toggle_button' )`. * * @since 1.2.7 * * @param array $attrs Shortcode attributes. */ public function cart_toggle_button( $attrs ) { if ( is_admin() || ( defined( 'REST_REQUEST' ) && REST_REQUEST ) ) { return; } $default_attrs = array( 'icon' => 'icon_6', 'class' => '', 'display_items_count' => 'true', 'items_count_position' => 'top-right', 'id' => '', ); $shortcode_attrs = wp_parse_args( $attrs, $default_attrs ); $button_attributes = array( 'class' => 'adfy_fc__woo-trigger-shortcode-button adfy__show-woofc', ); if ( isset( $shortcode_attrs['id'] ) && $shortcode_attrs['id'] ) { $button_attributes['id'] = esc_attr( $shortcode_attrs['id'] ); } if ( isset( $shortcode_attrs['class'] ) && $shortcode_attrs['class'] ) { $button_attributes['class'] .= ' ' . esc_attr( $shortcode_attrs['class'] ); } $button_svg_icons = addonify_floating_cart_get_cart_modal_toggle_button_icons(); ob_start(); ?> > cart->get_cart_contents() ); } else { $cart_count = WC()->cart->get_cart_contents_count(); } $count_positions = array( 'top-right', 'top-left', ); $count_position = ( isset( $shortcode_attrs['items_count_position'] ) && $shortcode_attrs['items_count_position'] && in_array( $shortcode_attrs['items_count_position'], $count_positions, true ) ) ? $shortcode_attrs['items_count_position'] : 'top-right'; ?> strings_from_setting ) { $saved_show_cart_button_label = addonify_floating_cart_get_option( 'show_cart_button_label' ); if ( $saved_show_cart_button_label ) { $show_cart_button_label = $saved_show_cart_button_label; } } return apply_filters( 'addonify_floating_cart_toast_notification_button', "' ); } /** * Insert sidebar cart toggle button and sidebar cart at the footer. * * @since 1.0.0 */ public function footer_content() { if ( is_cart() || is_checkout() || ! $this->cart_enabled ) { return; } WC()->cart->calculate_totals(); WC()->cart->maybe_set_cart_cookies(); do_action( 'addonify_floating_cart_footer_template', $this->strings_from_setting ); } /** * Function updating cart fragments through ajax call * returns array of cart fragments * * @param array $fragments Fragments. * @return array */ public function add_to_cart_ajax( $fragments = array() ) { $this->check_cart_item_validity_and_stock(); WC()->cart->calculate_totals(); WC()->cart->maybe_set_cart_cookies(); $this->check_coupons(); // Clear all WC notices from the session. wc_clear_notices(); if ( isset( $_POST['product_id'] ) ) { //phpcs:ignore $product = wc_get_product( absint( $_POST['product_id'] ) ); //phpcs:ignore $fragments['product'] = $product->get_title(); } if ( addonify_floating_cart_get_option( 'cart_badge_items_total_count' ) === 'total_products' ) { $cart_items_count = count( WC()->cart->get_cart_contents() ); } else { $cart_items_count = WC()->cart->get_cart_contents_count(); } ob_start(); addonify_floating_cart_display_items_count( $cart_items_count, $this->strings_from_setting ); $fragments['.adfy__woofc-badge'] = ob_get_clean(); ob_start(); do_action( 'addonify_floating_cart_sidebar_cart_body', $this->strings_from_setting ); $fragments['.adfy__woofc-content'] = ob_get_clean(); ob_start(); do_action( 'addonify_floating_cart_sidebar_cart_applied_coupons', $this->strings_from_setting ); $fragments['.adfy__woofc-coupons'] = ob_get_clean(); $fragments['.adfy_woofc-badge-count'] = '' . esc_html( $cart_items_count ) . ''; ob_start(); do_action( 'addonify_floating_cart_sidebar_cart_footer', $this->strings_from_setting ); $fragments['.adfy__woofc-colophon'] = ob_get_clean(); ob_start(); ?>
strings_from_setting ); ?>
strings_from_setting ); ?>
add_to_cart_ajax() ); wp_send_json( $return_response ); } wp_die(); } /** * Function for ajax call to remove item from cart. * prints array of cart fragments * * @since 1.0.0 */ public function remove_from_cart() { $return_response = array( 'success' => false, ); $nonce = isset( $_POST['nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['nonce'] ) ) : ''; if ( $nonce && wp_verify_nonce( $nonce, 'addonify-floating-cart-ajax-nonce' ) ) { $product_name = ''; $post_product_id = isset( $_POST['product_id'] ) ? (int) sanitize_text_field( wp_unslash( $_POST['product_id'] ) ) : ''; $post_cart_item_key = isset( $_POST['cart_item_key'] ) ? sanitize_text_field( wp_unslash( $_POST['cart_item_key'] ) ) : ''; foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) { if ( $cart_item['product_id'] === $post_product_id && $cart_item_key === $post_cart_item_key ) { $product = wc_get_product( $cart_item['product_id'] ); $product_name = $product->get_title(); if ( WC()->cart->remove_cart_item( $cart_item_key ) === true ) { $product_removal_text = esc_html__( '{product_name} has been removed.', 'addonify-floating-cart' ); if ( '1' === $this->strings_from_setting ) { $saved_product_removal_text = addonify_floating_cart_get_option( 'product_removal_text' ); if ( $saved_product_removal_text ) { $product_removal_text = $saved_product_removal_text; } } $return_response['success'] = true; $return_response['cart_hash'] = WC()->cart->get_cart_hash(); $return_response['message'] = $product_removal_text; $return_response['undo_product_link'] = $this->cart_undo_template( $product_name, $cart_item_key ); } else { $return_response['success'] = false; $return_response['message'] = esc_html__( "Error removing {$product_name} from the cart.", 'addonify-floating-cart' ); //phpcs:ignore } break; } else { $return_response['success'] = false; $return_response['message'] = esc_html__( 'Invalid product id or cart item key.', 'addonify-floating-cart' ); } } WC()->cart->calculate_totals(); WC()->cart->maybe_set_cart_cookies(); // Fragments returned. $return_response['fragments'] = apply_filters( 'woocommerce_add_to_cart_fragments', $this->add_to_cart_ajax() ); $return_response['cart_items_count'] = WC()->cart->get_cart_contents_count(); if ( WC()->cart->get_cart_contents_count() === 0 ) { ob_start(); do_action( 'addonify_floating_cart_render_empty_cart', $this->strings_from_setting ); $return_response['empty_cart_message'] = ob_get_clean(); } wp_send_json( $return_response ); } wp_send_json( array( 'success' => false, 'message' => esc_html( $this->security_token_error_message ), ) ); } /** * Restore removed cart item through ajax. * * @since 1.0.0 */ public function restore_in_cart() { $return_response = array( 'success' => false, 'message' => '', ); $nonce = isset( $_POST['nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['nonce'] ) ) : ''; if ( $nonce && wp_verify_nonce( $nonce, 'addonify-floating-cart-ajax-nonce' ) ) { $post_cart_item_key = isset( $_POST['cart_item_key'] ) ? sanitize_text_field( wp_unslash( $_POST['cart_item_key'] ) ) : ''; if ( ! empty( $post_cart_item_key ) ) { if ( ! array_key_exists( $post_cart_item_key, WC()->cart->get_cart() ) ) { $restored = WC()->cart->restore_cart_item( $post_cart_item_key ); WC()->cart->calculate_totals(); WC()->cart->maybe_set_cart_cookies(); if ( $restored ) { $return_response['success'] = true; $return_response['message'] = apply_filters( 'addonify_floating_cart_item_restored_success_message', __( 'Restored successfully.', 'addonify-floating-cart' ) ); } else { $return_response['success'] = false; $return_response['message'] = apply_filters( 'addonify_floating_cart_item_restore_failure_message', __( 'Could not be restored.', 'addonify-floating-cart' ) ); } } else { $return_response['success'] = false; $return_response['message'] = apply_filters( 'addonify_floating_cart_item_already_in_cart_message', __( 'Already exists in cart', 'addonify-floating-cart' ) ); } } else { $return_response['success'] = false; $return_response['message'] = apply_filters( 'addonify_floating_cart_item_restore_key_missing_message', __( 'Key Missing', 'addonify-floating-cart' ) ); } $fragments = apply_filters( 'woocommerce_add_to_cart_fragments', $this->add_to_cart_ajax() ); ob_start(); do_action( 'addonify_floating_cart_sidebar_cart_body', array() ); $fragments['.adfy__woofc-content'] = ob_get_clean(); $return_response['fragments'] = $fragments; $return_response['cart_items_count'] = WC()->cart->get_cart_contents_count(); wp_send_json( $return_response ); } wp_send_json( array( 'success' => false, 'message' => esc_html( $this->security_token_error_message ), ) ); } /** * Function for ajax call to update item in cart * prints array of cart fragments. * * @since 1.0.0 */ public function update_cart_item() { $nonce = isset( $_POST['nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['nonce'] ) ) : ''; if ( $nonce && wp_verify_nonce( $nonce, 'addonify-floating-cart-ajax-nonce' ) ) { $error_message = ''; $quantity = false; foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) { $product = wc_get_product( $cart_item['product_id'] ); $post_product_id = isset( $_POST['product_id'] ) ? (int) sanitize_text_field( wp_unslash( $_POST['product_id'] ) ) : ''; $post_cart_item_key = isset( $_POST['cart_item_key'] ) ? sanitize_text_field( wp_unslash( $_POST['cart_item_key'] ) ) : ''; $post_quantity = isset( $_POST['quantity'] ) ? (int) sanitize_text_field( wp_unslash( $_POST['quantity'] ) ) : 0; if ( $post_product_id && $cart_item['product_id'] === $post_product_id && $cart_item_key === $post_cart_item_key ) { $post_type = isset( $_POST['type'] ) ? sanitize_text_field( wp_unslash( $_POST['type'] ) ) : ''; $quantity = $cart_item['quantity']; switch ( $post_type ) { case 'add': $post_quantity = $quantity + 1; break; case 'sub': $post_quantity = $quantity - 1; break; default: break; } if ( $post_quantity <= 0 ) { $error_message = apply_filters( 'addonify_floating_cart_quantity_update_failure_less_than_zero_message', esc_html__( 'Quantity must be more than zero.', 'addonify-floating-cart' ) ); unset( $post_quantity ); break; } if ( $product->get_stock_quantity() ) { if ( $product->get_stock_quantity() >= $post_quantity ) { WC()->cart->set_quantity( $cart_item_key, $post_quantity ); } else { $error_message = apply_filters( 'addonify_floating_cart_quantity_update_failure_no_stock_message', esc_html__( 'Not available in the stock.', 'addonify-floating-cart' ) ); unset( $post_quantity ); } } else { WC()->cart->set_quantity( $cart_item_key, $post_quantity ); } break; } } WC()->cart->calculate_totals(); WC()->cart->maybe_set_cart_cookies(); // Fragments returned. $data = array( 'nQuantity' => isset( $post_quantity ) ? $post_quantity : $quantity, 'fragments' => apply_filters( 'woocommerce_add_to_cart_fragments', $this->add_to_cart_ajax() ), ); if ( ! empty( $error_message ) ) { $data['success'] = false; $data['message'] = $error_message; } else { $data['success'] = true; $data['message'] = apply_filters( 'addonify_floating_cart_quantity_update_success_message', esc_html__( 'Quantity updated successfully.', 'addonify-floating-cart' ) ); } wp_send_json( $data ); } wp_send_json( array( 'success' => false, 'message' => esc_html( $this->security_token_error_message ), ) ); } /** * Function to check cart items validity and stock. * * @since 1.0.17 */ public function check_cart_item_validity_and_stock() { $return = true; $result = WC()->cart->check_cart_item_validity(); if ( is_wp_error( $result ) ) { wc_add_notice( $result->get_error_message(), 'error' ); $return = false; } $remove_item_if_not_in_stock = (int) addonify_floating_cart_get_option( 'remove_product_from_cart_if_not_in_stock' ); if ( 1 === $remove_item_if_not_in_stock ) { foreach ( WC()->cart->get_cart() as $key => $cart_item ) { $product = $cart_item['data']; // Check stock based on stock-status. if ( ! $product->is_in_stock() ) { WC()->cart->remove_cart_item( $key ); } } } } /** * Function for ajax call to apply coupon in cart * prints array of coupon div and if the coupon was applied status * * @since 1.0.0 */ public function apply_coupon() { if ( ! wp_doing_ajax() ) { wp_die(); } $coupon_apply = false; $nonce = isset( $_POST['nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['nonce'] ) ) : ''; if ( $nonce && wp_verify_nonce( $nonce, 'addonify-floating-cart-ajax-nonce' ) ) { $coupon_code = isset( $_POST['form_data'] ) ? sanitize_text_field( wp_unslash( $_POST['form_data'] ) ) : ''; if ( ! empty( $coupon_code ) ) { $coupons_applied_before = WC()->cart->get_applied_coupons(); $coupon_apply = WC()->cart->apply_coupon( $coupon_code ); } } else { wc_add_notice( esc_html( $this->security_token_error_message ), 'error' ); } $coupon_notices = $this->get_coupon_notices(); $fragments = $this->add_to_cart_ajax(); $fragments['#adfy__woofc-coupon-alerts'] = $coupon_notices; wp_send_json( array( 'couponApplied' => $coupon_apply, 'appliedCoupons' => count( WC()->cart->get_applied_coupons() ), 'html' => apply_filters( 'woocommerce_add_to_cart_fragments', $fragments ), ) ); } /** * Function for ajax call to remove coupon in cart * prints array of coupon div and if the coupon was removed status * * @since 1.0.0 */ public function remove_coupon() { if ( ! wp_doing_ajax() ) { wp_die(); } $coupon_remove = false; $nonce = isset( $_POST['nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['nonce'] ) ) : ''; if ( $nonce && wp_verify_nonce( $nonce, 'addonify-floating-cart-ajax-nonce' ) ) { $coupon_code = isset( $_POST['form_data'] ) ? sanitize_text_field( wp_unslash( $_POST['form_data'] ) ) : ''; if ( ! empty( $coupon_code ) ) { $coupon_remove = WC()->cart->remove_coupon( $coupon_code ); wc_add_notice( esc_html( $this->coupon_code_removal_message ) ); } } else { wc_add_notice( esc_html( $this->security_token_error_message ), 'error' ); } $coupon_notices = $this->get_coupon_notices(); $fragments = $this->add_to_cart_ajax(); $fragments['#adfy__woofc-coupon-alerts'] = $coupon_notices; wp_send_json( array( 'couponRemoved' => $coupon_remove, 'appliedCoupons' => count( WC()->cart->get_applied_coupons() ), 'html' => apply_filters( 'woocommerce_add_to_cart_fragments', $fragments ), ) ); } /** * Function to generate coupon messages if exists. * * @since 1.2.6 * * @return string */ public function get_coupon_notices() { $coupon_notices = WC()->session->get( 'wc_notices', array() ); $coupon_notices_html = '
'; if ( $coupon_notices ) { foreach ( $coupon_notices as $notice_type => $notices ) { switch ( $notice_type ) { case 'success': foreach ( $notices as $notice ) { $coupon_notices_html .= '
' . esc_html( $notice['notice'] ) . '
'; } break; case 'error': foreach ( $notices as $notice ) { $coupon_notices_html .= '
' . esc_html( $notice['notice'] ) . '
'; } break; case 'notice': foreach ( $notices as $notice ) { $coupon_notices_html .= '
' . esc_html( $notice['notice'] ) . '
'; } break; default: } } } $coupon_notices_html .= '
'; return $coupon_notices_html; } /** * Update billing info (ajax). * * @throws Exception $e Shipping exception. */ public function update_shipping_info() { $nonce = isset( $_POST['nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['nonce'] ) ) : ''; if ( ! empty( $nonce ) && wp_verify_nonce( $nonce, 'addonify-floating-cart-shipping' ) ) { $address = array( 'country' => isset( $_POST['calc_shipping_country'] ) ? sanitize_text_field( wp_unslash( $_POST['calc_shipping_country'] ) ) : '', 'state' => isset( $_POST['calc_shipping_state'] ) ? sanitize_text_field( wp_unslash( $_POST['calc_shipping_state'] ) ) : '', 'city' => isset( $_POST['calc_shipping_city'] ) ? sanitize_text_field( wp_unslash( $_POST['calc_shipping_city'] ) ) : '', 'postcode' => isset( $_POST['calc_shipping_postcode'] ) ? sanitize_text_field( wp_unslash( $_POST['calc_shipping_postcode'] ) ) : '', ); try { WC()->shipping()->reset_shipping(); $address = apply_filters( 'woocommerce_cart_calculate_shipping_address', $address ); if ( $address['postcode'] && ! WC_Validation::is_postcode( $address['postcode'], $address['country'] ) ) { throw new Exception( __( 'Please enter a valid postcode / ZIP.', 'addonify-floating-cart' ) ); } elseif ( $address['postcode'] ) { $address['postcode'] = wc_format_postcode( $address['postcode'], $address['country'] ); } if ( $address['country'] ) { if ( ! WC()->customer->get_billing_first_name() ) { WC()->customer->set_billing_location( $address['country'], $address['state'], $address['postcode'], $address['city'] ); } WC()->customer->set_shipping_location( $address['country'], $address['state'], $address['postcode'], $address['city'] ); } else { WC()->customer->set_billing_address_to_base(); WC()->customer->set_shipping_address_to_base(); } WC()->customer->set_calculated_shipping( true ); WC()->customer->save(); do_action( 'woocommerce_calculated_shipping' ); $fragments = $this->add_to_cart_ajax(); ob_start(); do_action( 'addonify_floating_cart_sidebar_cart_shipping' ); $fragments['#adfy__woofc-shipping-container-inner'] = ob_get_clean(); $return_response['fragments'] = $fragments; $return_response['cart_items_count'] = WC()->cart->get_cart_contents_count(); } catch ( Exception $e ) { $return_response = array( 'success' => false, 'message' => $e->getMessage(), ); } wp_send_json( $return_response ); } wp_send_json( array( 'success' => false, 'message' => esc_html( $this->security_token_error_message ), ) ); } /** * Update shipping method */ public function update_shipping_method() { $nonce = isset( $_POST['nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['nonce'] ) ) : ''; if ( $nonce && wp_verify_nonce( $nonce, 'addonify-floating-cart-ajax-nonce' ) ) { $chosen_shipping_methods = WC()->session->get( 'chosen_shipping_methods' ); $posted_shipping_methods = isset( $_POST['shipping_method'] ) ? wc_clean( wp_unslash( $_POST['shipping_method'] ) ) : array(); //phpcs:ignore if ( is_array( $posted_shipping_methods ) ) { foreach ( $posted_shipping_methods as $i => $value ) { $chosen_shipping_methods[ $i ] = $value; } } WC()->session->set( 'chosen_shipping_methods', $chosen_shipping_methods ); // Fragments returned. $return_response['fragments'] = $this->add_to_cart_ajax(); $return_response['cart_items_count'] = WC()->cart->get_cart_contents_count(); $return_response['success'] = true; if ( WC()->cart->get_cart_contents_count() === 0 ) { ob_start(); do_action( 'addonify_floating_cart_render_empty_cart', $this->strings_from_setting ); $return_response['empty_cart_message'] = ob_get_clean(); } wp_send_json( $return_response ); } wp_send_json( array( 'success' => false, 'message' => esc_html( $this->security_token_error_message ), ) ); } /** * Function to check if all the applied coupons are valid * Rejects coupons that are no longer valid in cart * * @since 1.0.0 */ public function check_coupons() { WC()->cart->check_cart_coupons(); } /** * Define template displaying product remove Undo link. * * @since 1.0.0 * @param string $product_name Name of the product. * @param string $cart_item_key Key of the cart item. */ public function cart_undo_template( $product_name, $cart_item_key ) { $product_removal_text = esc_html__( '{product_name} has been removed.', 'addonify-floating-cart' ); $undo_text = esc_html__( 'Undo?', 'addonify-floating-cart' ); if ( '1' === $this->strings_from_setting ) { $saved_product_removal_text = addonify_floating_cart_get_option( 'product_removal_text' ); if ( $saved_product_removal_text ) { $product_removal_text = $saved_product_removal_text; } $saved_undo_text = addonify_floating_cart_get_option( 'product_removal_undo_text' ); if ( $saved_undo_text ) { $undo_text = $saved_undo_text; } } $product_removal_text = str_replace( '{product_name}', $product_name, $product_removal_text ); return esc_html( $product_removal_text ) . ' ' . esc_html( $undo_text ) . ''; } /** * Render template for displaying discount amount in the cart summary. * * @since 1.0.0 */ public function discount_template() { return apply_filters( 'addonify_floating_cart_discount_template', '' . get_woocommerce_currency_symbol() . WC()->cart->get_cart_discount_total() . ' ' ); } /** * Render template for displaying subtotal amount in the cart summary. * * @since 1.0.0 */ public function subtotal_template() { return apply_filters( 'addonify_floating_cart_subtotal_template', '' . WC()->cart->get_cart_subtotal() . '' ); } /** * Render template for displaying total amount in the cart summary. * * @since 1.0.0 */ public function total_template() { return apply_filters( 'addonify_floating_cart_total_template', '' . WC()->cart->get_cart_total() . '' ); } /** * Render template for displaying shopping meter bar. * * @since 1.0.0 */ public function shopping_meter_bar_template() { $shopping_threshold_amount = (int) addonify_floating_cart_get_option( 'customer_shopping_meter_threshold' ); $cart_total = WC()->cart->get_cart_contents_total(); $per = 0; if ( $cart_total >= $shopping_threshold_amount ) { $per = 100; } else { $per = 100 - ( ( $shopping_threshold_amount - $cart_total ) / $shopping_threshold_amount * 100 ); } return apply_filters( 'addonify_floating_cart_shopping_meter_bar', '
' ); } /** * Print dynamic CSS generated from settings page. */ public function dynamic_css() { $css_values = array( '--adfy_woofc_cart_width' => addonify_floating_cart_get_option( 'cart_modal_width' ) . 'px', // New. '--adfy_woofc_base_text_color' => addonify_floating_cart_get_option( 'cart_modal_base_text_color' ), '--adfy_woofc_base_link_color' => addonify_floating_cart_get_option( 'cart_modal_content_link_color' ), '--adfy_woofc_base_link_color_hover' => addonify_floating_cart_get_option( 'cart_modal_content_link_on_hover_color' ), '--adfy_woofc_base_text_font_size' => addonify_floating_cart_get_option( 'cart_modal_base_font_size' ) . 'px', '--adfy_woofc_border_color' => addonify_floating_cart_get_option( 'cart_modal_border_color' ), '--adfy_woofc_cart_background_color' => addonify_floating_cart_get_option( 'cart_modal_background_color' ), '--adfy_woofc_cart_overlay_background_color' => addonify_floating_cart_get_option( 'cart_modal_overlay_color' ), '--adfy_woofc_toggle_button_text_color' => addonify_floating_cart_get_option( 'toggle_button_label_color' ), '--adfy_woofc_toggle_button_text_color_hover' => addonify_floating_cart_get_option( 'toggle_button_on_hover_label_color' ), '--adfy_woofc_toggle_button_background_color' => addonify_floating_cart_get_option( 'toggle_button_background_color' ), '--adfy_woofc_toggle_button_background_color_hover' => addonify_floating_cart_get_option( 'toggle_button_on_hover_background_color' ), '--adfy_woofc_toggle_button_border_color' => addonify_floating_cart_get_option( 'toggle_button_border_color' ), '--adfy_woofc_toggle_button_border_color_hover' => addonify_floating_cart_get_option( 'toggle_button_on_hover_border_color' ), '--adfy_woofc_toggle_button_badge_text_color' => addonify_floating_cart_get_option( 'toggle_button_badge_label_color' ), '--adfy_woofc_toggle_button_badge_text_color_hover' => addonify_floating_cart_get_option( 'toggle_button_label_on_hover_color' ), '--adfy_woofc_toggle_button_badge_background_color' => addonify_floating_cart_get_option( 'toggle_button_badge_background_color' ), '--adfy_woofc_toggle_button_badge_background_color_hover' => addonify_floating_cart_get_option( 'toggle_button_badge_on_hover_background_color' ), '--adfy_woofc_toggle_button_badge_width' => addonify_floating_cart_get_option( 'toggle_button_badge_width' ), // New. '--adfy_woofc_toggle_button_badge_font_size' => addonify_floating_cart_get_option( 'toggle_button_badge_font_size' ) . 'px', // New. '--adfy_woofc_toggle_button_size' => addonify_floating_cart_get_option( 'cart_modal_toggle_button_width' ) . 'px', '--adfy_woofc_toggle_button_border_radius' => addonify_floating_cart_get_option( 'cart_modal_toggle_button_border_radius' ) . 'px', // New. '--adfy_woofc_toggle_button_cart_icon_font_size' => addonify_floating_cart_get_option( 'cart_modal_toggle_button_icon_font_size' ) . 'px', '--adfy_woofc_toggle_button_horizental_offset' => addonify_floating_cart_get_option( 'cart_modal_toggle_button_horizontal_offset' ) . 'px', '--adfy_woofc_toggle_button_vertical_offset' => addonify_floating_cart_get_option( 'cart_modal_toggle_button_vertical_offset' ) . 'px', // General Buttons styles. '--adfy_woofc_base_button_font_size' => addonify_floating_cart_get_option( 'cart_modal_buttons_font_size' ) . 'px', '--adfy_woofc_base_button_font_weight' => addonify_floating_cart_get_option( 'cart_modal_buttons_font_weight' ), '--adfy_woofc_base_button_letter_spacing' => addonify_floating_cart_get_option( 'cart_modal_buttons_letter_spacing' ), '--adfy_woofc_base_button_border_radius' => addonify_floating_cart_get_option( 'cart_modal_buttons_border_radius' ) . 'px', '--adfy_woofc_base_button_text_transform' => addonify_floating_cart_get_option( 'cart_modal_buttons_text_transform' ), '--adfy_woofc_primary_button_label_color' => addonify_floating_cart_get_option( 'cart_modal_primary_button_label_color' ), '--adfy_woofc_primary_button_label_color_hover' => addonify_floating_cart_get_option( 'cart_modal_primary_button_on_hover_label_color' ), '--adfy_woofc_primary_button_background_color' => addonify_floating_cart_get_option( 'cart_modal_primary_button_background_color' ), '--adfy_woofc_primary_button_background_color_hover' => addonify_floating_cart_get_option( 'cart_modal_primary_button_on_hover_background_color' ), '--adfy_woofc_primary_button_border_color' => addonify_floating_cart_get_option( 'cart_modal_primary_button_border_color' ), '--adfy_woofc_primary_button_border_color_hover' => addonify_floating_cart_get_option( 'cart_modal_primary_button_on_hover_border_color' ), '--adfy_woofc_secondary_button_label_color' => addonify_floating_cart_get_option( 'cart_modal_secondary_button_label_color' ), '--adfy_woofc_secondary_button_label_color_hover' => addonify_floating_cart_get_option( 'cart_modal_secondary_button_on_hover_label_color' ), '--adfy_woofc_secondary_button_background_color' => addonify_floating_cart_get_option( 'cart_modal_secondary_button_background_color' ), '--adfy_woofc_secondary_button_background_color_hover' => addonify_floating_cart_get_option( 'cart_modal_secondary_button_on_hover_background_color' ), '--adfy_woofc_secondary_button_border_color' => addonify_floating_cart_get_option( 'cart_modal_secondary_button_border_color' ), '--adfy_woofc_secondary_button_border_color_hover' => addonify_floating_cart_get_option( 'cart_modal_secondary_button_on_hover_border_color' ), // Miscellaneous. '--adfy_woofc_cart_input_placeholder_color' => addonify_floating_cart_get_option( 'cart_modal_input_field_placeholder_color' ), '--adfy_woofc_cart_input_text_color' => addonify_floating_cart_get_option( 'cart_modal_input_field_text_color' ), '--adfy_woofc_cart_input_border_color' => addonify_floating_cart_get_option( 'cart_modal_input_field_border_color' ), '--adfy_woofc_cart_input_background_color' => addonify_floating_cart_get_option( 'cart_modal_input_field_background_color' ), // Shopping meter. '--adfy_woofc_shopping_meter_initial_background_color' => addonify_floating_cart_get_option( 'cart_shopping_meter_initial_background_color' ), '--adfy_woofc_shopping_meter_progress_background_color' => addonify_floating_cart_get_option( 'cart_shopping_meter_progress_background_color' ), '--adfy_woofc_shopping_meter_threashold_reached_background_color' => addonify_floating_cart_get_option( 'cart_shopping_meter_threashold_reached_background_color' ), // Toast notification. '--adfy_woofc_toast_text_color' => addonify_floating_cart_get_option( 'toast_notification_text_color' ), '--adfy_woofc_toast_icon_color' => addonify_floating_cart_get_option( 'toast_notification_icon_color' ), '--adfy_woofc_toast_icon_background_color' => addonify_floating_cart_get_option( 'toast_notification_icon_bg_color' ), '--adfy_woofc_toast_background_color' => addonify_floating_cart_get_option( 'toast_notification_background_color' ), '--adfy_woofc_toast_button_text_color' => addonify_floating_cart_get_option( 'toast_notification_button_label_color' ), '--adfy_woofc_toast_button_text_color_hover' => addonify_floating_cart_get_option( 'toast_notification_button_on_hover_label_color' ), '--adfy_woofc_toast_button_background_color' => addonify_floating_cart_get_option( 'toast_notification_button_background_color' ), '--adfy_woofc_toast_button_background_color_hover' => addonify_floating_cart_get_option( 'toast_notification_button_on_hover_background_color' ), // Cart & cart title. '--adfy_woofc_cart_title_text_color' => addonify_floating_cart_get_option( 'cart_modal_title_color' ), '--adfy_woofc_cart_title_font_size' => addonify_floating_cart_get_option( 'cart_title_font_size' ) . 'px', // New. '--adfy_woofc_cart_title_font_weight' => addonify_floating_cart_get_option( 'cart_title_font_weight' ), // New. '--adfy_woofc_cart_title_letter_spacing' => addonify_floating_cart_get_option( 'cart_title_letter_spacing' ), // New. '--adfy_woofc_cart_title_text_transform' => addonify_floating_cart_get_option( 'cart_title_text_transform' ), // New. '--adfy_woofc_cart_title_count_badge_text_color' => addonify_floating_cart_get_option( 'cart_modal_badge_text_color' ), '--adfy_woofc_cart_title_count_badge_background_color' => addonify_floating_cart_get_option( 'cart_modal_badge_background_color' ), '--adfy_woofc_cart_close_button_text_color' => addonify_floating_cart_get_option( 'cart_modal_close_icon_color' ), '--adfy_woofc_cart_close_button_text_color_hover' => addonify_floating_cart_get_option( 'cart_modal_close_icon_on_hover_color' ), '--adfy_woofc_cart_field_placeholder_color' => addonify_floating_cart_get_option( 'cart_modal_input_field_placeholder_color' ), // TO DO. '--adfy_woofc_cart_field_background_color' => addonify_floating_cart_get_option( 'cart_modal_input_field_background_color' ), '--adfy_woofc_cart_field_text_color' => addonify_floating_cart_get_option( 'cart_modal_input_field_text_color' ), '--adfy_woofc_cart_field_border_color' => addonify_floating_cart_get_option( 'cart_modal_input_field_border_color' ), // Product titles. '--adfy_woofc_cart_product_title_text_color' => addonify_floating_cart_get_option( 'cart_modal_product_title_color' ), '--adfy_woofc_cart_product_title_text_color_hover' => addonify_floating_cart_get_option( 'cart_modal_product_title_on_hover_color' ), '--adfy_woofc_cart_product_price_quantity_text_color' => addonify_floating_cart_get_option( 'cart_modal_product_quantity_price_color' ), '--adfy_woofc_cart_product_quantity_text_color' => addonify_floating_cart_get_option( 'cart_modal_base_text_color' ), '--adfy_woofc_cart_product_quantity_input_button_text_color' => addonify_floating_cart_get_option( 'cart_modal_base_text_color' ), '--adfy_woofc_cart_product_remove_button_text_color' => addonify_floating_cart_get_option( 'cart_modal_product_remove_button_icon_color' ), '--adfy_woofc_cart_product_remove_button_text_color_hover' => addonify_floating_cart_get_option( 'cart_modal_product_remove_button_on_hover_icon_color' ), '--adfy_woofc_cart_product_remove_button_background_color' => addonify_floating_cart_get_option( 'cart_modal_product_remove_button_background_color' ), '--adfy_woofc_cart_product_remove_button_background_color_hover' => addonify_floating_cart_get_option( 'cart_modal_product_remove_button_on_hover_background_color' ), '--adfy_woofc_cart_product_title_font_size' => addonify_floating_cart_get_option( 'cart_modal_product_title_font_size' ) . 'px', '--adfy_woofc_cart_product_title_font_weight' => addonify_floating_cart_get_option( 'cart_modal_product_title_font_weight' ), ); $css = ':root {'; foreach ( $css_values as $key => $value ) { if ( $value ) { $css .= $key . ': ' . $value . ';'; } } $css .= '}'; return $css; } /** * Minify the dynamic css. * * @param string $css css to minify. * @return string minified css. */ public function minify_css( $css ) { $css = preg_replace( '/\s+/', ' ', $css ); $css = preg_replace( '/\/\*[^\!](.*?)\*\//', '', $css ); $css = preg_replace( '/(,|:|;|\{|}) /', '$1', $css ); $css = preg_replace( '/ (,|;|\{|})/', '$1', $css ); $css = preg_replace( '/(:| )0\.([0-9]+)(%|em|ex|px|in|cm|mm|pt|pc)/i', '${1}.${2}${3}', $css ); $css = preg_replace( '/(:| )(\.?)0(%|em|ex|px|in|cm|mm|pt|pc)/i', '${1}0', $css ); return trim( $css ); } }