*/ public function get_style_depends(): array { return [ KING_ADDONS_ASSETS_UNIQUE_KEY . '-woocommerce-floating-cart-icon-style', ]; } /** * Script dependencies. * * @return array */ public function get_script_depends(): array { return [ KING_ADDONS_ASSETS_UNIQUE_KEY . '-woocommerce-floating-cart-icon-script', ]; } /** * Categories. * * @return array */ public function get_categories(): array { return ['king-addons-woo']; } /** * Keywords. * * @return array */ public function get_keywords(): array { return ['woocommerce', 'cart', 'floating', 'badge', 'checkout']; } /** * Register Elementor controls. * * @return void */ public function get_custom_help_url() { return 'mailto:bug@kingaddons.com?subject=Bug Report - King Addons&body=Please describe the issue'; } public function register_controls(): void { $this->register_content_controls(); $this->register_layout_controls(); $this->register_panel_controls(); $this->register_style_controls(); $this->register_pro_notice_controls(); } /** * Render widget output. * * @return void */ public function render(): void { $cart = $this->get_cart(); if ($cart === null) { return; } $settings = $this->get_settings_for_display(); $count = (int) $cart->get_cart_contents_count(); $subtotal = $cart->get_subtotal(); $cart_url = wc_get_cart_url(); $checkout_url = wc_get_checkout_url(); $position = $settings['kng_position'] ?? 'right'; $show_badge = ($settings['kng_show_badge'] ?? 'yes') === 'yes'; $show_label = ($settings['kng_show_label'] ?? 'yes') === 'yes'; $show_subtotal = ($settings['kng_show_subtotal'] ?? 'yes') === 'yes'; $icon = $settings['kng_icon'] ?? [ 'value' => 'eicon-cart-medium', 'library' => 'elementor', ]; $offset_x = isset($settings['kng_offset_x']['size'], $settings['kng_offset_x']['unit']) ? $settings['kng_offset_x']['size'] . $settings['kng_offset_x']['unit'] : '18px'; $offset_y = isset($settings['kng_offset_y']['size'], $settings['kng_offset_y']['unit']) ? $settings['kng_offset_y']['size'] . $settings['kng_offset_y']['unit'] : '18px'; $wrapper_classes = ['king-addons-floating-cart']; $wrapper_classes[] = $position === 'left' ? 'king-addons-floating-cart--left' : 'king-addons-floating-cart--right'; $button_classes = ['king-addons-floating-cart__button']; if ($count === 0) { $button_classes[] = 'is-empty'; } $style_attr = $position === 'left' ? 'left:' . esc_attr($offset_x) . ';bottom:' . esc_attr($offset_y) . ';' : 'right:' . esc_attr($offset_x) . ';bottom:' . esc_attr($offset_y) . ';'; $items = array_slice($cart->get_cart(), 0, 2, true); $remaining = max(0, $count - count($items)); ?>
start_controls_section( 'kng_content_section', [ 'label' => KING_ADDONS_ELEMENTOR_ICON . esc_html__('Content', 'king-addons'), 'tab' => Controls_Manager::TAB_CONTENT, ] ); $this->add_control( 'kng_icon', [ 'label' => esc_html__('Icon', 'king-addons'), 'type' => Controls_Manager::ICONS, 'default' => [ 'value' => 'eicon-cart-medium', 'library' => 'elementor', ], ] ); $this->add_control( 'kng_label', [ 'label' => esc_html__('Label', 'king-addons'), 'type' => Controls_Manager::TEXT, 'default' => esc_html__('Cart', 'king-addons'), ] ); $this->add_control( 'kng_show_label', [ 'label' => esc_html__('Show Label', 'king-addons'), 'type' => Controls_Manager::SWITCHER, 'label_on' => esc_html__('Show', 'king-addons'), 'label_off' => esc_html__('Hide', 'king-addons'), 'return_value' => 'yes', 'default' => 'yes', ] ); $this->add_control( 'kng_show_badge', [ 'label' => esc_html__('Show Count Badge', 'king-addons'), 'type' => Controls_Manager::SWITCHER, 'label_on' => esc_html__('Show', 'king-addons'), 'label_off' => esc_html__('Hide', 'king-addons'), 'return_value' => 'yes', 'default' => 'yes', ] ); $this->end_controls_section(); } /** * Layout controls for floating placement. * * @return void */ protected function register_layout_controls(): void { $this->start_controls_section( 'kng_layout_section', [ 'label' => KING_ADDONS_ELEMENTOR_ICON . esc_html__('Floating Button', 'king-addons'), 'tab' => Controls_Manager::TAB_CONTENT, ] ); $this->add_control( 'kng_position', [ 'label' => esc_html__('Side', 'king-addons'), 'type' => Controls_Manager::CHOOSE, 'options' => [ 'left' => [ 'title' => esc_html__('Left', 'king-addons'), 'icon' => 'eicon-h-align-left', ], 'right' => [ 'title' => esc_html__('Right', 'king-addons'), 'icon' => 'eicon-h-align-right', ], ], 'default' => 'right', ] ); $this->add_control( 'kng_offset_x', [ 'label' => esc_html__('Horizontal Offset', 'king-addons'), 'type' => Controls_Manager::SLIDER, 'size_units' => ['px'], 'range' => [ 'px' => [ 'min' => 0, 'max' => 120, ], ], 'default' => [ 'size' => 18, 'unit' => 'px', ], ] ); $this->add_control( 'kng_offset_y', [ 'label' => esc_html__('Bottom Offset', 'king-addons'), 'type' => Controls_Manager::SLIDER, 'size_units' => ['px'], 'range' => [ 'px' => [ 'min' => 0, 'max' => 200, ], ], 'default' => [ 'size' => 18, 'unit' => 'px', ], ] ); $this->end_controls_section(); } /** * Quick view panel controls. * * @return void */ protected function register_panel_controls(): void { $this->start_controls_section( 'kng_panel_section', [ 'label' => KING_ADDONS_ELEMENTOR_ICON . esc_html__('Quick View', 'king-addons'), 'tab' => Controls_Manager::TAB_CONTENT, ] ); $this->add_control( 'kng_show_subtotal', [ 'label' => esc_html__('Show Subtotal', 'king-addons'), 'type' => Controls_Manager::SWITCHER, 'return_value' => 'yes', 'default' => 'yes', ] ); $this->add_control( 'kng_upgrade_hover', [ 'label' => sprintf(__('Hover to open %s', 'king-addons'), ''), 'type' => Controls_Manager::SWITCHER, 'classes' => 'king-addons-pro-control no-distance', ] ); $this->add_control( 'kng_upgrade_drawer', [ 'label' => sprintf(__('Drawer layout %s', 'king-addons'), ''), 'type' => Controls_Manager::SWITCHER, 'classes' => 'king-addons-pro-control no-distance', ] ); $this->end_controls_section(); } /** * Style controls. * * @return void */ protected function register_style_controls(): void { $this->start_controls_section( 'kng_style_button', [ 'label' => KING_ADDONS_ELEMENTOR_ICON . esc_html__('Button', 'king-addons'), 'tab' => Controls_Manager::TAB_STYLE, ] ); $this->add_group_control( Group_Control_Typography::get_type(), [ 'name' => 'kng_button_typography', 'selector' => '{{WRAPPER}} .king-addons-floating-cart__button', ] ); $this->add_control( 'kng_button_text_color', [ 'label' => esc_html__('Text Color', 'king-addons'), 'type' => Controls_Manager::COLOR, 'selectors' => [ '{{WRAPPER}} .king-addons-floating-cart__button' => 'color: {{VALUE}};', ], ] ); $this->add_control( 'kng_button_bg', [ 'label' => esc_html__('Background', 'king-addons'), 'type' => Controls_Manager::COLOR, 'selectors' => [ '{{WRAPPER}} .king-addons-floating-cart__button' => 'background-color: {{VALUE}};', ], ] ); $this->add_control( 'kng_button_bg_hover', [ 'label' => esc_html__('Hover Background', 'king-addons'), 'type' => Controls_Manager::COLOR, 'selectors' => [ '{{WRAPPER}} .king-addons-floating-cart__button:hover' => 'background-color: {{VALUE}};', ], ] ); $this->add_group_control( Group_Control_Border::get_type(), [ 'name' => 'kng_button_border', 'selector' => '{{WRAPPER}} .king-addons-floating-cart__button', ] ); $this->add_group_control( Group_Control_Box_Shadow::get_type(), [ 'name' => 'kng_button_shadow', 'selector' => '{{WRAPPER}} .king-addons-floating-cart__button', ] ); $this->add_responsive_control( 'kng_button_padding', [ 'label' => esc_html__('Padding', 'king-addons'), 'type' => Controls_Manager::DIMENSIONS, 'size_units' => ['px', 'em'], 'selectors' => [ '{{WRAPPER}} .king-addons-floating-cart__button' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', ], ] ); $this->end_controls_section(); $this->start_controls_section( 'kng_style_badge', [ 'label' => KING_ADDONS_ELEMENTOR_ICON . esc_html__('Badge', 'king-addons'), 'tab' => Controls_Manager::TAB_STYLE, ] ); $this->add_control( 'kng_badge_bg', [ 'label' => esc_html__('Badge Background', 'king-addons'), 'type' => Controls_Manager::COLOR, 'selectors' => [ '{{WRAPPER}} .king-addons-floating-cart__badge' => 'background-color: {{VALUE}};', ], ] ); $this->add_control( 'kng_badge_color', [ 'label' => esc_html__('Badge Text', 'king-addons'), 'type' => Controls_Manager::COLOR, 'selectors' => [ '{{WRAPPER}} .king-addons-floating-cart__badge' => 'color: {{VALUE}};', ], ] ); $this->add_group_control( Group_Control_Box_Shadow::get_type(), [ 'name' => 'kng_badge_shadow', 'selector' => '{{WRAPPER}} .king-addons-floating-cart__badge', ] ); $this->end_controls_section(); $this->start_controls_section( 'kng_style_panel', [ 'label' => KING_ADDONS_ELEMENTOR_ICON . esc_html__('Panel', 'king-addons'), 'tab' => Controls_Manager::TAB_STYLE, ] ); $this->add_group_control( Group_Control_Typography::get_type(), [ 'name' => 'kng_panel_typography', 'selector' => '{{WRAPPER}} .king-addons-floating-cart__panel', ] ); $this->add_control( 'kng_panel_bg', [ 'label' => esc_html__('Background', 'king-addons'), 'type' => Controls_Manager::COLOR, 'selectors' => [ '{{WRAPPER}} .king-addons-floating-cart__panel' => 'background-color: {{VALUE}};', ], ] ); $this->add_control( 'kng_panel_text', [ 'label' => esc_html__('Text Color', 'king-addons'), 'type' => Controls_Manager::COLOR, 'selectors' => [ '{{WRAPPER}} .king-addons-floating-cart__panel' => 'color: {{VALUE}};', ], ] ); $this->add_group_control( Group_Control_Border::get_type(), [ 'name' => 'kng_panel_border', 'selector' => '{{WRAPPER}} .king-addons-floating-cart__panel', ] ); $this->add_group_control( Group_Control_Box_Shadow::get_type(), [ 'name' => 'kng_panel_shadow', 'selector' => '{{WRAPPER}} .king-addons-floating-cart__panel', ] ); $this->add_responsive_control( 'kng_panel_padding', [ 'label' => esc_html__('Padding', 'king-addons'), 'type' => Controls_Manager::DIMENSIONS, 'size_units' => ['px', 'em'], 'selectors' => [ '{{WRAPPER}} .king-addons-floating-cart__panel' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', ], ] ); $this->end_controls_section(); } /** * Render pro upgrade notice. * * @return void */ public function register_pro_notice_controls(): void { if (!king_addons_freemius()->can_use_premium_code__premium_only()) { Core::renderProFeaturesSection( $this, '', Controls_Manager::RAW_HTML, 'woocommerce-floating-cart-icon', [ 'Hover trigger and auto-open after add to cart', 'Drawer layout with slide animation', 'Show thumbnails, subtotals, and remove actions', 'Hide button on empty cart or specific devices', 'Custom checkout label and quick actions', ] ); } } /** * Get WooCommerce cart instance when available. * * @return \WC_Cart|null */ protected function get_cart(): ?\WC_Cart { if (!function_exists('WC')) { return null; } $wc = WC(); if (!is_object($wc) || !method_exists($wc, 'cart')) { return null; } return $wc->cart ?: null; } }