Plugin Directory

Changeset 3437017


Ignore:
Timestamp:
01/11/2026 10:33:41 AM (3 months ago)
Author:
turboaddons
Message:

Fix: Allow plugin header/footer to render inside Elementor editor for normal pages so editor shows correct header/footer.

Location:
header-footer-builder-for-elementor
Files:
59 added
11 edited

Legend:

Unmodified
Added
Removed
  • header-footer-builder-for-elementor/trunk/README.MD

    r3428478 r3437017  
    55Tested up to: 6.9
    66Requires PHP: 7.4
    7 Stable tag: 1.0.8
     7Stable tag: 1.0.9
    88License: GPLv3 
    99License URI: https://opensource.org/licenses/GPL-3.0 
     
    171171== Changelog ==
    172172
     173== 1.0.9 ==
     174- Fix: Allow plugin header/footer to render inside Elementor editor for normal pages so editor shows correct header/footer.
     175- Fix: Skip plugin header/footer rendering on pages using the Elementor Canvas layout (prevents plugin injection on Canvas pages).
     176- Maintenance: Minor code improvements and safety checks for Elementor preview handling.
     177
    173178= 1.0.8 =
    174179* Fixed — Duplicate Header Issue – Resolved conflict causing duplicate header output and blank space on some themes.
  • header-footer-builder-for-elementor/trunk/assets/css/navigation-menu-hf.css

    r3406564 r3437017  
    2222    position: relative;
    2323    z-index: 1;
     24}
     25
     26/* Smooth transitions for active/hover state to prevent layout jump */
     27.tahefobu-nav-menu .tahefobu-menu-item,
     28.tahefobu-mobile-nav-menu .tahefobu-mobile-menu-item {
     29    transition: color .18s ease, background-color .18s ease, transform .18s ease;
     30    box-sizing: border-box; /* prevent padding changes from affecting layout */
     31    display: inline-block;   /* stabilize inline menu item widths */
     32    min-width: 0;
    2433}
    2534
  • header-footer-builder-for-elementor/trunk/assets/css/turbo-footer-template-popup.css

    r3368800 r3437017  
     1/* //nothing here yet// */
  • header-footer-builder-for-elementor/trunk/header-footer-builder-for-elementor.php

    r3428478 r3437017  
    44 * Plugin URI: https://wp-turbo.com/header-footer-builder-for-elementor/
    55 * Description: Header Footer Builder for Elementor & WooCommerce. Easy, customizable plugin for headers/footers with display rules, sticky header & include/exclude.
    6  * Version: 1.0.8
     6 * Version: 1.0.9
    77 * Requires Plugins: elementor
    88 * Author: turbo addons
     
    9292        define( 'TAHEFOBU_HEADER_FOOTER_BUILDER_FOR_ELEMENTOR_PLUGIN_URL', trailingslashit( plugins_url( '/', __FILE__ ) ) );
    9393        define( 'TAHEFOBU_HEADER_FOOTER_BUILDER_FOR_ELEMENTOR_PLUGIN_PATH', trailingslashit( plugin_dir_path( __FILE__ ) ) );
    94         define( 'TAHEFOBU_HEADER_FOOTER_BUILDER_FOR_ELEMENTOR_PLUGIN_VERSION', '1.0.8' );
     94        define( 'TAHEFOBU_HEADER_FOOTER_BUILDER_FOR_ELEMENTOR_PLUGIN_VERSION', '1.0.9' );
    9595    }
    9696
     
    204204                false, // no file, just for inline use
    205205                [],
    206                 '1.0.8'
     206                '1.0.9'
    207207            );
    208208            wp_enqueue_style( 'tahefobu-frontend' );
    209209
    210210            // Add your dynamic CSS inline
    211             $dynamic_css = '#tahefobu-header:not(.tahefobu-ready) { visibility: hidden; }';
     211            // Start header visually hidden (opacity 0) but present in layout; apply a very short fade when ready.
     212            $dynamic_css = '#tahefobu-header { opacity: 0; transform: none; pointer-events: none; } #tahefobu-header.tahefobu-ready { opacity: 1; pointer-events: auto; transition: opacity .25s linear; }';
    212213            wp_add_inline_style( 'tahefobu-frontend', $dynamic_css );
    213214        }, 1 );
  • header-footer-builder-for-elementor/trunk/header-footer-template/footer-builder/turbo-footer-render.php

    r3369450 r3437017  
    1616    }
    1717
    18     // Skip rendering/matching during Elementor preview (reviewer-friendly API)
     18    // Skip rendering/matching during Elementor preview only when previewing our CPTs.
    1919    if ( defined( 'ELEMENTOR_VERSION' ) && \Elementor\Plugin::$instance->preview->is_preview_mode() ) {
    2020        $pid = get_the_ID();
    2121
    22             // Enforce nonce + caps only for our CPT previews
    23             if ( $pid && in_array( get_post_type( $pid ), [ 'tahefobu_header', 'tahefobu_footer' ], true ) ) {
    24                 $nonce = filter_input( INPUT_GET, 'tahefobu_nonce', FILTER_SANITIZE_FULL_SPECIAL_CHARS );
     22        // If the preview is for our header/footer CPTs, verify nonce + caps and skip matching/rendering.
     23        if ( $pid && in_array( get_post_type( $pid ), [ 'tahefobu_header', 'tahefobu_footer' ], true ) ) {
     24            $nonce = filter_input( INPUT_GET, 'tahefobu_nonce', FILTER_SANITIZE_FULL_SPECIAL_CHARS );
    2525
    26                 // Fail early if nonce missing/invalid
    27                 if ( ! $nonce || ! wp_verify_nonce( $nonce, 'tahefobu_preview_' . $pid ) ) {
    28                     return;
    29                 }
    30 
    31                 // Authorization (nonces aren’t auth)
    32                 if ( ! is_user_logged_in() || ! current_user_can( 'edit_post', $pid ) ) {
    33                     return;
    34                 }
     26            // Fail early if nonce missing/invalid
     27            if ( ! $nonce || ! wp_verify_nonce( $nonce, 'tahefobu_preview_' . $pid ) ) {
     28                return;
    3529            }
    3630
    37             // Always skip our footer logic in preview
     31            // Authorization (nonces aren’t auth)
     32            if ( ! is_user_logged_in() || ! current_user_can( 'edit_post', $pid ) ) {
     33                return;
     34            }
     35
     36            // Valid preview of our CPT — skip our matching/rendering to avoid duplication.
    3837            return;
    3938        }
     39
     40        // For previews of regular pages (editor), allow footer matching/rendering so editor shows the plugin footer when applicable.
     41    }
    4042
    4143    $footers = get_posts( [
  • header-footer-builder-for-elementor/trunk/header-footer-template/footer-builder/turbo-footer-template.php

    r3374129 r3437017  
    275275
    276276    $current_page_id = get_queried_object_id();
     277    // If the page is using Elementor Canvas layout, skip matching footers (Canvas intentionally excludes theme header/footer).
     278    if ( $current_page_id ) {
     279        $page_settings = get_post_meta( $current_page_id, '_elementor_page_settings', true );
     280        if ( is_array( $page_settings ) && isset( $page_settings['page_layout'] ) && 'elementor_canvas' === $page_settings['page_layout'] ) {
     281            return null;
     282        }
     283        $wp_template = get_post_meta( $current_page_id, '_wp_page_template', true );
     284        if ( ! empty( $wp_template ) && false !== strpos( $wp_template, 'elementor_canvas' ) ) {
     285            return null;
     286        }
     287    }
    277288    $candidates = get_posts([
    278289        'post_type'      => 'tahefobu_footer',
  • header-footer-builder-for-elementor/trunk/header-footer-template/header-builder/dummy-header.php

    r3426644 r3437017  
    88 * Then our get_header hook outputs the actual header
    99 */
    10 ?>
     10
     11 if ( ! defined( 'ABSPATH' ) ) exit;
     12
     13 ?>
  • header-footer-builder-for-elementor/trunk/header-footer-template/header-builder/empty-header.php

    r3426644 r3437017  
    22// Empty header file for Turbo Header Footer Builder
    33// This prevents theme's header.php from loading
     4
     5
     6 if ( ! defined( 'ABSPATH' ) ) exit;
     7
     8 
    49?>
  • header-footer-builder-for-elementor/trunk/header-footer-template/header-builder/turbo-header-render.php

    r3428478 r3437017  
    2020
    2121        // Strict handling of Elementor preview param
     22        // - If previewing our header/footer CPTs, verify nonce/caps and skip rendering to avoid double-output.
     23        // - If previewing a normal page (editing a page in Elementor), allow our header to render so editor shows correct header.
    2224        if ( defined( 'ELEMENTOR_VERSION' ) && \Elementor\Plugin::$instance->preview->is_preview_mode() ) {
    2325            $pid = get_the_ID();
    2426
    25             // Only enforce nonce/caps for our custom CPT previews
    2627            if ( $pid && in_array( get_post_type( $pid ), [ 'tahefobu_header', 'tahefobu_footer' ], true ) ) {
    2728                $nonce = isset( $_GET['tahefobu_nonce'] ) ? sanitize_text_field( wp_unslash( $_GET['tahefobu_nonce'] ) ) : '';
     
    3637                    return;
    3738                }
     39
     40                // When the preview is specifically of our CPT, skip rendering the live header/footer to avoid duplication.
     41                return;
    3842            }
    3943
    40             // Always skip rendering in preview
    41             return;
     44            // For previews of regular pages (editor/preview), do NOT early-return — allow our header to render in the editor.
    4245        }
    4346
  • header-footer-builder-for-elementor/trunk/header-footer-template/header-builder/turbo-header-template.php

    r3426644 r3437017  
    261261    $current_page_id = get_queried_object_id();
    262262
     263    // If the current page uses the Elementor 'Canvas' page layout, do not match headers (Canvas intentionally has no theme header).
     264    if ( $current_page_id ) {
     265        $page_settings = get_post_meta( $current_page_id, '_elementor_page_settings', true );
     266        if ( is_array( $page_settings ) && isset( $page_settings['page_layout'] ) && 'elementor_canvas' === $page_settings['page_layout'] ) {
     267            return null;
     268        }
     269        $wp_template = get_post_meta( $current_page_id, '_wp_page_template', true );
     270        if ( ! empty( $wp_template ) && false !== strpos( $wp_template, 'elementor_canvas' ) ) {
     271            return null;
     272        }
     273    }
     274
    263275    $candidates = get_posts( [
    264276        'post_type'      => 'tahefobu_header',
     
    348360    // Elementor preview gating
    349361    if ( isset( $_GET['elementor-preview'] ) ) {
    350     $raw_id = filter_input( INPUT_GET, 'elementor-preview', FILTER_SANITIZE_NUMBER_INT );
    351     if ( ! $raw_id ) return;
     362        $raw_id = filter_input( INPUT_GET, 'elementor-preview', FILTER_SANITIZE_NUMBER_INT );
     363        if ( ! $raw_id ) return;
    352364        $pid   = absint( $raw_id );
    353365        $nonce = filter_input( INPUT_GET, 'tahefobu_nonce', FILTER_SANITIZE_FULL_SPECIAL_CHARS );
    354          // Security: Require valid nonce + current_user_can for preview access. Prevents bypass or unauthorized rendering.
    355         if ( ! $pid || ! $nonce || ! wp_verify_nonce( $nonce, 'tahefobu_preview_' . $pid ) ) return;
    356         if ( ! is_user_logged_in() || ! current_user_can( 'edit_post', $pid ) ) return;
    357         // Valid preview → do not mark for render
    358         return;
     366
     367        // If the preview is specifically for one of our CPTs, require nonce + caps and skip marking for render.
     368        if ( $pid && in_array( get_post_type( $pid ), [ 'tahefobu_header', 'tahefobu_footer' ], true ) ) {
     369            if ( ! $nonce || ! wp_verify_nonce( $nonce, 'tahefobu_preview_' . $pid ) ) return;
     370            if ( ! is_user_logged_in() || ! current_user_can( 'edit_post', $pid ) ) return;
     371            // Valid preview of our CPT → do not mark for render
     372            return;
     373        }
     374
     375        // For previews of normal pages (editor/preview), continue so our header can be matched/rendered inside editor.
    359376    }
    360377
  • header-footer-builder-for-elementor/trunk/widgets/navigation-menu-hf.php

    r3406564 r3437017  
    434434            ]
    435435        );
     436        //menu item background color
     437        $this->add_control(
     438            'tahefobu_navmenu_item_background_color',
     439            [
     440                'label' => esc_html__('Background Color', 'header-footer-builder-for-elementor'),
     441                'type' => Controls_Manager::COLOR,
     442                'selectors' => [
     443                    '{{WRAPPER}} .tahefobu-nav-menu .tahefobu-menu-item' => 'background-color: {{VALUE}};',
     444                ],
     445            ]
     446        );
    436447
    437448        $this->add_control(
     
    567578            ]
    568579        );
     580        //border radius
     581        $this->add_control(
     582            'tahefobu_navmenu_items_border_radius',
     583            [
     584                'label' => esc_html__( 'Border Radius', 'header-footer-builder-for-elementor' ),
     585                'type' => Controls_Manager::DIMENSIONS,
     586                'size_units' => [ 'px', '%', 'em' ],
     587                'default' => [
     588                    'top' => '0',
     589                    'right' => '0',
     590                    'bottom' => '0',
     591                    'left' => '0',
     592                    'isLinked' => true,
     593                ],
     594                'selectors' => [
     595                    '{{WRAPPER}} .tahefobu-menu-item' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
     596                ],
     597            ]
     598        );
    569599
    570600        $this->end_controls_tab();
     
    573603            'tahefobu_navmenu_style_hover_tab',
    574604            [
    575                 'label' => esc_html__( 'Hover', 'header-footer-builder-for-elementor' ),
     605                'label' => esc_html__( 'Active', 'header-footer-builder-for-elementor' ),
    576606            ]
    577607        );
     
    588618                     {{WRAPPER}} .tahefobu-nav-menu .tahefobu-menu-item.tahefobu-active-menu-item,
    589619                     {{WRAPPER}} .tahefobu-nav-menu > .menu-item-has-children.current_page_item > .tahefobu-sub-icon' => 'color: {{VALUE}};',
     620                ],
     621            ]
     622        );
     623        //active item background color
     624        $this->add_control(
     625            'tahefobu_navmenu_item_bg_color_hover',
     626            [
     627                'label' => esc_html__( 'Background Color', 'header-footer-builder-for-elementor' ),
     628                'type' => Controls_Manager::COLOR,
     629                'default' => '',
     630                'selectors' => [
     631                    '{{WRAPPER}} .tahefobu-nav-menu .tahefobu-menu-item:hover,
     632                     {{WRAPPER}} .tahefobu-nav-menu .tahefobu-menu-item.tahefobu-active-menu-item' => 'background-color: {{VALUE}};',
    590633                ],
    591634            ]
     
    927970                'default' => 'yes',
    928971                'return_value' => 'yes'
     972            ]
     973        );
     974        // mobile menu item width
     975        $this->add_responsive_control(
     976            'tahefobu_navmenu_mobile_menu_width',
     977            [
     978                'label' => esc_html__( 'Menu Item Width', 'header-footer-builder-for-elementor' ),
     979                'type' => Controls_Manager::SLIDER,
     980                'default' => [
     981                    'size' => 100,
     982                    'unit' => '%',
     983                ],
     984                'range' => [
     985                    'px' => [
     986                        'min' => 50,
     987                        'max' => 500,
     988                    ],
     989                    '%' => [
     990                        'min' => 10,
     991                        'max' => 100,
     992                    ],
     993                ],
     994                'size_units' => [ 'px', '%' ],
     995                'selectors' => [
     996                    '{{WRAPPER}} .tahefobu-mobile-nav-menu a' => 'width: {{SIZE}}{{UNIT}};',
     997                ],
    929998            ]
    930999        );
Note: See TracChangeset for help on using the changeset viewer.