File: /var/www/html/wp-content/themes/kalium/includes/functions/header-hook-functions.php
<?php
/**
* Kalium WordPress Theme
*
* Header hook functions.
*
* @author Laborator
* @link https://kaliumtheme.com
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Direct access not allowed.
}
/**
* Default sticky options.
*
* @param array $options
*
* @return array
*/
function _kalium_sticky_header_options_default( $options ) {
// Sticky vars
$vertical_padding = kalium_get_theme_option( 'sticky_header_vertical_padding' );
$background_color = kalium_get_theme_option( 'sticky_header_background_color' );
$header_skin = kalium_get_theme_option( 'sticky_header_skin' );
$has_border = kalium_get_theme_option( 'sticky_header_border' );
$border_color = kalium_get_theme_option( 'sticky_header_border_color' );
$border_width = kalium_get_theme_option( 'sticky_header_border_width' );
$shadow_color = kalium_get_theme_option( 'sticky_header_shadow_color' );
$shadow_width = kalium_get_theme_option( 'sticky_header_shadow_width' );
$shadow_blur = kalium_get_theme_option( 'sticky_header_shadow_blur' );
$is_autohide = kalium_get_theme_option( 'sticky_header_autohide' );
$autohide_type = kalium_get_theme_option( 'sticky_header_autohide_animation_type' );
$autohide_duration = kalium_get_theme_option( 'sticky_header_autohide_duration' );
$logo_width = kalium_get_theme_option( 'sticky_header_logo_width' );
$custom_logo = kalium_get_theme_option( 'sticky_header_logo' );
$animate_with_scroll = kalium_get_theme_option( 'sticky_header_animate_duration' );
$tween_changes = kalium_get_theme_option( 'sticky_header_tween_changes' );
$animate_duration = kalium_get_theme_option( 'header_sticky_duration' );
$animate_offset = kalium_get_theme_option( 'header_sticky_initial_offset' );
$animate_chaining = kalium_get_theme_option( 'sticky_header_animation_chaining' );
$supported_on = [
'desktop' => kalium_get_theme_option( 'sticky_header_support_desktop' ),
'tablet' => kalium_get_theme_option( 'sticky_header_support_tablet' ),
'mobile' => kalium_get_theme_option( 'sticky_header_support_mobile' ),
];
/**
* Initial offset for scenes to exclude top header bar.
*/
$options['offset'] = '.top-header-bar';
/**
* Animation scene offset.
*/
if ( is_numeric( $animate_offset ) ) {
$options['animationOffset'] = $animate_offset;
}
/**
* Animate animation progress with scroll.
*/
$options['animateProgressWithScroll'] = ! boolval( $animate_with_scroll );
/**
* Tween changes with scroll progress.
*/
$options['tweenChanges'] = boolval( $tween_changes );
/**
* Animate duration in seconds.
*/
if ( is_numeric( $animate_duration ) ) {
$options['animateDuration'] = $animate_duration;
}
/**
* Generate spacer or not.
*/
$options['spacer'] = 'absolute' !== kalium_header_get_option( 'position' );
/**
* Autohide sticky type.
*/
if ( $is_autohide ) {
// Sticky type
$options['type'] = 'autohide';
// Animation type
$options['autohide']['animationType'] = $autohide_type;
// Duration
if ( is_numeric( $autohide_duration ) ) {
$options['autohide']['duration'] = $autohide_duration;
}
}
/**
* Supported on device types.
*/
$options['supportedOn'] = $supported_on;
/**
* Menu skin on sticky mode.
*/
if ( $header_skin ) {
$options['other']['menuSkin'] = $header_skin;
}
/**
* Animation scenes.
*/
$scene_name_padding = 'padding';
$scene_name_styling = 'styling';
$scene_name_sticky_logo = 'sticky-logo';
$scene_name_resize_logo = 'resize-logo';
$animation_scenes = [];
// Padding animation scene
if ( is_numeric( $vertical_padding ) ) {
$animation_scene_padding = [
'name' => 'padding',
'selector' => '.header-block',
'props' => [
'paddingTop',
'paddingBottom',
],
'css' => [
'default' => [
'paddingTop' => $vertical_padding,
'paddingBottom' => $vertical_padding,
],
],
];
$animation_scenes[ $scene_name_padding ] = $animation_scene_padding;
}
// Background, shadow and border animation scene
$animation_scene_style = [
'name' => 'style',
'selector' => '.header-block',
'props' => [],
'css' => [
'default' => [],
],
'data' => [
'tags' => [
'transparent-header', // required!
],
],
];
if ( $background_color ) {
$animation_scene_style['props'][] = 'backgroundColor';
$animation_scene_style['css']['default']['backgroundColor'] = $background_color;
}
// Bottom border
if ( $has_border ) {
// Bottom border color
if ( $border_color ) {
$animation_scene_style['props'][] = 'borderBottom';
$animation_scene_style['css']['default']['borderBottom'] = sprintf( '%s solid %s', $border_width, $border_color );
kalium_append_custom_css( '.header-block', 'border-bottom: 1px solid transparent' );
}
// Shadow color
if ( $shadow_color ) {
$animation_scene_style['props'][] = 'boxShadow';
$animation_scene_style['css']['default']['boxShadow'] = sprintf( '%s 0px %s %s', $shadow_color, $shadow_width, $shadow_blur );
kalium_append_custom_css( '.header-block', 'box-shadow: 0px 0px 0px transparent' );
}
}
// Register styling scene if there are props to animate
if ( ! empty( $animation_scene_style['css']['default'] ) ) {
$animation_scenes[ $scene_name_styling ] = $animation_scene_style;
}
// Custom logo animation scene
if ( $custom_logo ) {
// Attachment image
$sticky_logo = wp_get_attachment_image( $custom_logo, 'original' );
if ( $sticky_logo ) {
// Register alternate logo
$sticky_logo_src = wp_get_attachment_image_src( $custom_logo, 'original' );
$sticky_logo_width = $sticky_logo_src[1];
$sticky_logo_height = $sticky_logo_src[2];
$options['alternateLogos']['sticky'] = [
'name' => 'sticky',
'image' => $sticky_logo,
];
// Custom logo width
if ( $logo_width ) {
$new_dimensions = kalium()->helpers->resize_by_width( $sticky_logo_width, $sticky_logo_height, $logo_width );
$sticky_logo_width = $new_dimensions[0];
$sticky_logo_height = $new_dimensions[1];
} // Determine logo width set in theme options
else if ( $custom_logo_max_width = kalium_get_theme_option( 'custom_logo_max_width' ) ) {
$new_dimensions = kalium()->helpers->resize_by_width( $sticky_logo_width, $sticky_logo_height, $custom_logo_max_width );
$sticky_logo_width = $new_dimensions[0];
$sticky_logo_height = $new_dimensions[1];
}
// Sticky logo animation scene
$animation_scene_sticky_logo = [
'name' => 'sticky-logo',
'selector' => 'logo',
'props' => [
'width',
'height',
],
'css' => [
'width' => $sticky_logo_width,
'height' => $sticky_logo_height,
],
'data' => [
'type' => 'alternate-logo',
'alternateLogo' => 'sticky',
'tags' => [
'logo-switch', // required!
],
],
];
$animation_scenes[ $scene_name_sticky_logo ] = $animation_scene_sticky_logo;
}
} // Logo resize animation scene
else if ( $logo_width && ( $custom_logo = kalium_get_theme_option( 'custom_logo_image' ) ) ) {
$custom_logo_src = wp_get_attachment_image_src( $custom_logo, 'original' );
if ( $custom_logo_src ) {
$custom_logo_width = $custom_logo_src[1];
$custom_logo_height = $custom_logo_src[2];
$new_dimensions = kalium()->helpers->resize_by_width( $custom_logo_width, $custom_logo_height, $logo_width );
$custom_logo_width = $new_dimensions[0];
$custom_logo_height = $new_dimensions[1];
// Resize logo animation scene
$animation_scenes[ $scene_name_resize_logo ] = [
'name' => 'logo-resize',
'selector' => '.logo-image',
'props' => [
'width',
'height',
],
'css' => [
'default' => [
'width' => $custom_logo_width,
'height' => $custom_logo_height,
],
],
'data' => [
'tags' => [
'logo-resize', // required!
],
],
];
}
}
/**
* Animation chaining.
*/
$scene_duration_base = 0.3;
switch ( $animate_chaining ) {
// All at once
case 'all':
foreach ( $animation_scenes as & $animation_scene ) {
$animation_scene['position'] = 0;
}
break;
// Padding -> Background, Logo
case 'padding-bg_logo':
$animation_chain = [
$scene_name_padding,
[ $scene_name_styling, $scene_name_sticky_logo, $scene_name_resize_logo ],
];
break;
// Background, Logo -> Padding
case 'bg_logo-padding':
$animation_chain = [
[ $scene_name_styling, $scene_name_sticky_logo, $scene_name_resize_logo ],
$scene_name_padding,
];
break;
// Logo, Padding -> Background
case 'logo_padding-bg':
$animation_chain = [
[ $scene_name_padding, $scene_name_sticky_logo, $scene_name_resize_logo ],
$scene_name_styling,
];
break;
// Background -> Logo, Padding
case 'bg-logo_padding':
$animation_chain = [
$scene_name_styling,
[ $scene_name_padding, $scene_name_sticky_logo, $scene_name_resize_logo ],
];
break;
// Padding -> Background -> Logo
case 'padding-bg-logo':
$animation_chain = [
$scene_name_padding,
$scene_name_styling,
[ $scene_name_sticky_logo, $scene_name_resize_logo ],
];
break;
// Background -> Logo -> Padding
case 'bg-logo-padding':
$animation_chain = [
$scene_name_styling,
[ $scene_name_sticky_logo, $scene_name_resize_logo ],
$scene_name_padding,
];
break;
// Logo -> Background -> Padding
case 'logo-bg-padding':
$animation_chain = [
[ $scene_name_sticky_logo, $scene_name_resize_logo ],
$scene_name_styling,
$scene_name_padding,
];
break;
// Background -> Padding -> Logo
case 'bg-padding-logo':
$animation_chain = [
$scene_name_styling,
$scene_name_padding,
[ $scene_name_sticky_logo, $scene_name_resize_logo ],
];
break;
}
// Set animation chaining
if ( isset( $animation_chain ) ) {
foreach ( $animation_chain as $i => $scenes ) {
$scenes = ! is_array( $scenes ) ? [ $scenes ] : $scenes;
foreach ( $scenes as $scene_name ) {
if ( isset( $animation_scenes[ $scene_name ] ) ) {
$position = $i * $scene_duration_base;
// Duration on timeline
if ( ! isset( $animation_scenes[ $scene_name ]['duration'] ) ) {
$animation_scenes[ $scene_name ]['duration'] = $scene_duration_base;
}
// Position on timeline
$animation_scenes[ $scene_name ]['position'] = $position;
}
}
}
}
// Sort animation scenes by their position
uasort( $animation_scenes, function ( $a, $b ) {
if ( isset( $a['position'] ) && isset( $b['position'] ) ) {
return $a['position'] < $b['position'] ? - 1 : 1;
}
} );
// Update animation scenes property
$options['animateScenes'] = $animation_scenes;
return $options;
}
/**
* Header position and spacing.
*
* @return void
*/
function _kalium_header_position_spacing_action() {
$queried_object_id = kalium_get_queried_object_id();
$header_position = kalium_header_get_option( 'position' );
$header_spacing = kalium_header_get_option( 'spacing' );
// Header position
if ( 'absolute' === $header_position && ! post_password_required( $queried_object_id ) ) {
kalium_append_custom_css( '.site-header', 'position: absolute; left: 0; right: 0;' );
// Header spacing
if ( $header_spacing ) {
$header_spacing = str_replace( 'px', '', $header_spacing );
kalium_append_custom_css( '.wrapper', "padding-top: {$header_spacing}px", '', true );
}
}
}
/**
* Absolute header body class.
*
* @param array $classes
*
* @return array
*/
function _kalium_absolute_header_body_class( $classes ) {
$queried_object_id = kalium_get_queried_object_id();
$header_position = kalium_header_get_option( 'position' );
if ( 'absolute' === $header_position && ! post_password_required( $queried_object_id ) ) {
$classes[] = 'header-absolute';
}
return $classes;
}
/**
* Custom logo and menu options for current page.
*
* @return void
*/
function _kalium_header_custom_logo_and_menu_on_page() {
if ( get_queried_object() instanceof WP_Post && ( $queried_object_id = kalium_get_queried_object_id() ) ) {
// Vars
$custom_logo = kalium_get_field( 'custom_logo', $queried_object_id );
$custom_menu_skin = kalium_get_field( 'custom_menu_skin', $queried_object_id );
$sticky_menu_on_page = kalium_get_field( 'sticky_menu_on_page', $queried_object_id );
$custom_sticky_logo = kalium_get_field( 'custom_sticky_logo', $queried_object_id );
$sticky_menu_skin = kalium_get_field( 'sticky_menu_skin', $queried_object_id );
$menu_skins = [
'menu-skin-main',
'menu-skin-dark',
'menu-skin-light',
];
// Custom logo
if ( $custom_logo && is_numeric( $custom_logo ) ) {
$custom_logo_width = kalium_get_field( 'custom_logo_width' );
add_filter( 'get_data_use_uploaded_logo', '__return_true' );
add_filter( 'get_data_custom_logo_image', kalium_hook_return_value( $custom_logo ) );
if ( is_numeric( $custom_logo_width ) && $custom_logo_width > 0 ) {
add_filter( 'get_data_custom_logo_max_width', kalium_hook_return_value( $custom_logo_width ) );
}
}
// Custom sticky logo
if ( $custom_sticky_logo ) {
add_filter( 'get_data_sticky_header_logo', kalium_hook_return_value( $custom_sticky_logo ) );
}
// Menu skin
if ( $custom_menu_skin && in_array( $custom_menu_skin, $menu_skins ) ) {
add_filter( 'get_data_menu_full_bg_skin', kalium_hook_return_value( $custom_menu_skin ) );
add_filter( 'get_data_menu_standard_skin', kalium_hook_return_value( $custom_menu_skin ) );
add_filter( 'get_data_menu_top_skin', kalium_hook_return_value( $custom_menu_skin ) );
add_filter( 'get_data_menu_sidebar_skin', kalium_hook_return_value( $custom_menu_skin ) );
add_filter( 'get_data_custom_header_default_skin', kalium_hook_return_value( $custom_menu_skin ) );
}
// Overwrite sticky header option for current page
if ( in_array( $sticky_menu_on_page, [ 'enable', 'disable' ] ) ) {
add_filter( 'get_data_sticky_header', ( $sticky_menu_on_page == 'enable' ? '__return_true' : '__return_false' ) );
}
// Custom sticky header skin
if ( in_array( $sticky_menu_skin, $menu_skins ) ) {
add_filter( 'get_data_sticky_header_skin', kalium_hook_return_value( $sticky_menu_skin ) );
}
}
}
/**
* Process legacy header types in custom header builder.
*/
function _kalium_header_process_legacy_header_types( $menu_content ) {
$header_type = kalium_get_theme_option( 'main_menu_type' );
$submenu_caret = kalium_conditional( kalium_get_theme_option( 'submenu_dropdown_indicator' ), 'yes', 'no' );
$menu_content_new = [
'entries' => [],
'alignment' => 'right',
];
// Toggle skin color
$skin_class = 'menu-skin-main';
switch ( $header_type ) {
case 'full-bg-menu':
$skin_class = kalium_get_theme_option( 'menu_full_bg_skin' );
break;
case 'standard-menu':
$skin_class = kalium_get_theme_option( 'menu_standard_skin' );
break;
case 'top-menu':
$skin_class = kalium_get_theme_option( 'menu_top_skin' );
break;
case 'sidebar-menu':
$skin_class = kalium_get_theme_option( 'menu_sidebar_skin' );
break;
}
// Language switcher
if ( kalium_get_theme_option( 'header_wpml_language_switcher' ) ) {
$show_on = kalium_get_theme_option( 'header_wpml_language_trigger' );
$flag_position = kalium_get_theme_option( 'header_wpml_language_flag_position' );
$display_text_format = kalium_get_theme_option( 'header_wpml_language_switcher_text_display_type' );
$language_switcher = [
'contentType' => 'wpml-language-switcher',
'options' => [
'display_text_format' => $display_text_format,
'flag_position' => $flag_position,
'show_on' => $show_on,
'skin' => $skin_class,
],
];
$menu_content_new['entries'][] = $language_switcher;
}
// Search field
if ( kalium_get_theme_option( 'header_search_field' ) ) {
$search_field_input = [
'contentType' => 'search-field',
'options' => [
'align' => 'left',
'skin' => $skin_class,
'hide_on' => [ 'mobile' ],
],
];
$menu_content_new['entries'][] = $search_field_input;
}
// Mini cart
if ( kalium_get_theme_option( 'shop_cart_icon_menu' ) && kalium()->is->woocommerce_active() ) {
$mini_cart_toggle = [
'contentType' => 'woocommerce-mini-cart',
'options' => [
'align' => 'left',
'skin' => $skin_class,
],
];
$menu_content_new['entries'][] = $mini_cart_toggle;
}
// Fullscreen menu toggle
if ( 'full-bg-menu' === $header_type ) {
$menu_full_toggled_skin = 'menu-skin-light';
$menu_full_search_field = kalium_conditional( kalium_get_theme_option( 'menu_full_bg_search_field' ), [ 'yes' ], [] );
$menu_full_show_footer = kalium_conditional( kalium_get_theme_option( 'menu_full_bg_footer_block' ), [ 'yes' ], [] );
$menu_full_translucent_bg = kalium_conditional( kalium_get_theme_option( 'menu_full_bg_opacity' ), [ 'yes' ], [] );
if ( 'menu-skin-light' === $skin_class ) {
$menu_full_toggled_skin = 'menu-skin-dark';
}
// Fullscreen toggle
$menu_toggle = [
'contentType' => 'open-fullscreen-menu',
'options' => [
'skin' => $skin_class,
'toggled_skin' => $menu_full_toggled_skin,
'background_color' => 'inherit',
'search_field' => $menu_full_search_field,
'show_footer' => $menu_full_show_footer,
'translucent_bg' => $menu_full_translucent_bg,
'hide_on' => [],
],
];
$menu_content_new['entries'][] = $menu_toggle;
} // Standard menu toggle
else if ( 'standard-menu' === $header_type ) {
$menu_toggle = [
'contentType' => 'main-menu',
'options' => [
'skin' => $skin_class,
'submenu_dropdown_caret' => $submenu_caret,
],
];
// Standard menu toggle
if ( kalium_validate_boolean( kalium_get_theme_option( 'menu_standard_menu_bar_visible' ) ) ) {
$menu_toggle['contentType'] = 'open-standard-menu';
$menu_toggle['options']['menu_id'] = 'main-menu';
$menu_toggle['options']['menu_position'] = 'beginning';
// Reveal effect
$reveal_effect = kalium_get_theme_option( 'menu_standard_menu_bar_effect' );
$reveal_effect_mapping = [
'reveal-from-top' => 'slide-top',
'reveal-from-right' => 'slide-right',
'reveal-from-left' => 'slide-left',
'reveal-from-bottom' => 'slide-bottom',
'reveal-fade' => 'fade',
];
// Toggle effect
if ( isset( $reveal_effect_mapping[ $reveal_effect ] ) ) {
$menu_toggle['options']['toggle_effect'] = $reveal_effect_mapping[ $reveal_effect ];
}
// Stagger direction
$menu_toggle['options']['stagger_direction'] = 'right';
// Add to end of row
$menu_content_new['entries'][] = $menu_toggle;
} else {
$menu_toggle['options']['mobile_menu_toggle_position'] = 'end';
// Add to beginning of row
array_unshift( $menu_content_new['entries'], $menu_toggle );
}
} // Top menu toggle
else if ( 'top-menu' === $header_type ) {
$menu_toggle = [
'contentType' => 'open-top-menu',
'options' => [
'skin' => $skin_class,
],
];
$menu_content_new['entries'][] = $menu_toggle;
} // Sidebar menu toggle
else if ( 'sidebar-menu' === $header_type ) {
$menu_toggle = [
'contentType' => 'open-sidebar-menu',
'options' => [
'skin' => $skin_class,
],
];
$menu_content_new['entries'][] = $menu_toggle;
}
return json_encode( $menu_content_new );
}