https://t.me/AnonymousX5
Server : Apache
System : Linux ls31.server.ly 3.10.0-962.3.2.lve1.5.68.el7.x86_64 #1 SMP Wed Apr 6 11:12:23 UTC 2022 x86_64
User : medchoco ( 2906)
PHP Version : 8.3.16
Disable Function : mail
Directory :  /home/medchoco/public_html/wp-content/themes/puca/inc/vendors/woocommerce/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/medchoco/public_html/wp-content/themes/puca/inc/vendors/woocommerce/functions.php
<?php

require get_template_directory() . '/inc/vendors/woocommerce/skins/'.puca_tbay_get_theme().'/functions.php';

remove_action( 'woocommerce_before_main_content', 'woocommerce_breadcrumb', 20 );

// class cart Postion
if ( ! function_exists( 'puca_tbay_body_classes_config_woocommerce' ) ) {
    function puca_tbay_body_classes_config_woocommerce( $classes ) {

        $classes[] =  ( is_cart() && puca_tbay_get_config('ajax_update_quantity', false) ) ? 'tbay-ajax-update-quantity' : ''; 

        $classes[] = ( class_exists( 'WooCommerce_Germanized' ) ) ? 'body-germanized' : '';

        return $classes;
    }
    add_filter( 'body_class', 'puca_tbay_body_classes_config_woocommerce' );
}

// cart Postion
if ( !function_exists('puca_tbay_woocommerce_cart_position') ) {
    function puca_tbay_woocommerce_cart_position() {
       
        global $post;

        $tbay_header = apply_filters( 'puca_tbay_get_header_layout', puca_tbay_get_config('header_type', 'v1') );
        $active_theme = puca_tbay_get_theme(); 

        $position = '';
        if( is_shop() ) {
          $post_id = wc_get_page_id('shop');
        } else if(isset($post->ID)) {
          $post_id = $post->ID;
        }

        if( isset($post_id) ) {
            $position = get_post_meta( $post_id, 'tbay_page_mini_cart_position', true );
            if ( $position == 'global' ) {
                $position = puca_tbay_get_config('woo_mini_cart_position');
            }

        } else {
            $position = puca_tbay_get_config('woo_mini_cart_position');
        } 

        if( isset($position) && empty($position) ) {
            $position = puca_tbay_get_config('woo_mini_cart_position');
        }

        $position = ( isset($_GET['ajax_cart']) ) ? $_GET['ajax_cart'] : $position;


        if( $active_theme == 'fashion' ) {
            if( isset($tbay_header) && $tbay_header == 'v14' ) {
               $position = 'left';
            }
        } 

        if( wp_is_mobile() ) {
            $position = 'right';
        }


        return $position;

    }
    add_filter( 'puca_cart_position', 'puca_tbay_woocommerce_cart_position' ); 
}


if ( !function_exists('puca_tbay_get_woocommerce_mini_cart') ) {
    function puca_tbay_get_woocommerce_mini_cart($name = null) {
        $active_theme = puca_tbay_get_part_theme(); 
        $position = apply_filters( 'puca_cart_position', 10,2 ); 
        if(is_null($name)) {
            get_template_part( 'woocommerce/cart/'.$active_theme.'/mini-cart-button', $position);
        } else {
            get_template_part( 'woocommerce/cart/'.$active_theme.'/'.$name.'/mini-cart-button', $position);
        }
    }
}
  
// class cart Postion
if ( ! function_exists( 'puca_tbay_body_classes_cart_postion' ) ) {
    function puca_tbay_body_classes_cart_postion( $classes ) {

        $position = apply_filters( 'puca_cart_position', 10,2 );

        $class = ( isset($_GET['ajax_cart']) ) ? 'ajax_cart_'.$_GET['ajax_cart'] : 'ajax_cart_'.$position;

        $classes[] = trim($class);

        return $classes;
    }
    add_filter( 'body_class', 'puca_tbay_body_classes_cart_postion' );
}


// add to cart modal box
if ( !function_exists('puca_tbay_woocommerce_add_to_cart_modal') ) {
    add_action( 'wp_footer', 'puca_tbay_woocommerce_add_to_cart_modal' );
    function puca_tbay_woocommerce_add_to_cart_modal(){
    ?>
    <div class="modal fade" id="tbay-cart-modal" tabindex="-1" role="dialog" aria-hidden="true">
        <div class="modal-dialog modal-lg">
            <div class="modal-content">
                <div class="modal-body">
                    <button type="button" class="close btn btn-close" data-dismiss="modal" aria-hidden="true">
                        <i class="fa fa-times"></i>
                    </button>
                    <div class="modal-body-content"></div>
                </div>
            </div>
        </div>
    </div>
    <?php     
    }
}


// cart modal
if ( !function_exists('puca_tbay_woocommerce_cart_modal') ) {
    add_action( 'wp_ajax_puca_add_to_cart_product', 'puca_tbay_woocommerce_cart_modal' );
    add_action( 'wp_ajax_nopriv_puca_add_to_cart_product', 'puca_tbay_woocommerce_cart_modal' );
    function puca_tbay_woocommerce_cart_modal() {
        wc_get_template( 'content-product-cart-modal.php' , array( 'product_id' => (int)$_GET['product_id'] ) );
        die;
    }
}


/*get category by id array*/
if ( !function_exists('puca_tbay_get_category_by_id') ) {
    function puca_tbay_get_category_by_id($categories_id = array()) {
        $categories = array(); 

        if( !is_array($categories_id)) return $categories;

        foreach ($categories_id as $key => $value) {
           $categories[$key] = get_term_by( 'id', $value, 'product_cat' )->slug;
        }

        return $categories;

    }
}

if ( !function_exists('puca_tbay_get_products') ) {
    function puca_tbay_get_products($categories = array(), $product_type = 'featured_product', $paged = 1, $post_per_page = -1, $orderby = '', $order = '', $offset  = 0) {
        global $woocommerce, $wp_query;
        $args = array(
            'post_type'           => 'product',
            'posts_per_page'      => $post_per_page,
            'post_status'         => 'publish',
            'paged'               => $paged,
            'orderby'             => $orderby,
            'order'               => $order,
            'offset'              => $offset,
            'meta_query'          => WC()->query->get_meta_query(),
            'tax_query'           => WC()->query->get_tax_query(),
        );

        if ( isset( $args['orderby'] ) ) {
            if ( 'price' == $args['orderby'] ) {
                $args = array_merge( $args, array(
                    'meta_key'  => '_price',
                    'orderby'   => 'meta_value_num'
                ) );
            }
            if ( 'featured' == $args['orderby'] ) {
                $args = array_merge( $args, array(
                    'meta_key'  => '_featured',
                    'orderby'   => 'meta_value'
                ) );
            }
            if ( 'sku' == $args['orderby'] ) {
                $args = array_merge( $args, array(
                    'meta_key'  => '_sku',
                    'orderby'   => 'meta_value'
                ) );
            }
        }

        if ( !empty($categories) && is_array($categories) ) {
            $args['tax_query']    = array(
                array(
                    'taxonomy'      => 'product_cat',
                    'field'         => 'slug',
                    'terms'         => $categories,
                    'operator'      => 'IN'
                )
            );
        }

        switch ($product_type) {
            case 'best_selling':
                $args['meta_key']='total_sales';
                $args['orderby']='meta_value_num';
                $args['ignore_sticky_posts']   = 1;
                $args['meta_query'] = array();
                $args['meta_query'][] = $woocommerce->query->stock_status_meta_query();
                $args['meta_query'][] = $woocommerce->query->visibility_meta_query();
                break;
            case 'featured_product':
                $args['ignore_sticky_posts']    = 1;
                $args['meta_query']             = array();
                $args['meta_query'][]           = $woocommerce->query->stock_status_meta_query();
                $args['meta_query'][]           = $woocommerce->query->visibility_meta_query();
                $args['tax_query'][]              = array(
                    array(
                        'taxonomy' => 'product_visibility',
                        'field'    => 'name',
                        'terms'    => 'featured',
                        'operator' => 'IN'
                    )
                );
                
                break;
            case 'top_rate':
                $args['meta_key']       ='_wc_average_rating';
                $args['orderby']        ='meta_value_num';
                $args['order']          ='DESC';
                $args['meta_query']     = array();
                $args['meta_query'][]   = WC()->query->get_meta_query();
                $args['tax_query'][]    = WC()->query->get_tax_query();
                break;

            case 'recent_product':
                $args['meta_query'] = array();
                $args['meta_query'][] = $woocommerce->query->stock_status_meta_query();
                break;
            case 'random_product':
                $args['orderby']    = 'rand';
                $args['meta_query'] = array();
                $args['meta_query'][] = $woocommerce->query->stock_status_meta_query();
                break;
            case 'deals':
                $product_ids_on_sale    = wc_get_product_ids_on_sale();
                $product_ids_on_sale[]  = 0;
                $args['post__in'] = $product_ids_on_sale;
                $args['meta_query'] = array();
                $args['meta_query'][] = $woocommerce->query->stock_status_meta_query();
                $args['meta_query'][] = $woocommerce->query->visibility_meta_query();
                $args['meta_query'][] =  array(
                    'relation' => 'AND',
                    array(
                        'relation' => 'OR',
                        array(
                            'key'           => '_sale_price',
                            'value'         => 0,
                            'compare'       => '>',
                            'type'          => 'numeric'
                        ),
                        array(
                            'key'           => '_min_variation_sale_price',
                            'value'         => 0,
                            'compare'       => '>',
                            'type'          => 'numeric'
                        ),
                    ),            
                    array(
                        'key'           => '_sale_price_dates_to',
                        'value'         => time(),
                        'compare'       => '>',
                        'type'          => 'numeric'
                    ),
                );
                break;     
            case 'on_sale':
                $product_ids_on_sale    = wc_get_product_ids_on_sale();
                $product_ids_on_sale[]  = 0;
                $args['post__in'] = $product_ids_on_sale;
                break;
        }

        if( 'yes' === get_option( 'woocommerce_hide_out_of_stock_items' ) ) {
            $args['meta_query'][] =  array(
                'relation' => 'AND',
                array(
                    'key' => '_stock_status',
                    'value' => 'instock',
                    'compare' => '=',
                )
            );
        }

        $args['tax_query'][] = array(
            'relation' => 'AND',
            array(
               'taxonomy' =>   'product_visibility',
                'field'    =>   'slug',
                'terms'    =>   array('exclude-from-search', 'exclude-from-catalog'),
                'operator' =>   'NOT IN',
            )
        );

        wc_reset_loop();
        
        return new WP_Query($args);
    }
}

// hooks
if ( !function_exists('puca_tbay_woocommerce_enqueue_styles') ) {
    function puca_tbay_woocommerce_enqueue_styles() { 
        
        $skin = puca_tbay_get_theme();
        $suffix = (puca_tbay_get_config('minified_js', false)) ? '.min' : PUCA_MIN_JS;
        // Load our main stylesheet.
          if( is_rtl() ){
          
               if ( $skin != 'default' && $skin ) {
                    $css_path =  PUCA_STYLES_SKINS . '/'.$skin.'/woocommerce.rtl.css';
               } else {
                    $css_path =  PUCA_STYLES . '/woocommerce.rtl.css';
               }
          }
          else{
               if ( $skin != 'default' && $skin ) {
                    $css_path =  PUCA_STYLES_SKINS . '/'.$skin.'/woocommerce.css';
               } else {
                    $css_path =  PUCA_STYLES . '/woocommerce.css';
               }
          }

        /**Fix dashboard woocommerce**/
        if( class_exists('MVX') && is_vendor_dashboard() ) {
        } else {
            wp_enqueue_script( 'puca-woocommerce-script', PUCA_SCRIPTS . '/woocommerce' . $suffix . '.js', array( 'jquery' ), PUCA_THEME_VERSION, true );    
        } 

        wp_register_style( 'puca-woocommerce', $css_path , array() , PUCA_THEME_VERSION, 'all' );

        wp_enqueue_style( 'puca-woocommerce' );

        wp_register_script( 'jquery-onepagenav', PUCA_SCRIPTS . '/jquery.onepagenav' . $suffix . '.js', array( 'jquery' ), '3.0.0', true ); 

    }
}
add_action( 'wp_enqueue_scripts', 'puca_tbay_woocommerce_enqueue_styles', 50 );

if( ! function_exists( 'puca_compare_styles' ) ) {
    add_action( 'wp_print_styles', 'puca_compare_styles', 200 );
    function puca_compare_styles() {
        if( ! class_exists( 'YITH_Woocompare' ) ) return;
        $view_action = 'yith-woocompare-view-table';
        if ( ( ! defined('DOING_AJAX') || ! DOING_AJAX ) && ( ! isset( $_REQUEST['action'] ) || $_REQUEST['action'] != $view_action ) ) return;
        wp_enqueue_style( 'font-awesome' ); 
        wp_enqueue_style( 'simple-line-icons' );
        wp_enqueue_style( 'font-tbay' );  
        wp_enqueue_style( 'puca-woocommerce' );
        wp_enqueue_style( 'puca-template' );
        add_filter( 'body_class', 'puca_tbay_body_classes_compare' );
    }
}


if ( ! function_exists( 'puca_tbay_body_classes_compare' ) ) {
    function puca_tbay_body_classes_compare( $classes ) {
        $class = 'tbay-body-compare';

        $classes[] = trim($class);

        return $classes;
    }

}


// cart
if ( !function_exists('puca_tbay_woocommerce_header_add_to_cart_fragment') ) {
    function puca_tbay_woocommerce_header_add_to_cart_fragment( $fragments ){
        $fragments['#cart .mini-cart-items'] =  sprintf(_n(' <span class="mini-cart-items"> %d  </span> ', ' <span class="mini-cart-items"> %d </span> ', WC()->cart->get_cart_contents_count(), 'puca'), WC()->cart->get_cart_contents_count() );
        $fragments['#cart .mini-cart-total'] = trim( WC()->cart->get_cart_subtotal() );
        return $fragments;
    }
    add_filter('woocommerce_add_to_cart_fragments', 'puca_tbay_woocommerce_header_add_to_cart_fragment', 10, 1 );
}

// breadcrumb for woocommerce page
if ( !function_exists('puca_tbay_woocommerce_breadcrumb_defaults') ) {
    function puca_tbay_woocommerce_breadcrumb_defaults( $args ) {
        $breadcrumb_img = puca_tbay_get_config('woo_breadcrumb_image');
        $breadcrumb_color = puca_tbay_get_config('woo_breadcrumb_color');
        $style = array();
        $img = '';

        $sidebar_configs = puca_tbay_get_woocommerce_layout_configs();


        $breadcrumbs_layout = puca_tbay_get_config('product_breadcrumb_layout', 'color');


        if( isset($_GET['breadcrumbs_layout']) ) {
             $breadcrumbs_layout = $_GET['breadcrumbs_layout'];
        }

        $class_container = '';
        if( isset($sidebar_configs['container_full']) &&  $sidebar_configs['container_full'] ) {
            $class_container = 'container-full';
        }

        switch ($breadcrumbs_layout) {
            case 'image':
                $breadcrumbs_class = ' breadcrumbs-image';
                break;
            case 'color':
                $breadcrumbs_class = ' breadcrumbs-color';
                break;
            case 'text':
                $breadcrumbs_class = ' breadcrumbs-text';
                break;
            default:
                $breadcrumbs_class  = ' breadcrumbs-image';
        }

        if(isset($sidebar_configs['breadscrumb_class'])) {
            $breadcrumbs_class .= ' '.$sidebar_configs['breadscrumb_class'];
        }



        if ( isset($breadcrumb_img['url']) && !empty($breadcrumb_img['url']) && $breadcrumbs_layout !=='color' && $breadcrumbs_layout !=='text' ) {
            $img = '<img src=" '.esc_url($breadcrumb_img['url']).'">';
        }

        if( $breadcrumb_color && $breadcrumbs_layout !== 'image' ){
            $style[] = 'background-color:'.$breadcrumb_color;
        }

        $estyle = ( !empty($style) && $breadcrumbs_layout !=='text' ) ? ' style="'.implode(";", $style).'"':"";
        $skin = puca_tbay_get_theme();
        if ( is_shop() && $skin === 'fashion3' ) {
            $title = '<h1 class="page-title">'. esc_html__('Shop', 'puca') .'</h1>';
        } else {
            $title = '';
        }
        $args['wrap_before'] = '<section id="tbay-breadscrumb" '.$estyle.' class="tbay-breadscrumb '.esc_attr($breadcrumbs_class).'">'.$img.'<div class="container '.$class_container.'"><div class="breadscrumb-inner"><ol class="tbay-woocommerce-breadcrumb breadcrumb">';
        $args['wrap_after'] = '</ol>'.$title.'</div></div></section>';

        return $args;
    }
}

add_action( 'init', 'puca_woo_remove_wc_breadcrumb' );
function puca_woo_remove_wc_breadcrumb() {
    if( !puca_tbay_get_config('show_product_breadcrumb', false) ) {
        remove_action( 'puca_woo_template_main_before', 'woocommerce_breadcrumb', 30, 0 );
    } else {
        add_filter( 'woocommerce_breadcrumb_defaults', 'puca_tbay_woocommerce_breadcrumb_defaults' );
        add_action( 'puca_woo_template_main_before', 'woocommerce_breadcrumb', 30, 0 );     
    }
}

if ( !function_exists('puca_tbay_is_check_woocommerce_show_sidebar') ) {
    function puca_tbay_is_check_woocommerce_show_sidebar(){

        $sidebar_configs = puca_tbay_get_woocommerce_layout_configs();

        $active = false;

        if ( (isset($sidebar_configs['left']['sidebar']) && is_active_sidebar( $sidebar_configs['left']['sidebar'] )) && (isset($sidebar_configs['right']['sidebar']) && is_active_sidebar( $sidebar_configs['right']['sidebar'] )) ) {
            $active = false;
        } elseif( (isset($sidebar_configs['left']['sidebar']) && is_active_sidebar( $sidebar_configs['left']['sidebar'] )) || (isset($sidebar_configs['right']['sidebar']) && is_active_sidebar( $sidebar_configs['right']['sidebar'] )) )  {
            $active = true;
        }        

        if( (isset($sidebar_configs['left_descreption']['sidebar']) && is_active_sidebar( $sidebar_configs['left_descreption']['sidebar'] )) || (isset($sidebar_configs['right_descreption']['sidebar']) && is_active_sidebar( $sidebar_configs['right_descreption']['sidebar'] )) )  {
            $active = true;
        }

        if( is_product() ) $active = false;


        return $active;

    }
}

if ( !function_exists('puca_tbay_close_side_woocommerce_show_sidebar_btn') ) {
    add_action( 'wp_footer', 'puca_tbay_close_side_woocommerce_show_sidebar_btn' );
    function puca_tbay_close_side_woocommerce_show_sidebar_btn(){
       
       $active = puca_tbay_is_check_woocommerce_show_sidebar();

       if ( $active ) :

       ?>
            <div class="puca-close-side"></div>
           <?php 
       endif;
    }
}

if ( !function_exists('puca_tbay_header_mobile_side_woocommerce_sidebar') ) {
    add_action( 'puca_after_sidebar_mobile', 'puca_tbay_header_mobile_side_woocommerce_sidebar' );
    function puca_tbay_header_mobile_side_woocommerce_sidebar(){
       
       $active = puca_tbay_is_check_woocommerce_show_sidebar();

       if ( $active ) :

       ?>
           <div class="widget-mobile-heading"> <a href="javascript:void(0);" class="close-side-widget"><i class="icon-close icons"></i></a></div>
           <?php 
       endif;
    }
}

if ( !function_exists('puca_tbay_woocommerce_show_sidebar_btn') ) {
    add_action( 'woocommerce_before_shop_loop', 'puca_tbay_woocommerce_show_sidebar_btn' , 5 );
    function puca_tbay_woocommerce_show_sidebar_btn(){
       
       $active = puca_tbay_is_check_woocommerce_show_sidebar();
       $skin = puca_tbay_get_theme();
       $icon = ($skin === 'fashion3') ? 'tb-icon tb-icon-zzz-bars'  : 'icon-equalizer icons';

       if ( $active ) :
       ?>
            <div class="puca-sidebar-mobile-btn">
                <i class="<?php echo esc_attr($icon) ?>"></i>  
            </div>
           <?php 
       endif;
    }
}


// display woocommerce modes
if ( !function_exists('puca_tbay_woocommerce_display_modes') ) {
    function puca_tbay_woocommerce_display_modes(){
        if ( ! wc_get_loop_prop( 'is_paginated' ) || ( ! woocommerce_products_will_display() && !puca_woo_is_vendor_page())  ) {
            return;
        }

        global $wp;
        $current_url = add_query_arg( $wp->query_string, '', home_url( $wp->request ) );
        $woo_mode = puca_tbay_woocommerce_get_display_mode();
        $icon_grid = 'icon-grid';
        $icon_list = 'icon-list';
        $skin = puca_tbay_get_theme();
        if ($skin === 'fashion3') {
            $icon_grid = 'tb-icon tb-icon-zz-squares'; 
            $icon_list = 'tb-icon tb-icon-zz-list';
        }
        echo '<form action="javascript:void(0);" class="display-mode" method="get">';
        echo '<button title="'.esc_html__('Grid','puca').'" class="change-view grid '.($woo_mode == 'grid' ? 'active' : '').'" value="grid" name="display" type="submit"><i class="'.$icon_grid.'"></i></button>';
        echo '<button title="'.esc_html__( 'List', 'puca' ).'" class="change-view list '.($woo_mode == 'list' ? 'active' : '').'" value="list" name="display" type="submit"><i class="'.$icon_list.'"></i></button>';  
        echo '</form>'; 
    } 
    add_action( 'woocommerce_before_shop_loop', 'puca_tbay_woocommerce_display_modes' , 10 );
}

if ( !function_exists('puca_tbay_woocommerce_get_display_mode') ) {
    function puca_tbay_woocommerce_get_display_mode() {
        $woo_mode = puca_tbay_get_config('product_display_mode', 'grid'); 

        if ( isset($_COOKIE['display_mode']) && ($_COOKIE['display_mode'] == 'list' || $_COOKIE['display_mode'] == 'grid') ) {
            $woo_mode = $_COOKIE['display_mode'];
        }

        if( isset($_GET['display_mode']) && $_GET['display_mode'] == 'grid' ) {
            $woo_mode = 'grid';
        } else if( isset($_GET['display_mode']) && $_GET['display_mode'] == 'list' ) {
            $woo_mode = 'list';
        }

        return $woo_mode;
    }
}



if(!function_exists('puca_tbay_filter_before')){
    function puca_tbay_filter_before(){
        echo '<div class="tbay-filter">';
    }
}
if(!function_exists('puca_tbay_filter_after')){
    function puca_tbay_filter_after(){
        echo '</div>';
    }
}
add_action( 'woocommerce_before_shop_loop', 'puca_tbay_filter_before' , 1 );
add_action( 'woocommerce_before_shop_loop', 'puca_tbay_filter_after' , 40 );
add_action( 'dokan_store_profile_frame_after', 'puca_tbay_filter_before' , 1 );
add_action( 'dokan_store_profile_frame_after', 'puca_tbay_filter_after' , 40 );


/*Fix Layout Shop Descreption Width Left Rihgt*/
if(!function_exists('puca_tbay_subcategories_wraper_open')){
    function puca_tbay_subcategories_wraper_open(){

        $sidebar_configs = puca_tbay_get_woocommerce_layout_configs();

        if ( isset($sidebar_configs['left_descreption']) && !isset($sidebar_configs['right_descreption']) ) {
            $sidebar_configs['main_descreption']['class'] .= ' pull-right';
        }

        if( isset($sidebar_configs['descreption']) &&  $sidebar_configs['descreption'] ) {

            echo '<div class="row">';

            echo '<div class="'.esc_attr($sidebar_configs['main_descreption']['class']).'">';
        }

    } 
}
add_action( 'woocommerce_before_shop_loop', 'puca_tbay_subcategories_wraper_open' , 41 );

if(!function_exists('puca_tbay_subcategories_wraper_closed')){
    function puca_tbay_subcategories_wraper_closed(){
        $sidebar_configs = puca_tbay_get_woocommerce_layout_configs();

        if( isset($sidebar_configs['descreption']) &&  $sidebar_configs['descreption'] ) {
            echo '</div>';
            
            ?>
                <?php if ( isset($sidebar_configs['left_descreption']) ) : ?>
                    <div class="<?php echo esc_attr($sidebar_configs['left_descreption']['class']) ;?>">
                        <?php do_action( 'puca_after_sidebar_mobile' ); ?>
                        <aside class="sidebar sidebar-left" itemscope="itemscope" itemtype="http://schema.org/WPSideBar">
                            <?php dynamic_sidebar( $sidebar_configs['left_descreption']['sidebar'] ); ?>
                        </aside>
                    </div>
                <?php endif; ?>

                <?php if ( isset($sidebar_configs['right_descreption']) ) : ?>
                    <div class="<?php echo esc_attr($sidebar_configs['right_descreption']['class']) ;?>">
                        <?php do_action( 'puca_after_sidebar_mobile' ); ?>
                        <aside class="sidebar sidebar-right" itemscope="itemscope" itemtype="http://schema.org/WPSideBar">
                            <?php dynamic_sidebar( $sidebar_configs['right_descreption']['sidebar'] ); ?>
                        </aside>
                    </div>
                <?php endif; ?>

            <?php

            echo '</div>';

        }
    }
    add_action( 'woocommerce_after_shop_loop', 'puca_tbay_subcategories_wraper_closed' , 41 );
}


// Hook Product Top sidebar
if ( !function_exists('puca_tbay_get_product_top_sidebar') ) {
    function puca_tbay_get_product_top_sidebar() {

        $sidebar_configs = puca_tbay_get_woocommerce_layout_configs();

        $class_container = '';
        if( isset($sidebar_configs['container_full']) &&  $sidebar_configs['container_full'] ) {
            $class_container = 'container-full';
        }

        if( !is_product()  && isset($sidebar_configs['product_top_sidebar']) && $sidebar_configs['product_top_sidebar'] ) {
            ?>

            <?php if(is_active_sidebar('product-top-sidebar')) : ?>
                <div class="product-top-sidebar">

                    <div class="product-top-button-wrapper"> 
                        <div class="container <?php echo esc_attr($class_container); ?>">
                            <button class="button-product-top" type="submit"><?php esc_html_e('Advanced filter', 'puca'); ?><i class="fa fa-angle-down first" aria-hidden="true"></i><i class="fa fa-angle-up second" aria-hidden="true"></i></button>
                        </div>
                    </div>
                    <div class="container <?php echo esc_attr($class_container); ?>">
                        <div class="content">
                            <?php dynamic_sidebar('product-top-sidebar'); ?>
                        </div>
                    </div>
                </div>
            <?php endif;?>

            <?php 
        }

    }
    add_action( 'puca_woo_template_main_before', 'puca_tbay_get_product_top_sidebar', 50 );
}


// Hook Product Top sidebar
if ( !function_exists('puca_tbay_get_product_top_multi_Viewed_sidebar') ) {
    function puca_tbay_get_product_top_multi_Viewed_sidebar() {

        $sidebar_configs = puca_tbay_get_woocommerce_layout_configs();

        if( !is_product()  && isset($sidebar_configs['multi_Viewed']) && $sidebar_configs['multi_Viewed'] ) {

            ?>

            <?php if(is_active_sidebar('product-top-multi-viewed-sidebar')) : ?>
                <div class="product-multi-Viewed-sidebar">
                    <?php dynamic_sidebar('product-top-multi-viewed-sidebar'); ?>
                </div>
            <?php endif;?>

            <?php 
        }

    }
    add_action( 'puca_woo_template_main_primary_before', 'puca_tbay_get_product_top_multi_Viewed_sidebar', 20 );
}



// set display mode to cookie
if ( !function_exists('puca_tbay_before_woocommerce_init') ) {
    function puca_tbay_before_woocommerce_init() {
        if( isset($_GET['display']) && ($_GET['display'] == 'list' || $_GET['display'] == 'grid') ){  
            setcookie( 'display_mode', trim($_GET['display']) , time()+3600*24*100,'/' );
            $_COOKIE['display_mode'] = trim($_GET['display']);
        }
    }
    add_action( 'init', 'puca_tbay_before_woocommerce_init' );
}


// Number of products per page
if ( !function_exists('puca_tbay_woocommerce_shop_per_page') ) {
    function puca_tbay_woocommerce_shop_per_page($number) {

        if( isset($_GET['product_per_page']) && is_numeric($_GET['product_per_page']) ) {
            $value = $_GET['product_per_page']; 
        } else {
            $value = puca_tbay_get_config('number_products_per_page');          
        }

        if ( is_numeric( $value ) && $value ) {
            $number = absint( $value );
        }
 
        if( isset($_GET['product_per_page']) && $_GET['product_per_page'] == -1 ) {
            $number = -1;
        }

        return $number;
    }
    add_filter( 'loop_shop_per_page', 'puca_tbay_woocommerce_shop_per_page' );
}


// Number of products per row
if ( !function_exists('puca_tbay_woocommerce_shop_columns') ) {
    function puca_tbay_woocommerce_shop_columns($number) {

        if( isset($_GET['product_columns']) && is_numeric($_GET['product_columns']) ) {
            $value = $_GET['product_columns']; 
        } else {
          $value = puca_tbay_get_config('product_columns');          
        }

        if ( in_array( $value, array(1, 2, 3, 4, 5, 6) ) ) {
            $number = $value;
        }
        return $number;
    }
    add_filter( 'loop_shop_columns', 'puca_tbay_woocommerce_shop_columns' );
}


if (!function_exists('puca_tbay_woocommerce_product_display_image_mode')) {
    function puca_tbay_woocommerce_product_display_image_mode($mode)
    {
        $show_swap_image = puca_tbay_get_config('show_swap_image', false);

        $show_swap_image = (isset($_GET['show_swap_image'])) ? $_GET['show_swap_image'] : $show_swap_image;

        if (wp_is_mobile() || !$show_swap_image ) {
            $mode = 'one';
        } else {
            $mode = 'two';
        }

        return $mode;
    }
    add_filter('puca_woo_display_image_mode', 'puca_tbay_woocommerce_product_display_image_mode');
}


if (!function_exists('puca_tbay_product_display_image_mode')) {
    function puca_tbay_product_display_image_mode()
    {
        $images_mode   = apply_filters('puca_woo_display_image_mode', 10, 2);

        if (wp_is_mobile()) {
            $images_mode = 'one';
        }

        switch ($images_mode) {
            case 'one':
                echo woocommerce_template_loop_product_thumbnail();
                break;

            case 'two':
                echo puca_tbay_woocommerce_get_two_product_thumbnail();
                break;
            
            default:
                echo woocommerce_template_loop_product_thumbnail();
                break;
        }
    }
    remove_action('woocommerce_before_shop_loop_item_title', 'woocommerce_template_loop_product_thumbnail', 10);
    add_action('woocommerce_before_shop_loop_item_title', 'puca_tbay_product_display_image_mode', 10);
    add_action('woocommerce_before_shop_loop_item_only_img', 'puca_tbay_product_display_image_mode', 10);
}

// Two product thumbnail
if (!function_exists('puca_tbay_woocommerce_get_two_product_thumbnail')) {
    function puca_tbay_woocommerce_get_two_product_thumbnail()
    {
        global $product;

        $size = 'woocommerce_thumbnail';
        $placeholder = wc_get_image_size($size);
        $placeholder_width = $placeholder['width'];
        $placeholder_height = $placeholder['height'];
        $post_thumbnail_id =  $product->get_image_id();

        $output='';
        $class = 'image-no-effect';
        if (has_post_thumbnail()) {
            $attachment_ids = $product->get_gallery_image_ids();

            $class = ($attachment_ids && isset($attachment_ids[0])) ? 'attachment-shop_catalog image-effect' : $class;

            $output .= wp_get_attachment_image($post_thumbnail_id, $size, false, array('class' => $class ));
            if ($attachment_ids && isset($attachment_ids[0])) {
                $output .= wp_get_attachment_image($attachment_ids[0], $size, false,array('class' => 'image-hover' ));
            }
        } else {
            $output .= '<img src="'.wc_placeholder_img_src().'" alt="'. esc_attr__('Placeholder' , 'puca'). '" class="'. esc_attr($class) .'" width="'. esc_attr($placeholder_width) .'" height="'. esc_attr($placeholder_height) .'" />';
        }
        return trim($output);
    }
}

// layout class for woo page
if ( !function_exists('puca_tbay_woocommerce_content_class') ) {
    function puca_tbay_woocommerce_content_class( $class ) {
        $page = 'archive';
        if ( is_singular( 'product' ) ) {
            $page = 'single';

            if( !isset($_GET['product_'.$page.'_layout']) ) {
                $class .= ' '.puca_tbay_get_config('product_'.$page.'_layout');
            }  else {
                $class .= ' '.$_GET['product_'.$page.'_layout'];
            }

        } else {

            if( !isset($_GET['product_'.$page.'_layout']) ) {
                $class .= ' '.puca_tbay_get_config('product_'.$page.'_layout');
            }  else {
                $class .= ' '.$_GET['product_'.$page.'_layout'];
            }

        }
        return $class;
    }
}
add_filter( 'puca_tbay_woocommerce_content_class', 'puca_tbay_woocommerce_content_class' );




if ( !function_exists('puca_tbay_get_product_single_layout') ) {
    function puca_tbay_get_product_single_layout() {
        $product_single_layout  =   ( isset($_GET['product_single_layout']) )   ?   $_GET['product_single_layout'] :  puca_tbay_get_config('product_single_layout', 'full-width-vertical-left');

        return $product_single_layout;
    }
}

// get layout configs
if ( !function_exists('puca_tbay_get_woocommerce_layout_configs') ) {
    function puca_tbay_get_woocommerce_layout_configs() {
        $page = 'archive';
        if ( is_singular( 'product' ) ) {
            $page = 'single';
        }
        $left = puca_tbay_get_config('product_'.$page.'_left_sidebar');
        $right = puca_tbay_get_config('product_'.$page.'_right_sidebar');


        if ( !is_singular( 'product' ) ) {

            $product_archive_layout  =   ( isset($_GET['product_archive_layout']) ) ? $_GET['product_archive_layout'] : puca_tbay_get_config('product_archive_layout', 'layout-1');

            if( isset($product_archive_layout) ) {
                switch ( $product_archive_layout ) {
                    case 'shop-left':
                        $configs['left'] = array( 'sidebar'  => $left, 'class' => 'sidebar-mobile-wrapper col-xs-12 col-md-12 col-lg-3'  );
                        $configs['main'] = array( 'class'    => 'col-xs-12 col-md-12 col-lg-9' );
                        break;
                    case 'shop-right':
                        $configs['right'] = array( 'sidebar' => $right,  'class' => 'sidebar-mobile-wrapper col-xs-12 col-md-12 col-lg-3' ); 
                        $configs['main'] = array( 'class'    => 'col-xs-12 col-md-12 col-lg-9' );
                        break;                
                    case 'shop-des-left':
                        $configs['left_descreption'] = array( 'sidebar'  => $left, 'class' => 'sidebar-mobile-wrapper col-xs-12 col-md-12 col-lg-3'  );
                        $configs['main_descreption'] = array( 'class'    => 'col-xs-12 col-md-12 col-lg-9' );
                        $configs['main'] = array( 'class' => 'archive-full' );
                        $configs['descreption'] = true;
                        $configs['breadscrumb_class'] = 'shop-des';
                        break;                
                    case 'shop-des-right':
                        $configs['right_descreption'] = array( 'sidebar'  => $right, 'class' => 'sidebar-mobile-wrapper col-xs-12 col-md-12 col-lg-3'  );
                        $configs['main_descreption'] = array( 'class'    => 'col-xs-12 col-md-12 col-lg-9' );
                        $configs['main'] = array( 'class' => 'archive-full' );
                        $configs['descreption'] = true;
                        $configs['breadscrumb_class'] = 'shop-des';
                        break;                
                    case 'full-width-wide':
                        $configs['main'] = array( 'class' => 'archive-full' );
                        $configs['container_full'] = true;
                        $configs['product_top_sidebar'] = true;
                        break;                
                    case 'full-width':
                        $configs['main'] = array( 'class' => 'archive-full' );
                        $configs['product_top_sidebar'] = true;
                        break;                
                    case 'multi-viewed-left':
                        $configs['left'] = array( 'sidebar'  => $left, 'class' => 'sidebar-mobile-wrapper col-xs-12 col-md-12 col-lg-3'  );
                        $configs['main'] = array( 'class'    => 'col-xs-12 col-md-12 col-lg-9' );
                        $configs['multi_Viewed'] = true;
                        break;                
                    case 'multi-viewed-right':
                        $configs['right'] = array( 'sidebar' => $right,  'class' => 'sidebar-mobile-wrapper col-xs-12 col-md-12 col-lg-3' ); 
                        $configs['main'] = array( 'class'    => 'col-xs-12 col-md-12 col-lg-9' );
                        $configs['multi_Viewed'] = true;
                        break;                
                    case 'filter-bar':
                        $configs['main'] = array( 'class' => 'archive-full' );
                        $configs['filter_bar'] = true;
                        break;                
                    case 'canvas-left-sidebar':
                        $configs['main'] = array( 'class' => 'archive-full' );
                        $configs['canvas'] = true;
                        $configs['body_class']   = 'canvas-left';
                        $configs['canvas_left'] = true;
                        break;                
                    case 'canvas-right-sidebar':
                        $configs['main'] = array( 'class' => 'archive-full' );
                        $configs['canvas'] = true;
                        $configs['canvas_right'] = true;
                        $configs['body_class']   = 'canvas-right';
                        break;
                    default:
                        $configs['main'] = array( 'class' => 'archive-full' );
                        break;
                }
            } 
        } 
        else { 

            $product_single_layout  =   puca_tbay_get_product_single_layout();

            if( isset($product_single_layout) ) {
                switch ( $product_single_layout ) {
                    case 'full-width-vertical-left':
                        $configs['main']            = array( 'class' => 'archive-full' );
                        $configs['thumbnail']       = 'vertical-left';
                        $configs['tabs']            = 'tbhorizontal';
                        $configs['tabs_position']   = 'bottom';
                        $configs['breadscrumb']     = 'color';
                        break;                    
                    case 'full-width-vertical-right':
                        $configs['main']            = array( 'class' => 'archive-full' );
                        $configs['thumbnail']       = 'vertical-right';
                        $configs['tabs']            = 'tbhorizontal';
                        $configs['tabs_position']   = 'bottom';
                        $configs['breadscrumb']     = 'color';
                        break;
                    case 'full-width-horizontal-top':
                        $configs['main']            = array( 'class' => 'archive-full' );
                        $configs['thumbnail']       = 'horizontal-top';
                        $configs['tabs']            = 'accordion';
                        $configs['tabs_position']   = 'bottom';
                        $configs['breadscrumb']     = 'color';
                        break;                        
                    case 'full-width-horizontal-bottom':
                        $configs['main']            = array( 'class' => 'archive-full' );
                        $configs['thumbnail']       = 'horizontal-bottom';
                        $configs['tabs']            = 'accordion';
                        $configs['tabs_position']   = 'bottom';
                        $configs['breadscrumb']     = 'color';
                        break;                  
                    case 'full-width-gallery':
                        $configs['main']            = array( 'class' => 'archive-full' );
                        $configs['thumbnail']       = 'gallery';
                        $configs['tabs']            = 'accordion';
                        $configs['tabs_position']   = 'right';
                        $configs['breadscrumb']     = 'color';
                        break;                     
                    case 'full-width-stick':
                        $configs['main']            = array( 'class' => 'archive-full' );
                        $configs['thumbnail']       = 'stick';
                        $configs['tabs']            = 'tbhorizontal';
                        $configs['tabs_position']   = 'bottom';
                        $configs['breadscrumb']     = 'color';
                        break;                    
                    case 'full-width-slide':
                        $configs['main']            = array( 'class' => 'archive-full' );
                        $configs['thumbnail']       = 'slide';
                        $configs['tabs']            = 'accordion';
                        $configs['tabs_position']   = 'bottom';
                        $configs['breadscrumb']     = 'color';
                        break;                      
                    case 'full-width-carousel':
                        $configs['main']            = array( 'class' => 'archive-full' );
                        $configs['thumbnail']       = 'carousel';
                        $configs['tabs']            = 'accordion';
                        $configs['tabs_position']   = 'bottom';
                        $configs['breadscrumb']     = 'color';
                        break;  
                    case 'left-main':
                        $configs['left']            = array( 'sidebar' => $left, 'class' => 'col-xs-12 col-md-12 col-lg-3'  );
                        $configs['main']            = array( 'class' => 'col-xs-12 col-md-12 col-lg-9' );
                        $configs['tabs_position']   = 'bottom';
                        $configs['thumbnail']       = 'horizontal-bottom';
                        $configs['breadscrumb']     = 'color';
                        break;
                    case 'main-right':
                        $configs['right']           = array( 'sidebar' => $right,  'class' => 'col-xs-12 col-md-12 col-lg-3' ); 
                        $configs['main']            = array( 'class' => 'col-xs-12 col-md-12 col-lg-9' );
                        $configs['tabs_position']   = 'bottom';
                        $configs['thumbnail']       = 'horizontal-bottom';
                        $configs['breadscrumb']     = 'color';
                        break;              
                    default:
                        $configs['main']            = array( 'class' => 'archive-full' );
                        $configs['thumbnail']       = 'vertical-left';
                        $configs['tabs']            = 'tbhorizontal';
                        $configs['tabs_position']   = 'bottom';
                        $configs['breadscrumb']     = 'color';
                        break;
                }  
            } 
        }

        return $configs; 
    }
}




if ( !function_exists( 'puca_tbay_product_review_tab' ) ) {
    function puca_tbay_product_review_tab($tabs) {
        if ( !puca_tbay_get_config('show_product_review_tab', true) && isset($tabs['reviews']) ) {
            unset( $tabs['reviews'] ); 
        }
        return $tabs;
    }
}
add_filter( 'woocommerce_product_tabs', 'puca_tbay_product_review_tab', 100 );

if ( !function_exists( 'puca_tbay_minicart') ) {
    function puca_tbay_minicart() {
        $template = apply_filters( 'puca_tbay_minicart_version', '' );
        get_template_part( 'woocommerce/cart/mini-cart-button', $template ); 
    }
}
// Wishlist
remove_action( 'woocommerce_before_shop_loop_item', 'woocommerce_template_loop_product_link_open', 10 );
remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_product_link_close', 5 );

if ( !function_exists( 'puca_tbay_remove_quick_view_default' ) ) {
    function puca_tbay_remove_quick_view_default() {
        if (class_exists('YITH_WCQV_Frontend')) {
            remove_action('woocommerce_after_shop_loop_item', array( YITH_WCQV_Frontend(), 'yith_add_quick_view_button' ), 15);
        }
    }
    add_action('init', 'puca_tbay_remove_quick_view_default', 10);
}

// Ajax Wishlist
if( defined( 'YITH_WCWL' ) && ! function_exists( 'puca_yith_wcwl_ajax_update_count' ) ){
function puca_yith_wcwl_ajax_update_count(){

    $wishlist_count = YITH_WCWL()->count_products();

    wp_send_json( array(
    'count' => $wishlist_count
    ) );
    }
    add_action( 'wp_ajax_yith_wcwl_update_wishlist_count', 'puca_yith_wcwl_ajax_update_count' );
    add_action( 'wp_ajax_nopriv_yith_wcwl_update_wishlist_count', 'puca_yith_wcwl_ajax_update_count' );
}

if ( ! function_exists( 'puca_woocommerce_saved_sales_price' ) ) {

    add_filter( 'woocommerce_get_saved_sales_price_html', 'puca_woocommerce_saved_sales_price' );

    function puca_woocommerce_saved_sales_price( $productid ) {

        $product = wc_get_product( $productid );

        
        $onsale         = $product->is_on_sale();
        $saleprice      = $product->get_sale_price();   
        $regularprice   = $product->get_regular_price();
        $priceDiff      = (int)$regularprice - (int)$saleprice;
        $price          = '';
        $price1         = '';

        $off_content    ='';
        if($priceDiff != 0){
            $price1 = '<span class="saved">'. esc_html__('Save you ', 'puca') .' <span class="price">'. sprintf( get_woocommerce_price_format(), get_woocommerce_currency_symbol(), $priceDiff ) . '</span></span>';     
            $price .= '<div class="block-save-price">'.$price1.'</div>'; 
        }
        
        // Sale price
        return $price;
        
    }
}

if( ! function_exists( 'puca_brands_get_name' ) && class_exists( 'YITH_WCBR' ) ) {

    function puca_brands_get_name($product_id) {

        $terms = wp_get_post_terms($product_id,'yith_product_brand');

        $brand = '';
        if($terms && defined( 'YITH_WCBR' ) && YITH_WCBR) {

            $brand  .= '<ul class="show-brand">';

            foreach ($terms as $term) {
                
                $name = $term->name;
                $url = get_term_link( $term->slug, 'yith_product_brand' );

                $brand  .= '<li><a href="'. esc_url($url) .'">'. esc_html($name) .'</a></li>';

            }

            $brand  .= '</ul>';
        }

        echo  trim($brand);

    }

}

/* ---------------------------------------------------------------------------
 * WooCommerce - Function get Query
 * --------------------------------------------------------------------------- */
 
if ( ! function_exists( 'puca_woo_get_review_counting' ) ) {
    function puca_woo_get_review_counting(){

        global $post;
        $output = array();

        for($i=1; $i <= 5; $i++){
             $args = array(
                'post_id'      => ( $post->ID ),
                'status' => 'approve',
                'meta_query' => array(
                  array(
                    'key'   => 'rating',
                    'value' => $i
                  )
                ),
                'count' => true
            );
            $output[$i] = get_comments( $args );
        }
        return $output;
    }
}

/*Fix count ajax cart*/
add_filter( 'woocommerce_add_to_cart_fragments', function($fragments) {

    ob_start();
    ?>

    <span class="qty">
        <?php echo WC()->cart->get_cart_subtotal(); ?>
    </span>


    <?php $fragments['span.qty']             = ob_get_clean();

    return $fragments;

} );

add_filter( 'woocommerce_add_to_cart_fragments', function($fragments) {

    ob_start();
    ?>

    <span class="mini-cart-items"><?php echo WC()->cart->get_cart_contents_count(); ?></span>

    <?php $fragments['span.mini-cart-items'] = ob_get_clean();

    return $fragments;

} );

add_filter( 'woocommerce_add_to_cart_fragments', function($fragments) {

    ob_start();
    ?>

    <span class="mini-cart-items-fixed"><?php echo WC()->cart->get_cart_contents_count(); ?></span>

    <?php $fragments['span.mini-cart-items-fixed'] = ob_get_clean();

    return $fragments;

} );

add_filter( 'woocommerce_add_to_cart_fragments', function($fragments) {
    ob_start();
    ?>

    <span class="mini-cart-items cart-mobile"><?php echo sprintf( '%d', WC()->cart->cart_contents_count );?></span>

    <?php $fragments['span.cart-mobile'] = ob_get_clean();

    return $fragments;

} );
/*End count ajax cart*/

// Remove product in the cart using ajax
if ( ! function_exists( 'puca_ajax_product_remove' ) ) {
    function puca_ajax_product_remove(){
        // Get mini cart
        ob_start();

        foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item)
        {
            if($cart_item['product_id'] == $_POST['product_id'] && $cart_item_key == $_POST['cart_item_key'] )
            {
                WC()->cart->remove_cart_item($cart_item_key);
            }
        }

        WC()->cart->calculate_totals();
        WC()->cart->maybe_set_cart_cookies();

        woocommerce_mini_cart();

        $mini_cart = ob_get_clean();

        // Fragments and mini cart are returned
        $data = array(
            'fragments' => apply_filters( 'woocommerce_add_to_cart_fragments', array(
                    'div.widget_shopping_cart_content' => '<div class="widget_shopping_cart_content">' . $mini_cart . '</div>'
                )
            ),
            'cart_hash' => apply_filters( 'woocommerce_cart_hash', WC()->cart->get_cart_for_session() ? md5( json_encode( WC()->cart->get_cart_for_session() ) ) : '', WC()->cart->get_cart_for_session() )
        );

        wp_send_json( $data );

        die();
    }
    add_action( 'wp_ajax_product_remove', 'puca_ajax_product_remove' );
    add_action( 'wp_ajax_nopriv_product_remove', 'puca_ajax_product_remove' );
}

/* ---------------------------------------------------------------------------
 * WooCommerce - Function Load more ajax
 * --------------------------------------------------------------------------- */
if ( ! function_exists( 'puca_fnc_more_post_ajax' ) ) {
    add_action('wp_ajax_nopriv_puca_more_post_ajax', 'puca_fnc_more_post_ajax');
    add_action('wp_ajax_puca_more_post_ajax', 'puca_fnc_more_post_ajax');

    function puca_fnc_more_post_ajax(){
        global $woocommerce_loop; 

        $columns                    =   (isset($_POST["columns"])) ? $_POST["columns"] : 4;
        $layout                     =   (isset($_POST["layout"])) ? $_POST["layout"] : '';
        $number                     =   (isset($_POST["number"])) ? $_POST["number"] : 8;
        $type                       =   (isset($_POST["type"])) ? $_POST["type"] : 'featured_product';
        $paged                      =   (isset($_POST["paged"])) ? $_POST["paged"] : 1;
        $category                   =   (isset($_POST["category"])) ? $_POST["category"] : '';
        $screen_desktop             =   (isset($_POST["screen_desktop"])) ? $_POST["screen_desktop"] : '';
        $screen_desktopsmall        =   (isset($_POST["screen_desktopsmall"])) ? $_POST["screen_desktopsmall"] : '';
        $screen_tablet              =   (isset($_POST["screen_tablet"])) ? $_POST["screen_tablet"] : '';
        $screen_mobile              =   (isset($_POST["screen_mobile"])) ? $_POST["screen_mobile"] : '';


        $product_item = isset($product_item) ? $product_item : 'inner';


        if(empty($category)) {
            $category = -1;
        }

        $offset         = $number*3;
        $number_load    = $columns*3;

        $woocommerce_loop['columns'] = $columns;

        if((strpos($category, ',') !== false )) {
            $categories = explode(',', $category); 
            $loop = puca_tbay_get_products( $categories, $type , $paged, $number_load, '', '', $number, $offset );
        } else {

            if( $category == -1 ) {
                $loop = puca_tbay_get_products( '', $type , $paged, $number_load, '', '', $number, $offset );
            } else {
              $loop = puca_tbay_get_products( array($category), '' , $paged, $number_load, '', '', $number, $offset );  
            } 

        } 

        $count = 0;
        $active_theme = puca_tbay_get_part_theme();

        add_filter( 'woocommerce_dropdown_variation_attribute_options_html', 'puca_get_swatch_html' , 10, 2 ); 
        add_filter( 'tawcvs_swatch_html', 'puca_swatch_html' , 5, 4 );

        if($loop->have_posts()) :
        ob_start();

             while ( $loop->have_posts() ) : $loop->the_post(); ?>

                <?php 

                    if( isset($layout) && $layout == 'special' ) {
                        wc_get_template( 'item-product/'.$active_theme.'/special.php', array('columns' => $columns, 'screen_desktop' => $screen_desktop,'screen_desktopsmall' => $screen_desktopsmall,'screen_tablet' => $screen_tablet,'screen_mobile' => $screen_mobile) );
                    } else {
                        wc_get_template( 'content-products.php', array('product_item' => $product_item,'columns' => $columns,'screen_desktop' => $screen_desktop,'screen_desktopsmall' => $screen_desktopsmall,'screen_tablet' => $screen_tablet,'screen_mobile' => $screen_mobile) );  
                    }

                ?>


                <?php $count++; ?>
            <?php endwhile; ?>
        <?php endif;

        wp_reset_postdata();

        $posts = ob_get_clean();

        $result['category'] = $category; 
        if($paged >= $loop->max_num_pages || $number_load > $loop->post_count ) {
            $result['check'] = false; 
        } else {
            $result['check'] = true;
        } 

        $result['posts'] = $posts;
        print_r(json_encode($result));
        exit();
    }
}

if ( ! function_exists( 'puca_woocommerce_post_class' ) ) {
    add_filter( 'post_class', 'puca_woocommerce_post_class', 21 );
    function puca_woocommerce_post_class( $classes ) {
        if ( 'product' == get_post_type() ) {
            $classes = array_diff( $classes, array( 'first', 'last' ) );
        }
        return $classes;
    }
}

if ( ! function_exists( 'puca_woocommerce_meta_query' ) ) {
    function puca_woocommerce_meta_query($type){

        $args = array();
        switch ($type) {
          
            case 'best_selling':
                $args['meta_key'] = 'total_sales';
                $args['order']    = 'DESC';
                $args['orderby']  = 'meta_value_num';
                break;

            case 'featured_product':
                $args['ignore_sticky_posts']    = 1;
                $args['meta_query']             = array();
                $args['tax_query'][]              = array(
                    array(
                        'taxonomy' => 'product_visibility',
                        'field'    => 'name',
                        'terms'    => 'featured',
                        'operator' => 'IN'
                    )
                );
                break;

            case 'top_rate':
                $args['meta_query']     = WC()->query->get_meta_query();
                $args['tax_query']      = WC()->query->get_tax_query();
                $args['meta_key']       = '_wc_average_rating';
                $args['orderby']        = 'meta_value_num';
                $args['order']          = 'DESC';
                break;

            case 'recent_product':
                $args['orderby']    = 'date';
                $args['order']      =  'DESC';
                $args['meta_query'] = WC()->query->get_meta_query();
                $args['tax_query']  = WC()->query->get_tax_query();
                break; 

            case 'random_product':
                $args['orderby']    = 'rand';
                $args['meta_query'] = array();
                break;

            case 'on_sale':
                $args['meta_query']     = WC()->query->get_meta_query();
                $args['tax_query']      = WC()->query->get_tax_query();
                $args['post__in']       = array_merge( array( 0 ), wc_get_product_ids_on_sale() );
                break;

        }

        if( 'yes' === get_option( 'woocommerce_hide_out_of_stock_items' ) ) {
            $args['meta_query'][] =  array(
                'relation' => 'AND',
                array(
                    'key' => '_stock_status',
                    'value' => 'instock',
                    'compare' => '=',
                )
            );
        }

        $args['tax_query'][] = array(
            'relation' => 'AND',
            array(
               'taxonomy' =>   'product_visibility',
                'field'    =>   'slug',
                'terms'    =>   array('exclude-from-search', 'exclude-from-catalog'),
                'operator' =>   'NOT IN',
            )
        );

        return $args;
    }
}

//Render form fillter product
if ( ! function_exists( 'puca_woocommerce_product_fillter' ) ) {
    function puca_woocommerce_product_fillter($options, $name, $default, $class = 'level-0'){
        // Only show on product categories
        if ( ! woocommerce_products_will_display() ) :
            return;
        endif;

        ?>
        <form method="get" class="woocommerce-fillter">
            <select name="<?php echo esc_attr($name); ?>" onchange="this.form.submit()" class="select">
                <?php $i = 0; foreach( $options as $key => $value ) : ?>
                    <?php 
                        if( $name === 'product_category' ) {
                            $category = get_term_by( 'slug', $key, 'product_cat' );
                        }
                        
                       if( $name !== 'product_category' || ( !empty($category->count) && $category->count > 0 ) ) :
                    ?>
                        <option class="<?php echo (!empty($class[$i])) ? trim($class[$i]) : '';?>" value="<?php echo esc_attr( $key ); ?>" <?php selected( $key, puca_woocommerce_get_fillter($name, $default) ); ?> ><?php echo trim($value);?></option>
                        <?php $i++; ?>
                    <?php endif; ?>
                <?php endforeach; ?>
            </select>
        <?php
            // Keep query string vars intact
            foreach ( $_GET as $key => $val ) :

                if ( $name === $key || 'submit' === $key ) :
                    continue;
                endif;
                if ( is_array( $val ) ) :
                    foreach( $val as $inner_val ) :
                        ?><input type="hidden" name="<?php echo esc_attr( $key ); ?>[]" value="<?php echo esc_attr( $inner_val ); ?>" /><?php
                    endforeach;
                else :
                    ?><input type="hidden" name="<?php echo esc_attr( $key ); ?>" value="<?php echo esc_attr( $val ); ?>" /><?php
                endif;
            endforeach;
        ?>
        </form>
    <?php

    }
}

//get value fillter
if ( ! function_exists( 'puca_woocommerce_get_fillter' ) ) {
    function puca_woocommerce_get_fillter($name, $default){

        if ( isset( $_GET[$name] ) ) :
            return $_GET[$name];
        else :
            return $default;
        endif;
    }
}


//Add query product type
if ( ! function_exists( 'puca_woocommerce_product_type_query' ) ) {
    function puca_woocommerce_product_type_query( $q ){
        $name = 'product_type';
        $default = 'recent_products';

        $product_type = puca_woocommerce_get_fillter($name, $default);
        $args    = puca_woocommerce_meta_query($product_type);
        $queries = array('meta_key', 'orderby', 'order', 'post__in', 'tax_query', 'meta_query');
        if ( function_exists( 'woocommerce_products_will_display' ) && $q->is_main_query() ) :
            foreach($queries as $query){
                if(isset($args[$query])){
                    $q->set( $query, $args[$query] );
                }
            }
        endif;
    }
}

//Add form fillter by product type
if ( ! function_exists( 'puca_woocommerce_product_type_fillter' ) ) {
    function puca_woocommerce_product_type_fillter(){
        $default = 'recent_product';
        $options = array(
            'best_selling'      => esc_html__('Best Selling', 'puca'),
            'featured_product'  => esc_html__('Featured Products', 'puca'),
            'recent_product'    => esc_html__('Recent Products', 'puca'),
            'on_sale'           => esc_html__('On Sale', 'puca'),
            'random_product'    => esc_html__('Random Products', 'puca')
        );
        $name = 'product_type';
        puca_woocommerce_product_fillter($options, $name, $default);
    }
}


//Add query product per page
if ( ! function_exists( 'puca_woocommerce_product_per_page_query' ) ) {
    function puca_woocommerce_product_per_page_query( $q ){
        $default            = puca_tbay_get_config('number_products_per_page');
        $product_per_page   = puca_woocommerce_get_fillter('product_per_page',$default);
        if ( function_exists( 'woocommerce_products_will_display' ) && $q->is_main_query() ) :
            $q->set( 'posts_per_page', $product_per_page );
        endif;
    }
}

//Add form fillter by product per page
if ( ! function_exists( 'puca_woocommerce_product_per_page_fillter' ) ) {
    function puca_woocommerce_product_per_page_fillter(){
        $columns = puca_tbay_get_config('product_columns', 4);
        $default = puca_tbay_get_config('number_products_per_page');
        $options= array();
        for($i=1; $i<=5; $i++){
            $options[$i*$columns] =  $i*$columns.' '.esc_html__( ' products per page', 'puca');
        }
        $options['-1'] = esc_html__('All products', 'puca' );
        $name = 'product_per_page';
        puca_woocommerce_product_fillter($options, $name, $default);
    }
}


//Add query product category
if ( ! function_exists( 'puca_woocommerce_product_category_query' ) ) {
    function puca_woocommerce_product_category_query( $q ){

        $default            = -1;
        $product_cat        = puca_woocommerce_get_fillter('product_category',$default);


        $tax_query = (array) $q->get( 'tax_query' );

        $tax_query[] = array(
                'posts_per_page' => -1,
                'tax_query' => array(
                    'relation' => 'AND',
                    array(
                        'taxonomy' => 'product_cat',
                        'field' => 'slug',
                        'terms' => $product_cat
                    )
                ),
                'post_type' => 'product',
                'orderby' => 'title,'
        );


        if ( function_exists( 'woocommerce_products_will_display' ) && $q->is_main_query() && $product_cat != -1 ) :
           $q->set( 'tax_query', $tax_query );
        endif;
    }
}


//Add form fillter by product category
if ( ! function_exists( 'puca_woocommerce_product_category_fillter' ) ) {
    function puca_woocommerce_product_category_fillter(){

        $taxonomy       = 'product_cat';
        $orderby        = 'name';  
        $pad_counts     = 0;      // 1 for yes, 0 for no
        $hierarchical   = 1;      // 1 for yes, 0 for no   
        $empty          = 0;
        $posts_per_page =  -1;

        $args = array(
            'taxonomy'       => $taxonomy, 
            'orderby'        => $orderby,
            'posts_per_page' => $posts_per_page,
            'pad_counts'     => $pad_counts,
            'hierarchical'   => $hierarchical,
            'hide_empty'     => $empty
        );

        $all_categories = get_categories( $args );

        $options = array();
        $class = array();
        $options['-1'] = esc_html__('All Category', 'puca' );
        $class[] = 'level-0';
        $default = esc_html__('All Category', 'puca' );
        foreach ($all_categories as $cat) {
            if($cat->category_parent == 0) {
                $cat_name   =   $cat->name;    
                $cat_id     =   $cat->term_id;    
                $cat_slug   =   $cat->slug;    
                $count      =   $cat->count;
                $level      =   0;

                $options[$cat_slug]      =  $cat_name.'('.$count.')';
                $class[]                 = 'level-'.$level;

                $taxonomy       =   'product_cat';
                $orderby        =   'name';  
                $pad_counts     =   0;      // 1 for yes, 0 for no
                $hierarchical   =   1;      // 1 for yes, 0 for no   
                $empty          =   0;
                $posts_per_page =  -1;


                $args2 = array(
                        'child_of'      => 0,
                        'parent'         => $cat_id,
                        'taxonomy'       => $taxonomy, 
                        'orderby'        => $orderby,
                        'posts_per_page' => $posts_per_page,
                        'pad_counts'     => $pad_counts,
                        'hierarchical'   => $hierarchical,
                        'hide_empty'     => $empty
                );

                $sub_cats = get_categories( $args2 );


                if($sub_cats) {
                    $level ++;

                    foreach($sub_cats as $sub_category) {

                        $sub_cat_name               =   $sub_category->name;    
                        $sub_cat_id                 =   $sub_category->term_id;    
                        $sub_cat_slug               =   $sub_category->slug;    
                        $sub_count                  =   $sub_category->count;
                        $class[]                    =  'level-'.$level;

                        $options[$sub_cat_slug]     =  $sub_cat_name.'('.$sub_count.')';


                        $taxonomy       =   'product_cat';
                        $orderby        =   'name';  
                        $pad_counts     =   0;      // 1 for yes, 0 for no
                        $hierarchical   =   1;      // 1 for yes, 0 for no   
                        $empty          =   0;
                        $posts_per_page =  -1;


                        $args2 = array(
                                'child_of'      => 0,
                                'parent'         => $sub_cat_id,
                                'taxonomy'       => $taxonomy, 
                                'orderby'        => $orderby,
                                'posts_per_page' => $posts_per_page,
                                'pad_counts'     => $pad_counts,
                                'hierarchical'   => $hierarchical,
                                'hide_empty'     => $empty
                        );

                        $sub_cats = get_categories( $args2 );


                        if($sub_cats) {
                            $level ++;

                            foreach($sub_cats as $sub_category) {

                                $sub_cat_name               =   $sub_category->name;    
                                $sub_cat_id                 =   $sub_category->term_id;    
                                $sub_cat_slug               =   $sub_category->slug;    
                                $sub_count                  =   $sub_category->count;
                                $class[]                    =  'level-'.$level;

                                $options[$sub_cat_slug]     =  $sub_cat_name.'('.$sub_count.')';
                            }
                        }

                    }
                }

            }
        }
                        
        $name = 'product_category';

        puca_woocommerce_product_fillter($options, $name, $default, $class);
    }
}




// Add hook to before shoop loop in layout filter bar
if ( !function_exists('puca_tbay_layout_filter_bar') ) {
    function puca_tbay_layout_filter_bar() {

        $sidebar_configs = puca_tbay_get_woocommerce_layout_configs();

        if( isset($sidebar_configs['filter_bar']) && $sidebar_configs['filter_bar'] ) {

            add_action( 'woocommerce_product_query', 'puca_woocommerce_product_type_query', 20, 2 );
            add_action('woocommerce_before_shop_loop', 'puca_woocommerce_product_type_fillter', 25);
            add_action('woocommerce_before_shop_loop', 'puca_woocommerce_product_per_page_fillter', 30);
            add_action('woocommerce_before_shop_loop', 'puca_woocommerce_product_category_fillter', 35);
            add_action( 'woocommerce_product_query', 'puca_woocommerce_product_category_query',30 ,2 );

        }

    }
    add_action( 'init', 'puca_tbay_layout_filter_bar' );
}


// Add hook to before shoop loop in layout filter bar
if ( !function_exists('puca_tbay_filter_config') ) {
    function puca_tbay_filter_config() {

        if( isset($_GET['product_type_fillter'])  ) {
            $product_type_fillter = $_GET['product_type_fillter'];
        } else {
            $product_type_fillter = puca_tbay_get_global_config('product_type_fillter');
        }        

        if( isset($_GET['product_per_page_fillter'])  ) {
            $product_per_page_fillter = $_GET['product_per_page_fillter'];
        } else {
            $product_per_page_fillter = puca_tbay_get_global_config('product_per_page_fillter');
        }        

        if( isset($_GET['product_category_fillter'] )  ) {
            $product_category_fillter = $_GET['product_category_fillter'];
        } else {
            $product_category_fillter = puca_tbay_get_global_config('product_category_fillter');
        }

        if ( $product_type_fillter ) {
            add_action('woocommerce_before_shop_loop', 'puca_woocommerce_product_type_fillter', 25);
        }

        add_action( 'woocommerce_product_query', 'puca_woocommerce_product_type_query', 20 ,2 );

        if ( $product_per_page_fillter ) {
             add_action('woocommerce_before_shop_loop', 'puca_woocommerce_product_per_page_fillter', 30);
             add_action( 'woocommerce_product_query', 'puca_woocommerce_product_per_page_query', 10, 2 );
        }

        if ( $product_category_fillter ) {
            add_action('woocommerce_before_shop_loop', 'puca_woocommerce_product_category_fillter', 35);
            add_action( 'woocommerce_product_query', 'puca_woocommerce_product_category_query',30 ,2 );
        }
        
    }
    add_action( 'init', 'puca_tbay_filter_config' );
}


// Add hook to before shoop loop in layout canvas sidebar
if(!function_exists('puca_tbay_layout_canvas_sidebar')){
    function puca_tbay_layout_canvas_sidebar(){

        $sidebar_configs = puca_tbay_get_woocommerce_layout_configs();

        $class_canvas = '';
        if ( isset($sidebar_configs['canvas_left']) && $sidebar_configs['canvas_left'] ) {
            $class_canvas = 'left';
        } elseif ( isset($sidebar_configs['canvas_right']) && $sidebar_configs['canvas_right'] ) {
            $class_canvas = 'right';
        }
        
        
        $skin = puca_tbay_get_theme();
        $icon = ($skin === 'fashion3') ? '<i class="tb-icon tb-icon-zz-cancel-1"></i>' : 'x';

        if ( isset($sidebar_configs['canvas']) && $sidebar_configs['canvas'] ) {
 
            if(is_active_sidebar('product-canvas-sidebar')) {
                ?>

                <div class="product-canvas-sidebar <?php echo esc_attr($class_canvas); ?>">
                    <div class="content"> 
                        <a href="javascript:;" class="product-canvas-close  <?php echo esc_attr($class_canvas); ?>"><span><?php echo trim($icon) ?></span></a>
                        <?php dynamic_sidebar('product-canvas-sidebar'); ?> 
                    </div>
                </div>

                <?php
            }

        }
    } 
    add_action( 'puca_woo_template_main_before', 'puca_tbay_layout_canvas_sidebar' , 10 );
}

// class body canvas
if ( ! function_exists( 'puca_tbay_body_classes_canvas' ) ) {
    function puca_tbay_body_classes_canvas( $classes ) {
        $sidebar_configs = puca_tbay_get_woocommerce_layout_configs();
        if ( isset($sidebar_configs['body_class']) && $sidebar_configs['body_class'] ) {
            $class = $sidebar_configs['body_class']; 
            $classes[] = trim($class);
        }
        return $classes;
    }
    add_filter( 'body_class', 'puca_tbay_body_classes_canvas' );
}


//Add button icon canvas sidebar
if(!function_exists('puca_tbay_layout_button_canvas_sidebar')){
    function puca_tbay_layout_button_canvas_sidebar(){

        $sidebar_configs = puca_tbay_get_woocommerce_layout_configs();
        $skin = puca_tbay_get_theme();
        $icon = ($skin === 'fashion3') ? 'tb-icon tb-icon-zzz-bars' : 'icons icon-settings';
        if( isset($sidebar_configs['canvas']) && $sidebar_configs['canvas'] ) {
            echo '<button class="button-canvas-sidebar" type="submit"><span><i class="'.$icon.'" aria-hidden="true"></i></span></button>';
        }  
       
    }
    add_action( 'woocommerce_before_shop_loop', 'puca_tbay_layout_button_canvas_sidebar' , 1 );
}


//Add button load more in shop
if(!function_exists('puca_tbay_woocommerce_shop_load_more')){
    function puca_tbay_woocommerce_shop_load_more(){
        global $wp_query;


        if (  $wp_query->max_num_pages > 1 ) {
            ?>
           <div class="tbay-pagination-load-more">
                <a href="javascript:void(0);" data-loadmore="true">
                    <i class="icon-plus icons"></i>
                    <span class="text"><?php esc_html_e('Load More', 'puca'); ?></span>
                </a>
           </div>

       <?php }
    }
}


/* ---------------------------------------------------------------------------
 * WooCommerce - Function Load more ajax
 * --------------------------------------------------------------------------- */
if(!function_exists('puca_pagination_fnc_more_post_ajax')){
    add_action('wp_ajax_nopriv_puca_pagination_more_post_ajax', 'puca_pagination_fnc_more_post_ajax');
    add_action('wp_ajax_puca_pagination_more_post_ajax', 'puca_pagination_fnc_more_post_ajax');

    function puca_pagination_fnc_more_post_ajax(){

        // prepare our arguments for the query
        $args = json_decode( stripslashes( $_POST['query'] ), true );
        $args['paged'] = $_POST['page'] + 1; // we need next page to be loaded
        $args['post_status'] = 'publish';
     
        // it is always better to use WP_Query but not here
        query_posts( $args );
     
        if( have_posts() ) :
     
            while( have_posts() ): the_post();
     
                wc_get_template( 'content-product.php');

     
            endwhile;
     
        endif;
        die; // here we exit the script and even no wp_reset_postdata() required!
    }
}

/*Call funciton WCVariation Swatches  swallow2603*/
if( class_exists( 'TA_WC_Variation_Swatches' ) ) {
    function puca_get_swatch_html( $html, $args ) {
        $swatch_types = TA_WCVS()->types;
        $attr         = TA_WCVS()->get_tax_attribute( $args['attribute'] );

        // Return if this is normal attribute
        if ( empty( $attr ) ) {
            return $html;
        }

        if ( ! array_key_exists( $attr->attribute_type, $swatch_types ) ) {
            return $html;
        }

        $options   = $args['options'];
        $product   = $args['product'];
        $attribute = $args['attribute'];
        $class     = "variation-selector variation-select-{$attr->attribute_type}";
        $swatches  = '';

        if ( empty( $options ) && ! empty( $product ) && ! empty( $attribute ) ) {
            $attributes = $product->get_variation_attributes();
            $options    = $attributes[$attribute];
        }

        if ( array_key_exists( $attr->attribute_type, $swatch_types ) ) {
            if ( ! empty( $options ) && $product && taxonomy_exists( $attribute ) ) {
                // Get terms if this is a taxonomy - ordered. We need the names too.
                $terms = wc_get_product_terms( $product->get_id(), $attribute, array( 'fields' => 'all' ) );

                foreach ( $terms as $term ) {
                    if ( in_array( $term->slug, $options ) ) {
                        $swatches .= apply_filters( 'tawcvs_swatch_html', '', $term, $attr, $args );
                    }
                }
            }

            if ( ! empty( $swatches ) ) {
                $class .= ' hidden';

                $swatches = '<div class="tawcvs-swatches" data-attribute_name="attribute_' . esc_attr( $attribute ) . '">' . $swatches . '</div>';
                $html     = '<div class="' . esc_attr( $class ) . '">' . $html . '</div>' . $swatches;
            }
        }

        return $html;
    }

    function puca_swatch_html( $html, $term, $attr, $args ) {
        $selected = sanitize_title( $args['selected'] ) == $term->slug ? 'selected' : '';
        $name     = esc_html( apply_filters( 'woocommerce_variation_option_name', $term->name ) );

        switch ( $attr->attribute_type ) {
            case 'color':
                $color = get_term_meta( $term->term_id, 'color', true );
                list( $r, $g, $b ) = sscanf( $color, "#%02x%02x%02x" );
                $html = sprintf(
                    '<span class="swatch swatch-color swatch-%s %s" style="background-color:%s;color:%s;" title="%s" data-value="%s">%s</span>',
                    esc_attr( $term->slug ),
                    $selected,
                    esc_attr( $color ),
                    "rgba($r,$g,$b,0.5)",
                    esc_attr( $name ),
                    esc_attr( $term->slug ),
                    $name
                );
                break;

            case 'image':
                $image = get_term_meta( $term->term_id, 'image', true );
                $image = $image ? wp_get_attachment_image_src( $image ) : '';
                $image = $image ? $image[0] : WC()->plugin_url() . '/assets/images/placeholder.png';
                $html  = sprintf(
                    '<span class="swatch swatch-image swatch-%s %s" title="%s" data-value="%s"><img src="%s" alt="%s">%s</span>',
                    esc_attr( $term->slug ),
                    $selected,
                    esc_attr( $name ),
                    esc_attr( $term->slug ),
                    esc_url( $image ),
                    esc_attr( $name ),
                    esc_attr( $name )
                );
                break;

            case 'label':
                $label = get_term_meta( $term->term_id, 'label', true );
                $label = $label ? $label : $name;
                $html  = sprintf(
                    '<span class="swatch swatch-label swatch-%s %s" title="%s" data-value="%s">%s</span>',
                    esc_attr( $term->slug ),
                    $selected,
                    esc_attr( $name ),
                    esc_attr( $term->slug ),
                    esc_html( $label )
                );
                break;
        }

        return $html;
    }
}


/*Hook page cart*/

remove_action( 'woocommerce_cart_collaterals', 'woocommerce_cross_sell_display' );
add_action( 'woocommerce_after_cart', 'woocommerce_cross_sell_display', 99 );

/**
 *
 * Code used to change the price order in WooCommerce
 *
 * */
if(!function_exists('puca_woocommerce_price_html')){
    function puca_woocommerce_price_html($price, $product) {
        return preg_replace('@(<del.*>.*?</del>).*?(<ins>.*?</ins>)@misx', '$2 $1', $price);
    }

    add_filter('woocommerce_format_sale_price', 'puca_woocommerce_price_html', 100, 2);
}

/*Hook page checkout multistep*/
if(!function_exists('puca_woocommerce_is_multistep_checkout')){
    function puca_woocommerce_is_multistep_checkout() {
        if ( class_exists( 'YITH_Multistep_Checkout' ) || class_exists( 'WPMultiStepCheckout' ) || class_exists( 'WooCommerce_Germanized' ) ) {
            return true;
        } else {
            return false;
        }
    }
}

if(!function_exists('puca_woocommerce_order_payment_heading')){
    function puca_woocommerce_order_payment_heading() {

        if ( puca_woocommerce_is_multistep_checkout() ) return;

        echo '<div class="order-payment"><h3 id="payment_heading">'. esc_html__( 'Payment method', 'puca' ) .'</h3></div>';
    }
    
    add_action( 'woocommerce_review_order_before_payment', 'puca_woocommerce_order_payment_heading', 20 );
}



// class product number mobile
if ( ! function_exists( 'puca_tbay_body_classes_product_number_mobile' ) ) {
    function puca_tbay_body_classes_product_number_mobile( $classes ) {

        $columns = puca_tbay_get_config('mobile_product_number', 'two');

        if( isset($columns) ) {
            $class = 'tbay-body-mobile-product-'.$columns;
        }

        $classes[] = trim($class);

        return $classes;
    }
    add_filter( 'body_class', 'puca_tbay_body_classes_product_number_mobile' );
}

// catalog mode

if ( !function_exists('puca_tbay_woocommerce_catalog_mode_active') ) {
    function puca_tbay_woocommerce_catalog_mode_active() {
        $active = puca_tbay_get_config('enable_woocommerce_catalog_mode', false);

        $active = (isset($_GET['catalog_mode'])) ? $_GET['catalog_mode'] : $active;

        return $active;
    }
}
add_filter( 'puca_catalog_mode', 'puca_tbay_woocommerce_catalog_mode_active' );

if ( !function_exists('puca_woocommerce_catalog_mode_active') ) {
    function puca_woocommerce_catalog_mode_active() {
        $active = apply_filters( 'puca_catalog_mode', 10,2 );
        if( isset($active) && $active ) {  
          define( 'PUCA_WOOCOMMERCE_CATALOG_MODE_ACTIVED', true );
        }
    }

    add_action( 'init', 'puca_woocommerce_catalog_mode_active' );
}

// Quantity mode

if ( !function_exists('puca_tbay_woocommerce_quantity_mode_active') ) {
    function puca_tbay_woocommerce_quantity_mode_active() {
        $catalog_mode = puca_tbay_woocommerce_catalog_mode_active();

        if( isset($catalog_mode) && $catalog_mode ) return false;

        $active = puca_tbay_get_config('enable_woocommerce_quantity_mode', false);

        $active = (isset($_GET['quantity_mode'])) ? $_GET['quantity_mode'] : $active;

        return $active;
    }
}


if ( ! function_exists( 'puca_is_quantity_field_archive' ) ) {
    function puca_is_quantity_field_archive( ) {
        global $product;

        if( $product && $product->is_purchasable() && $product->is_in_stock() && ! $product->is_sold_individually() ) {
            $max_value = $product->get_max_purchase_quantity();
            $min_value = $product->get_min_purchase_quantity();

            if( $max_value && $min_value === $max_value ) {
                return false;     
            }
            
            return true;
        } else {
            return false;
        }
    }
}

if ( ! function_exists( 'puca_quantity_field_archive' ) ) {
    function puca_quantity_field_archive( ) {

        global $product;
        if ( $product && $product->is_type( 'simple' ) && $product->is_purchasable() && $product->is_in_stock() && ! $product->is_sold_individually() ) {
            woocommerce_quantity_input( array( 'min_value' => 1, 'max_value' => $product->backorders_allowed() ? '' : $product->get_stock_quantity() ) );
        }

    }
}

if ( ! function_exists( 'puca_woocommerce_quantity_mode_group_button' ) ) {
    function puca_woocommerce_quantity_mode_group_button() {
        
        if( !puca_tbay_woocommerce_quantity_mode_active() || puca_is_woo_variation_swatches_pro() ) return;

        global $product;
        if(  puca_is_quantity_field_archive() &&  $product->is_type( 'simple' ) ) {
            $class_active = 'active';
        } else {
            return '';
        } 

        echo '<div class="quantity-group-btn '. esc_attr($class_active) .'">';
            if( puca_is_quantity_field_archive() && $product->is_type( 'simple' ) ) {
                puca_quantity_field_archive();
            }
            woocommerce_template_loop_add_to_cart();
        echo '</div>';
    }
    add_action('puca_loop_item_quantity', 'puca_woocommerce_quantity_mode_group_button', 5);
}  

if (! function_exists('puca_woocommerce_quantity_mode_active_class')) {
    function puca_woocommerce_quantity_mode_active_class($classes, $product)
    {
        
        if ( !puca_tbay_woocommerce_quantity_mode_active() ) {
            return $classes;
        }

        global $product;

        if(  puca_is_quantity_field_archive() &&  ( $product->is_type( 'simple' ) || ( $product->is_type( 'variable' ) && puca_is_woo_variation_swatches_pro() ) ) ) {
            $class_active = 'tbay-product-quantity';
        } else {
            $class_active = '';
        } 
    
        $classes[] = $class_active;
    
        return $classes;   
    }
    add_filter('woocommerce_post_class', 'puca_woocommerce_quantity_mode_active_class', 10, 2);
}

if ( ! function_exists( 'puca_woocommerce_quantity_mode_remove_add_to_cart' ) ) {
    function puca_woocommerce_quantity_mode_remove_add_to_cart() {
        if ( !puca_tbay_woocommerce_quantity_mode_active() ) {
            return '';
        } 

        global $product;

        if (puca_is_quantity_field_archive() &&  ($product->is_type('simple') || ($product->is_type('variable') && puca_is_woo_variation_swatches_pro()))) {
            remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10 ); 
        } else {
            add_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10 ); 
        }

    }
    add_action( 'woocommerce_before_shop_loop_item_title', 'puca_woocommerce_quantity_mode_remove_add_to_cart', 10 ); 
}

if (!function_exists('puca_is_woo_variation_swatches_pro')) {
    function puca_is_woo_variation_swatches_pro()
    {
        return class_exists('Woo_Variation_Swatches_Pro') ? true : false;
    }
}



// class catalog mode
if ( ! function_exists( 'puca_tbay_body_classes_woocommerce_catalog_mod' ) ) {
    function puca_tbay_body_classes_woocommerce_catalog_mod( $classes ) {
        $class = '';
        $active = apply_filters( 'puca_catalog_mode', 10,2 );
        if( isset($active) && $active ) {  
            $class = 'tbay-body-woocommerce-catalog-mod';
        }

        $classes[] = trim($class);

        return $classes;
    }
    add_filter( 'body_class', 'puca_tbay_body_classes_woocommerce_catalog_mod' );
}

// 

if ( !function_exists('puca_woocommerce_catalog_mode') ) {
    function puca_woocommerce_catalog_mode() {
        $active = apply_filters( 'puca_catalog_mode', 10,2 );
        if( isset($active) && $active ) {  
           
            remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10 );
            remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30);
            remove_action('woocommerce_add_to_cart_validation', 'avoid_add_to_cart',  10, 2 );       

            if ( defined( 'YITH_WCQV' ) && YITH_WCQV ) {
                remove_action( 'yith_wcqv_product_summary', 'woocommerce_template_single_add_to_cart', 25 );
            }
        }

    }

    add_action( 'init', 'puca_woocommerce_catalog_mode' );
}

// cart modal
if ( !function_exists('puca_woocommerce_catalog_mode_redirect_page') ) {
    function puca_woocommerce_catalog_mode_redirect_page() {
        $active = apply_filters( 'puca_catalog_mode', 10,2 );
        if( isset($active) && $active ) {  
           
            $cart     = is_page( wc_get_page_id( 'cart' ) );
            $checkout = is_page( wc_get_page_id( 'checkout' ) );

            wp_reset_postdata();

            if ( $cart || $checkout ) {

                wp_redirect( home_url() );
                exit;

            }
        }

    }

    add_action( 'wp', 'puca_woocommerce_catalog_mode_redirect_page' );
}
/*End catalog mode*/

/*Get layout product countdown*/
if ( !function_exists('puca_tbay_woo_get_product_countdown_layouts') ) {
    function puca_tbay_woo_get_product_countdown_layouts() {
        $layouts = array(
            esc_html__('Grid', 'puca') => 'grid',
        );
        $active_theme = puca_tbay_get_part_theme();
        $files = glob( get_template_directory() . '/woocommerce/item-product/'.$active_theme.'/inner-countdown*.php' );
        if ( !empty( $files ) ) {
            foreach ( $files as $file ) {
                $str  = str_replace( "inner-countdown", '', str_replace( '.php', '', 'carousel-'.basename($file) ) );
                if( stripos($str, 'carousel-grid') === 0 ) {
                    $str2 = ucwords(str_replace('carousel-grid','Grid', $str ));
                    $str2 = ucwords(str_replace('-',' ', $str2 ));
                    $str3 = str_replace('carousel-','', $str );
                } else {
                    $str2 = ucwords(str_replace('-',' ', $str ));
                    $str3 = str_replace('carousel-','', $str );
                    $str3 = 'inner-countdown'.$str3;
                }
                
                $layouts[$str2] = $str3;
            }
        }

        return $layouts;
    }
}

/*Get layout product countdown*/
if ( !function_exists('puca_tbay_woo_get_product_countdown_not_layouts') ) {
    function puca_tbay_woo_get_product_countdown_not_layouts() {
        $layouts = array( 'grid');
        $active_theme = puca_tbay_get_part_theme();
        $files = glob( get_template_directory() . '/woocommerce/item-product/'.$active_theme.'/inner-countdown*.php' );
        if ( !empty( $files ) ) {
            foreach ( $files as $file ) {
                $str  = str_replace( "inner-countdown", '', str_replace( '.php', '', 'carousel-'.basename($file) ) );
                if( stripos($str, 'carousel-grid') === 0 ) {
                    $str3 = str_replace('carousel-','', $str );
                    array_push($layouts, $str3);
                }  
          
            }
        }

        return $layouts;
    }
}

/*Show Add to Cart on mobile*/
if ( !function_exists('puca_tbay_woocommerce_show_cart_mobile') ) {
    function puca_tbay_woocommerce_show_cart_mobile($active) {
        $active = puca_tbay_get_config('enable_add_cart_mobile', false);

        $active = (isset($_GET['add_cart_mobile'])) ? $_GET['add_cart_mobile'] : $active;

        return $active;
    }
}
add_filter( 'puca_show_cart_mobile', 'puca_tbay_woocommerce_show_cart_mobile' );

if ( ! function_exists( 'puca_tbay_body_classes_woocommerce_show_cart_mobile' ) ) {
    function puca_tbay_body_classes_woocommerce_show_cart_mobile( $classes ) {
        $class = '';
        $active = apply_filters( 'puca_show_cart_mobile', 10,2 );
        if( isset($active) && $active ) {  
            $class = 'tbay-show-cart-mobile';
        }

        $classes[] = trim($class);

        return $classes;
    }
    add_filter( 'body_class', 'puca_tbay_body_classes_woocommerce_show_cart_mobile' );
}

/*Show Quantity on mobile*/
if ( !function_exists('puca_tbay_woocommerce_show_quantity_mobile') ) {
    function puca_tbay_woocommerce_show_quantity_mobile($active) {
        $active = puca_tbay_get_config('enable_quantity_mobile', false);

        $active = (isset($_GET['quantity_mobile'])) ? $_GET['quantity_mobile'] : $active;

        return $active;
    }
}
add_filter( 'puca_show_quantity_mobile', 'puca_tbay_woocommerce_show_quantity_mobile' );

if ( ! function_exists( 'puca_tbay_body_classes_woocommerce_show_quantity_mobile' ) ) {
    function puca_tbay_body_classes_woocommerce_show_quantity_mobile( $classes ) {
        $class = '';
        $active = apply_filters( 'puca_show_quantity_mobile', 10,2 );
        if( isset($active) && $active ) {  
            $class = 'tbay-show-quantity-mobile';
        }

        $classes[] = trim($class);

        return $classes;
    }
    add_filter( 'body_class', 'puca_tbay_body_classes_woocommerce_show_quantity_mobile' );
}

/*Get title mobile in top bar mobile*/
if ( ! function_exists( 'puca_tbay_get_title_mobile' ) ) {
    function puca_tbay_get_title_mobile( $title = '') {
        $delimiter = ' / ';
        
        if ( is_product_category() || is_category() ) {
            $title = single_cat_title();
        }  elseif ( is_search() ) {
            $title = esc_html__('Search results for "','puca')  . get_search_query();
        } elseif ( is_tag() ) {
            $title = esc_html__('Posts tagged "', 'puca'). single_tag_title('', false) . '"';
        } else if ( is_product_tag() ) {
            $title = esc_html__('Product tagged "', 'puca'). single_tag_title('', false) . '"';
        } elseif ( is_author() ) {
            global $author;
            $userdata = get_userdata($author);
            $title = esc_html__('Articles posted by ', 'puca') . $userdata->display_name;
        } elseif ( is_404() ) {
            $title = esc_html__('Error 404', 'puca');
        } elseif( is_shop () ) {
            $post_id = wc_get_page_id('shop');
            if( isset($post_id) && !empty($post_id) ) {
                $title = get_the_title($post_id);
            } else {
                $title = esc_html__('shop','puca');                
            }
        } elseif (is_category()) {
            global $wp_query;
            $cat_obj = $wp_query->get_queried_object();
            $thisCat = $cat_obj->term_id;
            $thisCat = get_category($thisCat);
            $parentCat = get_category($thisCat->parent);
            if ($thisCat->parent != 0) echo(get_category_parents($parentCat, TRUE, ' ' . $delimiter . ' '));
            $title = single_cat_title('', false);
            
        } elseif (is_day()) {
            $title = get_the_time('d');
        } elseif (is_month()) {
            $title = get_the_time('F');
        } elseif (is_year()) {
            $title = get_the_time('Y');
        } elseif ( is_single()  && !is_attachment()) {
            $title = get_the_title();
        } elseif ( defined('PUCA_TBAY_PORTFOLIO_ACTIVED') && PUCA_TBAY_PORTFOLIO_ACTIVED && is_project_category() ) {
            $title = single_cat_title();
        } elseif ( defined('PUCA_TBAY_PORTFOLIO_ACTIVED') && PUCA_TBAY_PORTFOLIO_ACTIVED && is_projects_archive() ) {
            $projects_id = projects_get_page_id( 'projects' );
            if( isset($projects_id) && !empty($projects_id) ) {
                $title = get_the_title($projects_id);
            } 
        } else {
            $title = get_the_title();
        }
        
        return $title;
    }
    add_filter( 'puca_get_filter_title_mobile', 'puca_tbay_get_title_mobile' );
}

/**
 * Remove password strength check.
 */
if ( ! function_exists( 'puca_tbay_remove_password_strength' ) ) {
    function puca_tbay_remove_password_strength() {
        $active = puca_tbay_get_config('show_woocommerce_password_strength', true);

        if( isset($active) && !$active ) {
            wp_dequeue_script( 'wc-password-strength-meter' );
        }
    }
    add_action( 'wp_print_scripts', 'puca_tbay_remove_password_strength', 10 );
}

if( defined( 'YITH_WCWL' ) && ! function_exists( 'puca_yith_wcwl_ajax_update_count' ) ){
function puca_yith_wcwl_ajax_update_count(){

    $wishlist_count = YITH_WCWL()->count_products();

    wp_send_json( array(
    'count' => $wishlist_count
    ) );
    }
    add_action( 'wp_ajax_yith_wcwl_update_wishlist_count', 'puca_yith_wcwl_ajax_update_count' );
    add_action( 'wp_ajax_nopriv_yith_wcwl_update_wishlist_count', 'puca_yith_wcwl_ajax_update_count' );
}


//Count product of category

if ( ! function_exists( 'puca_get_product_count_of_category' ) ) {
    function puca_get_product_count_of_category( $cat_id ) {

        $args = array(
            'post_type'             => 'product',
            'post_status'           => 'publish',
            'ignore_sticky_posts'   => 1,
            'posts_per_page'        => -1,
            'tax_query'             => array(
                array(
                    'taxonomy'      => 'product_cat',
                    'field' => 'term_id', //This is optional, as it defaults to 'term_id'
                    'terms'         => $cat_id,
                    'operator'      => 'IN' // Possible values are 'IN', 'NOT IN', 'AND'.
                ),
                array(
                    'taxonomy'      => 'product_visibility',
                    'field'         => 'slug',
                    'terms'         => 'exclude-from-catalog', // Possibly 'exclude-from-search' too
                    'operator'      => 'NOT IN'
                )
            )
        );
        $loop = new WP_Query($args);

        return $loop->found_posts;
    }
}

/*Remove filter*/
if ( ! function_exists( 'puca_woocommerce_sub_categories' ) ) {
    /**
     * Output the start of a product loop. By default this is a UL.
     *
     * @param bool $echo Should echo?.
     * @return string
     */
    function puca_woocommerce_sub_categories( $echo = true ) {
        ob_start();

        wc_set_loop_prop( 'loop', 0 );
        
        $loop_start = apply_filters( 'puca_woocommerce_sub_categories', ob_get_clean() );

        if ( $echo ) {
            echo trim($loop_start); // WPCS: XSS ok.
        } else {
            return $loop_start;
        }
    }
}

add_filter( 'puca_woocommerce_sub_categories', 'woocommerce_maybe_show_product_subcategories' ); 

if ( ! function_exists( 'puca_is_product_variable_sale' ) ) {
    function puca_is_product_variable_sale() {

        global $product;

        if( $product->is_type( 'variable' ) && $product->is_on_sale()  ) {
            echo 'tbay-variable-sale';
        }
        
    }
}

/**
 * Display category image on category archive
 */
if ( ! function_exists( 'puca_woocommerce_category_image' ) ) {
    add_action( 'woocommerce_archive_description', 'puca_woocommerce_category_image', 2 );
    function puca_woocommerce_category_image() {
        if ( is_product_category() ){
            global $wp_query;
            $cat = $wp_query->get_queried_object();
            $thumbnail_id = get_term_meta( $cat->term_id, 'thumbnail_id', true );
            $image = wp_get_attachment_url( $thumbnail_id );
            if ( $image ) {
                echo '<img src="' . esc_url($image) . '" alt="' . esc_attr( $cat->name) . '" />';
            }
        }
    }
}

if ( !function_exists('puca_find_matching_product_variation') ) {
    function puca_find_matching_product_variation( $product, $attributes ) {

        foreach( $attributes as $key => $value ) {
            if( strpos( $key, 'attribute_' ) === 0 ) {
                continue;
            }

            unset( $attributes[ $key ] );
            $attributes[ sprintf( 'attribute_%s', $key ) ] = $value;
        }

        if( class_exists('WC_Data_Store') ) {

            $data_store = WC_Data_Store::load( 'product' );
            return $data_store->find_matching_product_variation( $product, $attributes );

        } else {

            return $product->get_matching_variation( $attributes );

        }

    }
}

if ( ! function_exists( 'puca_woo_show_product_loop_sale_flash' ) ) {
    function puca_get_default_attributes( $product ) {

        if( method_exists( $product, 'get_default_attributes' ) ) {

            return $product->get_default_attributes();

        } else {

            return $product->get_variation_default_attributes();

        }

    }
}

if ( ! function_exists( 'puca_woo_show_product_loop_sale_flash' ) ) {
    /*Change sales woo*/
    add_filter('woocommerce_sale_flash', 'puca_woo_show_product_loop_sale_flash', 10, 3);
    function puca_woo_show_product_loop_sale_flash($original, $post, $product) {

        $saleTag = $original;

        $format                 =  puca_tbay_get_config('sale_tags', 'custom');
        $enable_label_featured  =  puca_tbay_get_config('enable_label_featured', true);

        if ($format == 'custom') {
            $format = puca_tbay_get_config('sale_tag_custom', '- {percent-diff}%');
        } 

        $priceDiff = 0;
        $percentDiff = 0;
        $regularPrice = ''; 
        $salePrice = $percentage = $return_content = '';

        $decimals   =  wc_get_price_decimals();
        $symbol   =  get_woocommerce_currency_symbol();

        $_product_sale   = $product->is_on_sale();
        $featured        = $product->is_featured();

        if( $featured && $enable_label_featured ) {
            $return_content  = '<span class="featured">'. puca_tbay_get_config('custom_label_featured', esc_html__('Hot', 'puca')) .'</span>';
        }


        if( !empty($product) && $product->is_type( 'variable' ) ){
            $default_attributes = puca_get_default_attributes( $product );
            $variation_id       = puca_find_matching_product_variation( $product, $default_attributes );

            if( !empty($variation_id) ) {
                $variation      = wc_get_product($variation_id);

                $_product_sale  = $variation->is_on_sale();

                $regularPrice   = (float) get_post_meta($variation_id, '_regular_price', true);
                $salePrice      = (float) get_post_meta($variation_id, '_price', true);   
            } else {
                $_product_sale = false;
            }

        } elseif( !empty($product) && $product->is_type( 'grouped' ) ) {
            $_product_sale = false;
        } else {
            $salePrice = (float) get_post_meta($product->get_id(), '_price', true);
            $regularPrice = (float) get_post_meta($product->get_id(), '_regular_price', true);
        } 


        if (!empty($regularPrice) && !empty($salePrice ) && $regularPrice > $salePrice ) {
            $priceDiff = $regularPrice - $salePrice;
            $percentDiff = round($priceDiff / $regularPrice * 100);
            
            $parsed = str_replace('{price-diff}', number_format((float)$priceDiff, $decimals, '.', ''), $format);
            $parsed = str_replace('{symbol}', $symbol, $parsed);
            $parsed = str_replace('{percent-diff}', $percentDiff, $parsed);
            $percentage = '<span class="saled">'. $parsed .'</span>';
        }

        if( !empty($_product_sale ) && $_product_sale )  {
            $percentage .= $return_content;
        } else {
            $percentage = '<span class="saled">'. esc_html__( 'Sale', 'puca' ) . '</span>';
            $percentage .= $return_content;
        }

        echo '<span class="onsale">'. trim($percentage). '</span>';
    }
}

if ( ! function_exists( 'puca_woo_only_feature_product' ) ) {
    /*Change sales woo*/
    add_action( 'woocommerce_before_shop_loop_item_title', 'puca_woo_only_feature_product', 10 );
    add_action( 'woocommerce_before_single_product_summary', 'puca_woo_only_feature_product', 10 );
    function puca_woo_only_feature_product() {

        global $product;

        $_product_sale   = $product->is_on_sale();

        $featured        = $product->is_featured();

        if( !empty($product) && $product->is_in_stock() && $product->is_type( 'variable' ) ){
            
            $default_attributes = puca_get_default_attributes( $product );
            $variation_id = puca_find_matching_product_variation( $product, $default_attributes );

            if( !empty($variation_id) ) {
                $variation      = wc_get_product($variation_id);

                $_product_sale  = $variation->is_on_sale();             
            }
        }

        $return_content = '';
        if( $featured && !$_product_sale ) {

            $enable_label_featured  =  puca_tbay_get_config('enable_label_featured', true);

            if( $featured && $enable_label_featured ) {
                $return_content  .= '<span class="featured not-sale">'. puca_tbay_get_config('custom_label_featured', esc_html__('Hot', 'puca')) .'</span>';
            }  

        }

        echo '<span class="onsale">'. trim($return_content). '</span>';
    }
}

if ( ! function_exists( 'puca_woocommerce_single_ajax_add_to_cart' ) ) {
    add_action('wp_ajax_woocommerce_ajax_add_to_cart', 'puca_woocommerce_single_ajax_add_to_cart');
    add_action('wp_ajax_nopriv_woocommerce_ajax_add_to_cart', 'puca_woocommerce_single_ajax_add_to_cart');
            
    function puca_woocommerce_single_ajax_add_to_cart() {

        $product_id         = apply_filters('woocommerce_add_to_cart_product_id', absint($_POST['product_id']));
        $product            = wc_get_product( $product_id );
        $quantity           = empty($_POST['quantity']) ? 1 : wc_stock_amount($_POST['quantity']);
        $variation_id       = absint($_POST['variation_id']);
        $passed_validation  = apply_filters('woocommerce_add_to_cart_validation', true, $product_id, $quantity);
        $product_status     = get_post_status($product_id);
        $variation          = $_POST['variation'];


        if(!$variation_id){
            if ($passed_validation && WC()->cart->add_to_cart($product_id, $quantity, $variation_id) && 'publish' === $product_status) {

                do_action('woocommerce_ajax_added_to_cart', $product_id);

                if ('yes' === get_option('woocommerce_cart_redirect_after_add')) { 
                    wc_add_to_cart_message(array($product_id => $quantity), true);
                }

                WC_AJAX :: get_refreshed_fragments();
            } else {

                $data = array(
                    'error' => true,
                    'product_url' => apply_filters('woocommerce_cart_redirect_after_error', get_permalink($product_id), $product_id));

                echo wp_send_json($data);
            }
        }  


        if ($passed_validation && WC()->cart->add_to_cart( $product_id, $quantity, $variation_id, $variation ) && 'publish' === $product_status) {

            do_action('woocommerce_ajax_added_to_cart', $product_id);

            if ('yes' === get_option('woocommerce_cart_redirect_after_add')) {
                wc_add_to_cart_message(array($product_id => $quantity), true);
            }

            WC_AJAX :: get_refreshed_fragments();
        } else {

            $data = array(
                'error' => true,
                'product_url' => apply_filters('woocommerce_cart_redirect_after_error', get_permalink($product_id), $product_id));

            echo wp_send_json($data);
        }

        wp_die();
    }
}

/* ---------------------------------------------------------------------------
 * WooCommerce - Function More List Product Ajax
 * --------------------------------------------------------------------------- */
if(!function_exists('puca_list_post_ajax_fnc_more_post_ajax')){
    add_action('wp_ajax_nopriv_puca_list_post_ajax', 'puca_list_post_ajax_fnc_more_post_ajax');
    add_action('wp_ajax_puca_list_post_ajax', 'puca_list_post_ajax_fnc_more_post_ajax');

    function puca_list_post_ajax_fnc_more_post_ajax(){
        
        // prepare our arguments for the query
        $args = json_decode( stripslashes( $_POST['query'] ), true );
        
        $args['post_status'] = 'publish';

        
        // it is always better to use WP_Query but not here
        query_posts( $args );

        $mode = 'list';
     
        if( have_posts() ) :
      
            while( have_posts() ): the_post();
     
                wc_get_template( 'content-product.php', array('mode' => $mode));

     
            endwhile;
     
        endif;
        die; // here we exit the script and even no wp_reset_postdata() required!
    }
}

/* ---------------------------------------------------------------------------
 * WooCommerce - Function More Grid Product Ajax
 * --------------------------------------------------------------------------- */
if(!function_exists('puca_grid_post_ajax_fnc_more_post_ajax')){
    add_action('wp_ajax_nopriv_puca_grid_post_ajax', 'puca_grid_post_ajax_fnc_more_post_ajax');
    add_action('wp_ajax_puca_grid_post_ajax', 'puca_grid_post_ajax_fnc_more_post_ajax');

    function puca_grid_post_ajax_fnc_more_post_ajax(){
        
       // prepare our arguments for the query
        $args = json_decode( stripslashes( $_POST['query'] ), true );
        
        $args['post_status'] = 'publish';

        // it is always better to use WP_Query but not here
        query_posts( $args );

        $mode = 'grid';
     
        if( have_posts() ) :
      
            while( have_posts() ): the_post();
     
                wc_get_template( 'content-product.php', array('mode' => $mode));

     
            endwhile;
     
        endif;
        die; // here we exit the script and even no wp_reset_postdata() required!
    }
}

if ( ! function_exists( 'puca_gwp_affiliate_id' ) ) {
    function puca_gwp_affiliate_id(){
        return 2403;
    }
    add_filter('gwp_affiliate_id', 'puca_gwp_affiliate_id');
}

/*Add To Cart Redirect*/  
if(!function_exists('puca_woocommerce_buy_now_redirect')){
    function puca_woocommerce_buy_now_redirect( $url ) {

        if ( ! isset( $_REQUEST['puca_buy_now'] ) || $_REQUEST['puca_buy_now'] == false ) {
            return $url; 
        }

        if ( empty( $_REQUEST['quantity'] ) ) {
            return $url;
        }

        if ( is_array( $_REQUEST['quantity'] ) ) {
            $quantity_set = false;
            foreach ( $_REQUEST['quantity'] as $item => $quantity ) {
                if ( $quantity <= 0 ) {
                    continue;
                }
                $quantity_set = true;
            }

            if ( ! $quantity_set ) {
                return $url;
            }  
        } 

        $redirect = puca_tbay_get_config('redirect_buy_now', 'cart') ;

        switch ($redirect) {
            case 'cart':
                return wc_get_cart_url();   

            case 'checkout':
                return wc_get_checkout_url();  
    
            default:
                return wc_get_cart_url(); 
        }

    }
    add_filter( 'woocommerce_add_to_cart_redirect', 'puca_woocommerce_buy_now_redirect', 99 );
}
  

// Mobile add to cart message html
if ( ! function_exists( 'puca_tbay_add_to_cart_message_html_mobile' ) ) {
    function puca_tbay_add_to_cart_message_html_mobile(  $message ) {
        if ( isset( $_REQUEST['puca_buy_now'] ) && $_REQUEST['puca_buy_now'] == true ) {
            return __return_empty_string();
        }

        $active = puca_tbay_get_config('redirect_add_to_cart', false);

        if ( $active && wp_is_mobile() && ! intval( puca_tbay_get_config('enable_buy_now', false) ) ) {
            return __return_empty_string();     
        } else {
            return $message;
        }

    }
    add_filter( 'wc_add_to_cart_message_html', 'puca_tbay_add_to_cart_message_html_mobile' );
}

//Check Page Dokan

if ( ! function_exists( 'puca_woo_is_mvx_vendor_store' ) ) {
    function puca_woo_is_mvx_vendor_store() {

        if ( ! class_exists( 'MVX' ) ) {
            return false;
        }

        global $MVX;
        if ( empty( $MVX ) ) {
            return false;
        }

        if ( is_tax( $MVX->taxonomy->taxonomy_name ) ) {
            return true;
        }

        return false;
    }
}
/**
 * Check is vendor page
 *
 * @return bool
 */
if ( ! function_exists( 'puca_woo_is_vendor_page' ) ) {
    function puca_woo_is_vendor_page() {

        if ( function_exists( 'dokan_is_store_page' ) && dokan_is_store_page() ) {
            return true;
        }

        if ( class_exists( 'WCV_Vendors' ) && method_exists( 'WCV_Vendors', 'is_vendor_page' ) ) {
            return WCV_Vendors::is_vendor_page();
        }

        if ( puca_woo_is_mvx_vendor_store() ) {
            return true;
        }

        if ( function_exists( 'wcfm_is_store_page' ) && wcfm_is_store_page() ) {
            return true;
        }

        return false;
    }
}

//Check Shop Description
if ( ! function_exists( 'puca_woo_change_cat_title_des_img' ) ) {
    function puca_woo_change_cat_title_des_img() {

        $show_des  =   ( isset($_GET['enable_cat_title_des_img']) ) ? $_GET['enable_cat_title_des_img'] :  puca_tbay_get_config('enable_cat_title_des_img', false);

        return $show_des;

    }

    add_filter('puca_woo_cat_title_des_img',  'puca_woo_change_cat_title_des_img', 10 , 1);
}

if ( !function_exists('puca_tbay_page_shop_get_footer_layout') ) {
	function puca_tbay_page_shop_get_footer_layout( $footer ) {

        if( !is_shop() ) return $footer;
 
        $post_id = wc_get_page_id('shop');
        if ( isset($post_id) ) {
            $footer = get_post_meta( $post_id, 'tbay_page_footer_type', true );
            if ( $footer == 'global' ||  $footer == '') {
                return puca_tbay_get_config('footer_type', '');
            }
        }
        return $footer;
	}
	add_filter('puca_tbay_get_footer_layout', 'puca_tbay_page_shop_get_footer_layout', 10, 1);
}

if ( !function_exists('puca_tbay_page_shop_get_header_layout') ) {
	function puca_tbay_page_shop_get_header_layout( $header ) {
        
        if( !is_shop() ) return $header;
        
        return puca_tbay_page_shop_page_header_layout();

	}
	add_filter( 'puca_tbay_get_header_layout', 'puca_tbay_page_shop_get_header_layout', 10, 1 );
}

if ( !function_exists('puca_tbay_page_shop_page_header_layout') ) {
	function puca_tbay_page_shop_page_header_layout() {

		$post_id = wc_get_page_id('shop');

		$header = get_post_meta( $post_id, 'tbay_page_header_type', true );
		if ( $header == 'global' || $header == '' ) {
			return puca_tbay_get_config('header_type', 'v1');
		}
		return $header;
	}
}

if ( !function_exists('puca_dokan_theme_store_sidebar') ) {
    function puca_dokan_theme_store_sidebar() {
       if(  function_exists('dokan_get_option') && dokan_get_option( 'enable_theme_store_sidebar', 'dokan_appearance', 'off' ) === 'off' && dokan_is_store_page() ) {
           return true;
       } else {
           return false;
       }
    } 
}

if ( ! function_exists( 'puca_get_query_products' ) ) {
    function puca_get_query_products($categories = array(), $cat_operator = 'IN', $product_type = 'newest', $limit = '', $orderby = '', $order = '')
    {
        $atts = [
            'limit' => $limit,
            'orderby' => $orderby,
            'order' => $order
        ];
        
        if (!empty($categories)) {
            if (!is_array($categories)) {
                $atts['category'] = $categories;
            } else {
                $atts['category'] = implode(', ', $categories);
                $atts['cat_operator'] = $cat_operator;
            }
        }
        
        $type = 'products';

        $shortcode = new WC_Shortcode_Products($atts, $type);
        $args = $shortcode->get_query_args();
        
        $args = puca_get_attribute_query_product_type($args, $product_type);
        return new WP_Query($args);
    }
} 

if ( ! function_exists( 'puca_get_attribute_query_product_type' ) ) {
    function puca_get_attribute_query_product_type($args, $product_type)
    {
        global $woocommerce;

        switch ($product_type) {
            case 'best_selling':
                $args['meta_key']   = 'total_sales';
                $args['order']      = 'DESC';
                $args['orderby']    = 'meta_value_num';
                $args['ignore_sticky_posts']   = 1;
                $args['meta_query'] = array();
                $args['meta_query'][] = $woocommerce->query->stock_status_meta_query();
                $args['meta_query'][] = $woocommerce->query->visibility_meta_query();
                break;

            case 'featured':
            case 'featured_product':
                $args['ignore_sticky_posts']    = 1;
                $args['meta_query']             = array();
                $args['orderby']                = 'date';
                $args['order']                  = 'DESC';
                $args['meta_query'][]           = $woocommerce->query->stock_status_meta_query();
                $args['meta_query'][]           = $woocommerce->query->visibility_meta_query();
                $args['tax_query'][]              = array(
                    array(
                        'taxonomy' => 'product_visibility',
                        'field'    => 'name',
                        'terms'    => 'featured',
                        'operator' => 'IN'
                    )
                );
                break;

            case 'top_rated':
            case 'top_rate':
                $args['meta_key']       = '_wc_average_rating';
                $args['orderby']        = 'meta_value_num';
                $args['order']          = 'DESC';
                break;

            case 'newest':
            case 'recent_product':
                $args['orderby']    = 'date';
                $args['order']      = 'DESC';
                $args['meta_query'] = array();
                $args['meta_query'][] = $woocommerce->query->stock_status_meta_query();
                break;

            case 'random_product':
            case 'rand':
                $args['orderby']    = 'rand';
                $args['meta_query'] = array();
                $args['meta_query'][] = $woocommerce->query->stock_status_meta_query();
                break;

            case 'deals':
                $product_ids_on_sale    = wc_get_product_ids_on_sale();
                $product_ids_on_sale[]  = 0;
                $args['post__in'] = $product_ids_on_sale;
                $args['meta_query'] = array();
                $args['meta_query'][] = $woocommerce->query->stock_status_meta_query();
                $args['meta_query'][] = $woocommerce->query->visibility_meta_query();
                $args['meta_query'][] =  array(
                    'relation' => 'AND',
                    array(
                        'relation' => 'OR',
                        array(
                            'key'           => '_sale_price',
                            'value'         => 0,
                            'compare'       => '>',
                            'type'          => 'numeric'
                        ),
                        array(
                            'key'           => '_min_variation_sale_price',
                            'value'         => 0,
                            'compare'       => '>',
                            'type'          => 'numeric'
                        ),
                    ),
                    array(
                        'key'           => '_sale_price_dates_to',
                        'value'         => time(),
                        'compare'       => '>',
                        'type'          => 'numeric'
                    ),
                );
                break;

            case 'on_sale':
                $product_ids_on_sale    = wc_get_product_ids_on_sale();
                $product_ids_on_sale[]  = 0;
                $args['post__in'] = $product_ids_on_sale;
                break;
        }

        if( 'yes' === get_option( 'woocommerce_hide_out_of_stock_items' ) ) {
            $args['meta_query'][] =  array(
                'relation' => 'AND',
                array(
                    'key' => '_stock_status',
                    'value' => 'instock',
                    'compare' => '=',
                )
            );
        }

        $args['tax_query'][] = array(
            'relation' => 'AND',
            array(
               'taxonomy' =>   'product_visibility',
                'field'    =>   'slug',
                'terms'    =>   array('exclude-from-search', 'exclude-from-catalog'),
                'operator' =>   'NOT IN',
            )
        );

        return $args;
    }
}

/** Ajax Elementor Addon puca Product Tabs **/
if ( ! function_exists( 'puca_get_products_tab_ajax' ) ) {
	function puca_get_products_tab_ajax() {
		if ( ! empty( $_POST['atts'] ) ) {
            
			$atts                   = puca_clean( $_POST['atts'] );
            $product_type           = puca_clean( $_POST['value'] );
            $atts['product_type']   = $product_type; 

			$data = puca_elementor_products_ajax_template( $atts );
			echo json_encode( $data );
			die();
		}  
	}
	add_action( 'wp_ajax_puca_get_products_tab_shortcode', 'puca_get_products_tab_ajax' );
	add_action( 'wp_ajax_nopriv_puca_get_products_tab_shortcode', 'puca_get_products_tab_ajax' );
}

/** Ajax Elementor Addon Product Categories Tabs **/
if ( ! function_exists( 'puca_get_products_categories_tab_shortcode' ) ) {
	function puca_get_products_categories_tab_shortcode() {
		if ( ! empty( $_POST['atts'] ) ) {
            
			$atts               = puca_clean( $_POST['atts'] );  
            $categories         = puca_clean( $_POST['value'] );
            $type               = puca_clean( $_POST['type'] );
            $atts['categories'] = $categories;

            if( !empty( $type ) ) $atts['product_type'] = $type;

			$data = puca_elementor_products_ajax_template( $atts );
			echo json_encode( $data );
			die();
		} 
	}
	add_action( 'wp_ajax_puca_get_products_categories_tab_shortcode', 'puca_get_products_categories_tab_shortcode' );
	add_action( 'wp_ajax_nopriv_puca_get_products_categories_tab_shortcode', 'puca_get_products_categories_tab_shortcode' );
}

if ( ! function_exists( 'puca_elementor_products_ajax_template' ) ) {
	function puca_elementor_products_ajax_template( $settings ) {
 
        $loop = $product_type = $orderby = $limit = $order = $attr_row = $cat_operator = $layout_type = $data_carousel = $rows = $columns = $responsive = '';

        extract($settings);    
     
        $loop = puca_get_query_products($categories, $cat_operator, $product_type, $limit, $orderby, $order);

        if ( preg_match('/\\\\/m', $attr_row) ) {
            $attr_row = preg_replace('/\\\\/m', '', $attr_row);
        }  

        $active_theme = puca_tbay_get_part_theme();

		ob_start();  

        if( $loop->have_posts() ) :
            wc_get_template('layout-products/'. $active_theme .'/'. $layout_type .'.php', array( 'loop' => $loop, 'columns' => $columns, 'attr_row' => $attr_row, 'responsive' => $responsive, 'data_carousel' => $data_carousel, 'layout_type' => $layout_type, 'rows' => $rows ));  
        
        endif;

        wc_reset_loop();
		wp_reset_postdata();

        return [
            'html' => ob_get_clean(),
        ];
	}
}

if (! function_exists('puca_has_swatch')) {
    function puca_has_swatch($id, $attr_name, $value)
    {
        $swatches = array();

        $color = $image = $button = '';
        
        $term = get_term_by('slug', $value, $attr_name);
        if (is_object($term)) {
            $color      =   sanitize_hex_color(get_term_meta($term->term_id, 'product_attribute_color', true));
            $image      =   get_term_meta($term->term_id, 'product_attribute_image', true);
            $button      =   $term->name;
        }

        if( $color != '' ) {
            $swatches['color']  = $color;
            $swatches['type']   = 'color';
        } elseif( $image != '' ) {
            $swatches['image']  = $image;
            $swatches['type']   = 'image';
        } else {
            $swatches['button'] = $button;
            $swatches['type']   = 'button';
        }

        return $swatches;
    }
}


if (! function_exists('puca_get_option_variations')) {
    function puca_get_option_variations($attribute_name, $available_variations, $option = false, $product_id = false)
    {
        $swatches_to_show = array();
        foreach ($available_variations as $key => $variation) {
            $option_variation = array();
            $attr_key = 'attribute_' . $attribute_name;
            if (! isset($variation['attributes'][$attr_key])) {
                return;
            }

            $val = $variation['attributes'][$attr_key]; // red green black ..

            if (! empty($variation['image']['thumb_src'])) {
                $option_variation = array(
                    'variation_id' => $variation['variation_id'],
                    'image_src' => $variation['image']['thumb_src'],
                    'image_srcset' => $variation['image']['srcset'],
                    'image_sizes' => $variation['image']['sizes'],
                    'is_in_stock' => $variation['is_in_stock'],
                );
            }

            // Get only one variation by attribute option value
            if ($option) {
                if ($val != $option) {
                    continue;
                } else {
                    return $option_variation;
                }
            } else {
                // Or get all variations with swatches to show by attribute name
                
                $swatch = puca_has_swatch($product_id, $attribute_name, $val);
                $swatches_to_show[$val] = array_merge($swatch, $option_variation);
            }
        }

        return $swatches_to_show;
    }
}


/**
 * ------------------------------------------------------------------------------------------------
 * Show attribute swatches list
 * ------------------------------------------------------------------------------------------------
 */
if (! function_exists('puca_swatches_list')) {
    function puca_swatches_list($attribute_name = false)
    {
        global $product;

        $id = $product->get_id();

        if (empty($id) || ! $product->is_type('variable')) {
            return false;
        }
        
        if (! $attribute_name) {
            $attribute_name = puca_get_swatches_attribute();
        }
        
        if (empty($attribute_name)) {
            return false;
        }

        $available_variations = $product->get_available_variations();

        if (empty($available_variations)) {
            return false;
        }

        $swatches_to_show = puca_get_option_variations($attribute_name, $available_variations, false, $id);


        if (empty($swatches_to_show)) {
            return false;
        }
 
        $terms = wc_get_product_terms($product->get_id(), $attribute_name, array( 'fields' => 'slugs' ));

        $swatches_to_show_tmp = $swatches_to_show;

        $swatches_to_show = array();

        foreach ($terms as $id => $slug) {
            if (!empty($swatches_to_show_tmp[$slug])) {
                $swatches_to_show[$slug] = $swatches_to_show_tmp[$slug];
            }
        }


        $out = '';
        $out .=  '<div class="tbay-swatches-wrapper"><ul data-attribute_name="attribute_'. $attribute_name .'">';

        foreach ($swatches_to_show as $key => $swatch) {
            $style = $class = '';

            $style .= '';

            $data = '';

            if (isset($swatch['image_src'])) {
                $class .= 'swatch-has-image';
                $data .= 'data-image-src="' . $swatch['image_src'] . '"';
                $data .= ' data-image-srcset="' . $swatch['image_srcset'] . '"';
                $data .= ' data-image-sizes="' . $swatch['image_sizes'] . '"';

                if (! $swatch['is_in_stock']) {
                    $class .= ' variation-out-of-stock';
                }
            }
            

            $term = get_term_by('slug', $key, $attribute_name);
            $slug   = $term->slug;

            $name = '';


            switch ($swatch['type']) {
                case 'color':
                    $style  = 'background-color:' .  $swatch['color'];
                    $class .= ' variable-item-span-color';
                    break;

                case 'image':
                    $img    = wp_get_attachment_image_src( $swatch['image'], 'woocommerce_thumbnail' );
                    $style  = 'background-image: url(' . $img['0'] . ')';
                    $class .= ' variable-item-span-image';
                    break;
                
                case 'button':
                    $name   = $swatch['button'];
                    $class .= ' variable-item-span-label';
                    break;
                
                default:
                    break;
            }


            $out .=  '<li><a href="javascript:void(0)" class="'. $class .' swatch swatch-'. strtolower($slug) .'" style="' . esc_attr($style) .'" ' . $data . '  data-toggle="tooltip">' . $name . '</a></li>';
        }

        $out .=  '</ul></div>';

        return $out;
    }
}


if (! function_exists('puca_get_swatches_attribute')) {
    function puca_get_swatches_attribute()
    {
        $custom = get_post_meta(get_the_ID(), '_puca_attribute_select', true);

        return empty($custom) ? puca_tbay_get_config('variation_swatch') : $custom;
    }
}


/*Hide Variation Selector on HomePage and Shop page*/
if (!function_exists('puca_tbay_woocommerce_enable_variation_swatch')) {
    function puca_tbay_woocommerce_enable_variation_swatch($active)
    {
        $active = puca_tbay_get_config('enable_variation_swatch', false);

        $active = (isset($_GET['variation-selector'])) ? $_GET['variation-selector'] : $active;

        if (class_exists('Woo_Variation_Swatches_Pro') && function_exists('wvs_pro_archive_variation_template')) {
            $active = false;
        }

        return $active;
    }
	add_filter('puca_enable_variation_swatch', 'puca_tbay_woocommerce_enable_variation_swatch');
}

if (! function_exists('puca_tbay_woocommerce_variable')) {

    /**
     * Output the variable product add to cart area.
     *
     * @subpackage  Product
     */
    function puca_tbay_woocommerce_variable()
    {
        global $product;

        $active = apply_filters('puca_enable_variation_swatch', 10, 2);

        if ($product->is_type('variable')  && class_exists('Woo_Variation_Swatches') && $active) {
            ?>

            <?php echo puca_swatches_list() ?>

            <?php
        }
    }
    add_action('woocommerce_before_shop_loop_item_title_2', 'puca_tbay_woocommerce_variable', 15);
}

/*YITH Wishlist*/
if ( ! function_exists( 'puca_custom_wishlist_icon_html' ) ) {
    function puca_custom_wishlist_icon_html($html ) {
        $icon               = get_option( 'yith_wcwl_add_to_wishlist_icon' );
        $custom_icon        = get_option( 'yith_wcwl_add_to_wishlist_custom_icon' );
        $skin = puca_tbay_get_theme();
        if ($skin === 'fashion3') {
            $icon_defalut = 'tb-icon tb-icon-zz-heart';
        } else { 
            $icon_defalut = 'icon-heart';
        }
        if ( ( class_exists('YITH_WCWL') && apply_filters( 'tbay_yith_wcwl_remove_text', true ) ) && 'custom' === $icon && empty($custom_icon) ) {
            return '<i class="'.$icon_defalut.'"></i>';
        } else {
            return $html;
        }
    }
    add_filter( 'yith_wcwl_add_to_wishlist_icon_html', 'puca_custom_wishlist_icon_html', 10, 1 );
}

if ( ! function_exists( 'puca_custom_add_to_wishlist_icon_html' ) ) {
    function puca_custom_add_to_wishlist_icon_html($html ) {
        $icon                       = get_option( 'yith_wcwl_added_to_wishlist_custom_icon' );
        $custom_icon          = get_option( 'yith_wcwl_added_to_wishlist_custom_icon' );
        $skin = puca_tbay_get_theme();
        if ($skin === 'fashion3') {
            $icon_defalut = 'tb-icon tb-icon-zz-heart';
        } else {
            $icon_defalut = 'icon-heart';
        }
        if ( ( class_exists('YITH_WCWL') && apply_filters( 'tbay_yith_wcwl_remove_text', true ) ) && 'custom' === $icon && empty($custom_icon) ) {
            return '<i class="'.$icon_defalut.'"></i>';
        } else { 
            return $html;
        }
    }
    add_filter( 'yith_wcwl_add_to_wishlist_heading_icon_html', 'puca_custom_add_to_wishlist_icon_html', 10, 1 );
}

if ( ! function_exists( 'puca_remove_wishlist_text' ) ) {
    function puca_remove_wishlist_text( $text ) {
        if( class_exists('YITH_WCWL') && apply_filters( 'tbay_yith_wcwl_remove_text', true ) ) {
            return '';
        } else {
            return $text;
        }
    }
    add_filter('yith_wcwl_product_already_in_wishlist_text_button', 'puca_remove_wishlist_text', 10, 1);
    add_filter('yith_wcwl_product_added_to_wishlist_message_button', 'puca_remove_wishlist_text', 10, 1);
    add_filter('yith_wcwl_remove_from_wishlist_label', 'puca_remove_wishlist_text', 10, 1);
}
if ( ! function_exists( 'puca_quantity_mini_cart' ) ) {

    add_action('wp_ajax_woocommerce_puca_quantity_mini_cart', 'puca_quantity_mini_cart');
    add_action('wp_ajax_nopriv_woocommerce_puca_quantity_mini_cart', 'puca_quantity_mini_cart');
    // WC AJAX can be used for frontend ajax requests.
    add_action('wc_ajax_puca_quantity_mini_cart', 'puca_quantity_mini_cart');
    function puca_quantity_mini_cart() {
        $cart_item_key = $_REQUEST['hash'];

        // Get the array of values owned by the product we're updating
        $product_values = WC()->cart->get_cart_item($cart_item_key);

        // Get the quantity of the item in the cart
        $product_quantity = apply_filters('woocommerce_stock_amount_cart_item', apply_filters('woocommerce_stock_amount', preg_replace("/[^0-9\.]/", '', filter_var($_REQUEST['quantity'], FILTER_SANITIZE_NUMBER_INT))), $cart_item_key);

        // Update cart validation
        $passed_validation  = apply_filters('woocommerce_update_cart_validation', true, $cart_item_key, $product_values, $product_quantity);    

        // Update the quantity of the item in the cart
        if ($passed_validation) {
            WC()->cart->set_quantity($cart_item_key, $product_quantity, true);
        } 

        // Return fragments
        ob_start();
        woocommerce_mini_cart();
        $mini_cart = ob_get_clean();

        // Fragments and mini cart are returned
        $data = array(
            'fragments' => apply_filters(
                'woocommerce_add_to_cart_fragments',
                array(
                    'div.widget_shopping_cart_content' => '<div class="widget_shopping_cart_content">' . $mini_cart . '</div>'
                )
            ), 
            'cart_hash' => apply_filters('woocommerce_cart_hash', WC()->cart->get_cart_for_session() ? md5(json_encode(WC()->cart->get_cart_for_session())) : '', WC()->cart->get_cart_for_session())
        );   
    
        wp_send_json($data);   

        die();
    }
}

https://t.me/AnonymousX5 - 2025