HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux sa-dev.otherchirps.net 5.15.0-139-generic #149-Ubuntu SMP Fri Apr 11 22:06:13 UTC 2025 x86_64
User: www-data (33)
PHP: 8.0.30
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/html/wp-content/themes/kalium/includes/functions/core-hook-functions.php
<?php
/**
 * Kalium WordPress Theme
 *
 * Core hook functions.
 *
 * @author Laborator
 * @link   https://kaliumtheme.com
 */
if ( ! defined( 'ABSPATH' ) ) {
	exit; // Direct access not allowed.
}

/**
 * Enqueue styles.
 *
 * @return void
 */
function _kalium_enqueue_styles() {

	// Enqueue Kalium theme scripts and styles
	kalium_enqueue( 'theme-style' );

	// Enqueue portfolio styles
	if ( kalium_should_enqueue( 'portfolio' ) ) {
		kalium_enqueue( 'theme-portfolio-css' );
	}

	// Enqueue WooCommerce styles
	if ( kalium_should_enqueue( 'woocommerce' ) ) {
		kalium_enqueue( 'theme-woocommerce-css' );
	}

	// Other components
	kalium_enqueue( 'theme-other-css' );

	// Admin icons
	if ( is_admin_bar_showing() ) {
		kalium_enqueue( 'theme-admin-icons-css' );
	}

	// CSS loaders
	if ( 'preselected' === kalium_get_theme_option( 'image_loading_placeholder_type' ) ) {
		kalium_enqueue( 'css-loaders' );
	}

	// Somebody don't want to include style.css of the theme
	$legacy_do_not_enqueue_style_css = wp_validate_boolean( get_theme_mod( 'do_not_enqueue_style_css' ) );

	if ( wp_validate_boolean( kalium_get_theme_option( 'performance_enqueue_style_css', ! $legacy_do_not_enqueue_style_css ) ) ) {
		kalium_enqueue( 'style-css' );
	}

	// Use custom skin
	if ( kalium_get_theme_option( 'use_custom_skin' ) ) {
		kalium_use_filebased_custom_skin_maybe_generate();
		kalium_use_filebased_custom_skin_enqueue();
	}
}

/**
 * Enqueue Kalium scripts and libraries.
 *
 * @return void
 */
function _kalium_enqueue_scripts() {

	// Built-in jQuery
	wp_enqueue_script( 'jquery' );

	// GSAP library
	kalium_enqueue_gsap_library();

	// ScrollMagic library
	kalium_enqueue_scrollmagic_library();

	// Sticky Header
	if ( kalium_get_theme_option( 'sticky_header' ) ) {
		kalium_enqueue_sticky_header();
	}

	// Single post enqueue
	if ( is_single() ) {

		// Fluidbox
		kalium_enqueue( 'fluidbox' );

		// Comment reply script
		if ( comments_open() ) {
			wp_enqueue_script( 'comment-reply' );
		}
	}
}

/**
 * Enqueue Kalium Main JS file.
 *
 * @return void
 */
function _kalium_enqueue_main_js_file() {

	// FontAwesome icons
	kalium_enqueue( 'fontawesome-css' );

	// Theme main JS
	kalium_enqueue( 'main-js' );
}

/**
 * Custom JavaScript in head and footer.
 *
 * @return void
 */
function _kalium_wp_head_custom_js() {

	// Custom JavaScript in Header
	$user_custom_js_head = kalium_get_theme_option( 'user_custom_js_head' );

	if ( ! empty( $user_custom_js_head ) ) {
		if ( ! preg_match( "/\<\w+/", $user_custom_js_head ) ) {
			$user_custom_js_head = '<script> ' . $user_custom_js_head . ' </script>';
		}

		echo $user_custom_js_head;
	}
}

/**
 * Custom User JavaScript print in the end.
 *
 * @return void
 */
function _kalium_wp_footer_custom_js() {

	// Custom JavaScript in Footer
	$user_custom_js = kalium_get_theme_option( 'user_custom_js' );

	if ( ! empty( $user_custom_js ) ) {
		if ( ! preg_match( "/\<\w+/", $user_custom_js ) ) {
			$user_custom_js = sprintf( '<script>%s</script>', $user_custom_js );
		}

		echo $user_custom_js;
	}
}

/**
 * Theme widgets init.
 *
 * @return void
 */
function _kalium_widgets_init() {

	// Widget wrappers
	$before_widget = '<div id="%1$s" class="widget %2$s">';
	$after_widget  = '</div>';

	// Core widgets
	$widgets = [
		// Blog Sidebar
		[
			'id'   => 'blog_sidebar',
			'name' => 'Blog Archive',
		],
		// Sidebar on single post
		[
			'id'   => 'blog_sidebar_single',
			'name' => 'Single Post',
		],
		// Footer Sidebar
		[
			'id'   => 'footer_sidebar',
			'name' => 'Footer',
		],
		// Top Menu Sidebar
		[
			'id'   => 'top_menu_sidebar',
			'name' => 'Top Menu',
		],
		// Sidebar Menu Widgets
		[
			'id'   => 'sidebar_menu_sidebar',
			'name' => 'Sidebar Menu',
		],
		// Shop Sidebar
		[
			'id'   => 'shop_sidebar',
			'name' => 'Shop Archive',
		],
		// Sidebar on single post
		[
			'id'   => 'shop_sidebar_single',
			'name' => 'Single Product',
		],
	];

	// Load sidebars (when the plugin is inactive)
	if ( ( $custom_sidebars = get_option( 'cs_sidebars', null ) ) && false == kalium()->is->plugin_active( 'custom-sidebars/customsidebars.php' ) ) {
		foreach ( $custom_sidebars as $widget ) {
			$widgets[] = [
				'id'          => $widget['id'],
				'name'        => $widget['name'],
				'description' => 'Inherited from Custom Sidebars plugin'
			];
		}
	}

	// Kalium Widgets Filter
	$widgets = apply_filters( 'kalium_widgets_array', $widgets );

	// Initialize widgets
	foreach ( $widgets as $widget ) {
		register_sidebar( [
			'id'            => $widget['id'],
			'name'          => $widget['name'],
			'before_widget' => $before_widget,
			'after_widget'  => $after_widget,
			'description'   => kalium_get_array_key( $widget, 'description' )
		] );
	}
}

/**
 * Parse footer styles.
 *
 * @return void
 */
function _kalium_append_custom_css() {
	global $kalium_append_custom_css;

	if ( empty( $kalium_append_custom_css ) ) {
		return;
	}

	echo sprintf( '<style data-appended-custom-css="true">%s</style>', kalium_compress_text( implode( "\n\n", $kalium_append_custom_css ) ) );
}

/**
 * Append content to the footer.
 *
 * @return void
 */
function _kalium_append_footer_html() {
	global $kalium_append_footer_html;

	if ( ! empty( $kalium_append_footer_html ) ) {
		echo implode( PHP_EOL, $kalium_append_footer_html );
	}
}

/**
 * Print scripts in the header.
 *
 * @return void
 */
function _kalium_wp_print_scripts() {
	?>
    <script type="text/javascript">
		var ajaxurl = ajaxurl || '<?php echo esc_attr( admin_url( 'admin-ajax.php' ) ); ?>';
		<?php if ( defined( 'ICL_LANGUAGE_CODE' ) ) : ?>
		var icl_language_code = <?php echo json_encode( ICL_LANGUAGE_CODE ); ?>;
		<?php endif; ?>
    </script>
	<?php
}

/**
 * Handler function for Endless Pagination via AJAX.
 *
 * @return void
 */
/**
 * Validate endless pagination callbacks (CVE-2025-49926).
 *
 * @param mixed $callback
 *
 * @return bool
 */
function _kalium_is_allowed_endless_callback( $callback ) {
	$allowed = apply_filters(
		'kalium_endless_pagination_allowed_callbacks',
		array(
			'_kalium_woocommerce_infinite_scroll_pagination_handler',
			'kalium_blog_loop_post_template',
		)
	);

	return is_string( $callback )
		&& in_array( $callback, $allowed, true )
		&& is_callable( $callback );
}
function _kalium_endless_pagination_get_paged_items() {
	$response = [
		'hasMore'        => false,
		'hasItems'       => false,
		'hasQueryFilter' => false,
	];

	$loop_handler  = kalium()->request->xhr_input( 'loop-handler' );
	$loop_template = kalium()->request->xhr_input( 'loop-template' );
	$base_query    = kalium()->request->xhr_input( 'base-query' );
	$args          = kalium()->request->xhr_input( 'args' );
	$pagination    = kalium()->request->xhr_input( 'pagination' );
	$query_filter  = kalium()->request->xhr_input( 'query-filter' );

	// Execute attached "pre" actions
	do_action( 'kalium_endless_pagination_pre_get_paged_items', $args );

	// Query
	$fetched_ids    = array_map( 'absint', (array) ( $pagination['fetchedItems'] ?? [] ) );
	$posts_per_page = absint( $pagination['perPage'] );
	$total_items    = absint( $pagination['totalItems'] );

	$wp_query_args = (array) $base_query;

	// Extra query filter
	if ( ! empty( $query_filter ) && is_array( $query_filter ) ) {
		$wp_query_args = array_merge( $wp_query_args, $query_filter );

		$response['hasQueryFilter'] = true;
	}

	// Set pagination data
	$wp_query_args = apply_filters( 'kalium_endless_pagination_get_paged_items_query_args', array_merge( $wp_query_args, [
		'post_status'    => 'publish',
		'posts_per_page' => $posts_per_page,
		'post__not_in'   => $fetched_ids,
	] ) );

	// Custom loop handler
	if ( $loop_handler ) {
		if ( ! _kalium_is_allowed_endless_callback( $loop_handler ) ) {
			wp_send_json_error( array( 'message' => 'Invalid loop handler.', 'code' => 'invalid_endless_callback' ) );
		}

		wp_send_json_success( call_user_func( $loop_handler, $posts_per_page, $total_items, $fetched_ids, $wp_query_args ) );
	}

	query_posts( $wp_query_args );

	// Load items
	if ( have_posts() ) {
		$new_fetched_ids = [];

		ob_start();

		// Posts loop
		while ( have_posts() ) {
			the_post();

			// Fetched ID
			$new_fetched_ids[] = get_the_id();

			// Loop template
						if ( $loop_template && _kalium_is_allowed_endless_callback( $loop_template ) ) {
				call_user_func( $loop_template );
			}
		}

		// Reset query
		wp_reset_postdata();
		wp_reset_query();

		$response['fetchedItems'] = $new_fetched_ids;
		$response['items']        = ob_get_clean();
		$response['hasMore']      = count( $fetched_ids ) + count( $new_fetched_ids ) < $total_items;
		$response['hasItems']     = true;
	}

	wp_send_json_success( $response );
}

/**
 * Kalium image placeholders style.
 *
 * @return void
 */
function _kalium_image_placeholder_set_style() {

	// Placeholder color
	$background_color = kalium_get_theme_option( 'image_loading_placeholder_bg' );

	if ( ! empty( $background_color ) ) {
		kalium()->images->set_placeholder_color( $background_color );
	}

	// Placeholder gradient color
	if ( kalium_get_theme_option( 'image_loading_placeholder_use_gradient' ) ) {
		kalium()->images->set_placeholder_gradient( $background_color, kalium_get_theme_option( 'image_loading_placeholder_gradient_bg' ), kalium_get_theme_option( 'image_loading_placeholder_gradient_type' ) );
	}

	// Placeholder dominant color
	if ( kalium_get_theme_option( 'image_loading_placeholder_dominant_color' ) ) {
		kalium()->images->use_dominant_color();
	}

	// Images Fluid Width
	kalium()->images->set_fluid_width( apply_filters( 'kalium_images_fluid_width', true ) );

	// Set loader types
	switch ( kalium_get_theme_option( 'image_loading_placeholder_type' ) ) {

		// Preselected
		case 'preselected':
			// Select spinner to use
			$spinner_id = kalium_get_theme_option( 'image_loading_placeholder_preselected_loader' );

			kalium()->images->set_loading_spinner( $spinner_id, array(
				'holder'    => 'span',
				'alignment' => kalium_get_theme_option( 'image_loading_placeholder_preselected_loader_position' ),
				'spacing'   => kalium_get_theme_option( 'image_loading_placeholder_preselected_spacing' ),
				'color'     => kalium_get_theme_option( 'image_loading_placeholder_preselected_loader_color' ),
				'scale'     => intval( kalium_get_theme_option( 'image_loading_placeholder_preselected_size' ) ) / 100,
			) );
			break;

		// Custom preloader
		case 'custom':
			$loader_image = kalium_get_theme_option( 'image_loading_placeholder_custom_image' );

			if ( $loader_image ) {
				$loader_image_width = kalium_get_theme_option( 'image_loading_placeholder_custom_image_width' );
				$loader_position    = kalium_get_theme_option( 'image_loading_placeholder_custom_loader_position' );
				$loader_spacing     = kalium_get_theme_option( 'image_loading_placeholder_custom_spacing' );

				kalium()->images->set_custom_preloader( $loader_image, array(
					'width'     => $loader_image_width,
					'alignment' => $loader_position,
					'spacing'   => $loader_spacing
				) );
			}
			break;
	}
}

/**
 * Get Google API Key Array for ACF.
 *
 * @return array
 */
function _kalium_google_api_key_acf() {
	return [
		'libraries' => 'places',
		'key'       => kalium_get_google_api(),
	];
}

/**
 * Set sidebar skin classes.
 *
 * @param array $classes
 *
 * @return array
 */
function _kalium_set_widgets_classes( $classes = [] ) {
	$skin = kalium_get_theme_option( 'sidebar_skin' );

	if ( in_array( $skin, [ 'bordered', 'background-fill' ] ) ) {
		$classes[] = sprintf( 'widget-area--skin-%s', $skin );
	}

	return $classes;
}

/**
 * Assign footer classes.
 *
 * @param array $classes
 *
 * @return array
 */
function _kalium_footer_classes( $classes ) {
	$fixed        = kalium_get_theme_option( 'footer_fixed' );
	$full_width   = kalium_get_theme_option( 'footer_fullwidth' );
	$style        = kalium_get_theme_option( 'footer_style' );
	$bottom_style = kalium_get_theme_option( 'footer_bottom_style' );

	$classes[] = 'footer-bottom-' . $bottom_style;

	if ( $fixed ) {
		$classes[] = 'fixed-footer';

		if ( $fixed == 'fixed-fade' ) {
			$classes[] = 'fixed-footer-fade';
		} else if ( $fixed == 'fixed-slide' ) {
			$classes[] = 'fixed-footer-slide';
		}
	}

	if ( $style ) {
		$classes[] = 'site-footer-' . $style;
		$classes[] = 'main-footer-' . $style; // Deprecated
	}

	// Full-width footer
	if ( $full_width ) {
		$classes[] = 'footer-fullwidth';
	}

	return $classes;
}

/**
 * Kalium get default excerpt length.
 */
function _kalium_get_default_excerpt_length() {
	return apply_filters( 'kalium_get_default_excerpt_length', 55 );
}

/**
 * Excerpt more dots.
 */
function _kalium_get_default_excerpt_more() {
	return apply_filters( 'kalium_get_default_excerpt_more', '&hellip;' );
}

/**
 * Kalium admin bar item.
 *
 * @param WP_Admin_Bar $wp_admin_bar
 */
function _kalium_admin_bar_entry( $wp_admin_bar ) {
	if ( ! current_user_can( 'manage_options' ) ) {
		return;
	}

	$plugin_updates = kalium_plugin_updates_count();

	// Add Admin Bar Menu Links
	$wp_admin_bar->add_menu( [
		'id'    => 'laborator-options',
		'title' => sprintf( '<span class="ab-icon" aria-hidden="true"></span><span class="ab-label">%s</span>', wp_get_theme() ),
		'href'  => is_admin() ? home_url() : admin_url( 'admin.php?page=laborator_options' ),
		'meta'  => [ 'target' => is_admin() ? '_blank' : '_self' ]
	] );

	$wp_admin_bar->add_menu( [
		'parent' => 'laborator-options',
		'id'     => 'laborator-options-theme',
		'title'  => 'Theme Options',
		'href'   => admin_url( 'admin.php?page=laborator_options' )
	] );

	$wp_admin_bar->add_menu( [
		'parent' => 'laborator-options',
		'id'     => 'laborator-options-typolab',
		'title'  => 'Typography',
		'href'   => admin_url( 'admin.php?page=typolab' )
	] );

	if ( $plugin_updates > 0 ) {
		$wp_admin_bar->add_menu( [
			'parent' => 'laborator-options',
			'id'     => 'install-plugins',
			'title'  => sprintf( 'Update Plugins <span class="kalium-update-badge">%d</span>', $plugin_updates ),
			'href'   => Kalium_About::get_tab_link( 'plugins' ),
		] );
	}

	$wp_admin_bar->add_menu( [
		'parent' => 'laborator-options',
		'id'     => 'laborator-custom-css',
		'title'  => 'Custom CSS',
		'href'   => admin_url( 'admin.php?page=laborator_custom_css' )
	] );

	$wp_admin_bar->add_menu( [
		'parent' => 'laborator-options',
		'id'     => 'kalium-demos',
		'title'  => 'Demos',
		'href'   => admin_url( 'admin.php?page=kalium&tab=demos' )
	] );

	$wp_admin_bar->add_menu( [
		'parent' => 'laborator-options',
		'id'     => 'laborator-help',
		'title'  => 'Help',
		'href'   => Kalium_About::get_tab_link( 'help' ),
	] );

	// Network Admin Links
	if ( ! is_admin() ) {
		$wp_admin_bar->add_menu( [
			'parent' => 'site-name',
			'id'     => 'site-name-themeoptions',
			'title'  => 'Theme Options',
			'href'   => admin_url( 'admin.php?page=laborator_options' ),
		] );

		$wp_admin_bar->add_menu( [
			'parent' => 'site-name',
			'id'     => 'site-name-typolab',
			'title'  => 'Typography',
			'href'   => admin_url( 'admin.php?page=typolab' ),
		] );
	}
}

/**
 * Go to Top Feature.
 *
 * @return void
 */
function _kalium_go_to_top_link() {
	if ( ! kalium_get_theme_option( 'footer_go_to_top' ) ) {
		return;
	}

	$activate_when = kalium_get_theme_option( 'footer_go_to_top_activate' );
	$button_type   = kalium_get_theme_option( 'footer_go_to_top_type' );
	$position      = kalium_get_theme_option( 'footer_go_to_top_position' );

	// Type
	$type = 'pixels';

	if ( strpos( $activate_when, '%' ) ) {
		$type = 'percentage';
	} else if ( trim( strtolower( $activate_when ) ) === 'footer' ) {
		$type = 'footer';
	}

	// Value
	$value = in_array( $type, [ 'pixels', 'percentage' ] ) ? intval( $activate_when ) : $activate_when;

	// Classes
	$classes = [
		'go-to-top',
		'position-' . $position,
	];

	// Shape
	if ( 'circle' === $button_type ) {
		$classes[] = 'rounded';
	}

	?>
    <a href="#top" <?php kalium_class_attr( $classes ); ?> data-type="<?php echo esc_attr( $type ); ?>" data-val="<?php echo esc_attr( $value ); ?>">
        <i class="flaticon-bottom4"></i>
    </a>
	<?php
}

/**
 * Page Custom CSS.
 *
 * @return void
 */
function _kalium_page_custom_css() {
	$queried_object_id = kalium_get_queried_object_id();

	if ( $queried_object_id && ( $page_custom_css = kalium()->acf->get_field( 'page_custom_css', $queried_object_id ) ) ) {
		$page_custom_css = str_replace( '{{ID}}', $queried_object_id, $page_custom_css );
		$page_custom_css = sprintf( '<style data-page-custom-css="true">%s</style>', $page_custom_css );

		if ( apply_filters( 'kalium_page_custom_css_append_header', true ) ) {
			add_action( 'wp_print_styles', kalium_hook_echo_value( $page_custom_css ) );
		} else {
			add_action( 'wp_footer', kalium_hook_echo_value( $page_custom_css ) );
		}
	}
}

/**
 * Add open graph meta in header.
 *
 * @return void
 */
function _kalium_wp_head_open_graph_meta() {

	// Only show if open graph meta is allowed
	if ( ! apply_filters( 'kalium_open_graph_meta', true ) || ! is_singular() ) {
		return;
	}

	// Current post
	$post = get_queried_object();

	// Excerpt, clean styles
	$excerpt = kalium_clean_excerpt( get_the_excerpt(), true );
	?>
    <meta property="og:type" content="article">
    <meta property="og:title" content="<?php echo esc_attr( get_the_title() ); ?>">
    <meta property="og:url" content="<?php echo esc_url( get_permalink() ); ?>">
    <meta property="og:site_name" content="<?php echo esc_attr( get_bloginfo( 'name' ) ); ?>">

	<?php if ( $excerpt ) : ?>
        <meta property="og:description" content="<?php echo esc_attr( $excerpt ); ?>">
	<?php endif; ?>

	<?php if ( has_post_thumbnail( $post ) ) : $image = wp_get_attachment_image_src( get_post_thumbnail_id( $post ), 'original' ); ?>
        <meta property="og:image" content="<?php echo esc_url( $image[0] ); ?>">
        <link itemprop="image" href="<?php echo esc_url( $image[0] ); ?>">

		<?php if ( apply_filters( 'kalium_meta_google_thumbnail', true ) ) : $image = wp_get_attachment_image_src( get_post_thumbnail_id( $post ), 'thumbnail' ); ?>
            <!--
		  <PageMap>
		    <DataObject type="thumbnail">
		      <Attribute name="src" value="<?php echo esc_url( $image[0] ); ?>"/>
		      <Attribute name="width" value="<?php echo esc_attr( $image[1] ); ?>"/>
		      <Attribute name="height" value="<?php echo esc_attr( $image[2] ); ?>"/>
		    </DataObject>
		  </PageMap>
		-->
		<?php endif; ?>

	<?php endif;
}

/**
 * Grid container custom width.
 *
 * @return void
 */
function _kalium_grid_container_max_width() {
	$grid_container_width     = kalium_get_theme_option( 'grid_container_width' );
	$grid_container_fullwidth = kalium_get_theme_option( 'grid_container_fullwidth' );

	// Custom in-page container width
	$queried_object_id = kalium_get_queried_object_id();

	if ( is_singular() && kalium_get_field( 'custom_grid_container_width', $queried_object_id ) ) {
		$grid_container_width     = kalium_get_field( 'grid_container_width', $queried_object_id );
		$grid_container_fullwidth = kalium_get_field( 'grid_container_fullwidth', $queried_object_id );
	}

	// Full width container
	if ( $grid_container_fullwidth ) {
		$grid_container_width = 0;
	}

	// Set container width
	if ( is_numeric( $grid_container_width ) ) {
		$grid_container_width = abs( $grid_container_width );
		$unit                 = 'px';
		$min_width            = 1200;

		// Selectors
		$selectors = [
			'.container',
			'.content-area',
			'.vc-container .vc-row-container--stretch-content .vc_inner.container-fixed',
		];

		// CSS props
		$css_props = [];

		// 100% width
		if ( 0 === $grid_container_width ) {
			$grid_container_width = 100;
			$unit                 = '%';
		}

		// Width prop
		$css_props[] = 'width: ' . $grid_container_width . $unit;

		// Width prop with calc()
		if ( 100 === $grid_container_width && '%' === $unit ) {
			$css_props[] = 'width: calc(100% - 60px)';
		}

		// Set minimum breaking point
		if ( 'px' === $unit ) {
			$min_width = $grid_container_width + 30;
		}

		// Custom container width
		echo sprintf(
			'<style data-grid-container-width> @media (min-width: %1$spx){ %2$s { %3$s } }</style>',
			$min_width,
			implode( ',', array_map( 'esc_attr', $selectors ) ),
			implode( ';', $css_props )
		);
	}
}

/**
 * Show breadcrumb in the specified location of pages.
 *
 * @return void
 *
 * @since 3.2
 */
function _kalium_breadcrumb() {
	if ( ! kalium()->is->breadcrumb_navxt_active() ) {
		return;
	}

	// Current Object ID
	$object_id = kalium_get_queried_object_id();

	// Display or not
	$breadcrumb_show = kalium_validate_boolean( kalium_get_theme_option( 'breadcrumbs', true ) );

	// Check breadcrumb visibility on certain pages
	if ( $breadcrumb_show ) {
		$visibility = array_map( 'kalium_validate_boolean', [
			'home'            => kalium_get_theme_option( 'breadcrumb_visibility_homepage' ),
			'portfolio'       => kalium_get_theme_option( 'breadcrumb_visibility_portfolio' ),
			'blog'            => kalium_get_theme_option( 'breadcrumb_visibility_blog' ),
			'search'          => kalium_get_theme_option( 'breadcrumb_visibility_search' ),
			'not_found'       => kalium_get_theme_option( 'breadcrumb_visibility_404' ),
			'header_absolute' => kalium_get_theme_option( 'breadcrumb_visibility_absolute_header' ),
		] );

		if ( ! $visibility['home'] && is_front_page() ) {
			$breadcrumb_show = false;
		} else if ( ! $visibility['portfolio'] && ( is_post_type_archive( 'portfolio' ) || is_singular( 'portfolio' ) ) ) {
			$breadcrumb_show = false;
		} else if ( ! $visibility['blog'] && ( is_post_type_archive( 'post' ) || is_singular( 'post' ) ) ) {
			$breadcrumb_show = false;
		} else if ( ! $visibility['search'] && is_search() ) {
			$breadcrumb_show = false;
		} else if ( ! $visibility['not_found'] && is_404() ) {
			$breadcrumb_show = false;
		} else if ( ! $visibility['header_absolute'] && 'absolute' === kalium_header_get_option( 'position' ) ) {
			$breadcrumb_show = false;
		}
	}

	// Single page options
	if ( is_singular() ) {
		$single_breadcrumb_show = kalium_get_field( 'breadcrumb', $object_id );

		// Force disabled for current page
		if ( 'disable' === $single_breadcrumb_show ) {
			$breadcrumb_show = false;
		} // Force enabled for current page
		else if ( 'enable' === $single_breadcrumb_show ) {
			$breadcrumb_show = true;
		}
	}

	// Breadcrumb can display
	if ( apply_filters( 'kalium_breadcrumb_display', $breadcrumb_show ) ) {

		// Default placement in wrapper start
		$breadcrumb_hook_tag      = 'kalium_wrapper_start';
		$breadcrumb_hook_priority = 15;

		// Single portfolio pages
		if ( is_singular( 'portfolio' ) ) {
			$item_type = kalium_get_field( 'item_type', $object_id );

			// Side type
			if ( 'type-1' === $item_type ) {

				// Full background
				if ( 'fullbg' === kalium_get_field( 'gallery_type' ) ) {
					$breadcrumb_hook_tag      = 'kalium_portfolio_type_side_portfolio_before_title';
					$breadcrumb_hook_priority = 10;
				}
			} // Columned type
			else if ( 'type-2' === $item_type ) {
				if ( kalium_get_field( 'show_featured_image', $object_id ) && 'absolute' === kalium_header_get_option( 'position' ) ) {
					$breadcrumb_hook_tag      = 'kalium_portfolio_type_columned_before_gallery';
					$breadcrumb_hook_priority = 10;
				}
			} // Fullscreen type
			else if ( 'type-5' === $item_type ) {
				$breadcrumb_hook_tag      = 'kalium_portfolio_type_fullscreen_before_title';
				$breadcrumb_hook_priority = 10;
			}
		} // Single post
		else if ( is_singular( 'post' ) ) {

			// Featured image placement
			$post_image_placement = kalium_blog_get_option( 'single/post_image/placement' );

			// Fullwidth image
			if ( 'full-width' === $post_image_placement ) {
				$breadcrumb_hook_tag      = 'kalium_blog_single_post_details';
				$breadcrumb_hook_priority = 5;
			}
		} // Single product
		else if ( is_singular( 'product' ) ) {

			// Product images that are stretched to the edge of browser in plain gallery type
			if ( in_array( kalium_get_theme_option( 'shop_single_product_images_layout' ), [
					'plain',
					'plain-sticky',
				] ) && kalium_validate_boolean( kalium_get_theme_option( 'shop_single_plain_image_stretch' ) ) ) {
				$breadcrumb_hook_tag      = 'woocommerce_single_product_summary';
				$breadcrumb_hook_priority = 0;
			}
		}

		// Insert breadcrumb hook
		add_action( $breadcrumb_hook_tag, 'kalium_breadcrumb', $breadcrumb_hook_priority );
	}
}

/**
 * Exclude post types from search.
 *
 * @param WP_Query $query
 *
 * @since 3.1.3
 */
function _kalium_exclude_post_types_from_search( $query ) {
	if ( is_admin() || ! $query->is_main_query() || ! $query->is_search() ) {
		return;
	}

	if ( $exclude_post_types = kalium_get_theme_option( 'exclude_search_post_types', [] ) ) {
		$exclude_post_types = array_keys( array_filter( $exclude_post_types ) );

		if ( ! empty( $exclude_post_types ) ) {
			$post_types = array_merge( [ 'post', 'page' ], array_values( get_post_types( [
				'public'   => true,
				'_builtin' => false,
			], 'names' ) ) );

			// Allowed post types
			$allowed_post_types = array_diff( array_values( $post_types ), $exclude_post_types );

			// Set query
			$query->set( 'post_type', $allowed_post_types );
		}
	}
}

/**
 * Kalium's built-in image lazy loading implementation.
 *
 * @since 3.4.5
 */
function _kalium_image_lazy_loading() {
	$enable = ! ! kalium_get_theme_option( 'performance_kalium_lazyloading', true );

	kalium()->images->set_lazy_loading( $enable );
}

/**
 * Icon fonts preloading.
 *
 * @since 3.4
 */
function _kalium_icon_fonts_preloading() {
	$preloads   = [];
	$mime_types = [
		'woff2' => 'font/woff2',
		'woff'  => 'font/woff',
		'ttf'   => 'font/ttf',
		'svg'   => 'image/svg+xml',
		'eot'   => 'application/vnd.ms-fontobject',
	];

	// Font Awesome
	if ( kalium_validate_boolean( kalium_get_theme_option( 'performance_preload_font_awesome' ) ) ) {
		$preloads['font-awesome'][] = kalium()->assets_url( 'vendors/font-awesome/webfonts/fa-regular-400.woff2' );
		$preloads['font-awesome'][] = kalium()->assets_url( 'vendors/font-awesome/webfonts/fa-solid-900.woff2' );
	}

	// Font Awesome Brands
	if ( kalium_validate_boolean( kalium_get_theme_option( 'performance_preload_font_awesome_brands' ) ) ) {
		$preloads['font-awesome'][] = kalium()->assets_url( 'vendors/font-awesome/webfonts/fa-brands-400.woff2' );
	}

	// Flaticons
	if ( kalium_validate_boolean( kalium_get_theme_option( 'performance_preload_flaticons' ) ) ) {
		$preloads['flaticons'][] = kalium()->assets_url( 'css/fonts/flaticons-custom/flaticon.woff' );
	}

	// Linea
	if ( kalium_validate_boolean( kalium_get_theme_option( 'performance_preload_linea' ) ) ) {
		$preloads['linea'][] = kalium()->assets_url( 'css/fonts/linea-iconfont/fonts/linea.woff' );
	}

	foreach ( $preloads as $web_fonts ) {
		foreach ( $web_fonts as $web_font ) {
			$extension = pathinfo( $web_font, PATHINFO_EXTENSION );
			$mime      = kalium_get_array_key( $mime_types, $extension );

			// Preload tag
			echo sprintf( '<link rel="preload" href="%s" as="font" type="%s" crossorigin>', $web_font, $mime );
			echo PHP_EOL;
		}
	}
}

/**
 * Disable Gutenberg CSS.
 *
 * @since 3.4
 */
function _kalium_disable_gutenberg_styles() {
	if ( false === kalium_validate_boolean( kalium_get_theme_option( 'performance_gutenberg_library_css', true ) ) ) {
		wp_dequeue_style( 'wp-block-library' );
		wp_dequeue_style( 'wp-block-library-theme' );
		wp_dequeue_style( 'wc-block-style' );
		wp_dequeue_style( 'wc-blocks-style' );
	}
}

/**
 * Disable jQuery migrate script.
 *
 * @param WP_Scripts $scripts
 *
 * @since 3.4
 */
function _kalium_disable_jquery_migrate( $scripts ) {
	if ( false === kalium_validate_boolean( kalium_get_theme_option( 'performance_jquery_migrate', true ) ) ) {
		if ( ! is_admin() && isset( $scripts->registered['jquery'] ) ) {
			$script = $scripts->registered['jquery'];

			if ( $script->deps ) {
				$script->deps = array_diff( $script->deps, [
					'jquery-migrate',
				] );
			}
		}
	}
}

/**
 * Disable WordPress Emoji library.
 *
 * @since 3.4
 */
function _kalium_disable_wp_emoji() {
	if ( false === kalium_validate_boolean( kalium_get_theme_option( 'performance_wp_emoji', true ) ) ) {
		remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
		remove_action( 'wp_print_styles', 'print_emoji_styles' );
	}
}

/**
 * Disable WordPress Emoji library.
 *
 * @since 3.4
 */
function _kalium_disable_wp_embed() {
	if ( false === kalium_validate_boolean( kalium_get_theme_option( 'performance_wp_embed', true ) ) ) {
		remove_action( 'wp_head', 'wp_oembed_add_host_js' );
	}
}

/**
 * JPEG quality.
 *
 * @param int $quality
 *
 * @return int
 *
 * @since 3.4
 */
function _kalium_jpeg_quality( $quality ) {
	$jpeg_quality = kalium_get_theme_option( 'performance_jpeg_quality' );

	if ( is_numeric( $jpeg_quality ) ) {
		return intval( $jpeg_quality );
	}

	return $quality;
}