true ] ); } /** * Enqueue the sticky assets (safe to call many times). */ private function do_enqueue() { if ( ! wp_script_is( 'aafe-sticky-elements', 'registered' ) ) { $this->register_assets(); } wp_enqueue_style( 'aafe-sticky-elements' ); wp_enqueue_script( 'aafe-sticky-elements' ); } /** * Enqueue frontend scripts. */ public function enqueue_assets() { if ( \Elementor\Plugin::$instance->editor->is_edit_mode() || \Elementor\Plugin::$instance->preview->is_preview_mode() ) { $this->do_enqueue(); return; } $document = \Elementor\Plugin::$instance->documents->get( get_the_ID() ); if ( ! $document ) { return; } $data = $document->get_elements_data(); if ( empty( $data ) || ! is_array( $data ) ) { return; } // AAFE FIX: the switch control is "aafe_sticky_enable" with the value "active". The old // code looked for a non-existent "aafe_sticky" key, so the script never loaded on the // frontend and sticky elements did not work at all. $find_sticky = function ( $elements ) use ( &$find_sticky ) { foreach ( $elements as $element ) { if ( ! empty( $element['settings']['aafe_sticky_enable'] ) ) { return true; } if ( ! empty( $element['elements'] ) && $find_sticky( $element['elements'] ) ) { return true; } } return false; }; if ( $find_sticky( $data ) ) { $this->do_enqueue(); } } /** * Register Sticky controls. */ public function register_sticky_controls( Element_Base $element, $args ) { $element->start_controls_section( 'aafe_sticky_section', [ 'label' => ' ' . esc_html__( 'AAFE Sticky', 'addronix-addons-for-elementor' ), 'tab' => Controls_Manager::TAB_ADVANCED, ] ); $element->add_control( 'aafe_sticky_enable', [ 'label' => esc_html__( 'Enable Sticky', 'addronix-addons-for-elementor' ), 'type' => Controls_Manager::SWITCHER, 'return_value' => 'active', 'default' => '', 'render_type' => 'none', // JS handles updates in editor 'frontend_available' => true, ] ); $element->add_control( 'aafe_sticky_position', [ 'label' => esc_html__( 'Sticky Position', 'addronix-addons-for-elementor' ), 'type' => Controls_Manager::SELECT, 'options' => [ 'top' => esc_html__( 'Top', 'addronix-addons-for-elementor' ), 'bottom' => esc_html__( 'Bottom', 'addronix-addons-for-elementor' ), ], 'default' => 'top', 'condition' => [ 'aafe_sticky_enable' => 'active' ], 'render_type' => 'none', 'frontend_available' => true, ] ); $element->add_control( 'aafe_sticky_offset', [ 'label' => esc_html__( 'Offset (px)', 'addronix-addons-for-elementor' ), 'type' => Controls_Manager::SLIDER, 'range' => [ 'px' => [ 'min' => 0, 'max' => 500, 'step' => 1 ] ], 'default' => [ 'size' => 0 ], 'condition' => [ 'aafe_sticky_enable' => 'active' ], 'render_type' => 'none', 'frontend_available' => true, ] ); $element->add_control( 'aafe_sticky_effects_offset', [ 'label' => esc_html__( 'Effects Offset (px)', 'addronix-addons-for-elementor' ), 'type' => Controls_Manager::SLIDER, 'range' => [ 'px' => [ 'min' => 0, 'max' => 1000, 'step' => 1 ] ], 'default' => [ 'size' => 0 ], 'condition' => [ 'aafe_sticky_enable' => 'active' ], 'render_type' => 'none', 'frontend_available' => true, ] ); $element->add_control( 'aafe_sticky_on', [ 'label' => esc_html__( 'Sticky On', 'addronix-addons-for-elementor' ), 'type' => Controls_Manager::SELECT2, 'multiple' => true, 'label_block' => true, 'default' => [ 'desktop', 'tablet', 'mobile' ], 'options' => [ 'desktop' => esc_html__( 'Desktop', 'addronix-addons-for-elementor' ), 'tablet' => esc_html__( 'Tablet', 'addronix-addons-for-elementor' ), 'mobile' => esc_html__( 'Mobile', 'addronix-addons-for-elementor' ), ], 'condition' => [ 'aafe_sticky_enable' => 'active' ], 'render_type' => 'none', 'frontend_available' => true, ] ); $element->add_control( 'aafe_sticky_parent', [ 'label' => esc_html__( 'Stay In Column', 'addronix-addons-for-elementor' ), 'type' => Controls_Manager::SWITCHER, 'return_value' => 'yes', 'default' => 'yes', 'condition' => [ 'aafe_sticky_enable' => 'active' ], 'render_type' => 'none', 'frontend_available' => true, ] ); $element->add_control( 'aafe_sticky_hide_on_scroll', [ 'label' => esc_html__( 'Hide on Scroll Down', 'addronix-addons-for-elementor' ), 'type' => Controls_Manager::SWITCHER, 'return_value' => 'yes', 'default' => '', 'condition' => [ 'aafe_sticky_enable' => 'active' ], 'render_type' => 'none', 'frontend_available' => true, ] ); $element->add_control( 'aafe_sticky_bg_color', [ 'label' => esc_html__( 'Sticky Background Color', 'addronix-addons-for-elementor' ), 'type' => Controls_Manager::COLOR, 'condition' => [ 'aafe_sticky_enable' => 'active' ], 'selectors' => [ '{{WRAPPER}}.aafe-sticky-effects-active' => 'background-color: {{VALUE}} !important;', ], ] ); $element->add_control( 'aafe_sticky_shrink', [ 'label' => esc_html__( 'Enable Shrink Effect', 'addronix-addons-for-elementor' ), 'type' => Controls_Manager::SWITCHER, 'return_value' => 'yes', 'default' => '', 'condition' => [ 'aafe_sticky_enable' => 'active' ], ] ); $element->add_control( 'aafe_sticky_shrink_padding', [ 'label' => esc_html__( 'Sticky Padding (Top/Bottom)', 'addronix-addons-for-elementor' ), 'type' => Controls_Manager::SLIDER, 'range' => [ 'px' => [ 'min' => 0, 'max' => 100, 'step' => 1 ] ], 'default' => [ 'size' => 10 ], 'condition' => [ 'aafe_sticky_shrink' => 'yes', 'aafe_sticky_enable' => 'active' ], 'selectors' => [ '{{WRAPPER}}.aafe-sticky-effects-active' => 'padding-top: {{SIZE}}{{UNIT}} !important; padding-bottom: {{SIZE}}{{UNIT}} !important;', ], ] ); $element->add_control( 'aafe_sticky_shrink_logo', [ 'label' => esc_html__( 'Shrink Logo (%)', 'addronix-addons-for-elementor' ), 'type' => Controls_Manager::SLIDER, 'range' => [ '%' => [ 'min' => 20, 'max' => 100, 'step' => 1 ] ], 'default' => [ 'size' => 80 ], 'condition' => [ 'aafe_sticky_shrink' => 'yes', 'aafe_sticky_enable' => 'active' ], 'selectors' => [ '{{WRAPPER}}.aafe-sticky-effects-active img, {{WRAPPER}}.aafe-sticky-effects-active .custom-logo' => 'max-width: {{SIZE}}% !important;', ], ] ); $element->add_control( 'aafe_sticky_zindex', [ 'label' => esc_html__( 'Z-Index', 'addronix-addons-for-elementor' ), 'type' => Controls_Manager::NUMBER, 'min' => 0, 'max' => 999999, 'step' => 1, 'default' => 99, 'condition' => [ 'aafe_sticky_enable' => 'active' ], 'render_type' => 'none', 'frontend_available' => true, ] ); $element->end_controls_section(); } /** * Inject settings to wrapper data-settings in PHP (fallback/initial). * Elementor handles frontend_available in JS, but this ensures it's always printed on load. */ public function before_render( Element_Base $element ) { $settings = $element->get_settings_for_display(); if ( empty( $settings['aafe_sticky_enable'] ) ) { return; } // Covers elements inside other documents too (header/footer, mega menu, loop items). $this->do_enqueue(); // Prepare settings $sticky_settings = [ 'enable' => true, 'position' => $settings['aafe_sticky_position'] ?? 'top', 'offset' => $settings['aafe_sticky_offset']['size'] ?? 0, 'effects_offset' => $settings['aafe_sticky_effects_offset']['size'] ?? 0, 'sticky_on' => $settings['aafe_sticky_on'] ?? [ 'desktop', 'tablet', 'mobile' ], 'stay_in_parent' => ( 'yes' === ( $settings['aafe_sticky_parent'] ?? 'yes' ) ), 'hide_on_scroll' => ( 'yes' === ( $settings['aafe_sticky_hide_on_scroll'] ?? '' ) ), 'zindex' => $settings['aafe_sticky_zindex'] ?? 99, ]; // We add a class to easily identify sticky elements on init $element->add_render_attribute( '_wrapper', [ 'class' => 'aafe-sticky-element', 'data-aafe-sticky' => wp_json_encode( $sticky_settings ), ] ); } }