Sh3ll
OdayForums


Server : LiteSpeed
System : Linux premium84.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64
User : claqxcrl ( 523)
PHP Version : 8.1.32
Disable Function : NONE
Directory :  /home/claqxcrl/claquemagazineawards.com/wp-content/themes/exs/inc/integrations/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/claqxcrl/claquemagazineawards.com/wp-content/themes/exs/inc/integrations/woocommerce.php
<?php
/**
 * WooCommerce support
 *
 * @package WordPress
 * @subpackage ExS
 * @since 0.0.1
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly
}

//Woo min required version is 3.6

//header products counter ajax refresh
add_filter( 'woocommerce_add_to_cart_fragments', 'exs_filter_woocommerce_cart_count_fragments', 10, 1 );
if ( ! function_exists( 'exs_filter_woocommerce_cart_count_fragments' ) ) :
	function exs_filter_woocommerce_cart_count_fragments( $fragments ) {
		$fragments['span.cart-count'] = '<span class="cart-count">';
		if ( ! empty( WC()->cart->get_cart_contents_count() ) ) {
			$fragments['span.cart-count'] .= WC()->cart->get_cart_contents_count();
		}
		$fragments['span.cart-count'] .= '</span>';
		return $fragments;
	}
endif;

//removing wrapper 'main' and 'div' elements - templates/global and adding our custom with class .woo
remove_action( 'woocommerce_before_main_content', 'woocommerce_output_content_wrapper', 10 );
remove_action( 'woocommerce_after_main_content', 'woocommerce_output_content_wrapper_end', 10 );

add_action( 'woocommerce_before_main_content', 'exs_action_woocommerce_output_content_wrapper', 10 );
if ( ! function_exists( 'exs_action_woocommerce_output_content_wrapper' ) ) :
	function exs_action_woocommerce_output_content_wrapper() {
		echo '<div class="woo">';
	}
endif;
add_action( 'woocommerce_after_main_content', 'exs_action_woocommerce_output_content_wrapper_end', 10 );
if ( ! function_exists( 'exs_action_woocommerce_output_content_wrapper_end' ) ) :
	function exs_action_woocommerce_output_content_wrapper_end() {
		echo '</div><!--.woo-->';
	}
endif;


//removing default WooCommerce sidebar - we have our sidebar
remove_action( 'woocommerce_sidebar', 'woocommerce_get_sidebar', 10 );

//removing default breadcrumbs - we have our breadcrumbs
remove_action( 'woocommerce_before_main_content', 'woocommerce_breadcrumb', 20 );

//////////////////
//Single Product//
//////////////////

if ( ! function_exists( 'exs_woocommerce_setup_for_customizer' ) ) :
	function exs_woocommerce_setup_for_customizer() {
		//removing page title if it is showing in the title section (to prevent duplication)
		$exs_title = exs_option( 'title_show_title', '' );
		if ( ! empty( $exs_title ) ) {
			remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_title', 5 );
			add_filter( 'woocommerce_show_page_title', '__return_false' );
		}

		// related products separate section
		if( exs_option( 'product_related_separate' ) ) {
			remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20 );
			add_action( 'exs_action_before_bottom_wrap', 'exs_woocommerce_output_related_products' );
		}
	}
endif;
add_action( 'wp_loaded', 'exs_woocommerce_setup_for_customizer' );

//print meta after price - top meta with SKU
if ( ! function_exists( 'exs_action_woocommerce_template_single_meta_top_sku' ) ) :
	function exs_action_woocommerce_template_single_meta_top_sku() {
		global $product;
		if ( wc_product_sku_enabled() && ( $product->get_sku() || $product->is_type( 'variable' ) ) ) :
			?>
			<div class="product_meta">
				<span class="sku_wrapper"><?php esc_html_e( 'SKU:', 'exs' ); ?>
					<span class="sku"><?php echo ( $sku = $product->get_sku() ) ? $sku : esc_html__( 'N/A', 'exs' ); ?></span>
				</span>
			</div>
			<?php
		endif;
	}
endif;
add_action( 'woocommerce_single_product_summary', 'exs_action_woocommerce_template_single_meta_top_sku', 15 );

//remove second SKU in bottom meta
remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_meta', 40 );
if ( ! function_exists( 'exs_action_woocommerce_template_single_meta_bottom_cats' ) ) :
	function exs_action_woocommerce_template_single_meta_bottom_cats() {
		global $product;
		?>
		<div class="product_meta">
			<?php do_action( 'woocommerce_product_meta_start' ); ?>
			<?php echo wc_get_product_category_list( $product->get_id(), ', ', '<span class="posted_in">' . _n( 'Category:', 'Categories:', count( $product->get_category_ids() ), 'exs' ) . ' ', '</span>' ); ?>
			<?php echo wc_get_product_tag_list( $product->get_id(), ', ', '<span class="tagged_as">' . _n( 'Tag:', 'Tags:', count( $product->get_tag_ids() ), 'exs' ) . ' ', '</span>' ); ?>
			<?php do_action( 'woocommerce_product_meta_end' ); ?>
		</div>
		<?php
	}
endif;
add_action( 'woocommerce_single_product_summary', 'exs_action_woocommerce_template_single_meta_bottom_cats', 40 );

//related products options
if ( ! function_exists( 'exs_woocommerce_filter_related_products_args' ) ) :
	function exs_woocommerce_filter_related_products_args( $args ) {
		$count = exs_option( 'product_related_products_count' );
		if ( ! empty( $count ) ) {
			$args['posts_per_page'] = (int) $count;
		}
		$cols =  exs_option( 'product_related_products_cols' );
		if ( ! empty( $count ) ) {
			$args['columns'] = (int) $cols;
		}
		return $args;
	}
endif;
add_filter( 'woocommerce_output_related_products_args', 'exs_woocommerce_filter_related_products_args' );

if ( ! function_exists( 'exs_woocommerce_filter_related_products_title' ) ) :
	function exs_woocommerce_filter_related_products_title( $title ) {
		$custom_title = exs_option( 'product_related_products_title' );
		return ! empty( $custom_title ) ? $custom_title : $title;
	}
endif;
add_filter( 'woocommerce_product_related_products_heading', 'exs_woocommerce_filter_related_products_title' );

if ( ! function_exists( 'exs_woocommerce_output_related_products' ) ) :
	function exs_woocommerce_output_related_products() {

		if ( ! is_singular( 'product' ) ) {
			return;
		}

		$exs_container_width    = exs_option( 'product_related_separate_container_width', '' );
		$exs_related_background = exs_option( 'product_related_separate_background', '' );
		$padding_class = 'pt-0 pb-2';
		if ( $exs_related_background ) {
			$padding_class = 'pt-5 pb-2';
		}

		echo '<div class="exs-related-products-wrap container-' . esc_attr( $exs_container_width . ' ' . $exs_related_background . ' ' . $padding_class ) . '">';
		echo '<div class="container">';
		woocommerce_output_related_products();
		echo '</div><!-- .container -->';
		echo '</div><!-- .exs-related-products-wrap -->';

	}
endif;

/////////////////
//Products Loop//
/////////////////

//wrap products counter and filter dropdown to div on products archive
add_action( 'woocommerce_before_shop_loop', 'exs_action_woocommerce_before_shop_loop_open_wrap_div', 15 );
if ( ! function_exists( 'exs_action_woocommerce_before_shop_loop_open_wrap_div' ) ) :
	function exs_action_woocommerce_before_shop_loop_open_wrap_div() {
		$view_switcher  = exs_option( 'shop_layout' );
		$default_layout = exs_option( 'shop_layout_default' ) ? exs_option( 'shop_layout_default' ) : 'layout-default';
		$layout_class   = ( ! empty ( $view_switcher ) ) && ( ! empty( $_COOKIE['exs-shop-layout'] ) ) ? sanitize_title( $_COOKIE['exs-shop-layout'] ) : '';
		$layout_class   = empty( $layout_class ) ? $default_layout : $layout_class;
		$flex_class     = exs_option( 'shop_flex', '' ) ? 'products-flex' : '';
		echo '<div class="row clear woo-count-filter-wrap ' . esc_attr( $layout_class ) . ' ' . esc_attr( $flex_class ) . '">';
		if ( ! empty( $view_switcher ) ) {

			$shop_layout_list = exs_option( 'shop_layout_list', true );
			$shop_layout_table = exs_option( 'shop_layout_table', false );
			$shop_layout_hide_labels = exs_option( 'shop_layout_hide_labels', true );
			$label_text_class = $shop_layout_hide_labels ? 'screen-reader-text' : '';
			?>
			<div id="shop-layout">
				<label class="label-layout-default">
					<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24"><path d="M6 20q-.825 0-1.412-.587Q4 18.825 4 18q0-.825.588-1.413Q5.175 16 6 16t1.412.587Q8 17.175 8 18q0 .825-.588 1.413Q6.825 20 6 20Zm6 0q-.825 0-1.412-.587Q10 18.825 10 18q0-.825.588-1.413Q11.175 16 12 16t1.413.587Q14 17.175 14 18q0 .825-.587 1.413Q12.825 20 12 20Zm6 0q-.825 0-1.413-.587Q16 18.825 16 18q0-.825.587-1.413Q17.175 16 18 16q.825 0 1.413.587Q20 17.175 20 18q0 .825-.587 1.413Q18.825 20 18 20ZM6 14q-.825 0-1.412-.588Q4 12.825 4 12t.588-1.413Q5.175 10 6 10t1.412.587Q8 11.175 8 12q0 .825-.588 1.412Q6.825 14 6 14Zm6 0q-.825 0-1.412-.588Q10 12.825 10 12t.588-1.413Q11.175 10 12 10t1.413.587Q14 11.175 14 12q0 .825-.587 1.412Q12.825 14 12 14Zm6 0q-.825 0-1.413-.588Q16 12.825 16 12t.587-1.413Q17.175 10 18 10q.825 0 1.413.587Q20 11.175 20 12q0 .825-.587 1.412Q18.825 14 18 14ZM6 8q-.825 0-1.412-.588Q4 6.825 4 6t.588-1.412Q5.175 4 6 4t1.412.588Q8 5.175 8 6t-.588 1.412Q6.825 8 6 8Zm6 0q-.825 0-1.412-.588Q10 6.825 10 6t.588-1.412Q11.175 4 12 4t1.413.588Q14 5.175 14 6t-.587 1.412Q12.825 8 12 8Zm6 0q-.825 0-1.413-.588Q16 6.825 16 6t.587-1.412Q17.175 4 18 4q.825 0 1.413.588Q20 5.175 20 6t-.587 1.412Q18.825 8 18 8Z"/></svg>
					<input type="radio" name="shop-layout" value="default">
					<span class="<?php echo esc_attr( $label_text_class ); ?>"><?php esc_html_e( 'Columns', 'exs' ); ?></span>
				</label>
				<?php if ( $shop_layout_list ) : ?>
				<label class="label-layout-list">
					<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24"><path d="M4.5 19.25q-.525 0-.888-.363-.362-.362-.362-.887t.362-.887q.363-.363.888-.363t.888.363q.362.362.362.887t-.362.887q-.363.363-.888.363Zm3.75-.5v-1.5h12.5v1.5Zm-3.75-5.5q-.525 0-.888-.363-.362-.362-.362-.887t.362-.887q.363-.363.888-.363t.888.363q.362.362.362.887t-.362.887q-.363.363-.888.363Zm3.75-.5v-1.5h12.5v1.5ZM4.5 7.25q-.525 0-.888-.363Q3.25 6.525 3.25 6t.362-.888q.363-.362.888-.362t.888.362q.362.363.362.888t-.362.887q-.363.363-.888.363Zm3.75-.5v-1.5h12.5v1.5Z"/></svg>
					<input type="radio" name="shop-layout" value="list">
					<span class="<?php echo esc_attr( $label_text_class ); ?>"><?php esc_html_e( 'List', 'exs' ); ?></span>
				</label>
				<?php
				endif; //list
				if ( $shop_layout_table ) :
				?>
				<label class="label-layout-table">
					<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24"><path d="M3 18v-2h18v2Zm0-5v-2h18v2Zm0-5V6h18v2Z"/></svg>
					<input type="radio" name="shop-layout" value="table">
					<span class="<?php echo esc_attr( $label_text_class ); ?>"><?php esc_html_e( 'Table', 'exs' ); ?></span>
				</label>
				<?php
				endif; //table
				?>
			</div>
			<?php
		}
	}
endif;
add_action( 'woocommerce_before_shop_loop', 'exs_action_woocommerce_before_shop_loop_close_wrap_div', 35 );
if ( ! function_exists( 'exs_action_woocommerce_before_shop_loop_close_wrap_div' ) ) :
	function exs_action_woocommerce_before_shop_loop_close_wrap_div() {
		echo '</div><!--.woo-count-filter-wrap-->';
	}
endif; //exs_action_woocommerce_before_shop_loop_close_wrap_div

//wrap product and category loop item into div
add_action( 'woocommerce_before_subcategory', 'exs_action_woocommerce_before_shop_loop_item_open_wrap_div', 5 );
add_action( 'woocommerce_before_shop_loop_item', 'exs_action_woocommerce_before_shop_loop_item_open_wrap_div', 5 );
if ( ! function_exists( 'exs_action_woocommerce_before_shop_loop_item_open_wrap_div' ) ) :
	function exs_action_woocommerce_before_shop_loop_item_open_wrap_div() {
		echo '<div class="product-loop-item">';
		echo '<div class="product-thumbnail-wrap">';
	}
endif; //exs_action_woocommerce_before_shop_loop_item_open_wrap_div
add_action( 'woocommerce_after_subcategory', 'exs_action_woocommerce_after_shop_loop_item_close_wrap_div', 15 );
add_action( 'woocommerce_after_shop_loop_item', 'exs_action_woocommerce_after_shop_loop_item_close_wrap_div', 15 );
if ( ! function_exists( 'exs_action_woocommerce_after_shop_loop_item_close_wrap_div' ) ) :
	function exs_action_woocommerce_after_shop_loop_item_close_wrap_div() {
		echo '</div><!--.product-text-wrap-->';
		echo '</div><!--.product-loop-item-->';
	}
endif;

add_action( 'woocommerce_after_shop_loop_item', 'exs_action_woocommerce_after_shop_loop_item_product_short_description', 7 );
if ( ! function_exists( 'exs_action_woocommerce_after_shop_loop_item_product_short_description' ) ) :
	function exs_action_woocommerce_after_shop_loop_item_product_short_description() {
		global $product;
		echo '<div class="product-short-description">';
		echo wp_kses_post( $product->get_short_description() );
		echo '</div><!-- .product-short-description -->';
	}
endif;

//quick view button
if ( class_exists( 'YITH_WCQV_Frontend' ) ) :

	add_filter( 'yith_add_quick_view_button_html', 'exs_filter_yith_add_quick_view_button_html' );
	if ( ! function_exists( 'exs_filter_yith_add_quick_view_button_html' ) ) :
		function exs_filter_yith_add_quick_view_button_html( $html ) {
			return str_replace( 'class="button ', 'class="', $html );
		}
	endif;

	add_action( 'init', 'exs_filter_yith_add_quick_view_remove_button_actions' );
	if ( ! function_exists( 'exs_filter_yith_add_quick_view_remove_button_actions' ) ) :
		function exs_filter_yith_add_quick_view_remove_button_actions() {
			remove_action( 'woocommerce_after_shop_loop_item', array( YITH_WCQV_Frontend::get_instance(), 'yith_add_quick_view_button' ), 15 );
			remove_action( 'yith_wcwl_table_after_product_name', array( YITH_WCQV_Frontend::get_instance(), 'yith_add_quick_view_button' ), 15, 0 );
		}
	endif;
endif;

//closing product link after image
add_action( 'woocommerce_before_shop_loop_item_title', 'exs_action_woocommerce_template_loop_close_link_and_div_after_thumbnail', 11 );
if ( ! function_exists( 'exs_action_woocommerce_template_loop_close_link_and_div_after_thumbnail' ) ) :
	function exs_action_woocommerce_template_loop_close_link_and_div_after_thumbnail() {
		echo '</a>';
		$show_link        = exs_option( 'product_show_thumbnail_link', '' );
		$show_add_to_cart = exs_option( 'product_show_thumbnail_add_to_cart', '' );
		$show_whishlist   = defined( 'YITH_WCWL' );
		$show_quick_view  = class_exists( 'YITH_WCQV_Frontend' );
		//add to cart button options
		$hide_btn  = exs_option( 'product_simple_add_to_cart_hide_button', '' ) ? 'hide-btn' : '';
		$hide_icon = exs_option( 'product_simple_add_to_cart_hide_icon', '' ) ? 'hide-icon' : '';
		$btn_block = exs_option( 'product_simple_add_to_cart_block_button', '' ) ? 'block-btn' : '';
		$center    = exs_option( 'product_center_content', '' ) ? 'text-center' : '';
		//additional product info options
		$show_cat  = exs_option( 'product_show_category', '' ) ? 'show-cat' : '';
		$show_sku  = exs_option( 'product_show_sku', '' ) ? 'show-sku' : '';
		$show_desc = exs_option( 'product_show_short_description', '' ) ? 'show-desc' : '';

		$shop_animation = exs_option( 'shop_animation', '');
		if ( ! empty( $shop_animation ) ) {
			echo '<div class="product-animation-button ' . esc_attr( $btn_block . ' ' . $hide_icon ) . '">';
			woocommerce_template_loop_add_to_cart();
			echo '</div>';
		}

		if ( $show_link || $show_add_to_cart || $show_whishlist ) :
			echo '<div class="product-buttons-wrap ' . esc_attr( $center ) . '">';
			if ( $show_link ) {
				echo '<a class="button view_product" href="' . esc_url( get_the_permalink() ) . '" aria-label="' . esc_attr( get_the_title() ) . '"></a>';
			}
			//YITH WooCommerce Quick View
			if ( $show_quick_view ) {
				echo do_shortcode( '[yith_quick_view]' );
			}
			//YITH WooCommerce Wishlist
			if ( $show_whishlist ) {
				echo do_shortcode( '[yith_wcwl_add_to_wishlist]' );
			}
			if ( $show_add_to_cart ) {
				woocommerce_template_loop_add_to_cart();
			}
			echo '</div><!-- .product-buttons-wrap -->';
		endif; //buttons
		echo '</div><!-- .product-thumbnail-wrap -->';
		echo '<div class="product-text-wrap ' . esc_attr( $hide_btn . ' ' . $btn_block . ' ' . $hide_icon . ' ' . $show_cat . ' ' . $show_sku . ' ' . $show_desc . ' ' . $center ) . '">';
	}
endif; //exs_woocommerce_template_loop_close_link_and_div_after_thumbnail

//putting link to product in the product title heading
remove_action( 'woocommerce_shop_loop_item_title', 'woocommerce_template_loop_product_title', 10 );
add_action( 'woocommerce_shop_loop_item_title', 'exs_action_woocommerce_template_loop_product_title', 10 );
if ( ! function_exists( 'exs_action_woocommerce_template_loop_product_title' ) ) :
	function exs_action_woocommerce_template_loop_product_title() {
		echo '<h2 class="woocommerce-loop-product__title">';
		woocommerce_template_loop_product_link_open();
		the_title();
		woocommerce_template_loop_product_link_close();
		echo '</h2>';
	}
endif;

//closing category link after image
add_action( 'woocommerce_shop_loop_subcategory_title', 'woocommerce_template_loop_category_link_close', 9 );
remove_action( 'woocommerce_shop_loop_subcategory_title', 'woocommerce_template_loop_category_title', 10 );
//putting link to category in the product category title heading
add_action( 'woocommerce_shop_loop_subcategory_title', 'exs_action_woocommerce_template_loop_category_title', 10 );
if ( ! function_exists( 'exs_action_woocommerce_template_loop_category_title' ) ) :
	function exs_action_woocommerce_template_loop_category_title( $category ) {
		echo '</div><!-- .product-thumbnail-wrap -->';
		echo '<div class="product-text-wrap">';
		echo '<h2 class="woocommerce-loop-category__title">';
		woocommerce_template_loop_category_link_open( $category );
		echo esc_html( $category->name );
		if ( $category->count > 0 ) {
			echo wp_kses(
				apply_filters(
					'exs_woocommerce_subcategory_count_html',
					' <mark class="count">(' . esc_html( $category->count ) . ')</mark>',
					$category
				),
				array(
					'mark' => array(
						'class' => array(),
					),
				)
			);
		}
		woocommerce_template_loop_category_link_close();
		echo '</h2>';
	}
endif;

//add categories to loop
add_action( 'woocommerce_shop_loop_item_title', 'exs_action_woocommerce_shop_loop_item_title_open_wrap', 5 );
if ( ! function_exists( 'exs_action_woocommerce_shop_loop_item_title_open_wrap' ) ) :
	function exs_action_woocommerce_shop_loop_item_title_open_wrap() {
		echo '<div class="product-title-cat-wrap">';
	}
endif;
add_action( 'woocommerce_shop_loop_item_title', 'exs_action_woocommerce_shop_loop_item_title', 20 );
if ( ! function_exists( 'exs_action_woocommerce_shop_loop_item_title' ) ) :
	function exs_action_woocommerce_shop_loop_item_title() {
		global $product;
		?>
		<?php
			if ( wc_product_sku_enabled() && ( $product->get_sku() || $product->is_type( 'variable' ) ) && exs_option( 'product_show_sku') ) :
				$sku = $product->get_sku() ? $product->get_sku() : esc_html__( 'N/A', 'exs' );
			?>
			<span class="sku_wrapper"><?php esc_html_e( 'SKU:', 'exs' ); ?> <span class="sku"><?php echo esc_html( $sku ); ?></span></span>
		<?php
		endif;

		echo wp_kses_post( wc_get_product_category_list( $product->get_id(), ', ', '<span class="posted_in">', '</span>' ) );
		echo '</div><!-- .product-title-cat-wrap -->';
	}
endif;

//remove closing A tag from the end of product and category loop item - we have our own earlier
remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_product_link_close', 5 );
remove_action( 'woocommerce_after_subcategory', 'woocommerce_template_loop_category_link_close', 10 );

//add rating wrap and reviews count inside it
add_action( 'woocommerce_after_shop_loop_item_title', 'exs_action_woocommerce_after_shop_loop_item_title_rating_wrap_and_reviews_count', 4 );
if ( ! function_exists( 'exs_action_woocommerce_after_shop_loop_item_title_rating_wrap_and_reviews_count' ) ) :
	function exs_action_woocommerce_after_shop_loop_item_title_rating_wrap_and_reviews_count() {
		if ( ! wc_review_ratings_enabled() ) {
			return;
		}
		/*
		 * You can use following to display rating instead of option from customizer
		global $product;
		$review_count = $product->get_review_count();
		$css_class    = $review_count ? 'visible' : 'hidden';
		*/
		$css_class = exs_option( 'product_show_reviews', '' ) ? 'visible' : 'hidden';
		echo '<div class="product-rating-wrap ' . esc_attr( $css_class ) . '">';
	}
endif; //exs_action_woocommerce_after_shop_loop_item_title_rating_wrap_and_reviews_count
add_action( 'woocommerce_after_shop_loop_item_title', 'exs_action_woocommerce_after_shop_loop_item_title_rating_wrap_and_reviews_count_close', 6 );
if ( ! function_exists( 'exs_action_woocommerce_after_shop_loop_item_title_rating_wrap_and_reviews_count_close' ) ) :
	function exs_action_woocommerce_after_shop_loop_item_title_rating_wrap_and_reviews_count_close() {
		if ( ! wc_review_ratings_enabled() ) {
			return;
		}

		if ( comments_open() ) :
			global $product;
			$review_count = $product->get_review_count();
			$link         = apply_filters( 'exs_woocommerce_loop_product_link', get_the_permalink(), $product );

			?>
			<a href="<?php echo esc_url( $link ); ?>#reviews" class="product-review-link" rel="nofollow">
				<?php
				printf(
					esc_html(
						/* translators: 1: number of comments */
						_n(
							'%s review',
							'%s reviews',
							esc_html( $review_count ),
							'exs'
						)
					),
					'<span class="count">' . esc_html( $review_count ) . '</span>'
				);
				?>
			</a>
			<?php
		endif; //comments_open
		echo '</div><!-- .product-rating-wrap -->';
	}
endif; //exs_action_woocommerce_after_shop_loop_item_title_rating_wrap_and_reviews_count

//change woo pagination
add_action( 'woocommerce_after_shop_loop', 'exs_action_woocommerce_after_shop_loop', 9 );
if ( ! function_exists( 'exs_action_woocommerce_after_shop_loop' ) ) :
	function exs_action_woocommerce_after_shop_loop() {
		echo '<div class="nav-links">';
	}
endif;
//change woo pagination
add_action( 'woocommerce_after_shop_loop', 'exs_action_woocommerce_after_shop_loop_end', 1 );
if ( ! function_exists( 'exs_action_woocommerce_after_shop_loop_end' ) ) :
	function exs_action_woocommerce_after_shop_loop_end() {
		echo '</div><!--.nav-links -->';
	}
endif;
//change woo pagination
add_filter( 'woocommerce_pagination_args', 'exs_filter_woocommerce_pagination_args' );
if ( ! function_exists( 'exs_filter_woocommerce_pagination_args' ) ) :
	function exs_filter_woocommerce_pagination_args( $args ) {
		$args['type'] = 'plain';
		$args         = wp_parse_args( exs_get_the_posts_pagination_atts(), $args );
		return $args;
	}
endif;

//change add to cart text for simple product
add_filter( 'woocommerce_product_add_to_cart_text', 'exs_filter_woocommerce_product_add_to_cart_text', 10, 2 );
if ( ! function_exists( 'exs_filter_woocommerce_product_add_to_cart_text' ) ) :
	function exs_filter_woocommerce_product_add_to_cart_text( $text, $class ) {
		if ( 'simple' !== $class->get_type() ) {
			return $text;
		}
		$custom_text = exs_option( 'product_simple_add_to_cart_text', '' );
		if ( empty( $custom_text ) ) {
			return $text;
		}
		if ( ! $class->is_purchasable() && ! $class->is_in_stock() ) {
			return $text;
		}
		$text = esc_html( $custom_text );
		return $text;
	}
endif;


//add autocomplete none for search form
add_filter( 'get_product_search_form', 'exs_filter_woocommerce_get_product_search_form' );
if ( ! function_exists( 'exs_filter_woocommerce_get_product_search_form' ) ) :
	function exs_filter_woocommerce_get_product_search_form( $form_html ) {
		$form_html = str_replace( '<form', '<form autocomplete="off"', $form_html );
		$form_html = str_replace( 'class="woocommerce-product-search"', 'class="woocommerce-product-search search-form"', $form_html );
		$form_html = str_replace( 'class="woocommerce-product-search"', 'class="woocommerce-product-search search-form"', $form_html );
		$form_html = str_replace( '<button type="submit"', '<button type="submit" class="search-submit"', $form_html );
		$form_html = str_replace( '</button>', exs_icon( 'magnify', true ) . '</button>', $form_html );
		return $form_html;
	}
endif;

////////////////////
//cart page layout//
////////////////////
add_action( 'woocommerce_before_cart', 'exs_action_woocommerce_before_cart' );
if ( ! function_exists( 'exs_action_woocommerce_before_cart' ) ) :
	function exs_action_woocommerce_before_cart() {
		echo '<div class ="cart-cols">';
	}
endif;

add_action( 'woocommerce_after_cart', 'exs_action_woocommerce_after_cart' );
if ( ! function_exists( 'exs_action_woocommerce_after_cart' ) ) :
	function exs_action_woocommerce_after_cart() {
		echo '</div><!-- .cart-cols.cols-2 -->';
	}
endif;

//////////
//Blocks//
//////////

//add custom markup for woocommerce grid block
add_filter( 'woocommerce_blocks_product_grid_item_html', 'exs_filter_woocommerce_blocks_product_grid_item_html', 10, 2 );
if ( ! function_exists( 'exs_filter_woocommerce_blocks_product_grid_item_html' ) ) :
	function exs_filter_woocommerce_blocks_product_grid_item_html( $html, $data ) {
		$hide_icon = exs_option( 'product_simple_add_to_cart_hide_icon', '' ) ? 'hide-icon' : '';
		$btn_block = exs_option( 'product_simple_add_to_cart_block_button', '' ) ? 'block-btn' : '';
		$center    = exs_option( 'product_center_content', '' ) ? 'text-center' : '';

		$show_link        = exs_option( 'product_show_thumbnail_link', '' );
		$show_add_to_cart = exs_option( 'product_show_thumbnail_add_to_cart', '' );

		$btns_link_html = '';
		if ( $show_link || $show_add_to_cart ) :
			$btns_link_html .= '<div class="product-buttons-wrap ' . esc_attr( $center ) . '">';
			if ( $show_link ) {
				$btns_link_html .= '<a class="button view_product" href="' . esc_url( $data->permalink ) . '"></a>';
			}
			if ( $show_add_to_cart ) {
				$btns_link_html .= $data->button;
			}
			$btns_link_html .= '</div><!-- .product-buttons-wrap -->';
		endif; //buttons


		$shop_animation     = exs_option( 'shop_animation', '');
		$animation_btn_html = '';
		if ( ! empty( $shop_animation ) ) {
			$animation_btn_html .= '<div class="product-animation-button ' . esc_attr( $btn_block . ' ' . $hide_icon ) . '">';
			$animation_btn_html .= $data->button;
			$animation_btn_html .= '</div>';
		}

		return '<li class="product wc-block-grid__product">' .
				'<div class="product-loop-item">' .
					'<div class="product-thumbnail-wrap">' .
						'<a href="' . esc_url( $data->permalink ) . '" class="wc-block-grid__product-link woocommerce-LoopProduct-link woocommerce-loop-product__link">' .
							wp_kses(
								$data->badge,
								array(
									'span' => array(
										'class'       => true,
										'aria-hidden' => true,
									),
									'div' => array(
										'class'       => true,
									),
								)
							) .
							wp_kses(
								$data->image,
								array(
									'div' => array(
										'class' => true
									),
									'img' => array(
										'class'  => true,
										'srcset' => true,
										'width'  => true,
										'height' => true,
										'sizes'  => true,
										'alt'    => true,
									)
								)
							) .
						'</a>' .
						wp_kses(
							$animation_btn_html,
							array(
								'div'  => array(
									'class' => true,
								),
								'a'    => array(
									'href'             => true,
									'class'            => true,
									'title'            => true,
									'aria-label'       => true,
									'data-quantity'    => true,
									'data-product_id'  => true,
									'data-product_sku' => true,
									'rel'              => true,
								),
								'span' => array(
									'class' => true,
									)
								)
							) .
						wp_kses(
							$btns_link_html,
							array(
								'div'  => array(
									'class' => true,
								),
								'a'    => array(
									'href'             => true,
									'class'            => true,
									'title'            => true,
									'aria-label'       => true,
									'data-quantity'    => true,
									'data-product_id'  => true,
									'data-product_sku' => true,
									'rel'              => true,
								),
								'span' => array(
									'class' => true,
									)
								)
							) .
					'</div>' .
					'<div class="product-text-wrap ' . esc_attr( $hide_icon . ' ' . $btn_block . ' ' . $center ) . '">' .
						'<h2 class="woocommerce-loop-product__title">' .
							'<a href="' . esc_url( $data->permalink ) . '" class="wc-block-grid__product-link">' .
								wp_kses( $data->title, array() ) .
							'</a>' .
						'</h2>'.
						wp_kses(
							$data->price,
							array(
								'div'  => array(
									'class' => true,
								),
								'span' => array(
									'class' => true
								),
								'del'  => true,
								'ins'  => true,
							)
						) .
						wp_kses(
							$data->rating,
							array(
								'div'    => array(
									'class'      => true,
									'role'       => true,
									'aria-label' => true,
								),
								'span'   => array(
									'width' => true,
									'style' => true,
									'class' => true,
								),
								'strong' => array(
									'class' => true,
								)
							)
						) .
						// data-product_id and data-product_sku are stripped out:
						// https://core.trac.wordpress.org/ticket/33121
						wp_kses(
							$data->button,
							array(
								'div'  => array(
									'class' => true,
								),
								'a'    => array(
									'href'             => true,
									'class'            => true,
									'title'            => true,
									'aria-label'       => true,
									'data-quantity'    => true,
									'data-product_id'  => true,
									'data-product_sku' => true,
									'rel'              => true,
								),
								'span' => array(
									'class' => true,
								)
							)
						) .
					'</div>' .
				'</div>' .
			'</li>';
	}
endif;

/*
add .products to block UL
uncomment, if needed
*/
//add_filter( 'the_content', 'exs_filter_woocommerce_the_content' );
add_filter( 'render_block', 'exs_filter_woocommerce_the_content' );
if ( ! function_exists( 'exs_filter_woocommerce_the_content' ) ) :
	function exs_filter_woocommerce_the_content( $html ) {
		return str_replace( 'ul class="wc-block-grid__products"', 'ul class="products wc-block-grid__products"', $html );
	}
endif;

//add class to checkout button
remove_action( 'woocommerce_widget_shopping_cart_buttons', 'woocommerce_widget_shopping_cart_proceed_to_checkout', 20 );
add_action( 'woocommerce_widget_shopping_cart_buttons', 'exs_action_woocommerce_widget_shopping_cart_proceed_to_checkout', 20 );
if ( ! function_exists( 'exs_action_woocommerce_widget_shopping_cart_proceed_to_checkout' ) ) :
	function exs_action_woocommerce_widget_shopping_cart_proceed_to_checkout() {
		echo '<a href="' . esc_url( wc_get_checkout_url() ) . '" class="button alt checkout wc-forward">' . esc_html__( 'Checkout', 'exs' ) . '</a>';
	}
endif;

//add spans to filter widget braces
add_filter( 'woocommerce_layered_nav_count', 'exs_filter_woocommerce_layered_nav_count', 10, 2 );
if ( ! function_exists( 'exs_filter_woocommerce_layered_nav_count' ) ) :
	function exs_filter_woocommerce_layered_nav_count( $html, $count ) {
		return '<span class="count"><span class="count-open">(</span>' . absint( $count ) . '<span class="count-close">)</span></span>';
	}
endif;

//add sidebar position option for product and shop
add_filter( 'exs_customizer_options', 'exs_filter_exs_customizer_options' );
if ( ! function_exists( 'exs_filter_exs_customizer_options' ) ) :
	function exs_filter_exs_customizer_options( $options ) {
		//sections
		$options['section_exs_woocommerce_layout']   = array(
			'type'        => 'section',
			'panel'       => 'woocommerce',
			'label'       => esc_html__( 'ExS Shop Layout', 'exs' ),
			'description' => esc_html__( 'These options let you manage sidebar positions on the shop and product pages and other layout options.', 'exs' ),
		);
		$options['section_exs_woocommerce_product_layout']   = array(
			'type'        => 'section',
			'panel'       => 'woocommerce',
			'label'       => esc_html__( 'ExS Singe Product Layout', 'exs' ),
			'description' => esc_html__( 'These options let you manage your single product page layout.', 'exs' ),
		);
		$options['section_exs_woocommerce_products'] = array(
			'type'        => 'section',
			'panel'       => 'woocommerce',
			'label'       => esc_html__( 'ExS Products List', 'exs' ),
			'description' => esc_html__( 'These options lets you manage your shop page layout.', 'exs' ),
		);

		$options['shop_products_list_extra'] = array(
			'type'        => 'extra-button',
			'section'     => 'section_exs_woocommerce_products',
			'label'       => esc_html__( 'Products display options', 'exs' ),
			'description' => esc_html__( 'Change your products list layout easily in your Customizer', 'exs' ),
		);

		//options
		$options['header_cart_dropdown'] = array(
			'type'        => 'checkbox',
			'section'     => 'section_exs_woocommerce_layout',
			'default'     => exs_option( 'header_cart_dropdown', '' ),
			'label'       => esc_html__( 'Show Cart Dropdown in Header', 'exs' ),
			'description' => esc_html__( 'Show cart icon in header with product count in shopping cart if added.', 'exs' ),
		);

		$options['shop_page_name'] = array(
			'type'        => 'text',
			'section'     => 'section_exs_woocommerce_layout',
			'default'     => exs_option( 'shop_page_name', esc_html__( 'Shop', 'exs' ) ),
			'label'       => esc_html__( 'Shop page custom title', 'exs' ),
		);

		//shop
		$options['shop_sidebar_position'] = array(
			'type'        => 'radio',
			'section'     => 'section_exs_woocommerce_layout',
			'default'     => exs_option( 'shop_sidebar_position', 'right' ),
			'label'       => esc_html__( 'Shop sidebar position', 'exs' ),
			'description' => esc_html__( 'This option let you manage sidebar position on the shop page. Shop sidebar needs to be not empty to display.', 'exs' ),
			'choices'     => exs_get_sidebar_position_options(),
		);
		$options['shop_container_width']   = array(
			'type'    => 'radio',
			'section' => 'section_exs_woocommerce_layout',
			'label'   => esc_html__( 'Shop container max width', 'exs' ),
			'default' => esc_html( exs_option( 'shop_container_width', '' ) ),
			'choices' => array(
				''     => esc_html__( 'Inherit from Global', 'exs' ),
				'1400' => esc_html__( '1400px', 'exs' ),
				'1140' => esc_html__( '1140px', 'exs' ),
				'960'  => esc_html__( '960px', 'exs' ),
				'720'  => esc_html__( '720px', 'exs' ),
			),
		);
		$options['shop_animation']   = array(
			'type'    => 'select',
			'section' => 'section_exs_woocommerce_layout',
			'label'   => esc_html__( 'Products animation type', 'exs' ),
			'default' => esc_html( exs_option( 'shop_animation', '' ) ),
			'description' => esc_html__( 'Select buttons animation type for products list.', 'exs' ),
			'choices' => array(
				''     => esc_html__( 'Default', 'exs' ),
				'1' => esc_html__( 'Type 1', 'exs' ),
				'2' => esc_html__( 'Type 2', 'exs' ),
				'3' => esc_html__( 'Type 3', 'exs' ),
			),
		);
		$options['cart_icon'] = array(
			'type'        => 'select',
			'section'     => 'section_exs_woocommerce_layout',
			'default'     => exs_option( 'cart_icon', '1' ),
			'label'       => esc_html__( 'Cart icon type', 'exs' ),
			'description' => esc_html__( 'Select cart icon type to optionally show in the header and on "Add to Cart" button for simple products.', 'exs' ),
			'choices'     => array(
				'1'                         => esc_html__( 'Default Icon', 'exs' ),
				'cart-google'               => esc_html__( 'Google Icon', 'exs' ),
				'cart-google-outline'       => esc_html__( 'Google Outline Icon', 'exs' ),
				'cart-ionic'                => esc_html__( 'Ionic Icon', 'exs' ),
				'cart-ionic-outline'        => esc_html__( 'Ionic Outline Icon', 'exs' ),
				'cart-lineicons'            => esc_html__( 'Lineicons Icon', 'exs' ),
				'cart-google-basket'        => esc_html__( 'Google Basket Icon', 'exs' ),
				'cart-ionic-bag'            => esc_html__( 'Ionic Bag Icon', 'exs' ),
				'cart-ionic-bag-outline'    => esc_html__( 'Ionic Bag Outline Icon', 'exs' ),
				'cart-ionic-basket'         => esc_html__( 'Ionic Basket Icon', 'exs' ),
				'cart-ionic-basket-outline' => esc_html__( 'Ionic Basket Outline Icon', 'exs' ),
			),
		);

		$options['shop_flex'] = array(
			'type'        => 'checkbox',
			'section'     => 'section_exs_woocommerce_layout',
			'default'     => exs_option( 'shop_flex', '' ),
			'label'       => esc_html__( 'Make shop products equal height', 'exs' ),
			'description' => esc_html__( 'This option will make shop products in list equal.', 'exs' ),
		);

		//single product
		$options['product_sidebar_position'] = array(
			'type'        => 'radio',
			'section'     => 'section_exs_woocommerce_product_layout',
			'default'     => exs_option( 'product_sidebar_position', 'right' ),
			'label'       => esc_html__( 'Product sidebar position', 'exs' ),
			'description' => esc_html__( 'This option let you manage sidebar position on product pages. Shop sidebar needs to be not empty to display.', 'exs' ),
			'choices'     => exs_get_sidebar_position_options(),
		);
		$options['product_container_width']   = array(
			'type'    => 'radio',
			'section' => 'section_exs_woocommerce_product_layout',
			'label'   => esc_html__( 'Product container max width', 'exs' ),
			'default' => esc_html( exs_option( 'product_container_width', '' ) ),
			'choices' => array(
				''     => esc_html__( 'Inherit from Global', 'exs' ),
				'1400' => esc_html__( '1400px', 'exs' ),
				'1140' => esc_html__( '1140px', 'exs' ),
				'960'  => esc_html__( '960px', 'exs' ),
				'720'  => esc_html__( '720px', 'exs' ),
			),
		);

		$options['product_related_products_heading'] = array(
			'type'        => 'block-heading',
			'section'     => 'section_exs_woocommerce_product_layout',
			'label'       => esc_html__( 'Related products options', 'exs' ),
		);

		$options['product_related_products_title'] = array(
			'type'        => 'text',
			'section'     => 'section_exs_woocommerce_product_layout',
			'default'     => exs_option( 'product_related_products_title', '' ),
			'label'       => esc_html__( 'Custom Related Products title', 'exs' ),
			'description' => esc_html__( '"Related Products" is default value.', 'exs' ),
		);

		$options['product_related_products_count'] = array(
			'type'        => 'number',
			'section'     => 'section_exs_woocommerce_product_layout',
			'default'     => exs_option( 'product_related_products_count', '' ),
			'label'       => esc_html__( 'Custom Related Products number', 'exs' ),
			'description' => esc_html__( '"4" is default value.', 'exs' ),
		);

		$options['product_related_products_cols'] = array(
			'type'        => 'number',
			'section'     => 'section_exs_woocommerce_product_layout',
			'default'     => exs_option( 'product_related_products_cols', '' ),
			'label'       => esc_html__( 'Custom Related Products Columns number', 'exs' ),
			'description' => esc_html__( '"4" is default value.', 'exs' ),
		);

		$options['product_related_separate'] = array(
			'type'        => 'checkbox',
			'section'     => 'section_exs_woocommerce_product_layout',
			'default'     => exs_option( 'product_related_separate', '' ),
			'label'       => esc_html__( 'Show related products below main content', 'exs' ),
			'description' => esc_html__( 'You can move related products on the single product page below the main content.', 'exs' ),
		);

		$options['product_related_separate_background'] = array(
			'type'        => 'color-radio',
			'section'     => 'section_exs_woocommerce_product_layout',
			'default'     => exs_option( 'product_related_separate_background', '' ),
			'label'       => esc_html__( 'Related products section background', 'exs' ),
			'choices'     => exs_customizer_backgrounds_array(),
			'visible' => array(
					'key' => 'product_related_separate',
					'value' => true,
			),
		);
		$options['product_related_separate_container_width'] = array(
			'type'        => 'radio',
			'section'     => 'section_exs_woocommerce_product_layout',
			'default'     => exs_option( 'product_related_separate_container_width', '' ),
			'label'       => esc_html__( 'Related products section container width', 'exs' ),
			'choices' => array(
				''     => esc_html__( 'Inherit from Global', 'exs' ),
				'1400' => esc_html__( '1400px', 'exs' ),
				'1140' => esc_html__( '1140px', 'exs' ),
				'960'  => esc_html__( '960px', 'exs' ),
				'720'  => esc_html__( '720px', 'exs' ),
			),
			'visible' => array(
				'key' => 'product_related_separate',
				'value' => true,
			),
		);

		return $options;
	}
endif;

//not work - because of esc_html on text
add_filter( 'woocommerce_product_add_to_cart_text1', function ( $text ) {
	$icon = exs_option( 'header_cart_dropdown', '' );
	if ( '' === $icon || 1 === $icon || '1' === $icon ) {
		return $text;
	} else {
		return exs_icon( $icon, true ) . $text;
	}

} );

//add svg cart icon to simple product to a loop add to cart button
add_filter( 'woocommerce_loop_add_to_cart_link', function ( $html, $product, $args ) {
	$icon = exs_option( 'cart_icon', '' );
	if ( empty( $icon ) || 'simple' !== $product->get_type() || exs_option( 'product_simple_add_to_cart_hide_icon' ) || 1 === $icon || '1' === $icon ) {
		return $html;
	} else {
		$html = str_replace( 'product_type_simple', 'product_type_simple with_svg_icon', $html );
		return str_replace( '">', '">' . exs_icon( $icon, true ) , $html );
	}
}, 10, 3 );

ZeroDay Forums Mini