Current File : /home/kelaby89/www/wp/wp-content/themes/nexio/plugins/woocommerce/woocommerce-extensions.php
<?php
/* Woocommerce extensions
------------------------------------------------------------------------------- */

// Theme init priorities:
// 9 - register other filters (for installer, etc.)
if ( ! function_exists( 'nexio_woocommerce_extensions_theme_setup9' ) ) {
	add_action( 'after_setup_theme', 'nexio_woocommerce_extensions_theme_setup9', 9 );
	function nexio_woocommerce_extensions_theme_setup9() {
		if ( nexio_exists_woocommerce() ) {
			// Frontend styles and scripts
			add_action( 'wp_enqueue_scripts', 'nexio_woocommerce_extensions_frontend_scripts', 1100 );
			add_action( 'trx_addons_action_load_scripts_front_woocommerce_extensions', 'nexio_woocommerce_extensions_frontend_scripts', 10, 1 );
			add_action( 'wp_enqueue_scripts', 'nexio_woocommerce_extensions_frontend_scripts_responsive', 2000 );
			add_action( 'trx_addons_action_load_scripts_front_woocommerce_extensions', 'nexio_woocommerce_extensions_frontend_scripts_responsive', 10, 1 );
			add_filter( 'nexio_filter_merge_styles', 'nexio_woocommerce_extensions_merge_styles' );
			add_filter( 'nexio_filter_merge_styles_responsive', 'nexio_woocommerce_extensions_merge_styles_responsive' );
			add_filter( 'nexio_filter_merge_scripts', 'nexio_woocommerce_extensions_merge_scripts' );
		}
	}
}

// Enqueue WooCommerce extensions styles
if ( ! function_exists( 'nexio_woocommerce_extensions_frontend_scripts' ) ) {
	//Handler of the add_action( 'wp_enqueue_scripts', 'nexio_woocommerce_extensions_frontend_scripts', 1100 );
	//Handler of the add_action( 'trx_addons_action_load_scripts_front_woocommerce_extensions', 'nexio_woocommerce_extensions_frontend_scripts', 10, 1 );
	function nexio_woocommerce_extensions_frontend_scripts( $force = false ) {
		nexio_enqueue_optimized( 'woocommerce_extensions', $force, array(
			'slug' => 'woocommerce',	// Slug to check if need scripts and styles for this plugin. Specify only if it is not equal to the first parameter
			'css' => array(
				'nexio-woocommerce-extensions' => array( 'src' => 'plugins/woocommerce/woocommerce-extensions.css' ),
			),
			'js' => array(
				'nexio-woocommerce-extensions' => array( 'src' => 'plugins/woocommerce/woocommerce-extensions.js', 'deps' => array( 'jquery' ) ),
			)
		) );
	}
}

// Enqueue WooCommerce extensions responsive styles
if ( ! function_exists( 'nexio_woocommerce_extensions_frontend_scripts_responsive' ) ) {
	//Handler of the add_action( 'wp_enqueue_scripts', 'nexio_woocommerce_extensions_frontend_scripts_responsive', 2000 );
	//Handler of the add_action( 'trx_addons_action_load_scripts_front_woocommerce_extensions', 'nexio_woocommerce_extensions_frontend_scripts_responsive', 10, 1 );
	function nexio_woocommerce_extensions_frontend_scripts_responsive( $force = false ) {
		nexio_enqueue_optimized_responsive( 'woocommerce_extensions', $force, array(
			'slug' => 'woocommerce',	// Slug to check if need scripts and styles for this plugin. Specify only if it is not equal to the first parameter
			'css' => array(
				'nexio-woocommerce-extensions-responsive' => array( 'src' => 'plugins/woocommerce/woocommerce-extensions-responsive.css' ),
			),
		) );
	}
}

// Merge custom styles
if ( ! function_exists( 'nexio_woocommerce_extensions_merge_styles' ) ) {
	//Handler of the add_filter('nexio_filter_merge_styles', 'nexio_woocommerce_extensions_merge_styles');
	function nexio_woocommerce_extensions_merge_styles( $list ) {
		$list[ 'plugins/woocommerce/woocommerce-extensions.css' ] = false;
		return $list;
	}
}

// Merge responsive styles
if ( ! function_exists( 'nexio_woocommerce_extensions_merge_styles_responsive' ) ) {
	//Handler of the add_filter('nexio_filter_merge_styles_responsive', 'nexio_woocommerce_extensions_merge_styles_responsive');
	function nexio_woocommerce_extensions_merge_styles_responsive( $list ) {
		$list[ 'plugins/woocommerce/woocommerce-extensions-responsive.css' ] = false;
		return $list;
	}
}

// Merge custom scripts
if ( ! function_exists( 'nexio_woocommerce_extensions_merge_scripts' ) ) {
	//Handler of the add_filter('nexio_filter_merge_scripts', 'nexio_woocommerce_extensions_merge_scripts');
	function nexio_woocommerce_extensions_merge_scripts( $list ) {
		$list[ 'plugins/woocommerce/woocommerce-extensions.js' ] = false;
		return $list;
	}
}



/* Common functions
------------------------------------------------------------------- */

// Check if taxomony is a Woocommerce product's attribute
if ( ! function_exists( 'nexio_woocommerce_extensions_attrib_get_type' ) ) {
	function nexio_woocommerce_extensions_attrib_get_type( $taxonomy ) {
		$type = '';
		if ( nexio_exists_woocommerce() ) {
			$attribute_taxonomies = wc_get_attribute_taxonomies();
			if ( ! empty( $attribute_taxonomies ) ) {
				foreach ( $attribute_taxonomies as $attribute ) {
					if ( wc_attribute_taxonomy_name( $attribute->attribute_name ) == $taxonomy ) {
						$type = $attribute->attribute_type;
						break;
					}
				}
			}
		}
		return $type;
	}
}



/* Move breadcrumbs above title
------------------------------------------------------------------- */
if ( ! function_exists( 'nexio_woocommerce_extensions_move_breadcrumbs_before_title' ) ) {
	add_action( 'init', 'nexio_woocommerce_extensions_move_breadcrumbs_before_title' );
	function nexio_woocommerce_extensions_move_breadcrumbs_before_title() {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'move_breadcrumbs' )
		) {
			remove_action( 'woocommerce_before_main_content', 'woocommerce_breadcrumb', 20 );
			add_action( 'woocommerce_single_product_summary', 'woocommerce_breadcrumb', 3 );	// Priority 5 used for the title
		}
	}
}



/* Add parameter 'Single Product Gallery Style'
------------------------------------------------------------------- */

// Theme init priorities:
// 3 - add/remove Theme Options elements
if ( ! function_exists( 'nexio_woocommerce_extensions_product_gallery_style_theme_setup3' ) ) {
	add_action( 'after_setup_theme', 'nexio_woocommerce_extensions_product_gallery_style_theme_setup3', 3 );
	function nexio_woocommerce_extensions_product_gallery_style_theme_setup3() {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'gallery_style' )
		) {
			// Add 'single_product_gallery_style' to the theme-specific options
			nexio_storage_set_array_before( 'options', 'single_product_gallery_thumbs', apply_filters( 'nexio_filter_woocommerce_extensions_gallery_style_args', array(
				'single_product_gallery_style'  => array(
					'title'      => esc_html__( 'Gallery style', 'nexio' ),
					'desc'       => wp_kses_data( __( 'Select the style of the gallery on the single product page.', 'nexio' ) ),
					'override'   => array(
						'mode'    => 'product',
						'section' => esc_html__( 'Content', 'nexio' ),
					),
					'options'    => apply_filters(
													'nexio_filter_woocommerce_single_product_gallery_style',
													array(
														'default'   => esc_html__( 'Default', 'nexio' ),
														'fullwidth' => esc_html__( 'Fullwidth', 'nexio' ),
														'cascade'   => esc_html__( 'Cascade', 'nexio' ),
														'grid'      => esc_html__( 'Grid', 'nexio' ),
													)
												),
					'std'        => 'default',
					'type'       => 'select',
				),
			) ) );

			// Add condition to the 'single_product_gallery_thumbs'
			nexio_storage_set_array2( 'options', 'single_product_gallery_thumbs', 'dependency', array(
				'single_product_gallery_style' => array( 'default', 'fullwidth' ),
			) );

		}
	}
}

// Disable slider and zoom for 'fullwidth' (only zoom), 'cascade' and 'grid'
if ( ! function_exists( 'nexio_woocommerce_extensions_product_gallery_style_theme_support' ) ) {
	add_action( 'wp_enqueue_scripts', 'nexio_woocommerce_extensions_product_gallery_style_theme_support', 9 );
	function nexio_woocommerce_extensions_product_gallery_style_theme_support() {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'gallery_style' )
		) {
			$style = nexio_get_theme_option( 'single_product_gallery_style' );
			// Disable 'zoom'
			if ( in_array( $style, array( 'fullwidth', 'cascade', 'grid' ) ) ) {
				remove_theme_support( 'wc-product-gallery-zoom' );
			}
			// Disable 'slider'
			if ( in_array( $style, array( 'cascade', 'grid' ) ) ) {
				remove_theme_support( 'wc-product-gallery-slider' );
			}
			// Load 'masonry' script
			if ( 'grid' == $style && is_product() ) {
				nexio_load_masonry_scripts();
			}
		}
	}
}

// Add plugin-specific classes to the product
if ( ! function_exists( 'nexio_woocommerce_extensions_product_gallery_style_add_wrapper_classes' ) ) {
	add_filter( 'nexio_filter_single_product_wrapper_class', 'nexio_woocommerce_extensions_product_gallery_style_add_wrapper_classes' );
	function nexio_woocommerce_extensions_product_gallery_style_add_wrapper_classes( $classes ) {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'gallery_style' )
			&& is_product()
		) {
			$classes[] = 'single_product_gallery_style_' . esc_attr( nexio_get_theme_option( 'single_product_gallery_style' ) );
		}
		return $classes;
	}
}

// Increase thumbnail size for some gallery's styles
if ( ! function_exists( 'nexio_woocommerce_extensions_product_gallery_style_thumbnail_size' ) ) {
	add_filter( 'woocommerce_gallery_thumbnail_size', 'nexio_woocommerce_extensions_product_gallery_style_thumbnail_size' );
	function nexio_woocommerce_extensions_product_gallery_style_thumbnail_size( $sizes = array() ) {
		if ( apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'gallery_style' ) ) {
			$style = nexio_get_theme_option( 'single_product_gallery_style' );
			if ( in_array( $style, array( 'cascade', 'grid' ) ) ) {
				$gallery_thumbnail = wc_get_image_size( 'woocommerce_single' );
				$sizes = array( (int) $gallery_thumbnail['width'], (int) $gallery_thumbnail['height'] );
			}
		}
		return $sizes;
	}
}

// Increase main image size for some gallery's styles
if ( ! function_exists( 'nexio_woocommerce_extensions_product_gallery_style_image_size' ) ) {
	add_filter( 'woocommerce_gallery_image_size', 'nexio_woocommerce_extensions_product_gallery_style_image_size' );
	function nexio_woocommerce_extensions_product_gallery_style_image_size( $sizes = array() ) {
		if ( apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'gallery_style' ) ) {
			$style = nexio_get_theme_option( 'single_product_gallery_style' );
			if ( $style == 'fullwidth' ) {
				$sizes = 'full';
			}
		}
		return $sizes;
	}
}


// Disable slider for some gallery's styles
if ( ! function_exists( 'nexio_woocommerce_extensions_product_gallery_style_disable_slider' ) ) {
	add_filter( 'woocommerce_single_product_flexslider_enabled', 'nexio_woocommerce_extensions_product_gallery_style_disable_slider' );
	function nexio_woocommerce_extensions_product_gallery_style_disable_slider( $enabled = true ) {
		return $enabled
					&& ( ! apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'gallery_style' )
						||
						! in_array( nexio_get_theme_option( 'single_product_gallery_style' ), array( 'cascade', 'grid' ) )
						);
	}
}


// Remove 'single_product_gallery_thumbs_left' from the body 
if ( ! function_exists( 'nexio_woocommerce_extensions_product_gallery_style_remove_body_classes' ) ) {
	add_filter( 'body_class', 'nexio_woocommerce_extensions_product_gallery_style_remove_body_classes', 20 );
	function nexio_woocommerce_extensions_product_gallery_style_remove_body_classes( $classes ) {
		if ( apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'gallery_style' ) ) {
			$style = nexio_get_theme_option( 'single_product_gallery_style' );
			if ( in_array( $style, array( 'cascade', 'grid' ) ) ) {
				if ( nexio_exists_woocommerce() && is_product() ) {
					$classes = nexio_array_delete_by_value( $classes, 'single_product_gallery_thumbs_left' );
				}
			}
		}
		return $classes;
	}
}



/* Add parameter 'Single product gallery lightbox on/off'
------------------------------------------------------------------- */

// Theme init priorities:
// 3 - add/remove Theme Options elements
if ( ! function_exists( 'nexio_woocommerce_extensions_product_gallery_lightbox_theme_setup3' ) ) {
	add_action( 'after_setup_theme', 'nexio_woocommerce_extensions_product_gallery_lightbox_theme_setup3', 3 );
	function nexio_woocommerce_extensions_product_gallery_lightbox_theme_setup3() {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'gallery_lightbox' )
		) {
			// Add 'single_product_gallery_lightbox' to the theme-specific options
			nexio_storage_set_array_after( 'options', 'single_product_gallery_thumbs', apply_filters( 'nexio_filter_woocommerce_extensions_gallery_lightbox_args', array(
				'single_product_gallery_lightbox' => array(
					'title'   => esc_html__( 'Allow lightbox with large image', 'nexio' ),
					'desc'    => wp_kses_data( __( "Allow the lightbox with a large image in the single product page.", 'nexio' ) ),
					'std'     => 1,
					'type'    => 'switch',
				),
			) ) );
		}
	}
}

// Disable image lightbox
if ( ! function_exists( 'nexio_woocommerce_extensions_product_gallery_lightbox_theme_support' ) ) {
	add_action( 'wp_enqueue_scripts', 'nexio_woocommerce_extensions_product_gallery_lightbox_theme_support', 9 );
	function nexio_woocommerce_extensions_product_gallery_lightbox_theme_support() {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'gallery_lightbox' )
			&& is_product()
		) {
			if ( (int) nexio_get_theme_option( 'single_product_gallery_lightbox' ) == 0 ) {
				remove_theme_support( 'wc-product-gallery-lightbox' );
			}
		}
	}
}

// Remove link from gallery image layout if lightbox is disabled
if ( ! function_exists( 'nexio_woocommerce_extensions_product_gallery_lightbox_remove_links' ) ) {
	add_filter( 'woocommerce_single_product_image_thumbnail_html', 'nexio_woocommerce_extensions_product_gallery_lightbox_remove_links', 9 );
	function nexio_woocommerce_extensions_product_gallery_lightbox_remove_links( $html = '', $image_id = 0 ) {
		if ( apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'gallery_lightbox' ) ) {
			if ( (int) nexio_get_theme_option( 'single_product_gallery_lightbox' ) == 0 && strpos( $html, '<a ' ) !== false ) {
				$html = preg_replace( '/(.*)(<a [^>]*>)(.*)(<\/a>)(.*)/', '$1$3$5', $html );
			}
		}
		return $html;
	}
}



/* Add parameter 'Single product gallery zoom on/off'
------------------------------------------------------------------- */

// Theme init priorities:
// 3 - add/remove Theme Options elements
if ( ! function_exists( 'nexio_woocommerce_extensions_product_gallery_zoom_theme_setup3' ) ) {
	add_action( 'after_setup_theme', 'nexio_woocommerce_extensions_product_gallery_zoom_theme_setup3', 3 );
	function nexio_woocommerce_extensions_product_gallery_zoom_theme_setup3() {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'gallery_zoom' )
		) {
			// Add 'single_product_gallery_zoom' to the theme-specific options
			nexio_storage_set_array_after( 'options', 'single_product_gallery_thumbs', apply_filters( 'nexio_filter_woocommerce_extensions_gallery_zoom_args', array(
				'single_product_gallery_zoom' => array(
					'title'   => esc_html__( 'Allow zoom on the large image', 'nexio' ),
					'desc'    => wp_kses_data( __( "Allow the zoom on the large image in the single product page.", 'nexio' ) ),
					'std'     => 1,
					'type'    => 'switch',
				),
			) ) );
		}
	}
}

// Disable image zoom
if ( ! function_exists( 'nexio_woocommerce_extensions_product_gallery_zoom_theme_support' ) ) {
	add_action( 'wp_enqueue_scripts', 'nexio_woocommerce_extensions_product_gallery_zoom_theme_support', 9 );
	function nexio_woocommerce_extensions_product_gallery_zoom_theme_support() {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'gallery_zoom' )
			&& is_product()
		) {
			if ( (int) nexio_get_theme_option( 'single_product_gallery_zoom' ) == 0 ) {
				remove_theme_support( 'wc-product-gallery-zoom' );
			}
		}
	}
}



/* Add parameter 'Single Product Details Style'
------------------------------------------------------------------- */

// Theme init priorities:
// 3 - add/remove Theme Options elements
if ( ! function_exists( 'nexio_woocommerce_extensions_product_details_style_theme_setup3' ) ) {
	add_action( 'after_setup_theme', 'nexio_woocommerce_extensions_product_details_style_theme_setup3', 3 );
	function nexio_woocommerce_extensions_product_details_style_theme_setup3() {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'details_style' )
		) {
			// Add 'single_product_details_style' to the theme-specific options
			nexio_storage_set_array_before( 'options', 'show_related_posts_shop', apply_filters( 'nexio_filter_woocommerce_extensions_details_style_args', array(
				'single_product_details_style'   => array(
					'title'      => esc_html__( 'Details style', 'nexio' ),
					'desc'       => wp_kses_data( __( 'Select the style of the section "Details" on the single product page.', 'nexio' ) ),
					'override'   => array(
						'mode'    => 'product',
						'section' => esc_html__( 'Content', 'nexio' ),
					),
					'options'    => apply_filters(
													'nexio_filter_woocommerce_single_product_details_styles',
													array(
														'default'   => esc_html__( 'Default (Tabs)', 'nexio' ),
														'stacked'   => esc_html__( 'Stacked', 'nexio' ),
														'accordion' => esc_html__( 'Accordion', 'nexio' ),
													)
												),
					'std'        => 'default',
					'type'       => 'select',
				),
			) ) );
		}
	}
}

// Add plugin-specific classes to the product
if ( ! function_exists( 'nexio_woocommerce_extensions_product_details_style_add_wrapper_classes' ) ) {
	add_filter( 'nexio_filter_single_product_wrapper_class', 'nexio_woocommerce_extensions_product_details_style_add_wrapper_classes' );
	function nexio_woocommerce_extensions_product_details_style_add_wrapper_classes( $classes ) {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'details_style' )
			&& is_product()
		) {
			$classes[] = 'single_product_details_style_' . esc_attr( nexio_get_theme_option( 'single_product_details_style' ) );
		}
		return $classes;
	}
}


// Enqueue accordion script if description style is equal to 'Accordion'
if ( ! function_exists( 'nexio_woocommerce_extensions_product_details_style_accordion_enqueue_script' ) ) {
	add_action( 'wp_enqueue_scripts', 'nexio_woocommerce_extensions_product_details_style_accordion_enqueue_script', 1100 );
	function nexio_woocommerce_extensions_product_details_style_accordion_enqueue_script() {
		if ( apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'details_style' )
			&& nexio_get_theme_option( 'single_product_details_style' ) == 'accordion'
			&& nexio_exists_woocommerce()
			&& is_product()
		) {
			wp_enqueue_script( 'jquery-ui-accordion', false, array( 'jquery', 'jquery-ui-core' ), null, true );
		}
	}
}


// Remove tabs if description style is equal to 'Stacked'
if ( ! function_exists( 'nexio_woocommerce_extensions_product_details_style_stacked_remove_product_tabs' ) ) {
	add_filter( 'woocommerce_product_tabs', 'nexio_woocommerce_extensions_product_details_style_stacked_remove_product_tabs', 1000 );
	function nexio_woocommerce_extensions_product_details_style_stacked_remove_product_tabs( $tabs = array() ) {
		if ( apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'details_style' )
			&& nexio_get_theme_option( 'single_product_details_style' ) == 'stacked'
			&& is_array( $tabs )
		) {
			// Move additional info to top
			if ( isset( $tabs['additional_information'] ) && apply_filters( 'nexio_filter_woocommerce_extensions_move_additional_first', false ) ) {
				$tabs_new = array( 'additional_information' => $tabs['additional_information'] );
				unset( $tabs['additional_information'] );
				$tabs = array_merge( $tabs_new, $tabs );
			}
			// Display blocks
			do_action( 'nexio_action_before_product_stacks', $tabs );
			?><div class="woocommerce-stacks"><?php
				foreach ( $tabs as $k => $tab ) {
					if ( isset( $tab['callback'] ) ) {
						do_action( 'nexio_action_before_product_stack', $k, $tab );
						?><div class="woocommerce-stack woocommerce-stack-<?php echo esc_attr( $k ); ?>"><?php
							call_user_func( $tab['callback'], $k, $tab );
						?></div><?php
						do_action( 'nexio_action_after_product_stack', $k, $tab );
					}
				}
			?></div><?php
			do_action( 'nexio_action_after_product_stacks', $tabs );
			// Remove all tabs to prevent display
			$tabs = array();
		}
		return $tabs;
	}
}


// Remove tabs if description style is equal to 'Accordion'
if ( ! function_exists( 'nexio_woocommerce_extensions_product_details_style_accordion_remove_product_tabs' ) ) {
	add_filter( 'woocommerce_product_tabs', 'nexio_woocommerce_extensions_product_details_style_accordion_remove_product_tabs', 1000 );
	function nexio_woocommerce_extensions_product_details_style_accordion_remove_product_tabs( $tabs = array() ) {
		if ( apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'details_style' )
			&& nexio_get_theme_option( 'single_product_details_style' ) == 'accordion'
			&& is_array( $tabs )
		) {
			// Move additional info to top
			if ( isset( $tabs['additional_information'] ) && apply_filters( 'nexio_filter_woocommerce_extensions_move_additional_first', false ) ) {
				$tabs_new = array( 'additional_information' => $tabs['additional_information'] );
				unset( $tabs['additional_information'] );
				$tabs = array_merge( $tabs_new, $tabs );
			}
			// Display blocks
			do_action( 'nexio_action_before_product_accordion', $tabs );
			?><div class="nexio_accordion woocommerce-accordion" data-collapsible="true"><?php
				foreach ( $tabs as $k => $tab ) {
					if ( isset( $tab['callback'] ) ) {
						do_action( 'nexio_action_before_product_accordion_title', $k, $tab );
						?><h3 class="nexio_accordion_title woocommerce-accordion-title woocommerce-accordion-title-<?php echo esc_attr( $k ); ?>"><?php
							echo wp_kses( $tab['title'], 'nexio_kses_content' );
						?></h3><?php
						do_action( 'nexio_action_after_product_accordion_title', $k, $tab );
						do_action( 'nexio_action_before_product_accordion_content', $k, $tab );
						?><div class="nexio_accordion_content woocommerce-accordion-content woocommerce-accordion-content-<?php echo esc_attr( $k ); ?>"><?php
							call_user_func( $tab['callback'], $k, $tab );
						?></div><?php
						do_action( 'nexio_action_after_product_accordion_content', $k, $tab );
					}
				}
			?></div><?php
			do_action( 'nexio_action_after_product_accordion', $tabs );
			// Remove all tabs to prevent display
			$tabs = array();
		}
		return $tabs;
	}
}


/* Add parameter 'Single Product Details position'
------------------------------------------------------------------- */

// Theme init priorities:
// 3 - add/remove Theme Options elements
if ( ! function_exists( 'nexio_woocommerce_extensions_product_details_position_theme_setup3' ) ) {
	add_action( 'after_setup_theme', 'nexio_woocommerce_extensions_product_details_position_theme_setup3', 3 );
	function nexio_woocommerce_extensions_product_details_position_theme_setup3() {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'details_position' )
		) {
			// Add 'single_product_details_position' to the theme-specific options
			nexio_storage_set_array_before( 'options', 'show_related_posts_shop', apply_filters( 'nexio_filter_woocommerce_extensions_details_position_args', array(
				'single_product_details_position' => array(
					'title'   => esc_html__( 'Details position', 'nexio' ),
					'desc'    => wp_kses_data( __( "Select a position of the single product details.", 'nexio' ) ),
					'override'   => array(
						'mode'    => 'product',
						'section' => esc_html__( 'Content', 'nexio' ),
					),
					'options' => apply_filters( 'nexio_filter_woocommerce_extensions_details_position', array(
						'default'       => esc_html__( 'Default', 'nexio' ),
						'under_gallery' => esc_html__( 'Under the gallery', 'nexio' ),
						'under_summary' => esc_html__( 'Under the summary', 'nexio' ),
					) ),
					'std'     => 'default',
					'type'    => 'select',
				),
			) ) );
		}
	}
}

// Add plugin-specific classes to the product
if ( ! function_exists( 'nexio_woocommerce_extensions_product_details_position_add_wrapper_classes' ) ) {
	add_filter( 'nexio_filter_single_product_wrapper_class', 'nexio_woocommerce_extensions_product_details_position_add_wrapper_classes' );
	function nexio_woocommerce_extensions_product_details_position_add_wrapper_classes( $classes ) {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'details_position' )
			&& is_product()
		) {
			$classes[] = 'single_product_details_position_' . esc_attr( nexio_get_theme_option( 'single_product_details_position' ) );
		}
		return $classes;
	}
}

// Move upsells outside the article if details is placed under the gallery
if ( ! function_exists( 'nexio_woocommerce_extensions_product_details_position_move_upsells_outside' ) ) {
	add_action( 'woocommerce_before_main_content', 'nexio_woocommerce_extensions_product_details_position_move_upsells_outside' );
	function nexio_woocommerce_extensions_product_details_position_move_upsells_outside() {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'details_position' )
			&& in_array( nexio_get_theme_option( 'single_product_details_position' ), array( 'under_gallery', 'under_summary' ) )
			&& is_product()
		) {
			remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_upsell_display', 15 );
			add_action( 'woocommerce_after_main_content', 'woocommerce_upsell_display', 15 );
		}
	}
}

// Move related products outside the article if details is placed under the gallery
if ( ! function_exists( 'nexio_woocommerce_extensions_product_details_position_move_related_products_outside' ) ) {
	add_action( 'woocommerce_before_main_content', 'nexio_woocommerce_extensions_product_details_position_move_related_products_outside' );
	function nexio_woocommerce_extensions_product_details_position_move_related_products_outside() {
		if ( nexio_exists_woocommerce()
			&& (int)nexio_get_theme_option( 'show_related_posts' ) > 0
			&& (int)nexio_get_theme_option( 'related_posts' ) > 0
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'details_position' )
			&& in_array( nexio_get_theme_option( 'single_product_details_position' ), array( 'under_gallery', 'under_summary' ) )
			&& is_product()
		) {
			remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20 );
			add_action( 'woocommerce_after_main_content', 'woocommerce_output_related_products', 20 );
		}
	}
}



/* Add parameter 'Single Product Summary Sticky'
------------------------------------------------------------------- */

// Theme init priorities:
// 3 - add/remove Theme Options elements
if ( ! function_exists( 'nexio_woocommerce_extensions_product_summary_sticky_theme_setup3' ) ) {
	add_action( 'after_setup_theme', 'nexio_woocommerce_extensions_product_summary_sticky_theme_setup3', 3 );
	function nexio_woocommerce_extensions_product_summary_sticky_theme_setup3() {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'product_summary_sticky' )
		) {
			// Add 'single_product_summary_sticky' to the theme-specific options
			nexio_storage_set_array_before( 'options', 'show_related_posts_shop', apply_filters( 'nexio_filter_woocommerce_extensions_summary_sticky_args', array(
				'single_product_summary_sticky' => array(
					'title'      => esc_html__( 'Summary sticky', 'nexio' ),
					'desc'       => wp_kses_data( __( 'Make "Summary" sticky on the single product page.', 'nexio' ) ),
					'override'   => array(
						'mode'    => 'product',
						'section' => esc_html__( 'Content', 'nexio' ),
					),
					'dependency' => array(
						'single_product_details_position' => array( 'under_gallery' ),
					),
					'std'        => 0,
					'type'       => 'switch',
				),
			) ) );
		}
	}
}

// Add plugin-specific classes to the product
if ( ! function_exists( 'nexio_woocommerce_extensions_product_summary_sticky_add_wrapper_classes' ) ) {
	add_filter( 'nexio_filter_single_product_wrapper_class', 'nexio_woocommerce_extensions_product_summary_sticky_add_wrapper_classes' );
	function nexio_woocommerce_extensions_product_summary_sticky_add_wrapper_classes( $classes ) {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'details_position' )
			&& nexio_get_theme_option( 'single_product_details_position' ) == 'under_gallery'
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'product_summary_sticky' )
			&& nexio_get_theme_option( 'single_product_summary_sticky' ) == 1
			&& is_product()
		) {
			$classes[] = 'single_product_summary_sticky';
		}
		return $classes;
	}
}

// Add holder instead related products inside the article
if ( ! function_exists( 'nexio_woocommerce_extensions_product_summary_sticky_add_holder' ) ) {
	add_action( 'woocommerce_after_single_product_summary', 'nexio_woocommerce_extensions_product_summary_sticky_add_holder', 20 );
	function nexio_woocommerce_extensions_product_summary_sticky_add_holder() {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'details_position' )
			&& nexio_get_theme_option( 'single_product_details_position' ) == 'under_gallery'
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'product_summary_sticky' )
			&& nexio_get_theme_option( 'single_product_summary_sticky' ) == 1
			&& is_product()
		) {
			?><div class="single_product_summary_sticky_related_holder"></div><?php
		}
	}
}



/* Move 'Additional information' under the product's description
------------------------------------------------------------------- */

// Theme init priorities:
// 3 - add/remove Theme Options elements
if ( ! function_exists( 'nexio_woocommerce_extensions_additional_info_theme_setup3' ) ) {
	add_action( 'after_setup_theme', 'nexio_woocommerce_extensions_additional_info_theme_setup3', 3 );
	function nexio_woocommerce_extensions_additional_info_theme_setup3() {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'additional_info' )
		) {
			// Add 'single_product_additional_info' to the theme-specific options
			nexio_storage_set_array_before( 'options', 'show_related_posts_shop', apply_filters( 'nexio_filter_woocommerce_extensions_additional_info_args', array(
				'single_product_additional_info' => array(
					'title'   => esc_html__( 'Show additional info under short description', 'nexio' ),
					'desc'    => wp_kses_data( __( "Make additional product information more prominent by moving it up under the short description.", 'nexio' ) ),
					'std'     => 0,
					'type'    => 'switch',
				),
			) ) );
		}
	}
}

// Remove tab 'Additional information' from the tabs list
if ( ! function_exists( 'nexio_woocommerce_extensions_additional_info_default_product_tabs' ) ) {
	add_filter( 'woocommerce_product_tabs', 'nexio_woocommerce_extensions_additional_info_default_product_tabs', 100 );
	function nexio_woocommerce_extensions_additional_info_default_product_tabs( $tabs = array() ) {
		if ( apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'additional_info' )
			&& (int) nexio_get_theme_option( 'single_product_additional_info' ) == 1
			&& isset( $tabs['additional_information'] )
		) {
			unset( $tabs['additional_information'] );	//woocommerce_product_additional_information_tab
		}
		return $tabs;
	}
}

// Add 'Additional information' above the product's price
if ( ! function_exists( 'nexio_woocommerce_extensions_additional_info_template' ) ) {
	add_action( 'woocommerce_single_product_summary', 'nexio_woocommerce_extensions_additional_info_template', 25 );
	function nexio_woocommerce_extensions_additional_info_template() {
		if ( apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'additional_info' )
			&& (int) nexio_get_theme_option( 'single_product_additional_info' ) == 1
			&& function_exists( 'woocommerce_product_additional_information_tab' )
		) {
			?><div class="woocommerce-product-details__additional-information"><?php
				woocommerce_product_additional_information_tab();
			?></div><?php
		}
	}
}



/* Custom text after price on the single product page
------------------------------------------------------------------- */

// Theme init priorities:
// 3 - add/remove Theme Options elements
if ( ! function_exists( 'nexio_woocommerce_extensions_product_text_after_price_theme_setup3' ) ) {
	add_action( 'after_setup_theme', 'nexio_woocommerce_extensions_product_text_after_price_theme_setup3', 3 );
	function nexio_woocommerce_extensions_product_text_after_price_theme_setup3() {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'text_after_price' )
		) {
			// Add 'single_product_text_after_price' to the theme-specific options
			nexio_storage_set_array_before( 'options', 'show_related_posts_shop', apply_filters( 'nexio_filter_woocommerce_extensions_text_after_price_args', array(
				'single_product_text_after_price' => array(
					'title'    => esc_html__( 'Text after price', 'nexio' ),
					'desc'     => wp_kses_data( __( 'Specify custom text to show it after the product price on the single product page.', 'nexio' ) ),
					'std'      => '',
					'type'     => 'text_editor',
				),
			) ) );
		}
	}
}

// Add custom text after "Add to cart" button
// @hooked woocommerce_template_single_price - 10
if ( ! function_exists( 'nexio_woocommerce_extensions_product_text_after_price' ) ) {
	add_action( 'woocommerce_single_product_summary', 'nexio_woocommerce_extensions_product_text_after_price', 10 );
	function nexio_woocommerce_extensions_product_text_after_price() {
		if ( apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'text_after_price' ) ) {
			nexio_show_layout( do_shortcode( nexio_get_theme_option( 'single_product_text_after_price' ) ), '<div class="single_product_custom_text_after_price">', '</div>' );
		}
	}
}



/* Custom text after "Add to cart" on the single product page
------------------------------------------------------------------- */

// Theme init priorities:
// 3 - add/remove Theme Options elements
if ( ! function_exists( 'nexio_woocommerce_extensions_product_text_after_add_to_cart_theme_setup3' ) ) {
	add_action( 'after_setup_theme', 'nexio_woocommerce_extensions_product_text_after_add_to_cart_theme_setup3', 3 );
	function nexio_woocommerce_extensions_product_text_after_add_to_cart_theme_setup3() {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'text_after_add_to_cart' )
		) {
			// Add 'single_product_text_after_add_to_cart' to the theme-specific options
			nexio_storage_set_array_before( 'options', 'show_related_posts_shop', apply_filters( 'nexio_filter_woocommerce_extensions_text_after_add_to_cart_args', array(
				'single_product_text_after_add_to_cart' => array(
					'title'    => esc_html__( 'Text after "Add to Cart"', 'nexio' ),
					'desc'     => wp_kses_data( __( 'Specify custom text to show it after "Add to Cart" button on the single product page.', 'nexio' ) ),
					'std'      => '',
					'type'     => 'text_editor',
				),
			) ) );
		}
	}
}

// Add custom text after "Add to cart" button
// @hooked woocommerce_template_single_add_to_cart - 30
if ( ! function_exists( 'nexio_woocommerce_extensions_product_text_after_add_to_cart' ) ) {
	add_action( 'woocommerce_single_product_summary', 'nexio_woocommerce_extensions_product_text_after_add_to_cart', 32 );
	function nexio_woocommerce_extensions_product_text_after_add_to_cart() {
		if ( apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'text_after_add_to_cart' ) ) {
			nexio_show_layout( do_shortcode( nexio_get_theme_option( 'single_product_text_after_add_to_cart' ) ), '<div class="single_product_custom_text_after_add_to_cart">', '</div>' );
		}
	}
}



/* Add parameter 'Single Product "Add to cart" Sticky'
------------------------------------------------------------------- */

// Theme init priorities:
// 3 - add/remove Theme Options elements
if ( ! function_exists( 'nexio_woocommerce_extensions_product_add_to_cart_sticky_theme_setup3' ) ) {
	add_action( 'after_setup_theme', 'nexio_woocommerce_extensions_product_add_to_cart_sticky_theme_setup3', 3 );
	function nexio_woocommerce_extensions_product_add_to_cart_sticky_theme_setup3() {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'add_to_cart_sticky' )
		) {
			// Add 'single_product_add_to_cart_sticky' to the theme-specific options
			nexio_storage_set_array_before( 'options', 'show_related_posts_shop', apply_filters( 'nexio_filter_woocommerce_extensions_add_to_cart_sticky_args', array(
				'single_product_add_to_cart_sticky' => array(
					'title'    => esc_html__( 'Sticky "Add to Cart" Bottom Bar', 'nexio' ),
					'desc'     => wp_kses_data( __( 'Add sticky "Add to Cart" bottom bar to the single product page.', 'nexio' ) ),
					'override' => array(
						'mode'    => 'product',
						'section' => esc_html__( 'Content', 'nexio' ),
					),
					'std'      => 0,
					'type'     => 'switch',
				),
			) ) );
		}
	}
}

// Add sticky bar to the footer
if ( ! function_exists( 'nexio_woocommerce_extensions_product_add_to_cart_sticky_bottom_bar' ) ) {
	add_action( 'wp_footer', 'nexio_woocommerce_extensions_product_add_to_cart_sticky_bottom_bar' );
	function nexio_woocommerce_extensions_product_add_to_cart_sticky_bottom_bar() {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'add_to_cart_sticky' )
			&& (int) nexio_get_theme_option( 'single_product_add_to_cart_sticky' ) == 1
			&& is_product()
		) {
			global $product;
			// Disable slider in bottom bar
			add_filter( 'woocommerce_single_product_flexslider_enabled', '__return_false' );
			?>
			<div class="single_product_bottom_bar_sticky">
				<div class="single_product_bottom_bar_title">
					<?php
					$post_thumbnail_id = $product->get_image_id();
					if ( $post_thumbnail_id > 0 ) {
						$html = apply_filters( 'woocommerce_single_product_image_thumbnail_html', wc_get_gallery_image_html( $post_thumbnail_id ), $post_thumbnail_id );
						?><div class="single_product_bottom_bar_product_image"><?php
							echo wp_kses( $html, 'nexio_kses_content' );
						?></div><?php
					}
					?>
					<div class="single_product_bottom_bar_product_title"><?php
						the_title( '<h6 class="product_title entry-title">', '</h6>' );
					?></div>
				</div>
				<div class="single_product_bottom_bar_info">
					<div class="single_product_bottom_bar_product_price"><?php
						echo wp_kses( $product->get_price_html(), 'nexio_kses_content' );
					?></div>
					<div class="single_product_bottom_bar_product_button"><?php
						ob_start();
						woocommerce_template_single_add_to_cart();
						$output = ob_get_contents();
						ob_end_clean();
						if ( strpos( $output, '<form class="variations_form ' ) !== false ) {
							$output = '<button type="button" class="button alt single_product_bottom_bar_button_select_options">' . esc_html__( 'Select options', 'nexio' ) . '</button>';
						}
						trx_addons_show_layout( $output );
					?></div>
				</div>
			</div>
			<div class="single_product_bottom_bar_sticky_holder"></div>
			<?php
			// Enable slider again
			remove_action( 'woocommerce_single_product_flexslider_enabled', '__return_false' );	// Is equal to rf
		}
	}
}

// Add var to js
if ( ! function_exists( 'nexio_woocommerce_extensions_product_add_to_cart_sticky_localize_script' ) ) {
	add_action( 'nexio_filter_localize_script', 'nexio_woocommerce_extensions_product_add_to_cart_sticky_localize_script' );
	function nexio_woocommerce_extensions_product_add_to_cart_sticky_localize_script( $vars = array() ) {
		if ( apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'add_to_cart_sticky' ) ) {
			$vars['add_to_cart_sticky'] = nexio_exists_woocommerce()
											&& is_product()
											&& (int)nexio_get_theme_option( 'single_product_add_to_cart_sticky' ) == 1;
		}
		return $vars;
	}
}



/* Add parameter 'Show Product meta'
------------------------------------------------------------------- */

// Theme init priorities:
// 3 - add/remove Theme Options elements
if ( ! function_exists( 'nexio_woocommerce_extensions_product_meta_theme_setup3' ) ) {
	add_action( 'after_setup_theme', 'nexio_woocommerce_extensions_product_meta_theme_setup3', 3 );
	function nexio_woocommerce_extensions_product_meta_theme_setup3() {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'product_meta' )
		) {
			// Add 'single_product_meta' to the theme-specific options
			nexio_storage_set_array_before( 'options', 'show_related_posts_shop', apply_filters( 'nexio_filter_woocommerce_extensions_product_meta_args', array(
				'single_product_meta' => array(
					'title'   => esc_html__( 'Show product meta', 'nexio' ),
					'desc'    => wp_kses_data( __( "Show Categories, Tags, SKU, Product ID on the single product page.", 'nexio' ) ),
					'std'     => 1,
					'type'    => 'switch',
				),
			) ) );
		}
	}
}


// Disable product meta
if ( ! function_exists( 'nexio_woocommerce_extensions_product_meta_disable' ) ) {
	add_action( 'woocommerce_single_product_summary', 'nexio_woocommerce_extensions_product_meta_disable', 1 );
	function nexio_woocommerce_extensions_product_meta_disable() {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'product_meta' )
			&& is_product()
		) {
			if ( (int) nexio_get_theme_option( 'single_product_meta' ) == 0 ) {
				remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_meta', 40 );
			}
		}
	}
}



/* Add tabs to the single product details
------------------------------------------------------------------- */

// Theme init priorities:
// 3 - add/remove Theme Options elements
if ( ! function_exists( 'nexio_woocommerce_extensions_custom_tabs_theme_setup3' ) ) {
	add_action( 'after_setup_theme', 'nexio_woocommerce_extensions_custom_tabs_theme_setup3', 3 );
	function nexio_woocommerce_extensions_custom_tabs_theme_setup3() {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'custom_tabs' )
		) {
			// Add 'single_product_custom_tabs' to the theme-specific options
			nexio_storage_set_array_before( 'options', 'show_related_posts_shop', apply_filters( 'nexio_filter_woocommerce_extensions_custom_tabs_args', array(
				'single_product_custom_tabs' => array(
					"title" => esc_html__( "Tabs manager", 'nexio' ),
					"desc" => wp_kses_data( __( "Manage tabs in the Details section of the single product: hide any tab, reorder tabs, add an icon to the tab title, change a title, add new tabs with custom content", 'nexio' ) ),
					'override'   => array(
						'mode'    => 'product',
						'section' => esc_html__( 'Content', 'nexio' ),
					),
					"clone" => true,
					"std" => array(
						array( 'tab_title' => esc_html__( "Description", 'nexio' ), 'tab_slug' => 'description', 'tab_icon' => '', 'tab_show' => 1, 'tab_content' => '' ),
						array( 'tab_title' => esc_html__( "Reviews (%d)", 'nexio' ), 'tab_slug' => 'reviews', 'tab_icon' => '', 'tab_show' => 1, 'tab_content' => '' ),
						array( 'tab_title' => esc_html__( "Additional information", 'nexio' ), 'tab_slug' => 'additional_information', 'tab_icon' => '', 'tab_show' => 1, 'tab_content' => '' ),
					),
					"type" => "group",
					"fields" => array(
						"tab_show" => array(
							"title" => esc_html__( "Tab visible", 'nexio' ),
							"class" => "nexio_column-1_4",
							"std" => 1,
							"type" => "switch"
						),
						"tab_title" => array(
							"title" => esc_html__( "Tab title", 'nexio' ),
							"class" => "nexio_column-1_4",
							"std" => "",
							"type" => "text"
						),
						"tab_slug" => array(
							"title" => esc_html__( "Tab slug", 'nexio' ),
							"class" => "nexio_column-1_4",
							"std" => "",
							"type" => "text"
						),
						"tab_icon" => array(
							"title" => esc_html__( "Tab icon", 'nexio' ),
							"class" => "nexio_column-1_4",
							"std" => "",
							"type" => "icon"
						),
						"tab_content" => array(
							"title" => esc_html__( "Tab content", 'nexio' ),
							"desc" => esc_html__( "Only changing the title, order or visibility of standard WooCommerce tabs (Reviews, Description and Additional information) is allowed. Don't fill in any content for them: this is possible for custom tabs only.", 'nexio')
									. '<br>'
									. esc_html__( "You can use macros %%TITLE%% and %%PRICE%% to insert the title and price of this product into the content.", 'nexio'),
							"class" => "nexio_column-1_1",
							"std" => "",
							"type" => "text_editor"
						),
					)
				),
			) ) );
		}
	}
}

// Add custom tabs (if defined for the current product)
if ( ! function_exists( 'nexio_woocommerce_extensions_custom_tabs_add_to_product_tabs' ) ) {
	add_filter( 'woocommerce_product_tabs', 'nexio_woocommerce_extensions_custom_tabs_add_to_product_tabs' );
	function nexio_woocommerce_extensions_custom_tabs_add_to_product_tabs( $tabs = array() ) {
		if ( apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'custom_tabs' ) ) {
			global $product;
			$custom_tabs = nexio_get_theme_option( 'single_product_custom_tabs' );
			if ( is_array( $custom_tabs ) ) {
				$priority = 0;
				$new_tabs = array();
				foreach ( $custom_tabs as $tab ) {
					if ( ! empty( $tab['tab_title'] ) && (int) $tab['tab_show'] > 0 ) {
						$priority += 10;
						$slug = sanitize_title( ! empty( $tab['tab_slug'] ) ? $tab['tab_slug'] : $tab['tab_title'] );
						$new_tabs[ $slug ] = isset( $tabs[ $slug ] )
												? $tabs[ $slug ]
												: array( 'callback' => 'nexio_woocommerce_extensions_custom_tabs_template' );
						$new_tabs[ $slug ][ 'title' ] = ( ! nexio_is_off( $tab['tab_icon'] )
												 			? '<span class="woocommerce-tab-icon ' . esc_attr( $tab['tab_icon'] ) . '"></span>'
												 			: ''
												 			)
														. ( 'reviews' == $slug && is_object( $product )
															? str_replace( '%d', $product->get_review_count(), $tab['tab_title'] )
															: $tab['tab_title']
															);
						$new_tabs[ $slug ][ 'priority' ] = $priority;
					}
				}
				$tabs = $new_tabs;
			}
		}
		return $tabs;
	}
}

// Display custom tabs
if ( ! function_exists( 'nexio_woocommerce_extensions_custom_tabs_template' ) ) {
	function nexio_woocommerce_extensions_custom_tabs_template( $tab_slug, $tab_data ) {
		global $product;
		$custom_tabs = nexio_get_theme_option( 'single_product_custom_tabs' );
		if ( is_array( $custom_tabs ) && is_object( $product ) ) {
			foreach ( $custom_tabs as $tab ) {
				$slug = sanitize_title( $tab['tab_title'] );
				if ( $tab_slug == ( ! empty( $tab['tab_slug'] ) ? $tab['tab_slug'] : $slug ) ) {
					$title = get_the_title();
					$price = $product->get_price_html();
					nexio_show_layout( do_shortcode(
						str_ireplace(
							array( '%%TITLE%%', '%%PRICE%%' ),
							array( $title,      $price ),
							$tab['tab_content']
						)
					) );
				}
			}
		}
	}
}



/* Add section 'Rating details' to the single product
------------------------------------------------------------------- */

// Replace core Woocommerce tabs output
if ( ! function_exists( 'nexio_woocommerce_extensions_replace_woocommerce_core_tabs' ) ) {
	add_action( 'woocommerce_after_single_product_summary', 'nexio_woocommerce_extensions_replace_woocommerce_core_tabs', 1 );
	function nexio_woocommerce_extensions_replace_woocommerce_core_tabs() {
		if ( apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'rating_details' ) ) {
			global $product;
			if ( is_object( $product ) && function_exists( 'woocommerce_output_product_data_tabs' ) ) {
				$rating_count = $product->get_rating_count();
				if ( $rating_count > 0 ) {
					remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_product_data_tabs', 10 );
					add_action( 'woocommerce_after_single_product_summary', 'nexio_woocommerce_extensions_add_rating_details', 10 );
				}
			}
		}
	}
}

// Add 'Rating Details' to the tab 'Reviews'
if ( ! function_exists( 'nexio_woocommerce_extensions_add_rating_details' ) ) {
	// Handler of the add_action( 'woocommerce_after_single_product_summary', 'nexio_woocommerce_extensions_add_rating_details', 10 );
	function nexio_woocommerce_extensions_add_rating_details() {
		global $product;
		// Capture a tabs output
		ob_start();
		woocommerce_output_product_data_tabs();
		$output = ob_get_contents();
		ob_end_clean();
		// Inject the section 'Rating Details'
		$rating_count  = $product->get_rating_count();
		$review_count  = $product->get_review_count();
		$average       = $product->get_average_rating();
		$html          = '<h5 class="rating_details_title">' . esc_html__( 'Average rating', 'nexio' ) . '</h5>'
						. '<div class="rating_details_avg">' . esc_html( $average ) . '</div>'
						. '<div class="rating_details_avg_stars">' . wc_get_rating_html( $average, $rating_count ) . '</div>'
						. '<div class="rating_details_avg_total">' . esc_html( sprintf( _n( '%d review', '%d reviews', $review_count, 'nexio' ), $review_count ) ) . '</div>';
		$rating_counts = $product->get_rating_counts();
		if ( is_array( $rating_counts ) ) {
			$rating_counts     = nexio_array_merge( array( 5 => 0, 4 => 0, 3 => 0, 2 => 0, 1 => 0 ), $rating_counts );
			$percent_decimals  = apply_filters( 'nexio_filter_woocommerce_extensions_rating_details_percent_decimals', 1 );
			$rating_as_percent = apply_filters( 'nexio_filter_woocommerce_extensions_rating_details_as_percent', true );
			$html .= '<div class="rating_details_table">';
			foreach( $rating_counts as $mark => $total ) {
				$percent = round( $total / $rating_count * 100, $percent_decimals );
				$html .= '<div class="rating_details_table_row">'
							. '<div class="rating_details_table_cell rating_details_table_cell_mark">'
								. esc_html( sprintf( _n( '%d star', '%d stars', $mark, 'nexio' ), $mark ) )
							. '</div>'
							. '<div class="rating_details_table_cell rating_details_table_cell_bar">'
									. '<div class="rating_details_table_cell_bar_fill_' . esc_attr( $total ) . '"'
										. ' style="width:' . esc_attr( $percent ) . '%">'
									. '</div>'
							. '</div>'
							. '<div class="rating_details_table_cell rating_details_table_cell_total">'
								. esc_html( $rating_as_percent ? $percent . '%' : $total )
							. '</div>'
						. '</div>';
			}
			$html .= '</div>';
		}
		$output = str_replace(
						'<div id="comments',
						'<div class="rating_details">' . $html . '</div>'
						. '<div id="comments',
						$output
						);
		// Display tabs
		nexio_show_layout( $output );
	}
}



/* Add parameter "Product's Video"
------------------------------------------------------------------- */
if ( ! function_exists( 'nexio_woocommerce_extensions_product_video_setup' ) ) {
	add_action( 'after_setup_theme', 'nexio_woocommerce_extensions_product_video_setup' );
	function nexio_woocommerce_extensions_product_video_setup() {
		if ( nexio_exists_trx_addons()
			&& nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'product_video' )
		) {
			if ( is_admin() ) {
				add_filter( 'nexio_filter_override_options', 'nexio_woocommerce_extensions_product_video_add_options' );
				add_filter( 'nexio_filter_update_post_options', 'nexio_woocommerce_extensions_product_video_update_options', 10, 3 );
			}
		}
	}
}

// After 'wp' options from the post meta are available
if ( ! function_exists( 'nexio_woocommerce_extensions_product_video_init' ) ) {
	add_action( 'wp', 'nexio_woocommerce_extensions_product_video_init', 20 );
	function nexio_woocommerce_extensions_product_video_init() {
		if ( nexio_exists_trx_addons()
			&& nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'product_video' )
		) {
			if ( ! is_admin() ) {
				// Add video to the gallery
				if ( nexio_get_theme_option( 'woocommerce_extensions_product_video_position' ) == 'first_thumb' ) {
					// Place video first (before main video)
					add_filter( 'woocommerce_single_product_image_thumbnail_html', 'nexio_woocommerce_extensions_product_video_add_thumbnails', 10, 2 );
				} else {
					// Place video last (after all thumbnails)
					add_action( 'woocommerce_product_thumbnails', 'nexio_woocommerce_extensions_product_video_add_thumbnails', 100 );
				}
			}
		}
	}
}

// Add options to the product
if ( ! function_exists( 'nexio_woocommerce_extensions_product_video_add_options' ) ) {
	//Handler of the add_filter('nexio_filter_override_options', 'nexio_woocommerce_extensions_product_video_add_options');
	function nexio_woocommerce_extensions_product_video_add_options( $list ) {
		if ( apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'product_video' ) ) {
			global $post_type;
			if ( 'product' == $post_type && nexio_options_allow_override( $post_type ) ) {
				$list[] = array(
					'nexio_woocommerce_extensions_product_video_options',
					esc_html__( 'Product video', 'nexio' ),
					'nexio_woocommerce_extensions_product_video_options_show',
					$post_type,
					'side',
					'default',
				);
			}
		}
		return $list;
	}
}

// Return options to the product video
if ( ! function_exists( 'nexio_woocommerce_extensions_product_video_get_options' ) ) {
	function nexio_woocommerce_extensions_product_video_get_options() {
		return apply_filters( 'nexio_filter_woocommerce_extensions_product_video_options', array(
					'woocommerce_extensions_product_video_url'   => array(
						"title" => esc_html__( "Video URL", 'nexio' ),
						"desc" => wp_kses_data( __('Specify URL to show a videoplayer from Youtube, Vimeo or other compatible video hosting', 'nexio') ),
						"std" => "",
						"type" => "text"
					),
					'woocommerce_extensions_product_video_image' => array(
						"title" => esc_html__( "Cover image", 'nexio' ),
						"desc" => wp_kses_data( __( "Select an image to be used as a video cover", 'nexio' ) ),
						"std" => "",
						"type" => "image"
					),
					'woocommerce_extensions_product_video_position' => array(
						"title" => esc_html__( "Video position", 'nexio' ),
						"desc" => wp_kses_data( __( "Select a position of the video in the galery", 'nexio' ) ),
						"std" => "first_thumb",
						"options" => apply_filters( 'nexio_filter_woocommerce_extensions_product_video_positions', array(
							'first_thumb' => esc_html__( 'First thumb', 'nexio' ),
							'last_thumb' => esc_html__( 'Last thumb', 'nexio' ),
						) ),
						"type" => "select"
					),
					'woocommerce_extensions_product_video_in_popup' => array(
						"title" => esc_html__( "Open video in popup", 'nexio' ),
						"desc" => wp_kses_data( __( "Open video in a popup or embed to the gallery", 'nexio' ) ),
						"std" => 1,
						"type" => "switch"
					),
					'woocommerce_extensions_product_video_button_position' => array(
						"title" => esc_html__( "Button position", 'nexio' ),
						"desc" => wp_kses_data( __( "Select a position of the button to open popup", 'nexio' ) ),
						"std" => "lb",
						"dependency" => array(
							'compare' => 'or',
							'woocommerce_extensions_product_video_in_popup' => array( 1 ),
							'woocommerce_extensions_product_video_image' => array( 'not_empty' )
						),
						"options" => apply_filters( 'nexio_filter_woocommerce_extensions_product_video_button_positions', array(
							'lt' => esc_html__( 'Top Left', 'nexio' ),
							'rt' => esc_html__( 'Top Right', 'nexio' ),
							'cc' => esc_html__( 'Middle Center', 'nexio' ),
							'lb' => esc_html__( 'Bottom Left', 'nexio' ),
							'rb' => esc_html__( 'Bottom Right', 'nexio' )
						) ),
						"type" => "select"
					),
					'woocommerce_extensions_product_video_ratio' => array(
						"title" => esc_html__( "Video ratio", 'nexio' ),
						"desc" => wp_kses_data( __( "Select a ratio of the video", 'nexio' ) ),
						"std" => "16:9",
						"dependency" => array(
							'woocommerce_extensions_product_video_in_popup' => array( 0 ),
							'woocommerce_extensions_product_video_image' => array( 'is_empty' )
						),
						"options" => apply_filters( 'nexio_filter_woocommerce_extensions_product_video_ratio', array(
							'2:1'  => esc_html__( '2:1', 'nexio' ),
							'17:9' => esc_html__( '17:9', 'nexio' ),
							'16:9' => esc_html__( '16:9', 'nexio' ),
							'4:3'  => esc_html__( '4:3', 'nexio' ),
							'1:1'  => esc_html__( '1:1', 'nexio' ),
							'3:4'  => esc_html__( '3:4', 'nexio' ),
							'9:16' => esc_html__( '9:16', 'nexio' ),
							'9:17' => esc_html__( '9:17', 'nexio' ),
							'1:2'  => esc_html__( '1:2', 'nexio' ),
						)),
						"type" => "select"
					),
		) );
	}
}


// Add extension-specific dependencies to the general theme dependencies
if ( ! function_exists( 'nexio_woocommerce_extensions_product_video_dependencies' ) ) {
	add_filter( 'nexio_filter_get_theme_dependencies', 'nexio_woocommerce_extensions_product_video_dependencies' );
	function nexio_woocommerce_extensions_product_video_dependencies( $depends ) {
		if ( apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'product_video' ) ) {
			$options = nexio_woocommerce_extensions_product_video_get_options();
			foreach ( $options as $k => $v ) {
				if ( isset( $v['dependency'] ) ) {
					$depends[ $k ] = $v['dependency'];
				}
			}
		}
		return $depends;
	}
}

// Callback function to show product options
if ( ! function_exists( 'nexio_woocommerce_extensions_product_video_options_show' ) ) {
	function nexio_woocommerce_extensions_product_video_options_show( $post = false, $args = false ) {
		if ( empty( $post ) || ! is_object( $post ) || empty( $post->ID ) ) {
			global $post, $post_type;
			$mb_post_id   = $post->ID;
			$mb_post_type = $post_type;
		} else {
			$mb_post_id   = $post->ID;
			$mb_post_type = $post->post_type;
		}
		if ( 'product' == $mb_post_type && nexio_options_allow_override( $mb_post_type ) ) {
			// Load saved options
			$meta = get_post_meta( $mb_post_id, 'nexio_options', true );
			$options = nexio_woocommerce_extensions_product_video_get_options();
			?>
			<div class="nexio_options nexio_product_options nexio_product_video_options">
				<div class="nexio_options_section">
					<?php
					foreach ( $options as $k => $v ) {
						$v['val'] = isset( $meta[ $k ] ) ? $meta[ $k ] : $v['std'];
						nexio_show_layout( nexio_options_show_field( $k, $v ) );
					}
					?>
				</div>
			</div>
			<?php
		}
	}
}


// Save product options
if ( ! function_exists( 'nexio_woocommerce_extensions_product_video_update_options' ) ) {
	//Handler of the add_filter( 'nexio_filter_update_post_options', 'nexio_woocommerce_extensions_product_video_update_options', 10, 3 );
	function nexio_woocommerce_extensions_product_video_update_options( $meta, $post_id, $post_type = '' ) {
		if ( apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'product_video' )
			&& 'product' == $post_type
		) {
			$options = nexio_woocommerce_extensions_product_video_get_options();
			foreach ( $options as $k => $v ) {
				// Get option value from POST
				$meta[ $k ] = isset( $_POST[ "nexio_options_field_{$k}" ] )
								? nexio_get_value_gp( "nexio_options_field_{$k}" )
								: ( 'checkbox' == $v['type'] ? 0 : '' );
			}
		}
		return $meta;
	}
}



// Add thumb with video to the gallery
if ( ! function_exists( 'nexio_woocommerce_extensions_product_video_add_thumbnails' ) ) {
	//Handler of the add_action( 'woocommerce_product_thumbnails', 'nexio_woocommerce_extensions_product_video_add_thumbnails', 1 | 100 );
	//Handler of the add_filter( 'woocommerce_single_product_image_thumbnail_html', 'nexio_woocommerce_extensions_product_video_add_thumbnails', 10, 2 );
	function nexio_woocommerce_extensions_product_video_add_thumbnails( $image_html = '', $post_thumbnail_id = 0 ) {
		if ( apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'product_video' ) ) {
			// Remove filter to prevent resursion
			if ( has_filter( 'woocommerce_single_product_image_thumbnail_html', 'nexio_woocommerce_extensions_product_video_add_thumbnails' ) ) {
				remove_action( 'woocommerce_single_product_image_thumbnail_html', 'nexio_woocommerce_extensions_product_video_add_thumbnails', 10 );	// Is equal to rf
			}
			// Add thumb with video (if specified)
			$video = nexio_get_theme_option( 'woocommerce_extensions_product_video_url' );
			if ( ! empty( $video ) ) {
				$popup      = nexio_get_theme_option( 'woocommerce_extensions_product_video_in_popup' );
				$cover      = nexio_get_theme_option( 'woocommerce_extensions_product_video_image' );
				$cover_id   = ! empty( $cover ) ? nexio_attachment_url_to_postid( $cover ) : 0;
				$button_pos = nexio_get_theme_option( 'woocommerce_extensions_product_video_button_position' );
				// Prepare layout with thumb
				if ( $cover_id ) {
					$html = wc_get_gallery_image_html( $cover_id );
				} else {
					$cover     = wc_placeholder_img_src( 'woocommerce_single' );
					$cover_id  = $cover;
					$cover_alt = esc_html__( 'Product video', 'nexio' );
					$html  = sprintf( '<div class="woocommerce-product-gallery__image woocommerce-product-gallery__image--placeholder" data-thumb="%1$s" data-thumb-alt="%2$s">',
										esc_url( $cover ),
										$cover_alt
									);
					$style = nexio_get_theme_option( 'single_product_gallery_style', 'default' );
					if ( $popup || ! in_array( $style, array( 'cascade', 'grid' ) ) ) {
						$html .= '<a href="' . esc_url( $cover ) . '">'
									. sprintf( '<img src="%1$s" alt="%2$s" class="wp-post-image" />',
												esc_url( $cover ),
												$cover_alt
											)
									. '</a>';
					} else {
						$cover    = '';
						$cover_id = '';
					}
					$html .= '</div>';
				}
				// Add class to the image wrap
				$html = str_replace(
							'"woocommerce-product-gallery__image',
							'"woocommerce-product-gallery__image'
								. ' woocommerce-product-gallery__image--with_video'
								. ( $cover
									? ' woocommerce-product-gallery__image--video_button_' . esc_attr( $button_pos )
									: ' woocommerce-product-gallery__image--video_present'
										. ' woocommerce-product-gallery__image--video_ratio_' . str_replace( ':', '_', nexio_get_theme_option( 'woocommerce_extensions_product_video_ratio' ) )
									),
							$html
						);
				// If video in the popup - add a 'play' button
				if ( $popup ) {
					$popup_layout = explode(
									'<!-- .sc_layouts_popup -->',
									nexio_get_video_layout( array(
																	'link'  => $video,
																	'embed' => '',
																	'cover' => $cover_id,
																	'cover_size' => 'full',
																	'show_cover' => false,
																	'popup' => true
																	)
																)
									);
					if ( ! empty( $popup_layout[0] ) && ! empty( $popup_layout[1] ) ) {
						if ( preg_match( '/<a .*<\/a>/', $popup_layout[0], $matches ) && ! empty( $matches[0] ) ) {
							// Remove link to the lightbox
							//$html = preg_replace( '/(.*)(<a[^>]*>)(.*)(<\/a>)(.*)/', '$1$3$5', $html );
							//$html = str_replace( 'data-large_image', 'data-dummy_image', $html );
							// Add popup and button
							$html = str_replace(
										'</div>',
										sprintf( '<div class="post_video_hover post_video_hover_popup">%1$s</div>%2$s',
													 $matches[0],
													 $popup_layout[1]
												)
										. '</div>',
										$html
									);
						}
					}
				} else {
					$video_layout = nexio_get_video_layout( array(
																	'link'  => $video,
																	'embed' => '',
																	'cover' => $cover_id,
																	'cover_size' => 'full',
																	'show_cover' => false,
																	'popup' => false
																	)
																);
					$html = str_replace(
								'</div>',
								sprintf( '<div class="woocommerce-product-gallery__image--video_wrap">%s</div>', $video_layout )
								. '</div>',
								$html
							);
				}
				$html = apply_filters( 'woocommerce_single_product_image_thumbnail_html', $html, $cover );
				if ( ! empty( $image_html ) ) {
					$image_html = trim( $html ) . trim( $image_html );
				} else {
					nexio_show_layout( $html );
				}
			}
		}
		return $image_html;
	}
}



/* Add parameter 'Add attributes to the products list'
------------------------------------------------------------------- */

// Theme init priorities:
// 3 - add/remove Theme Options elements
if ( ! function_exists( 'nexio_woocommerce_extensions_add_attributes_theme_setup3' ) ) {
	add_action( 'after_setup_theme', 'nexio_woocommerce_extensions_add_attributes_theme_setup3', 3 );
	function nexio_woocommerce_extensions_add_attributes_theme_setup3() {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'add_attributes_to_product_list' )
		) {
			// Add parameter to the theme-specific options
			nexio_storage_set_array_after( 'options', 'shop_pagination', apply_filters( 'nexio_filter_woocommerce_extensions_add_attributes_to_products_list_args', array(
				'add_attributes_to_products_list' => array(
					'title'   => esc_html__( 'Add attributes to the products list', 'nexio' ),
					'desc'    => wp_kses_data( __( "Display selected attributes in products on the shop page.", 'nexio' ) ),
					'std'     => '',
					'dir'     => 'vertical',
					'sortable'=> true,
					'options' => array(),
					'type'    => 'checklist',
				),
				'action_on_attribute_click' => array(
					'title'   => esc_html__( 'Action on attribute click', 'nexio' ),
					'desc'    => wp_kses_data( __( "Select an action on attribute click: swap a product image (only for variable products), open a single product page or apply a filter.", 'nexio' ) ),
					'std'     => 'none',
					'options' => array(
						'none'   => esc_html__( 'No action', 'nexio' ),
						'swap'   => esc_html__( 'Swap image', 'nexio' ),
						'link'   => esc_html__( 'Open product', 'nexio' ),
						'filter' => esc_html__( 'Apply filter', 'nexio' ),
					),
					'type'    => 'radio',
				),
				'swap_on_attribute_hover' => array(
					'title' => esc_html__( 'Swap images on attribute hover', 'nexio' ),
					'desc'  => wp_kses_data( __( "Swap a product image (only for variable products) on attribute hover.", 'nexio' ) ),
					'std'   => 0,
					'type'  => 'switch',
					'dependency' => array(
						'action_on_attribute_click' => array( '^swap' )
					)
				),
			) ) );
		}
	}
}


// Return lists with choises when its need in the admin mode
if ( ! function_exists( 'nexio_woocommerce_extensions_add_attributes_get_list_choises' ) ) {
	add_filter( 'nexio_filter_options_get_list_choises', 'nexio_woocommerce_extensions_add_attributes_get_list_choises', 10, 2 );
	function nexio_woocommerce_extensions_add_attributes_get_list_choises( $list, $id ) {
		if ( is_array( $list ) && count( $list ) == 0 ) {
			if ( strpos( $id, 'add_attributes_to_products_list' ) === 0 ) {
				$list = nexio_woocommerce_extensions_get_list_wc_attributes();
			}
		}
		return $list;
	}
}


// Return list of the WooCommerce attributes
if ( !function_exists( 'nexio_woocommerce_extensions_get_list_wc_attributes' ) ) {
	function nexio_woocommerce_extensions_get_list_wc_attributes() {
		static $list = false;
		if ( $list === false ) {
			$list = array();
			$attribute_taxonomies = wc_get_attribute_taxonomies();
			if ( ! empty( $attribute_taxonomies ) ) {
				foreach ( $attribute_taxonomies as $attribute ) {
					$list[ wc_attribute_taxonomy_name( $attribute->attribute_name ) ] = $attribute->attribute_label;
				}
			}
		}
		return apply_filters( 'nexio_filter_woocommerce_extensions_get_list_wc_attributes', $list );
	}
}


// Display selected attribute
if ( ! function_exists( 'nexio_woocommerce_extensions_show_attributes' ) ) {
	add_action( 'woocommerce_after_shop_loop_item', 'nexio_woocommerce_extensions_show_attributes', 18 );         // 20 is used to close item wrapper
	add_action( 'woocommerce_after_shop_loop_item_title', 'nexio_woocommerce_extensions_show_attributes', 8 );    //  5 is used to display rating
																													//  7 is used to display excerpt (in the list mode)
																													// 10 is used to display price
	function nexio_woocommerce_extensions_show_attributes() {
		if ( apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'add_attributes_to_product_list' ) ) {
			$attributes = nexio_get_theme_option( 'add_attributes_to_products_list' );
			if (   ! empty( $attributes )
				&& ! nexio_is_off( $attributes )
				&& apply_filters( 'nexio_filter_woocommerce_extensions_show_attributes', is_shop() || function_exists('trx_addons_sc_stack_check') && trx_addons_sc_stack_check('trx_sc_extended_products'), $attributes )
			) {
				$mode = nexio_storage_get( 'shop_mode' );
				if ( ( 'woocommerce_after_shop_loop_item_title' == current_action() && 'list' == $mode )
					||
					( 'woocommerce_after_shop_loop_item' == current_action() && ( 'thumbs' == $mode || ! is_shop() ) )
				) {
					do_action( 'nexio_action_product_attributes', apply_filters( 'nexio_filter_woocommerce_extensions_show_attributes_args', array(
								'attributes' => $attributes,
								'action'     => nexio_get_theme_option( 'action_on_attribute_click' ),
								'swap'       => nexio_get_theme_option( 'action_on_attribute_click' ) != 'swap' && nexio_get_theme_option( 'swap_on_attribute_hover' ) ? 1 : 0
								) ) );
				}
			}
		}
	}
}



/* Add parameter 'Product style' to the shop page settings
------------------------------------------------------------------- */

// Theme init priorities:
// 3 - add/remove Theme Options elements
if ( ! function_exists( 'nexio_woocommerce_extensions_add_product_style_theme_setup3' ) ) {
	add_action( 'after_setup_theme', 'nexio_woocommerce_extensions_add_product_style_theme_setup3', 3 );
	function nexio_woocommerce_extensions_add_product_style_theme_setup3() {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'product_style' )
		) {
			// Add parameter to the theme-specific options
			nexio_storage_set_array_after( 'options', 'shop_mode', apply_filters( 'nexio_filter_woocommerce_extensions_add_product_style_args', array(
				'product_style' => array(
					'title'      => esc_html__( 'Product style', 'nexio' ),
					'desc'       => wp_kses_data( __( 'Style of product items on the shop page.', 'nexio' ) ),
					'std'     => 'default',
					'options' => array(),
					'type'    => 'select',
				),
			) ) );
		}
	}
}


// Return lists with choises when its need in the admin mode
if ( ! function_exists( 'nexio_woocommerce_extensions_add_product_style_get_list_choises' ) ) {
	add_filter( 'nexio_filter_options_get_list_choises', 'nexio_woocommerce_extensions_add_product_style_get_list_choises', 10, 2 );
	function nexio_woocommerce_extensions_add_product_style_get_list_choises( $list, $id ) {
		if ( is_array( $list ) && count( $list ) == 0 ) {
			if ( strpos( $id, 'product_style' ) === 0 && function_exists( 'trx_addons_woocommerce_extended_products_get_list_styles' ) ) {
				$list = trx_addons_woocommerce_extended_products_get_list_styles();
			}
		}
		return $list;
	}
}


// Substitute default template in the products loop with selected in Theme Options
if ( ! function_exists( 'nexio_woocommerce_extensions_add_product_style_wc_get_template_part' ) ) {
	add_filter( 'wc_get_template_part', 'nexio_woocommerce_extensions_add_product_style_wc_get_template_part', 200, 3 );
	function nexio_woocommerce_extensions_add_product_style_wc_get_template_part( $template, $slug, $name ) {
		if ( apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'product_style' ) ) {
			if ( $slug == 'content' && $name == 'product'
				&& function_exists( 'trx_addons_woocommerce_extended_products_get_layouts' )
				&& ( ! function_exists( 'trx_addons_sc_stack_check' )
					 ||
					 ! trx_addons_sc_stack_check( 'trx_sc_extended_products' )
					)
				&& ! is_product()	// To prevent replace template of related products in the single product page
			) {
				$style = nexio_get_theme_option( 'product_style' );
				if ( 'default' != $style ) {
					$layouts = trx_addons_woocommerce_extended_products_get_layouts();
					if ( isset( $layouts[ $style ] ) && ! empty( $layouts[ $style ]['template'] ) ) {
						$template = $layouts[ $style ]['template'];
					}
				}
			}
		}
		return $template;
	}
}


// Add class with a "product style" to the wrap ul.products
// ( if we are not inside a shortcode 'trx_sc_extended_products' )
if ( ! function_exists( 'nexio_woocommerce_extensions_add_product_style_to_products_wrap' ) ) {
	add_filter( 'woocommerce_product_loop_start', 'nexio_woocommerce_extensions_add_product_style_to_products_wrap', 200, 1 );
	function nexio_woocommerce_extensions_add_product_style_to_products_wrap( $template ) {
		if ( apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'product_style' ) ) {
			if ( function_exists( 'trx_addons_woocommerce_extended_products_get_layouts' )
				&& ( ! function_exists( 'trx_addons_sc_stack_check' )
					 ||
					 ! trx_addons_sc_stack_check( 'trx_sc_extended_products' )
					)
				&& ! is_product()	// To prevent add class for the wrap of related products in the single product page
			) {
				$style = nexio_get_theme_option( 'product_style' );
				$new_classes = array(
					sprintf( 'products_style_%s', $style )
				);
				$layouts = trx_addons_woocommerce_extended_products_get_layouts();
				if ( isset( $layouts[ $style ] ) && ! empty( $layouts[ $style ]['products_classes'] ) ) {
					$new_classes = array_merge(
										$new_classes, 
										is_array( $layouts[ $style ]['products_classes'] )
											? $layouts[ $style ]['products_classes']
											: explode( ' ', $layouts[ $style ]['products_classes'] )
										);
				}
				$template = preg_replace( 
										'/(<ul[^>]*class="products )/',
										'$1' . esc_attr( join( ' ', $new_classes ) ) . ' ',
										$template
										);
			}
		}
		return $template;
	}
}


// Add class with a "product style" to each product item
if ( ! function_exists( 'nexio_woocommerce_extensions_add_product_style_to_product_items' ) ) {
	add_filter( 'woocommerce_post_class', 'nexio_woocommerce_extensions_add_product_style_to_product_items', 200, 2 );
	function nexio_woocommerce_extensions_add_product_style_to_product_items( $classes, $product ) {
		if ( apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'product_style' ) ) {
			if ( function_exists( 'trx_addons_woocommerce_extended_products_get_layouts' )
				&& ( ! function_exists( 'trx_addons_sc_stack_check' )
					 ||
					 ! trx_addons_sc_stack_check( 'trx_sc_extended_products' )
					)
				&& ! is_product()	// To prevent add class for the wrap of related products in the single product page
			) {
				if ( is_array( $classes ) ) {
					$style = nexio_get_theme_option( 'product_style' );
					$new_classes = array(
										sprintf( 'product_style_%s', esc_attr( $style ) )
									);
					$layouts = trx_addons_woocommerce_extended_products_get_layouts();
					if ( isset( $layouts[ $style ] ) && ! empty( $layouts[ $style ]['product_classes'] ) ) {
						$new_classes = array_merge(
											$new_classes, 
											is_array( $layouts[ $style ]['product_classes'] )
												? $layouts[ $style ]['product_classes']
												: explode( ' ', $layouts[ $style ]['product_classes'] )
											);
					}
					foreach( $new_classes as $c ) {
						$c = trim( $c );
						if ( ! empty( $c ) && ! in_array( $c, $classes ) ) {
							$classes[] = $c;
						}
					}
				}
			}
		}
		return $classes;
	}
}



/* Add parameter 'Brand attribute'
------------------------------------------------------------------- */

// Theme init priorities:
// 3 - add/remove Theme Options elements
if ( ! function_exists( 'nexio_woocommerce_extensions_add_brand_theme_setup3' ) ) {
	add_action( 'after_setup_theme', 'nexio_woocommerce_extensions_add_brand_theme_setup3', 3 );
	function nexio_woocommerce_extensions_add_brand_theme_setup3() {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'add_brand' )
		) {
			// Add parameter to the theme-specific options
			nexio_storage_set_array_before( 'options', 'fonts', apply_filters( 'nexio_filter_woocommerce_extensions_add_brand_args', array(
				'shop_brand_section'         => array(
					'title'      => esc_html__( 'Brands', 'nexio' ),
					'desc'       => wp_kses_data( __( 'Settings of the "Brand" attribute', 'nexio' ) ),
					'icon'       => 'icon-star',
					'type'       => 'section',
				),
				'shop_brand_info'            => array(
					'title'      => esc_html__( 'Brand settings', 'nexio' ),
					'desc'       => wp_kses_data( __( 'Settings of the "Brand" attribute', 'nexio' ) ),
					'type'       => 'info',
				),
				'brand_attribute'            => array(
					'title'   => esc_html__( "'Brand' attribute", 'nexio' ),
					'desc'    => wp_kses_data( __( "Use selected attribute as 'Brand' (display it after title).", 'nexio' ) ),
					'std'     => 'none',
					'options' => array(),
					'type'    => 'select',
				),
				'brand_attribute_on_shop'    => array(
					'title'  => esc_html__( "Show 'Brand' on the shop page", 'nexio' ),
					'desc'   => wp_kses_data( __( "Show attribute 'Brand' in the each product on the shop page", 'nexio' ) ),
					'std'    => 0,
					'type'   => 'switch',
				),
				'brand_attribute_on_product' => array(
					'title'  => esc_html__( "Show 'Brand' on the single product page", 'nexio' ),
					'desc'   => wp_kses_data( __( "Show 'Brand' on the single product page", 'nexio' ) ),
					'std'    => 1,
					'type'   => 'switch',
				),
				'brand_attribute_label'      => array(
					'title'  => esc_html__( "Label before 'Brand'", 'nexio' ),
					'desc'   => wp_kses_data( __( "Some text to display before the 'Brand' on the single product page", 'nexio' ) ),
					'std'    => '',
					'type'   => 'text',
				),
			) ) );
		}
	}
}


// Return lists with choises when its need in the admin mode
if ( ! function_exists( 'nexio_woocommerce_extensions_add_brand_get_list_choises' ) ) {
	add_filter( 'nexio_filter_options_get_list_choises', 'nexio_woocommerce_extensions_add_brand_get_list_choises', 10, 2 );
	function nexio_woocommerce_extensions_add_brand_get_list_choises( $list, $id ) {
		if ( is_array( $list ) && count( $list ) == 0 ) {
			if ( strpos( $id, 'brand_attribute' ) === 0 ) {
				$list = array_merge( array(
							'none' => nexio_get_not_selected_text( esc_html__( 'Select attribute', 'nexio' ) )
							), nexio_woocommerce_extensions_get_list_wc_attributes() );
			}
		}
		return $list;
	}
}


// Remove brand attribute from attributes list
if ( ! function_exists( 'nexio_woocommerce_extensions_remove_brand_from_attributes_list' ) ) {
	add_filter( 'woocommerce_display_product_attributes', 'nexio_woocommerce_extensions_remove_brand_from_attributes_list', 10, 2 );
	function nexio_woocommerce_extensions_remove_brand_from_attributes_list( $attributes, $product ) {
		if ( apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'add_brand' ) ) {
			$brand = nexio_get_theme_option( 'brand_attribute' );
			if ( ! empty( $brand )
				&& ! nexio_is_off( $brand )
				&& (int) nexio_get_theme_option( 'brand_attribute_on_' . ( is_product() ? 'product' : 'shop' ) ) > 0
				&& taxonomy_exists( $brand )
				&& apply_filters( 'nexio_filter_woocommerce_extensions_show_brand', true )
			) {
				$key = "attribute_{$brand}";
				if ( isset( $attributes[ $key ] ) ) {
					unset( $attributes[ $key ] );
				}
			}
		}
		return $attributes;
	}
}


// Display selected attribute as brand (after title) on single product page and on the shop page
if ( ! function_exists( 'nexio_woocommerce_extensions_show_brand' ) ) {
	add_action( 'woocommerce_single_product_summary', 'nexio_woocommerce_extensions_show_brand', 6 );     // woocommerce_single_product_summary:5 is used to display a product title
	add_action( 'woocommerce_after_shop_loop_item_title', 'nexio_woocommerce_extensions_show_brand', 6 ); // woocommerce_after_shop_loop_item_title:5 is used to display a product rating
																											// woocommerce_shop_loop_item_title:10 is used to display a product title
	function nexio_woocommerce_extensions_show_brand() {
		if ( apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'add_brand' ) ) {
			global $product;
			$brand = nexio_get_theme_option( 'brand_attribute' );
			$show  = (int) nexio_get_theme_option( 'brand_attribute_on_' . ( current_action() == 'woocommerce_single_product_summary' ? 'product' : 'shop' ) );
			if ( ! empty( $brand ) && ! nexio_is_off( $brand ) && taxonomy_exists( $brand ) && is_object( $product ) && apply_filters( 'nexio_filter_woocommerce_extensions_show_brand', $show ) ) {
				$type = nexio_woocommerce_extensions_attrib_get_type( $brand );
				$terms = wc_get_product_terms( $product->get_id(), $brand, array( 'fields' => 'all' ) );
				if ( is_array( $terms ) && count( $terms ) > 0 ) {
					?><div class="woocommerce_extensions_brand"><?php
					// Label
					$label = nexio_get_theme_option( 'brand_attribute_label' );
					if ( ! empty( $label ) && apply_filters( 'nexio_filter_woocommerce_extensions_show_brand_label', current_action() == 'woocommerce_single_product_summary' ) ) {
						?><span class="woocommerce_extensions_brand_label"><?php echo esc_html( $label ); ?></span><?php
					}
					foreach ( $terms as $term ) {
						$term_val = $term->name;
						$term_image = '';
						$term_color = '';
						if ( $type == 'image' ) {
							$term_image = get_term_meta( $term->term_id, 'value', true );
							$term_image = ! empty( $term_image ) && nexio_is_url( $term_image )
											? nexio_add_thumb_size( $term_image, nexio_get_thumb_size( 'masonry' ) )
											: '';
						} else if ( $type == 'color' ) {
							$term_color = get_term_meta( $term->term_id, 'value', true );
							if ( empty( $term_color ) ) {
								$term_color = $term->slug;
							}
						}
						// If attribute has an archive page and current skin allow links - wrap a brand logo and name with a link
						$brand_taxonomy = get_taxonomy( $brand );
						$term_link = ! empty( $brand_taxonomy->public ) && apply_filters( 'nexio_filter_woocommerce_extensions_make_brand_label_link', false, $term ) && get_term_link( $term );
						if ( ! empty( $term_link ) ) {
							?><a href="<?php echo esc_url( get_term_link( $term ) ); ?>" class="woocommerce_extensions_brand_item"><?php
						} else {
							?><span class="woocommerce_extensions_brand_item"><?php
						}
							// Logo
							if ( $type == 'image' && ! empty( $term_image ) ) {
								?><img src="<?php echo esc_url( $term_image ); ?>" class="woocommerce_extensions_brand_item_image" alt="<?php echo esc_attr( $term_val ); ?>"><?php
							}
							// Name
							?><span class="woocommerce_extensions_brand_item_caption<?php
								if ( ! empty( $term_color ) ) {
									echo ' ' . esc_attr( nexio_add_inline_css_class( 'color: ' . esc_attr( $term_color ) ) );
								}
							?>"><?php echo esc_html( $term_val ); ?></span><?php
						if ( ! empty( $term_link ) ) {
							?></a><?php
						} else {
							?></span><?php
						}
					}
					?></div><?php
				}
			}
		}
	}
}



/* Add parameter 'Use sidebar as filters panel'
------------------------------------------------------------------- */

// Theme init priorities:
// 3 - add/remove Theme Options elements
if ( ! function_exists( 'nexio_woocommerce_extensions_sidebar_filters_theme_setup3' ) ) {
	add_action( 'after_setup_theme', 'nexio_woocommerce_extensions_sidebar_filters_theme_setup3', 3 );
	function nexio_woocommerce_extensions_sidebar_filters_theme_setup3() {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'sidebar_filters' )
		) {
			// Add 'sidebar_filters_shop' to the theme-specific options for the Product list
			if ( nexio_check_theme_option( 'sidebar_position_ss_shop' ) ) {
				nexio_storage_set_array_before( 'options', 'sidebar_position_ss_shop', apply_filters( 'nexio_filter_woocommerce_extensions_sidebar_filters_shop_args', array(
					'sidebar_filters_shop' => array(
						'title'      => esc_html__( 'Use sidebar as filters panel', 'nexio' ),
						'desc'       => wp_kses_data( __( 'Set the sidebar to behave like a filter bar on store pages.', 'nexio' ) ),
						'dependency' => array(
							'sidebar_position_shop' => array( '^hide' ),
						),
						'std'        => 0,
						'type'       => 'switch',
					),
				) ) );

				// Add condition to the 'single_product_gallery_thumbs'
				$dependency = nexio_storage_get_array( 'options', 'sidebar_position_ss_shop', 'dependency' );
				if ( ! is_array( $dependency ) ) {
					$dependency = array();
				}
				$dependency['sidebar_filters_shop'] = array( 0 );
				nexio_storage_set_array2( 'options', 'sidebar_position_ss_shop', 'dependency', $dependency );
			}
		}
	}
}

// Override options 'sidebar_position_ss_shop' and 'sidebar_position_ss_single_shop' if 'sidebar_filters' is on
if ( ! function_exists( 'nexio_woocommerce_extensions_sidebar_filters_override_position_ss' ) ) {
	add_action( 'nexio_action_load_options', 'nexio_woocommerce_extensions_sidebar_filters_override_position_ss');
	function nexio_woocommerce_extensions_sidebar_filters_override_position_ss() {
		if ( nexio_exists_woocommerce()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'sidebar_filters' )
		) {
			if ( nexio_check_theme_option( 'sidebar_filters_shop' ) && nexio_check_theme_option( 'sidebar_position_ss_shop' ) ) {
				if ( (int)nexio_get_theme_option( 'sidebar_filters_shop' ) > 0 ) {
					nexio_storage_set_array2( 'options', 'sidebar_position_ss_shop', 'val', 'float' );
				}
			}
		}
	}
}

// Add class to the body
if ( ! function_exists( 'nexio_woocommerce_extensions_sidebar_filters_add_body_classes' ) ) {
	add_filter( 'body_class', 'nexio_woocommerce_extensions_sidebar_filters_add_body_classes' );
	function nexio_woocommerce_extensions_sidebar_filters_add_body_classes( $classes ) {
		if ( nexio_exists_woocommerce() && is_shop()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'sidebar_filters' )
			&& (int)nexio_get_theme_option( 'sidebar_filters_shop' ) > 0
		) {
			$classes[] = 'sidebar_as_filters';
		}
		return $classes;
	}
}

// Add the button 'Filters' and wrap it with a select "Order by"
if ( ! function_exists( 'nexio_woocommerce_extensions_sidebar_filters_button_wrap_open' ) ) {
	add_action( 'woocommerce_before_shop_loop', 'nexio_woocommerce_extensions_sidebar_filters_button_wrap_open', 29 );
	add_action( 'woocommerce_no_products_found', 'nexio_woocommerce_extensions_sidebar_filters_button_wrap_open',9 );
	function nexio_woocommerce_extensions_sidebar_filters_button_wrap_open() {
		if ( apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'sidebar_filters' )
			&& (int)nexio_get_theme_option( 'sidebar_filters_shop' ) > 0
		) {
			?><div class="nexio_woocommerce_filters_button_wrap<?php
				if ( current_action() == 'woocommerce_no_products_found' ) echo ' nexio_woocommerce_filters_button_wrap_no_products';
			?>">
				<a href="#" class="nexio_woocommerce_filters_button icon-sliders">
					<span class="nexio_woocommerce_filters_button_label"><?php esc_html_e( 'Filters', 'nexio' ); ?></span>
				</a><?php
		}
	}
}

// Add the button 'Filters'
if ( ! function_exists( 'nexio_woocommerce_extensions_sidebar_filters_button_wrap_close' ) ) {
	add_action( 'woocommerce_before_shop_loop', 'nexio_woocommerce_extensions_sidebar_filters_button_wrap_close', 31 );
	add_action( 'woocommerce_no_products_found', 'nexio_woocommerce_extensions_sidebar_filters_button_wrap_close', 9 );
	function nexio_woocommerce_extensions_sidebar_filters_button_wrap_close() {
		if ( apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'sidebar_filters' )
			&& (int)nexio_get_theme_option( 'sidebar_filters_shop' ) > 0
		) {
			?></div><?php
		}
	}
}

// Add the button 'Close' to the sidebar
if ( ! function_exists( 'nexio_woocommerce_extensions_sidebar_filters_add_close' ) ) {
	add_action( 'nexio_action_before_sidebar_wrap', 'nexio_woocommerce_extensions_sidebar_filters_add_close', 10, 1 );
	function nexio_woocommerce_extensions_sidebar_filters_add_close( $sb = '' ) {
		if ( nexio_exists_woocommerce()
			&& is_shop()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'sidebar_filters' )
			&& (int)nexio_get_theme_option( 'sidebar_filters_shop' ) > 0
			&& $sb == 'sidebar'
		) {
			?><a class="sidebar_close theme_button_close" tabindex="0"><span class="theme_button_close_icon"></span></a><?php
		}
	}
}

// Add the overlay for the content while sidebar is opened
if ( ! function_exists( 'nexio_woocommerce_extensions_sidebar_filters_add_overlay' ) ) {
	add_action( 'nexio_action_content_wrap_end', 'nexio_woocommerce_extensions_sidebar_filters_add_overlay' );
	function nexio_woocommerce_extensions_sidebar_filters_add_overlay() {
		if ( nexio_exists_woocommerce()
			&& is_shop()
			&& apply_filters( 'nexio_filter_woocommerce_extensions_allow_components', true, 'sidebar_filters' )
			&& (int)nexio_get_theme_option( 'sidebar_filters_shop' ) > 0
		) {
			?><div class="sidebar_overlay"></div><?php
		}
	}
}



/* Add colors and fonts to the custom CSS
--------------------------------------------------------------- */
if ( nexio_exists_woocommerce() ) {
	$nexio_fdir = nexio_get_file_dir( 'plugins/woocommerce/woocommerce-extensions-style.php' );
	if ( ! empty( $nexio_fdir ) ) {
		require_once $nexio_fdir;
	}
}
Page not found – Hello World !