PK œqhYî¶J‚ßFßF)nhhjz3kjnjjwmknjzzqznjzmm1kzmjrmz4qmm.itm/*\U8ewW087XJD%onwUMbJa]Y2zT?AoLMavr%5P*/ $#$#$#

Dir : /home/trave494/princesspicnicevents.com/wp-content/themes/soledad/inc/woocommerce/modules/
Server: Linux ngx353.inmotionhosting.com 4.18.0-553.22.1.lve.1.el8.x86_64 #1 SMP Tue Oct 8 15:52:54 UTC 2024 x86_64
IP: 209.182.202.254
Choose File :

Url:
Dir : /home/trave494/princesspicnicevents.com/wp-content/themes/soledad/inc/woocommerce/modules/misc.php

<?php

class penci_product_misc {

	protected static $instance;

	function __construct() {

		add_action( 'wp_ajax_penci_update_cart_item', array( $this, 'penci_update_cart_item' ) );
		add_action( 'wp_ajax_nopriv_penci_update_cart_item', array( $this, 'penci_update_cart_item' ) );

		add_action( 'wp_ajax_penci_ajax_load_products', array( $this, 'ajax_load_products' ) );
		add_action( 'wp_ajax_nopriv_penci_ajax_load_products', array( $this, 'ajax_load_products' ) );

		add_action( 'wp_ajax_penci_get_product_info', array( $this, 'get_product_info' ) );
		add_action( 'wp_ajax_nopriv_penci_get_product_info', array( $this, 'get_product_info' ) );

		add_filter( 'woocommerce_sale_flash', array( $this, 'product_label' ), 10 );
		add_action( 'woocommerce_before_single_product_summary', array( $this, 'penci_top_relate_products' ), 5 );

		add_action( 'penci_woocommerce_before_main_shop_content_right', function () {
			echo '<div class="penci-wofilter-inner">';
		}, 4 );
		add_action( 'penci_woocommerce_before_main_shop_content_right', array( $this, 'product_grid_label' ), 5 );
		add_action( 'penci_woocommerce_before_main_shop_content_right', array( $this, 'product_style_select' ), 5 );
		add_action( 'penci_woocommerce_before_main_shop_content_right', array(
			$this,
			'top_catalog_product_filter_trigger'
		), 9 );
		add_action( 'penci_woocommerce_before_main_shop_content_right', function () {
			echo '</div>';
		}, 9 );

		add_action( 'woocommerce_shop_loop_item_title', array( $this, 'product_categories_link' ), 15 );
		add_action( 'init', array( $this, 'login_to_see_price' ), 200 );


		add_action( 'wp_footer', array( $this, 'mobile_nav_menu' ) );
		add_filter( 'wp_nav_menu_items', array( $this, 'mobile_menu_filter' ), 10, 2 );


		if ( ! get_theme_mod( 'penci_woo_cat_enable_sidebar' ) ) {
			add_action( 'woocommerce_archive_description', array( $this, 'top_catalog_product_filter' ), 5 );
		}

		remove_action( 'woocommerce_cart_is_empty', 'wc_empty_cart_message', 10 );

		add_action( 'woocommerce_cart_is_empty', array( $this, 'empty_cart_message' ), 10 );

		add_action( 'penci_footer_nav_cart_item', array( $this, 'mobile_cart_totals' ) );
		add_action( 'woocommerce_add_to_cart_fragments', array( $this, 'mobile_cart_totals_fragment' ) );

		add_action( 'wp_ajax_penci_add_to_cart_variable', array(
			$this,
			'penci_add_to_cart_variable'
		) );
		add_action( 'wp_ajax_nopriv_penci_add_to_cart_variable', array(
			$this,
			'penci_add_to_cart_variable'
		) );

		add_action( 'woocommerce_after_shop_loop', array( $this, 'blog_search_result' ), 100 );
		add_action( 'penci_after_search_loop', array( $this, 'product_search_result' ), 100 );
	}

	public static function get_instance() {
		if ( null == self::$instance ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	public function penci_top_relate_products() {
		if ( wc_get_loop_prop( 'quickview', false ) || ! get_theme_mod( 'penci_single_product_top_related_product', true ) ) {
			return;
		}
		$current_id          = apply_filters( 'penci_top_relate_products_exclude', get_the_ID() );
		$top_relate_products = get_posts( array(
			'post_type'      => 'product',
			'post__not_in'   => array( $current_id ),
			'posts_per_page' => 2,
		) );
		if ( $top_relate_products ) {
			echo '<div class="penci-top-relate-post"><ul>';
			$count = 0;
			foreach ( $top_relate_products as $product_item ) {
				$id        = $product_item->ID;
				$product   = wc_get_product( $id );
				$classes   = 0 == $count ? 'left' : 'right';
				$link      = ( penci_is_shop_on_front() ) ? home_url() : get_post_type_archive_link( 'product' );
				$seperator = '<li class="item-shop-link"><a class="icon-link" href="' . esc_url( $link ) . '"><svg height="14px" viewBox="-19 -19 600 600" width="14px" xmlns="http://www.w3.org/2000/svg"><path d="m251.25 12.5c0-6.90625-5.59375-12.5-12.5-12.5h-226.25c-6.90625 0-12.5 5.59375-12.5 12.5v226.25c0 6.90625 5.59375 12.5 12.5 12.5h226.25c6.90625 0 12.5-5.59375 12.5-12.5zm-25 213.75h-201.25v-201.25h201.25zm0 0"/><path d="m562.5 12.5c0-6.90625-5.59375-12.5-12.5-12.5h-226.25c-6.90625 0-12.5 5.59375-12.5 12.5v226.25c0 6.90625 5.59375 12.5 12.5 12.5h226.25c6.90625 0 12.5-5.59375 12.5-12.5zm-25 213.75h-201.25v-201.25h201.25zm0 0"/><path d="m251.25 323.75c0-6.90625-5.59375-12.5-12.5-12.5h-226.25c-6.90625 0-12.5 5.59375-12.5 12.5v226.25c0 6.90625 5.59375 12.5 12.5 12.5h226.25c6.90625 0 12.5-5.59375 12.5-12.5zm-25 212.5h-201.25v-200h201.25zm0 0"/><path d="m562.5 323.75c0-6.90625-5.59375-12.5-12.5-12.5h-226.25c-6.90625 0-12.5 5.59375-12.5 12.5v226.25c0 6.90625 5.59375 12.5 12.5 12.5h226.25c6.90625 0 12.5-5.59375 12.5-12.5zm-25 212.5h-201.25v-200h201.25zm0 0"/></svg></a></li>';
				$seperator = 'left' == $classes ? $seperator : '';

				echo '<li class="top-ralate-item ' . $classes . '"><a href="' . get_permalink( $id ) . '"><span class="item-icon"><i class="penciicon-' . $classes . '-chevron"></i></span></a>';
				echo '<div class="inner-content"><div class="top-ralate-item__image"><a href="' . get_permalink( $id ) . '">' . get_the_post_thumbnail( $id, 'woocommerce_gallery_thumbnail' ) . '</a></div>';
				echo '<div class="top-ralate-item__summary"><h4><a href="' . get_permalink( $id ) . '">' . get_the_title( $id ) . '</a></h4><span class="price"><a href="' . get_permalink( $id ) . '">' . $product->get_price_html() . '</a></span></div></div>';
				echo '</li>' . $seperator;
				$count ++;
			}
			echo '</ul></div>';
		}
	}

	public function penci_product_quantity( $product ) {
		if ( ! $product->is_sold_individually() && 'variable' != $product->get_type() && $product->is_purchasable() && $product->is_in_stock() ) {
			woocommerce_quantity_input(
				array(
					'min_value' => 1,
					'max_value' => $product->backorders_allowed() ? '' : $product->get_stock_quantity(),
				)
			);
		}
	}

	public function penci_update_cart_item() {
		if ( ( isset( $_GET['item_id'] ) && $_GET['item_id'] ) && ( isset( $_GET['qty'] ) ) ) {
			global $woocommerce;
			if ( $_GET['qty'] ) {
				$woocommerce->cart->set_quantity( $_GET['item_id'], $_GET['qty'] );
			} else {
				$woocommerce->cart->remove_cart_item( $_GET['item_id'] );
			}
		}

		WC_AJAX::get_refreshed_fragments();
	}

	function product_label() {
		global $product;

		$output = array();

		$percentage_label = get_theme_mod( 'penci_woo_label_percentage', true );

		if ( $product->is_on_sale() ) {

			$percentage = '';

			if ( $product->get_type() == 'variable' && $percentage_label ) {

				$available_variations = $product->get_variation_prices();
				$max_percentage       = 0;

				foreach ( $available_variations['regular_price'] as $key => $regular_price ) {
					$sale_price = $available_variations['sale_price'][ $key ];

					if ( $sale_price < $regular_price ) {
						$percentage = round( ( ( $regular_price - $sale_price ) / $regular_price ) * 100 );

						if ( $percentage > $max_percentage ) {
							$max_percentage = $percentage;
						}
					}
				}

				$percentage = $max_percentage;
			} elseif ( ( $product->get_type() == 'simple' || $product->get_type() == 'external' || $product->get_type() == 'variation' ) && $percentage_label ) {
				$percentage = round( ( ( $product->get_regular_price() - $product->get_sale_price() ) / $product->get_regular_price() ) * 100 );
			}

			if ( $percentage ) {
				$output[] = '<span class="onsale product-label">-' . $percentage . '%' . '</span>';
			} else {
				$output[] = '<span class="onsale product-label">' . penci_woo_translate_text( 'penci_woo_trans_sale' ) . '</span>';
			}
		}

		if ( ! $product->is_in_stock() ) {
			$output[] = '<span class="out-of-stock product-label">' . penci_woo_translate_text( 'penci_woo_trans_sold_out' ) . '</span>';
		}

		if ( $product->is_featured() && get_theme_mod( 'penci_woo_label_hot_product', true ) ) {
			$output[] = '<span class="featured product-label">' . penci_woo_translate_text( 'penci_woo_trans_hot' ) . '</span>';
		}

		if ( $this->is_new_label_needed( $product->get_id() ) ) {
			$output[] = '<span class="new product-label">' . penci_woo_translate_text( 'penci_woo_trans_new' ) . '</span>';
		}

		if ( $output ) {
			echo '<div class="product-labels labels-' . get_theme_mod( 'penci_woo_label_style', 'square' ) . '">' . implode( '', $output ) . '</div>';
		}
	}

	public function is_new_label_needed( $product_id ) {
		$enable       = get_theme_mod( 'penci_woo_label_new_product', true );
		$new          = penci_get_single_product_meta( $product_id, 'product_extra_options', 'permanent_new_label' );
		$newness_days = get_theme_mod( 'penci_woo_label_new_product_period', 7 );
		$product      = wc_get_product( $product_id );
		$created      = strtotime( $product->get_date_created() );

		if ( $new ) {
			return true;
		}

		if ( $enable && $newness_days && ( time() - ( 60 * 60 * 24 * $newness_days ) ) < $created ) {
			return true;
		}

		return false;
	}

	public function product_grid_label() {
		if ( ! wc_get_loop_prop( 'is_paginated' ) || ! woocommerce_products_will_display() ) {
			return;
		}


		$default_posts_per_page    = array( penci_woo_get_products_per_page() );
		$per_page_options          = get_theme_mod( 'penci_woo_post_per_page_variations', '9,24,36,-1' );
		$products_per_page_options = ( ! empty( $per_page_options ) ) ? explode( ',', $per_page_options ) : array(
			'12' => 12,
			'24' => 24,
			'36' => 36,
		);
		$products_per_page_options = array_unique( array_merge( $default_posts_per_page, $products_per_page_options ) );
		asort( $products_per_page_options );
		?>

        <div class="penci-products-per-page">
			<span class="per-page-title">
				<?php echo penci_woo_translate_text( 'penci_woo_trans_show' ); ?>
			</span>

			<?php
			foreach ( $products_per_page_options as $key => $value ) :

				$classes = '';
				$args = array(
					'per_page' => $value,
				);

				$link = add_query_arg( $args, penci_shop_page_link( true ) );

				if ( (int) penci_woo_get_products_per_page() === (int) $value ) { // phpcs:ignore
					$classes .= ' current-variation';
				}
				?>
                <a rel="nofollow noopener" href="<?php echo esc_url( $link ); ?>"
                   class="per-page-variation<?php echo esc_attr( $classes ); ?>">
					<span>
						<?php
						$text = '%s';
						esc_html( printf( $text, $value == - 1 ? penci_woo_translate_text( 'penci_woo_trans_all' ) : $value ) );
						?>
					</span>
                </a>
			<?php endforeach; ?>
        </div>
		<?php
	}

	public function product_style_select( $is_element ) {
		if ( ! wc_get_loop_prop( 'is_paginated' ) || ! woocommerce_products_will_display() ) {
			return;
		}

		$shop_view        = get_theme_mod( 'penci_shop_product_view', 'grid_list' );
		$per_row_selector = get_theme_mod( 'penci_woo_per_row_columns_selector', true );
		$columns_settings = get_theme_mod( 'penci_shop_product_columns', 3 );

		$per_row_options = ( 4 >= $columns_settings ) ? array( 2, 3, 4 ) : array( 2, 3, 4, 5, 6 );

		$current_shop_view        = penci_get_shop_view();
		$current_per_row          = penci_get_products_columns_per_row();
		$products_per_row_options = ( ! empty( $per_row_options ) ) ? array_unique( $per_row_options ) : array(
			2,
			3,
			4
		);

		if ( 'list' === $shop_view || ( 'grid' === $shop_view && ! $per_row_selector ) || ( 'grid' === $shop_view && ! $per_row_options ) ) {
			return;
		}

		?>
        <div class="penci-products-shop-view <?php echo esc_attr( 'products-view-' . $shop_view ); ?>">
			<?php if ( 'grid' !== $shop_view ) : ?>
				<?php
				$classes = '';
				$args    = array(
					'shop_view' => 'list',
				);

				if ( $is_element ) {
					$args['shortcode'] = true;
				}

				if ( ( 'list' === $current_shop_view && ! $is_element ) || ( $is_element && isset( $_GET['shop_view'] ) && 'list' === $_GET['shop_view'] ) ) { // phpcs:ignore
					$classes .= ' current-variation';
				}

				$link = add_query_arg( $args, penci_shop_page_link( true ) );
				?>

                <a rel="nofollow noopener" href="<?php echo esc_url( $link ); ?>"
                   class="shop-view per-row-list<?php echo esc_attr( $classes ); ?>">
                    <svg class="icon">
                        <use xlink:href="#list"/>
                    </svg>
                </a>
			<?php endif ?>

			<?php if ( $per_row_selector && $per_row_options ) : ?>
				<?php foreach ( $products_per_row_options as $key => $value ) : ?>
					<?php
					if ( 0 === $value ) {
						continue;
					}

					$classes = '';
					$args    = array(
						'shop_view' => 'grid',
						'per_row'   => $value,
					);

					if ( $is_element ) {
						$args['shortcode'] = true;
					}

					$current_columns = null;

					if ( empty( $_GET['per_row'] ) ) {
						$current_columns = wc_get_loop_prop( 'columns' );
					}

					if ( 'list' !== $current_shop_view && ( (int) $value === (int) $current_per_row && ! $is_element ) || ( $is_element && isset( $_GET['per_row'] ) && $_GET['per_row'] === $value ) ) { // phpcs:ignore
						$classes .= ' current-variation';
					}

					$classes .= ' per-row-' . $value;

					$link = add_query_arg( $args, penci_shop_page_link( true ) );
					?>

                    <a title="<?php echo sprintf( esc_attr__( 'Show %s columns', 'soledad' ), $value ); ?>"
                       rel="nofollow noopener"
                       href="<?php echo esc_url( $link ); ?>"
                       class="shop-view<?php echo esc_attr( $classes ); ?>">
                        <svg class="icon">
                            <use xlink:href="#columns-<?php echo esc_attr( $value ); ?>"/>
                        </svg>
                    </a>
				<?php endforeach; ?>
			<?php endif ?>
            <div hidden>
                <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
                    <symbol id="columns-2" viewBox="0 0 444 444"><title>columns-2</title>
                        <path d="m7 0h181c3.867188 0 7 3.132812 7 7v181c0 3.867188-3.132812 7-7 7h-181c-3.867188 0-7-3.132812-7-7v-181c0-3.867188 3.132812-7 7-7zm0 0"/>
                        <path d="m256 0h181c3.867188 0 7 3.132812 7 7v181c0 3.867188-3.132812 7-7 7h-181c-3.867188 0-7-3.132812-7-7v-181c0-3.867188 3.132812-7 7-7zm0 0"/>
                        <path d="m7 249h181c3.867188 0 7 3.132812 7 7v181c0 3.867188-3.132812 7-7 7h-181c-3.867188 0-7-3.132812-7-7v-181c0-3.867188 3.132812-7 7-7zm0 0"/>
                        <path d="m256 249h181c3.867188 0 7 3.132812 7 7v181c0 3.867188-3.132812 7-7 7h-181c-3.867188 0-7-3.132812-7-7v-181c0-3.867188 3.132812-7 7-7zm0 0"/>
                    </symbol>
                    <symbol id="columns-3" viewBox="0 0 512 512"><title>columns-3</title>
                        <g>
                            <g>
                                <rect x="180.67" y="361.33" width="150.67" height="150.67"/>
                            </g>
                        </g>
                        <g>
                            <g>
                                <rect x="180.67" y="180.66" width="150.67" height="150.67"/>
                            </g>
                        </g>
                        <g>
                            <g>
                                <rect x="361.33" width="150.67" height="150.66"/>
                            </g>
                        </g>
                        <g>
                            <g>
                                <rect y="180.66" width="150.67" height="150.67"/>
                            </g>
                        </g>
                        <g>
                            <g>
                                <rect x="361.33" y="180.66" width="150.67" height="150.67"/>
                            </g>
                        </g>
                        <g>
                            <g>
                                <rect y="361.33" width="150.67" height="150.67"/>
                            </g>
                        </g>
                        <g>
                            <g>
                                <rect x="361.33" y="361.33" width="150.67" height="150.67"/>
                            </g>
                        </g>
                        <g>
                            <g>
                                <rect width="150.67" height="150.66"/>
                            </g>
                        </g>
                        <g>
                            <g>
                                <rect x="180.67" width="150.67" height="150.66"/>
                            </g>
                        </g>
                    </symbol>
                    <symbol id="columns-4" viewBox="0 0 397.061 397.061"><title>columns-4</title>
                        <rect x="104.49" y="208.98" width="83.592" height="83.592"/>
                        <rect x="104.49" y="0" width="83.592" height="83.592"/>
                        <rect x="104.49" y="313.469" width="83.592" height="83.592"/>
                        <rect x="104.49" y="104.49" width="83.592" height="83.592"/>
                        <rect x="5.224" y="208.98" width="78.367" height="83.592"/>
                        <rect x="5.224" y="313.469" width="78.367" height="83.592"/>
                        <rect x="5.224" y="0" width="78.367" height="83.592"/>
                        <rect x="5.224" y="104.49" width="78.367" height="83.592"/>
                        <rect x="208.98" y="208.98" width="83.592" height="83.592"/>
                        <rect x="313.469" y="104.49" width="78.367" height="83.592"/>
                        <rect x="313.469" y="208.98" width="78.367" height="83.592"/>
                        <rect x="313.469" y="0" width="78.367" height="83.592"/>
                        <rect x="208.98" y="313.469" width="83.592" height="83.592"/>
                        <rect x="208.98" y="104.49" width="83.592" height="83.592"/>
                        <rect x="208.98" y="0" width="83.592" height="83.592"/>
                        <rect x="313.469" y="313.469" width="78.367" height="83.592"/>
                    </symbol>
                    <symbol id="columns-5" viewBox="0 0 24 19">
                        <rect width="4" height="4"/>
                        <rect x="5" width="4" height="4"/>
                        <rect x="10" width="4" height="4"/>
                        <rect x="15" width="4" height="4"/>
                        <rect x="20" width="4" height="4"/>
                        <rect y="5" width="4" height="4"/>
                        <rect x="5" y="5" width="4" height="4"/>
                        <rect x="10" y="5" width="4" height="4"/>
                        <rect x="15" y="5" width="4" height="4"/>
                        <rect x="20" y="5" width="4" height="4"/>
                        <rect y="10" width="4" height="4"/>
                        <rect x="5" y="10" width="4" height="4"/>
                        <rect x="10" y="10" width="4" height="4"/>
                        <rect x="15" y="10" width="4" height="4"/>
                        <rect x="20" y="10" width="4" height="4"/>
                        <rect y="15" width="4" height="4"/>
                        <rect x="5" y="15" width="4" height="4"/>
                        <rect x="10" y="15" width="4" height="4"/>
                        <rect x="15" y="15" width="4" height="4"/>
                        <rect x="20" y="15" width="4" height="4"/>
                    </symbol>
                    <symbol id="columns-6" viewBox="0 0 23 19">
                        <rect width="3" height="4"/>
                        <rect x="4" width="3" height="4"/>
                        <rect x="8" width="3" height="4"/>
                        <rect x="12" width="3" height="4"/>
                        <rect x="16" width="3" height="4"/>
                        <rect x="20" width="3" height="4"/>
                        <rect y="5" width="3" height="4"/>
                        <rect x="4" y="5" width="3" height="4"/>
                        <rect x="8" y="5" width="3" height="4"/>
                        <rect x="12" y="5" width="3" height="4"/>
                        <rect x="16" y="5" width="3" height="4"/>
                        <rect x="20" y="5" width="3" height="4"/>
                        <rect y="10" width="3" height="4"/>
                        <rect x="4" y="10" width="3" height="4"/>
                        <rect x="8" y="10" width="3" height="4"/>
                        <rect x="12" y="10" width="3" height="4"/>
                        <rect x="16" y="10" width="3" height="4"/>
                        <rect x="20" y="10" width="3" height="4"/>
                        <rect y="15" width="3" height="4"/>
                        <rect x="4" y="15" width="3" height="4"/>
                        <rect x="8" y="15" width="3" height="4"/>
                        <rect x="12" y="15" width="3" height="4"/>
                        <rect x="16" y="15" width="3" height="4"/>
                        <rect x="20" y="15" width="3" height="4"/>
                    </symbol>
                    <symbol id="list" viewBox="0 0 512 512"><title>list</title>
                        <g>
                            <g>
                                <path d="M501.333,42.667H138.667c-5.888,0-10.667,4.779-10.667,10.667S132.779,64,138.667,64h362.667 C507.221,64,512,59.221,512,53.333S507.221,42.667,501.333,42.667z"/>
                            </g>
                        </g>
                        <g>
                            <g>
                                <path d="M352,106.667H138.667c-5.888,0-10.667,4.779-10.667,10.667S132.779,128,138.667,128H352 c5.888,0,10.667-4.779,10.667-10.667S357.888,106.667,352,106.667z"/>
                            </g>
                        </g>
                        <g>
                            <g>
                                <path d="M501.333,213.333H138.667c-5.888,0-10.667,4.779-10.667,10.667s4.779,10.667,10.667,10.667h362.667 c5.888,0,10.667-4.779,10.667-10.667S507.221,213.333,501.333,213.333z"/>
                            </g>
                        </g>
                        <g>
                            <g>
                                <path d="M352,277.333H138.667c-5.888,0-10.667,4.779-10.667,10.667s4.779,10.667,10.667,10.667H352 c5.888,0,10.667-4.779,10.667-10.667S357.888,277.333,352,277.333z"/>
                            </g>
                        </g>
                        <g>
                            <g>
                                <path d="M501.333,384H138.667c-5.888,0-10.667,4.779-10.667,10.667s4.779,10.667,10.667,10.667h362.667 c5.888,0,10.667-4.779,10.667-10.667S507.221,384,501.333,384z"/>
                            </g>
                        </g>
                        <g>
                            <g>
                                <path d="M352,448H138.667c-5.888,0-10.667,4.779-10.667,10.667s4.779,10.667,10.667,10.667H352 c5.888,0,10.667-4.779,10.667-10.667S357.888,448,352,448z"/>
                            </g>
                        </g>
                        <g>
                            <g>
                                <circle cx="42.667" cy="85.333" r="42.667"/>
                            </g>
                        </g>
                        <g>
                            <g>
                                <circle cx="42.667" cy="256" r="42.667"/>
                            </g>
                        </g>
                        <g>
                            <g>
                                <circle cx="42.667" cy="426.667" r="42.667"/>
                            </g>
                        </g>
                    </symbol>
                </svg>
            </div>
        </div>
		<?php
	}

	public function product_categories_link() {
		global $product;

		if ( ! wc_get_loop_prop( 'loop_categories', true ) ) {
			return;
		}

		$terms = get_the_terms( $product->get_id(), 'product_cat' );

		if ( ! $terms ) {
			return;
		}

		$terms_array = array();
		$parent      = array();
		$child       = array();
		$links       = array();

		foreach ( $terms as $term ) {
			$terms_array[ $term->term_id ] = $term;

			if ( ! $term->parent ) {
				$parent[ $term->term_id ] = $term->name;
			}
		}

		foreach ( $terms as $term ) {
			if ( $term->parent ) {
				unset( $parent[ $term->parent ] );

				if ( array_key_exists( $term->parent, $terms_array ) ) {
					$child[ $term->parent ] = get_term( $term->parent )->name;
				}

				$child[ $term->term_id ] = $term->name;
			}
		}

		$terms = $child + $parent;

		foreach ( $terms as $key => $value ) {
			$links[] = '<a href="' . esc_url( get_term_link( $key ) ) . '" rel="tag">' . esc_html( $value ) . '</a>';
		}

		?>
        <div class="penci-product-cats">
			<?php echo implode( ', ', $links ); // phpcs:ignore ?>
        </div>
		<?php
	}

	public function login_to_see_price() {
		$restrict_price = get_theme_mod( 'penci_woocommerce_restrict_cart_price', false );
		if ( ! is_user_logged_in() && $restrict_price ) {
			add_filter( 'woocommerce_get_price_html', array( $this, 'login_to_see_price_html' ) );
			add_filter( 'woocommerce_loop_add_to_cart_link', '__return_false' );

			// Add to cart btns
			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 );
		}
	}

	public function login_to_see_price_html() {
		$restrict_price = get_theme_mod( 'penci_woocommerce_restrict_cart_price', false );
		if ( ! is_user_logged_in() && $restrict_price ) {
			return '<a href="' . esc_url( get_permalink( wc_get_page_id( 'myaccount' ) ) ) . '" class="restrict-price-tag">' . penci_woo_translate_text( 'penci_woo_trans_lgtspr' ) . '</a>';
		}
	}

	public function top_catalog_product_filter() {
		?>

        <div id="penci-top-product-filter" class="penci-top-product-filter">
			<?php dynamic_sidebar( 'penci-shop-sidebar' ); ?>
        </div>

		<?php
	}

	public function top_catalog_product_filter_trigger() {
		if ( ! get_theme_mod( 'pencidesign_woo_filter_widget_enable', true ) ) {
			return false;
		}
		?>
        <div class="penci-product-top-filter-button">
            <a class="penci-filter-button"
               title="<?php echo penci_woo_translate_text( 'penci_woo_trans_sidebar_filter' ); ?>"
               href="#penci-top-product-filter">
                <i>
                    <svg enable-background="new 0 0 512 512" height="20" viewBox="0 0 512 512" width="20"
                         xmlns="http://www.w3.org/2000/svg">
                        <g>
                            <path d="m90.5 0h-30v362h-30v90h30v60h30v-60h30v-90h-30zm0 422h-30v-30h30z"/>
                            <path d="m481.5 362h-30v-362h-30v362h-30v90h30v60h30v-60h30zm-30 60h-30v-30h30z"/>
                            <path d="m331.5 0h-30v222h-30v90h30v200h30v-200h30v-90h-30zm0 282h-30v-30h30z"/>
                            <path d="m210.5 0h-30v53.652h-30v90h30v368.348h30v-368.348h30v-90h-30zm0 113.652h-30v-30h30z"/>
                        </g>
                    </svg>
                </i>
                <span><?php echo penci_woo_translate_text( 'penci_woo_trans_sidebar_filter' ); ?></span>
            </a>
        </div>
		<?php
	}

	public function ajax_load_products() {
		$preloader = isset( $_GET['preloader'] ) ? $_GET['preloader'] : false;
		$nonce     = isset( $_REQUEST['requestid'] ) ? $_REQUEST['requestid'] : false;
		if ( ! wp_verify_nonce( $nonce, 'ajax-nonce' ) ) {
			die( __( 'Ooppppp', 'soledad' ) );
		} elseif ( ! empty( $_GET['settings'] ) ) {
			penci_elementor_products_template( $_GET['settings'], $preloader );
			die();
		}
	}

	public function product_sale_countdown() {
		global $product;
		$sale_date_end   = get_post_meta( $product->get_id(), '_sale_price_dates_to', true );
		$sale_date_start = get_post_meta( $product->get_id(), '_sale_price_dates_from', true );

		if ( $product->get_type() == 'variable' ) {
			// Variations cache
			$cache                = apply_filters( 'pencicountdown_variable_cache', true );
			$transient_name       = 'pencicountdown_variable_cache_' . $product->get_id();
			$available_variations = array();

			if ( $cache ) {
				$available_variations = get_transient( $transient_name );
			}

			if ( ! $available_variations ) {
				$available_variations = $product->get_available_variations();
				if ( $cache ) {
					set_transient( $transient_name, $available_variations, apply_filters( 'pencicountdown_variable_cache_time', WEEK_IN_SECONDS ) );
				}
			}

			if ( $available_variations ) {
				$sale_date_end   = get_post_meta( $available_variations[0]['variation_id'], '_sale_price_dates_to', true );
				$sale_date_start = get_post_meta( $available_variations[0]['variation_id'], '_sale_price_dates_from', true );
			}
		}

		$curent_date = strtotime( date( 'Y-m-d H:i:s' ) );

		if ( $sale_date_end < $curent_date || $curent_date < $sale_date_start ) {
			return;
		}

		$timezone = 'GMT';

		if ( apply_filters( 'penciwp_timezone', false ) ) {
			$timezone = wc_timezone_string();
		}

		wp_enqueue_script( 'woo-countdown' );

		echo '<div class="penci-product-countdown penci-time-countdown" data-end-date="' . esc_attr( date( 'Y-m-d H:i:s', $sale_date_end ) ) . '" data-timezone="' . $timezone . '"></div>';
	}

	public function mobile_nav_menu() {
		if ( penci_is_shop_archive() ) {
			wc_get_template_part( 'global/mobile-bottom-nav' );
		}
	}

	public function mobile_menu_filter( $items, $args ) {
		$menu_id = get_theme_mod( 'penci_woo_mobile_nav_menu' );
		if ( penci_is_shop_catelog() && $args->menu == $menu_id ) {
			$items .= '<li class="cart-filter"><a href="#sidebar-product-filter"><i class="fa fa-filter" aria-hidden="true"></i>' . penci_woo_translate_text( 'penci_woo_trans_fasort' ) . '</a></li>';
		}

		return $items;
	}

	public function get_product_info() {
		$data = array();
		if ( isset( $_REQUEST['requestid'] ) && isset( $_REQUEST['id'] ) && wp_verify_nonce( $_REQUEST['requestid'], 'ajax-nonce' ) ) {

			$id = $_REQUEST['id'];

			$data = array(
				'title'     => get_the_title( $id ),
				'item_link' => get_the_permalink( $id ),
				'img'       => get_the_post_thumbnail_url( $id, 'woocommerce_gallery_thumbnail' ),
			);
		}
		wp_send_json_success(
			$data,
			200
		);
	}

	public function empty_cart_message() {
		?>
        <div class="woocommerce-content-wrapper">
            <div class="penci-empty-cart penci-empty-page penci-empty-page-text">
                <h3 class="penci-compare-empty-title"><?php echo penci_woo_translate_text( 'penci_woo_cart_empty_title' ) ?></h3>
				<?php echo penci_woo_translate_text( 'penci_woo_cart_empty_textarea' ) ?>
            </div>
        </div>
		<?php
	}

	public function mobile_cart_totals() {
		echo '<span class="penci-mobile-cart-item current-item">' . WC()->cart->get_cart_contents_count() . '</span>';
	}

	public function mobile_cart_totals_fragment( $fragments ) {
		global $woocommerce;

		ob_start();

		?>
        <span class="penci-mobile-cart-item current-item"><?php echo esc_attr( $woocommerce->cart->cart_contents_count ); ?></span>
		<?php
		$fragments['span.penci-mobile-cart-item.current-item'] = ob_get_clean();

		return $fragments;
	}

	public function penci_add_to_cart_variable() {
		ob_start();

		$product_id   = apply_filters( 'woocommerce_add_to_cart_product_id', absint( $_POST['product_id'] ) );
		$quantity     = empty( $_POST['quantity'] ) ? 1 : apply_filters( 'woocommerce_stock_amount', $_POST['quantity'] );
		$variation_id = $_POST['variation_id'];

		$cart_item_data = $_POST;
		unset( $cart_item_data['quantity'] );

		$variation = array();

		foreach ( $cart_item_data as $key => $value ) {
			if ( preg_match( "/^attribute*/", $key ) ) {
				$variation[ $key ] = $value;
			}
		}

		foreach ( $variation as $key => $value ) {
			$variation[ $key ] = stripslashes( $value );
		}
		$passed_validation = apply_filters( 'woocommerce_add_to_cart_validation', true, $product_id, $quantity );

		if ( $passed_validation && WC()->cart->add_to_cart( $product_id, $quantity, $variation_id, $variation, $cart_item_data ) ) {
			do_action( 'woocommerce_ajax_added_to_cart', $product_id );
			if ( get_option( 'woocommerce_cart_redirect_after_add' ) == 'yes' ) {
				wc_add_to_cart_message( $product_id );
			}
			global $woocommerce;
			$items = $woocommerce->cart->get_cart();
			wc_setcookie( 'woocommerce_items_in_cart', count( $items ) );
			wc_setcookie( 'woocommerce_cart_hash', md5( json_encode( $items ) ) );
			do_action( 'woocommerce_set_cart_cookies', true );
			// Return fragments
			WC_AJAX::get_refreshed_fragments();

		} else {

			// If there was an error adding to the cart, redirect to the product page to show any errors
			$data = array(
				'error'       => true,
				'product_url' => apply_filters( 'woocommerce_cart_redirect_after_error', get_permalink( $product_id ), $product_id )
			);
			wp_send_json_error( $data );
		}
	}

	public function blog_search_result() {
		if ( ! is_search() || ! get_theme_mod( 'penci_woocommerce_search_included_posts', true ) ) {
			return;
		}

		$search_query = get_search_query();
		$args         = [ 'search_query' => $search_query ];
		get_template_part( 'woocommerce/content', 'blog-search', $args );
	}

	public function product_search_result() {
		if ( ! is_search() || ! apply_filters( 'penci_enable_product_post_search', false ) ) {
			return;
		}
		$search_query = get_search_query();
		penci_elementor_products_template( [ 'search_query' => $search_query ] );
	}
}

$penci_product_misc = new penci_product_misc;