HEX
Server: LiteSpeed
System: Linux linux31.centraldnserver.com 4.18.0-553.83.1.lve.el8.x86_64 #1 SMP Wed Nov 12 10:04:12 UTC 2025 x86_64
User: salamatk (1501)
PHP: 8.1.33
Disabled: show_source, system, shell_exec, passthru, exec, popen, proc_open
Upload Files
File: /home/salamatk/takarzan.ir/wp-content/themes/xts-luman/framework/includes/functions.php
<?php
/**
 * Framework functions.
 *
 * @package xts
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Direct access not allowed.
}

use Elementor\Utils;
use XTS\Framework\AJAX_Response;
use XTS\Styles_Storage;
use Elementor\Plugin;

if ( ! function_exists( 'xts_custom_admin_menu_order' ) ) {
	/**
	 * Filters the order of administration menu items.
	 *
	 * @since 1.0.0
	 *
	 * @param array $menu_order An ordered array of menu items.
	 *
	 * @return array
	 */
	function xts_custom_admin_menu_order( $menu_order ) {
		$custom_menu_order = array(
			'xts_dashboard',
			'xtemos_options',
			'edit.php?post_type=xts-portfolio',
			'edit.php?post_type=xts-html-block',
			'edit.php?post_type=xts-sidebar',
			'edit.php?post_type=xts-slide',
			'edit.php?post_type=xts-template',
			'edit.php?post_type=xts-size-guide',
			'xts-menu-separator',
		);

		foreach ( $menu_order as $index => $item ) {
			if ( in_array( $item, $custom_menu_order ) ) { // phpcs:ignore
				unset( $menu_order[ $index ] );
			}

			if ( 'xts_dashboard' === $item ) {
				$menu_order[] = 'xts-menu-separator';
				$menu_order[] = $item;
				$menu_order[] = 'xtemos_options';
				$menu_order[] = 'edit.php?post_type=xts-portfolio';
				$menu_order[] = 'edit.php?post_type=xts-html-block';
				$menu_order[] = 'edit.php?post_type=xts-sidebar';
				$menu_order[] = 'edit.php?post_type=xts-slide';
				$menu_order[] = 'edit.php?post_type=xts-template';
				$menu_order[] = 'edit.php?post_type=xts-size-guide';
			} elseif ( ! in_array( $item, array( 'xts-menu-separator' ), true ) ) {
				$menu_order[] = $item;
			}
		}

		return $menu_order;
	}

	add_filter( 'menu_order', 'xts_custom_admin_menu_order', 1000000 );
	add_filter( 'custom_menu_order', '__return_true' );
}

if ( ! function_exists( 'xts_scpo_single_posts_navigation_fix' ) ) {
	/**
	 * Fix for single post navigation with Simple Custom Post Order plugin.
	 *
	 * @param WP_Query $wp_query The WP_Query instance (passed by reference).
	 */
	function xts_scpo_single_posts_navigation_fix( $wp_query ) {
		unset( $wp_query->query['suppress_filters'] );
	}
}

if ( ! function_exists( 'xts_get_taxonomies_by_ids_autocomplete' ) ) {
	/**
	 * Autocomplete by taxonomies ids.
	 *
	 * @since 1.0.0
	 *
	 * @param array $ids Posts ids.
	 *
	 * @return array
	 */
	function xts_get_taxonomies_by_ids_autocomplete( $ids ) {
		$output = array();

		if ( ! $ids ) {
			return $output;
		}

		if ( ! is_array( $ids ) ) {
			$ids = array( $ids );
		}

		foreach ( $ids as $id ) {
			$term = get_term( $id );

			if ( $term && ! is_wp_error( $term ) ) {
				$output[ $term->term_id ] = array(
					'name'  => $term->name,
					'value' => $term->term_id,
				);
			}
		}

		return $output;
	}
}

if ( ! function_exists( 'xts_get_taxonomies_by_query_autocomplete' ) ) {
	/**
	 * Autocomplete by taxonomies.
	 *
	 * @since 1.0.0
	 */
	function xts_get_taxonomies_by_query_autocomplete() {
		$output = array();

		$args = array(
			'number'     => 5,
			'taxonomy'   => xts_clear( $_POST['value'] ), // phpcs:ignore
			'hide_empty' => false,
		);

		if ( ! empty( $_POST['params']['term'] ) ) {
			$args['search'] = xts_clear( $_POST['params']['term'] ); // phpcs:ignore
		}

		$terms = get_terms( $args );

		if ( $terms && count( $terms ) > 0 ) { // phpcs:ignore
			foreach ( $terms as $term ) {
				$output[] = array(
					'id'   => $term->term_id,
					'text' => $term->name,
				);
			}
		}

		AJAX_Response::send_response( $output );
	}

	add_action( 'wp_ajax_xts_get_taxonomies_by_query_autocomplete', 'xts_get_taxonomies_by_query_autocomplete' );
	add_action( 'wp_ajax_nopriv_xts_get_taxonomies_by_query_autocomplete', 'xts_get_taxonomies_by_query_autocomplete' );
}

if ( ! function_exists( 'xts_get_posts_by_query_autocomplete' ) ) {
	/**
	 * Autocomplete by post type.
	 *
	 * @since 1.0.0
	 */
	function xts_get_posts_by_query_autocomplete() {
		$output = array();
		$args   = array(
			'posts_per_page' => apply_filters( 'xts_get_numberposts_by_query_autocomplete', 20 ),
			'post_type'      => xts_clear( $_POST['value'] ), // phpcs:ignore
			'exclude'        => isset( $_POST['selected'] ) ? $_POST['selected'] : array(),  // phpcs:ignore
		);

		if ( ! empty( $_POST['params']['term'] ) ) {
			$args['s'] = xts_clear( $_POST['params']['term'] ); // phpcs:ignore.
		}

		$posts = get_posts( $args );

		if ( count( $posts ) > 0 ) { // phpcs:ignore
			foreach ( $posts as $post ) {
				$output[] = array(
					'id'   => $post->ID,
					'text' => $post->post_title,
				);
			}
		}

		AJAX_Response::send_response( $output );
	}

	add_action( 'wp_ajax_xts_get_posts_by_query_autocomplete', 'xts_get_posts_by_query_autocomplete' );
	add_action( 'wp_ajax_nopriv_xts_get_posts_by_query_autocomplete', 'xts_get_posts_by_query_autocomplete' );
}

if ( ! function_exists( 'xts_get_posts_by_ids_autocomplete' ) ) {
	/**
	 * Autocomplete by posts by ids.
	 *
	 * @since 1.0.0
	 *
	 * @param array $ids Posts ids.
	 *
	 * @return array
	 */
	function xts_get_posts_by_ids_autocomplete( $ids ) {
		$output = array();

		if ( ! $ids ) {
			return $output;
		}

		if ( ! is_array( $ids ) ) {
			$ids = array( $ids );
		}

		foreach ( $ids as $id ) {
			$post = get_post( $id );

			if ( $post ) {
				$output[ $post->ID ] = array(
					'name'  => $post->post_title,
					'value' => $post->ID,
				);
			}
		}

		return $output;
	}
}

if ( ! function_exists( 'xts_get_site_content_container_classes' ) ) {
	/**
	 * Get classes for site content container div
	 *
	 * @since 1.0.0
	 *
	 * @param integer $page_id Page id.
	 *
	 * @return string
	 */
	function xts_get_site_content_container_classes( $page_id ) {
		$container_classes    = 'container';
		$page_for_projects    = xts_get_opt( 'portfolio_page' );
		$portfolio_full_width = ( $page_id === $page_for_projects || is_post_type_archive( 'xts-portfolio' ) || is_tax( 'xts-portfolio-cat' ) ) && xts_get_opt( 'portfolio_full_width' );

		if ( $portfolio_full_width || xts_is_elementor_full_width() ) {
			$container_classes = 'container-fluid container-no-gutters';
		}

		return apply_filters( 'xts_main_content_classes', $container_classes );
	}
}

if ( ! function_exists( 'xts_get_custom_js' ) ) {
	/**
	 * Get custom JS from theme settings
	 *
	 * @since 1.0.0
	 *
	 * @return string
	 */
	function xts_get_custom_js() {
		$custom_js = xts_get_opt( 'js_global' );
		$js_ready  = xts_get_opt( 'js_document_ready' );

		ob_start();

		if ( $custom_js || $js_ready ) {
			if ( $custom_js ) {
				echo apply_filters( 'xts_custom_js_output', $custom_js ); // phpcs:ignore
			}

			if ( $js_ready ) {
				echo 'jQuery(document).ready(function() {';
				echo apply_filters( 'xts_custom_js_output', $js_ready ); // phpcs:ignore
				echo '});';
			}
		}

		return ob_get_clean();
	}
}

if ( ! function_exists( 'xts_get_single_post_classes' ) ) {
	/**
	 * Get blog single post classes
	 *
	 * @since 1.0.0
	 *
	 * @param array $custom_classes Custom classes.
	 *
	 * @return array
	 */
	function xts_get_single_post_classes( $custom_classes = array() ) {
		$design      = xts_get_opt( 'blog_single_design' );
		$post_format = get_post_format();
		$post_id     = get_the_ID();
		$audio       = get_post_meta( $post_id, '_xts_post_audio_url', true );
		$gallery     = get_post_meta( $post_id, '_xts_post_gallery', true );
		$classes     = array();

		$classes[] = 'xts-single-post';
		$classes[] = 'xts-design-' . $design;

		if ( 'video' === $post_format && xts_post_have_video( $post_id ) ) {
			$classes[] = 'xts-has-video';
		}

		if ( 'video' === $post_format && xts_post_have_video( $post_id ) && ! has_post_thumbnail() ) {
			$classes[] = 'has-post-thumbnail';
		}

		if ( 'audio' === $post_format && $audio ) {
			$classes[] = 'xts-has-audio';
		}

		if ( 'gallery' === $post_format && $gallery ) {
			$classes[] = 'xts-has-gallery';
			$classes[] = 'has-post-thumbnail';
		}

		if ( ( 'image' === $post_format || 'quote' === $post_format || 'link' === $post_format ) && xts_get_opt( 'blog_theme_post_formats', '0' ) ) {
			$classes[] = 'xts-format-design-mask';
		}

		if ( $custom_classes ) {
			$classes = array_merge( $classes, $custom_classes );
		}

		return $classes;
	}
}

if ( ! function_exists( 'xts_get_post_classes' ) ) {
	/**
	 * Get blog post classes
	 *
	 * @since 1.0.0
	 * @return array
	 */
	function xts_get_post_classes() {
		$post_format = get_post_format();
		$post_id     = get_the_ID();
		$audio       = get_post_meta( $post_id, '_xts_post_audio_url', true );
		$gallery     = get_post_meta( $post_id, '_xts_post_gallery', true );
		$classes     = array();

		$classes[] = 'xts-post';

		if ( 'video' === $post_format && xts_post_have_video( $post_id ) ) {
			$classes[] = 'xts-video-muted';
			$classes[] = 'xts-has-video';
		}

		if ( 'video' === $post_format && xts_post_have_video( $post_id ) && ! has_post_thumbnail() ) {
			$classes[] = 'has-post-thumbnail';
		}

		if ( 'audio' === $post_format && $audio ) {
			$classes[] = 'xts-has-audio';
		}

		if ( 'gallery' === $post_format && $gallery ) {
			$classes[] = 'xts-has-gallery';
		}

		if ( 'gallery' === $post_format && $gallery && ! has_post_thumbnail() ) {
			$classes[] = 'has-post-thumbnail';
		}

		if ( ( 'image' === $post_format || 'quote' === $post_format || 'link' === $post_format ) && xts_get_opt( 'blog_theme_post_formats', '0' ) ) {
			$classes[] = 'xts-format-design-mask';
		}

		return $classes;
	}
}

if ( ! function_exists( 'xts_get_link_attrs' ) ) {
	/**
	 * Get image url
	 *
	 * @since 1.0.0
	 *
	 * @param array $link Link data array.
	 *
	 * @return string
	 */
	function xts_get_link_attrs( $link ) {
		$link_attrs = '';

		if ( isset( $link['url'] ) && $link['url'] ) {
			$link_attrs = ' href="' . esc_url( $link['url'] ) . '"';

			if ( isset( $link['is_external'] ) && 'on' === $link['is_external'] ) {
				$link_attrs .= ' target="_blank"';
			}

			if ( isset( $link['nofollow'] ) && 'on' === $link['nofollow'] ) {
				$link_attrs .= ' rel="nofollow"';
			}
		}

		if ( isset( $link['class'] ) ) {
			$link_attrs .= ' class="' . esc_attr( $link['class'] ) . '"';
		}

		if ( isset( $link['data'] ) ) {
			$link_attrs .= $link['data'];
		}

		if ( ! empty( $link['custom_attributes'] ) ) {
			$custom_attributes = Utils::parse_custom_attributes( $link['custom_attributes'] );
			foreach ( $custom_attributes as $key => $value ) {
				$link_attrs .= ' ' . $key . '="' . $value . '"';
			}
		}

		return $link_attrs;
	}
}

if ( ! function_exists( 'xts_body_classes' ) ) {
	/**
	 * Add classes to body
	 *
	 * @since 1.0.0
	 *
	 * @param array $classes Body classes.
	 *
	 * @return array
	 */
	function xts_body_classes( $classes ) {
		$settings = xts_get_header_settings();

		if ( isset( $settings['overlap'] ) && $settings['overlap'] ) {
			$classes[] = 'xts-header-overlap';
		}

		if ( ! is_user_logged_in() && xts_get_opt( 'login_to_see_price' ) ) {
			$classes[] = 'xts-login-see-price';
		}

		if ( xts_is_shop_archive() ) {
			$classes[] = 'xts-shop-archive';
		}

		if ( 'boxed' === xts_get_opt( 'site_layout' ) ) {
			$classes[] = 'xts-layout-boxed';
		}

		if ( xts_get_opt( 'sticky_categories_navigation_menu' ) && ! xts_elementor_is_edit_mode() && ! xts_elementor_is_preview_mode() ) {
			$classes[] = 'xts-sticky-cats-enabled';
		}

		if ( xts_get_opt( 'product_categories_widget_accordion' ) ) {
			$classes[] = 'xts-cat-accordion';
		}

		if ( xts_get_opt( 'sticky_bottom_navbar' ) ) {
			$classes[] = 'xts-sticky-navbar-enabled';
		}

		if ( (int) xts_get_opt( 'footer_html_block' ) === xts_get_page_id() && is_singular( 'xts-html-block' ) ) {
			$classes[] = 'xts-footer-html-block';
		}

		return $classes;
	}

	add_filter( 'body_class', 'xts_body_classes' );
}

if ( ! function_exists( 'xts_load_html_dropdowns_action' ) ) {
	/**
	 * Load menu dropdowns with AJAX actions
	 *
	 * @since 1.0.0
	 */
	function xts_load_html_dropdowns_action() {
		$response = array(
			'status'  => 'error',
			'message' => esc_html__( 'Can\'t load HTML Blocks with AJAX', 'xts-theme' ),
			'data'    => array(),
		);

		if ( isset( $_POST['ids'] ) && is_array( $_POST['ids'] ) ) { // phpcs:ignore
			$ids = xts_clear( $_POST['ids'] ); // phpcs:ignore
			foreach ( $ids as $id ) {
				$content = xts_get_html_block_content( $id );
				if ( ! $content ) {
					continue;
				}

				$response['status']      = 'success';
				$response['message']     = 'At least one HTML Block loaded';
				$response['data'][ $id ] = $content;
			}
		}
		AJAX_Response::send_response( $response );
	}

	add_action( 'wp_ajax_xts_load_html_dropdowns', 'xts_load_html_dropdowns_action' );
	add_action( 'wp_ajax_nopriv_xts_load_html_dropdowns', 'xts_load_html_dropdowns_action' );
}

if ( ! function_exists( 'xts_clear_menu_transient' ) ) {
	/**
	 * Clear menu session storage key hash on save menu/html block.
	 *
	 * @since 1.0.0
	 */
	function xts_clear_menu_transient() {
		delete_transient( 'xts-menu-hash-time' );
	}

	add_action( 'wp_update_nav_menu_item', 'xts_clear_menu_transient', 11, 1 );
	add_action( 'save_post_xts-html-block', 'xts_clear_menu_transient', 30, 3 );
}

if ( ! function_exists( 'xts_get_default_carousel_config' ) ) {
	/**
	 * Function to get array of default carousel configuration
	 *
	 * @since 1.0.0
	 *
	 * @return array
	 */
	function xts_get_default_carousel_config() {
		return array(
			'autoplay'                   => 'no',
			'autoplay_speed'             => array( 'size' => 2000 ),
			'infinite_loop'              => 'no',
			'center_mode'                => 'no',
			'draggable'                  => 'yes',
			'auto_height'                => 'no',
			'init_on_scroll'             => 'yes',
			'dots'                       => 'no',
			'dots_color_scheme'          => 'dark',
			'arrows'                     => 'yes',
			'arrows_horizontal_position' => '',
			'arrows_color_scheme'        => xts_get_default_value( 'carousel_arrows_color_scheme' ),
			'arrows_vertical_position'   => xts_get_default_value( 'carousel_arrows_vertical_position' ),
			'arrows_design'              => 'default',
			'parent'                     => '',
			'center_mode_opacity'        => 'no',
			'library'                    => 'swiper',
			'source'                     => '',

			'carousel_items'             => array( 'size' => 3 ),
			'carousel_items_tablet'      => array( 'size' => 2 ),
			'carousel_items_mobile'      => array( 'size' => 2 ),
			'carousel_spacing'           => xts_get_default_value( 'items_gap' ),
			'controls_id'                => uniqid(),

			// Sync.
			'sync'                       => 'disabled',
			'sync_parent_id'             => '',
			'sync_child_id'              => '',
		);
	}
}

if ( ! function_exists( 'xts_get_carousel_atts' ) ) {
	/**
	 * Function to get carousel attributes
	 *
	 * @since 1.0.0
	 *
	 * @param array $config Carousel config.
	 *
	 * @return string
	 */
	function xts_get_carousel_atts( $config = array() ) {
		$default_config = xts_get_default_carousel_config();
		$config         = wp_parse_args( $config, $default_config );

		$columns = xts_get_row_columns_numbers( $config['carousel_items']['size'] );

		$config['carousel_items']['size']        = $config['carousel_items']['size'] ? $config['carousel_items']['size'] : $columns['desktop'];
		$config['carousel_items_tablet']['size'] = $config['carousel_items_tablet']['size'] ? $config['carousel_items_tablet']['size'] : $columns['tablet'];
		$config['carousel_items_mobile']['size'] = $config['carousel_items_mobile']['size'] ? $config['carousel_items_mobile']['size'] : $columns['mobile'];

		$json         = wp_json_encode( array_intersect_key( $config, $default_config ) );
		$custom_attrs = '';

		if ( 'yes' === $config['dots'] ) {
			$custom_attrs .= 'data-xts-carousel-dots="yes"';
		}

		if ( 'disabled' !== $config['sync'] && ( $config['sync_parent_id'] || $config['sync_child_id'] ) ) {
			$id = 'parent' === $config['sync'] ? $config['sync_parent_id'] : $config['sync_child_id'];

			$custom_attrs .= ' data-sync="' . $config['sync'] . '" data-sync-id="' . $id . '"';
		}

		return ' data-xts-carousel ' . $custom_attrs . ' data-carousel-args=\'' . $json . '\'';
	}
}

if ( ! function_exists( 'xts_get_carousel_classes' ) ) {
	/**
	 * Function to get carousel attributes
	 *
	 * @since 1.0.0
	 *
	 * @param array $config Carousel config.
	 *
	 * @return string
	 */
	function xts_get_carousel_classes( $config = array() ) {
		$default_config = xts_get_default_carousel_config();
		$config         = wp_parse_args( $config, $default_config );

		$classes = ' xts-carousel';

		$classes .= ' xts-lib-' . $config['library'];

		if ( 'yes' === $config['init_on_scroll'] ) {
			xts_enqueue_js_library( 'waypoints' );
			$classes .= ' xts-init-on-scroll';
		}

		if ( 'swiper' === $config['library'] ) {
			$minified = xts_get_opt( 'minified_css' ) ? '.min' : '';
			wp_enqueue_style( 'xts-swiper-library', XTS_THEME_URL . '/css/swiper' . $minified . '.css', array(), XTS_VERSION );
			xts_enqueue_js_library( 'xts-swiper' );
			xts_enqueue_js_script( 'swiper-init' );
		}

		if ( 'dark' !== $config['arrows_color_scheme'] ) {
			$classes .= ' xts-arrows-' . $config['arrows_color_scheme'];
		}

		if ( 'dark' !== $config['dots_color_scheme'] ) {
			$classes .= ' xts-dots-' . $config['dots_color_scheme'];
		}

		if ( $config['arrows_horizontal_position'] && 'disabled' !== $config['arrows_horizontal_position'] ) {
			$classes .= ' xts-arrows-hpos-' . $config['arrows_horizontal_position'];
		}

		if ( 'disabled' !== $config['arrows_vertical_position'] ) {
			$classes .= ' xts-arrows-vpos-' . $config['arrows_vertical_position'];
		}

		if ( 'disabled' !== $config['arrows_design'] ) {
			$classes .= ' xts-arrows-design-' . $config['arrows_design'];
		}

		if ( 'yes' === $config['center_mode_opacity'] ) {
			$classes .= ' xts-center-mode-opacity';
		}

		if ( xts_get_opt( 'disable_carousel_mobile_devices' ) && 'single_product' !== $config['source'] ) {
			$classes .= ' xts-disable-md';
		}

		return $classes;
	}
}

if ( ! function_exists( 'xts_get_row_classes' ) ) {
	/**
	 * Get row classes
	 *
	 * @since 1.0.0
	 *
	 * @param string  $desktop Desktop item count.
	 * @param string  $tablet  Tablet item count.
	 * @param string  $mobile  Mobile item count.
	 * @param integer $spacing Spacing.
	 *
	 * @return string
	 */
	function xts_get_row_classes( $desktop = '', $tablet = '', $mobile = '', $spacing = 10 ) {
		$columns = xts_get_row_columns_numbers( $desktop );

		$desktop = $desktop ? $desktop : $columns['desktop'];
		$tablet  = $tablet ? $tablet : $columns['tablet'];
		$mobile  = $mobile ? $mobile : $columns['mobile'];

		$sizes = array(
			array(
				'name'  => 'xts-row-lg',
				'value' => $desktop,
			),
			array(
				'name'  => 'xts-row-md',
				'value' => $tablet,
			),
			array(
				'name'  => 'xts-row',
				'value' => $mobile,
			),
		);

		$result_sizes = array();

		foreach ( $sizes as $index => $value ) {
			if ( isset( $sizes[ $index + 1 ] ) ) {
				$next = $sizes[ $index + 1 ];
			} else {
				continue;
			}

			if ( $value['value'] === $next['value'] ) {
				$result_sizes[ $next['name'] ] = $next['value'];
				unset( $result_sizes[ $value['name'] ] );
			} elseif ( $value['value'] !== $next['value'] ) {
				$result_sizes[ $value['name'] ] = $value['value'];
				$result_sizes[ $next['name'] ]  = $next['value'];
			}
		}

		$classes = ' xts-row';

		foreach ( $result_sizes as $size => $value ) {
			$classes .= ' ' . $size . '-' . $value;
		}

		$classes .= ' xts-row-spacing-' . $spacing;

		return $classes;
	}
}

if ( ! function_exists( 'xts_get_row_columns_numbers' ) ) {
	/**
	 * Get row classes
	 *
	 * @since 1.0.0
	 *
	 * @param integer $desktop Desktop item count.
	 *
	 * @return array
	 */
	function xts_get_row_columns_numbers( $desktop ) {
		$columns = array();

		$columns['desktop'] = $desktop > 0 ? $desktop : 1;
		$columns['tablet']  = $columns['desktop'] > 1 ? $columns['desktop'] - 1 : $columns['desktop'];
		$columns['mobile']  = $columns['desktop'] > 4 ? 2 : 1;

		if ( 1 === $columns['desktop'] ) {
			$columns['mobile'] = 1;
		}

		return $columns;
	}
}

if ( ! function_exists( 'xts_setup_loop' ) ) {
	/**
	 * Setup loop
	 *
	 * @since 1.0.0
	 *
	 * @param array $args Array of loop arguments.
	 */
	function xts_setup_loop( $args = array() ) {
		if ( isset( $GLOBALS['xts_loop'] ) ) {
			return;
		}

		$default_args = array(
			'blog_post_title'                 => xts_get_opt( 'blog_title_visibility' ),
			'blog_post_meta'                  => xts_get_opt( 'blog_meta_visibility' ),
			'blog_post_text'                  => xts_get_opt( 'blog_text_visibility' ),
			'blog_post_categories'            => xts_get_opt( 'blog_categories_visibility' ),
			'blog_post_read_more'             => xts_get_opt( 'blog_read_more_visibility' ),
			'blog_design'                     => xts_get_opt( 'blog_design', 'default' ),
			'blog_image_size'                 => xts_get_opt( 'blog_image_size' ),
			'blog_image_size_custom'          => xts_get_opt( 'blog_image_size_custom' ),
			'blog_excerpt_length'             => xts_get_opt( 'blog_excerpt_length' ),
			'blog_post_black_white'           => xts_get_opt( 'blog_post_black_white' ),
			'blog_post_shadow'                => xts_get_opt( 'blog_post_shadow' ),
			'blog_loop'                       => 0,

			'portfolio_design'                => xts_get_opt( 'portfolio_design' ),
			'portfolio_distortion_effect'     => xts_get_opt( 'portfolio_distortion_effect' ),
			'portfolio_image_size'            => xts_get_opt( 'portfolio_image_size' ),
			'portfolio_image_custom'          => xts_get_opt( 'portfolio_image_custom' ),
			'portfolio_loop'                  => 0,

			'product_image_size'              => xts_get_opt( 'product_loop_image_size' ),
			'product_image_custom'            => xts_get_opt( 'product_loop_image_size_custom' ),
			'product_countdown'               => xts_get_opt( 'product_loop_sale_countdown' ),
			'product_stock_progress_bar'      => xts_get_opt( 'product_loop_stock_progress_bar' ),
			'product_design'                  => xts_get_opt( 'product_loop_design' ),
			'product_rating'                  => xts_get_opt( 'product_loop_rating' ),
			'product_categories'              => xts_get_opt( 'product_loop_categories' ),
			'product_attributes'              => xts_get_opt( 'product_loop_attributes' ),
			'product_brands'                  => xts_get_opt( 'product_loop_brands' ),
			'product_hover_image'             => xts_get_opt( 'product_hover_image', '1' ),
			'product_loop_quantity'           => xts_get_opt( 'product_loop_quantity' ),

			'product_categories_image_size'   => false,
			'product_categories_image_custom' => false,

			'woocommerce_loop'                => 0,
			'is_quick_view'                   => false,
		);

		$GLOBALS['xts_loop'] = wp_parse_args( $args, apply_filters( 'xts_get_default_setup_loop_args', $default_args ) );
	}

	add_action( 'wp', 'xts_setup_loop', 500 );
	add_action( 'loop_start', 'xts_setup_loop', 50 );
	add_action( 'woocommerce_before_shop_loop', 'xts_setup_loop', 50 );
}

if ( ! function_exists( 'xts_set_custom_404_page' ) ) {
	/**
	 * Set custom 404 page
	 *
	 * @since 1.0.0
	 *
	 * @param string $template Page template.
	 *
	 * @return string
	 */
	function xts_set_custom_404_page( $template ) {
		global $wp_query;

		$custom_404 = xts_get_opt( 'custom_404_page' );

		if ( ! $custom_404 ) {
			return $template;
		}

		$wp_query->query( 'page_id=' . $custom_404 );
		$wp_query->the_post();
		$template = get_page_template();
		rewind_posts();

		return $template;
	}

	add_filter( '404_template', 'xts_set_custom_404_page', 1000 );
}

if ( ! function_exists( 'xts_get_instagram_user_data' ) ) {
	/**
	 * Get instagram user data
	 *
	 * @since 1.0.0
	 *
	 * @param string $user_id User id.
	 *
	 * @return mixed
	 */
	function xts_get_instagram_user_data( $user_id ) {
		$instagram_access_token = get_option( 'xts_instagram_access_token' );

		if ( $instagram_access_token ) {
			return get_option( 'xts_instagram_account_data_' . get_option( 'xts_instagram_account_id' ) );
		}

		$remote      = wp_remote_get( 'https://www.instagram.com/' . $user_id . '/' );
		$remote_code = wp_remote_retrieve_response_code( $remote );

		if ( is_wp_error( $remote ) ) {
			return new WP_Error( 'site_down', esc_html__( 'Unable to communicate with Instagram.', 'xts-theme' ) );
		}

		if ( 200 !== $remote_code ) {
			return new WP_Error( 'invalid_response_' . $remote_code, esc_html__( 'Instagram did not return a 200.', 'xts-theme' ) );
		}

		$shards = explode( 'window._sharedData = ', $remote['body'] );
		if ( ! isset( $shards[1] ) ) {
			if ( isset( $shards[0] ) ) {
				$error_info = json_decode( $shards[0], true );

				if ( isset( $error_info['errors'] ) ) {
					return new WP_Error( $error_info['error_type'], $error_info['errors']['error'][0] );
				}
			}

			return new WP_Error( 'site_down', esc_html__( 'Unable to communicate with Instagram.', 'xts-theme' ) );
		}
		$json = explode( ';</script>', $shards[1] );

		return json_decode( $json[0], true );
	}
}


if ( ! function_exists( 'xts_admin_custom_css_file' ) ) {
	/**
	 * This function creates and includes a custom CSS for the WordPress admin panel when the css_backend option is passed.
	 *
	 * @return void
	 */
	function xts_admin_custom_css_file() {
		$css_backend = xts_get_opt( 'css_backend' );

		if ( ! $css_backend ) {
			return;
		}

		$storage = new Styles_Storage( 'admin-custom' );
		$storage->write( $css_backend, false );
		$storage->inline_css();
	}

	add_action( 'admin_print_styles', 'xts_admin_custom_css_file', 30000 );
}

if ( ! function_exists( 'xts_clear_elementor_cache' ) ) {
	/**
	 * This function clear cache from elementor "Element Caching" option on theme settings save.
	 *
	 * @return void
	 */
	function xts_clear_elementor_cache() {
		if ( ! xts_is_elementor_installed() ) {
			return;
		}

		$is_elementor_cache_enabled = Plugin::$instance->experiments->is_feature_active( 'e_element_cache' );

		if ( isset( $_GET['settings-updated'] ) && $is_elementor_cache_enabled ) { // phpcs:ignore.
			Plugin::$instance->files_manager->clear_cache();
		}
	}

	add_action( 'xts_after_theme_settings', 'xts_clear_elementor_cache' );
}