function customRatingScoreHTML($productID) { $product = wc_get_product($productID); $average = $product->get_average_rating(); $rating_whole = floor($average); $rating_fraction = $average - $rating_whole; $flug = 0; for ($i = 1; $i <= 5; $i++) { if ($i <= $rating_whole) { echo '<i class="fas fa-star"></i>'; } else { if ($rating_fraction > 0 && $flug == 0) { echo '<i class="fas fa-star-half-alt"></i>'; $flug = 1; } else { echo '<i class="far fa-star empty"></i>'; } } } }
<?php class Product_Search_Widget extends \Elementor\Widget_Base { public function get_name() { return 'product-search-widget'; } public function get_title() { return __('Product Search Widget', 'text-domain'); } public function get_icon() { return 'eicon-search'; } public function get_categories() { return ['general']; } protected function render() { ?> <form class="pp-search-form" role="search" action="<?php echo esc_url(home_url('/')); ?>" method="get" aria-label="Search form"> <div class="pp-search-form__toggle"> <i class="fa fa-search" aria-hidden="true"></i> </div> <div class="pp-search-form__container pp-search-form--lightbox"> <div class="search-form"> <label class="pp-screen-reader-text" for="pp-search-form__input-<?php echo esc_attr($this->get_id()); ?>"> Search our products </label> <input id="pp-search-form__input-<?php echo esc_attr($this->get_id()); ?>" class="pp-search-form__input" type="search" name="s" title="Search" value=""> </div> <button type="submit" class="pp-search-form__button"> <span class="pp-icon-search" aria-hidden="true"> <i class="fa fa-search" aria-hidden="true"></i> </span> </button> <input type="hidden" name="post_type" value="product"> <div class="pp-search-form--lightbox-close"> <span class="pp-icon-close" aria-hidden="true"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><path d="M342.6 150.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192 210.7 86.6 105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L146.7 256 41.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L192 301.3 297.4 406.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L237.3 256 342.6 150.6z"/></svg> </span> </div> </div> </form> <?php } } \Elementor\Plugin::instance()->widgets_manager->register_widget_type(new Product_Search_Widget());
<?php /** * Checkout billing information form * * This template can be overridden by copying it to yourtheme/woocommerce/checkout/form-billing.php. * * HOWEVER, on occasion WooCommerce will need to update template files and you * (the theme developer) will need to copy the new files to your theme to * maintain compatibility. We try to do this as little as possible, but it does * happen. When this occurs the version of the template file will be bumped and * the readme will list any important changes. * * @see https://woocommerce.com/document/template-structure/ * @package WooCommerce\Templates * @version 3.6.0 * @global WC_Checkout $checkout */ defined('ABSPATH') || exit; $fields = $checkout->get_checkout_fields('billing'); ?> <?php if (!is_user_logged_in() && $checkout->is_registration_enabled()) : ?> <div class="woocommerce-billing-fields woocommerce-billing-fields-top"> <h3><?php esc_html_e('Login', 'woocommerce'); ?></h3> <p>Log in to place your order</p> <div class="woocommerce-billing-fields__field-wrapper"> <?php foreach ($fields as $key => $field) { if ($key === 'billing_email') { woocommerce_form_field($key, $field, $checkout->get_value($key)); } } ?> <p class="form-row form-row-wide" id="billing_password_field" data-priority="110"> <span class="woocommerce-input-wrapper"> <input type="password" class="input-text" name="billing_password" id="billing_password" placeholder="Password"> </span> </p> <div class="flogin-btn"> <button type="button"><?php _e('Login and place order', 'wp'); ?></button> </div> <div class="flogin-footer"> <div>Not yet a member?</div> <div>create an account</div> <div>Create an account and place your order</div> </div> </div> </div> <?php else : ?> <div class="woocommerce-billing-fields"> <h3><?php esc_html_e('Account', 'woocommerce'); ?></h3> <div class="woocommerce-billing-fields__field-wrapper"> <?php foreach ($fields as $key => $field) { if ($key === 'billing_email') { woocommerce_form_field($key, $field, $checkout->get_value($key)); } } ?> </div> </div> <?php endif; ?> <div class="woocommerce-billing-fields"> <?php if (wc_ship_to_billing_address_only() && WC()->cart->needs_shipping()) : ?> <h3><?php esc_html_e('Billing & Shipping', 'woocommerce'); ?></h3> <?php else : ?> <h3><?php esc_html_e('Billing Info', 'woocommerce'); ?></h3> <?php endif; ?> <?php do_action('woocommerce_before_checkout_billing_form', $checkout); ?> <div class="woocommerce-billing-fields__field-wrapper"> <?php foreach ($fields as $key => $field) { if ($key !== 'billing_email') { woocommerce_form_field($key, $field, $checkout->get_value($key)); } } ?> <?php woocommerce_form_field('billing_notes', array( 'type' => 'textarea', 'class' => array('form-row-wide'), 'label' => false, 'placeholder' => __('Order notes(optional)', 'woocommerce'), 'required' => false, ), $checkout->get_value('billing_notes')); ?> <div class="form-row shipping-address-method-field"> <input type="radio" name="shipping-address-method[]" value="billing_address" id="method-billing_address" checked> <label for="method-billing_address">Ship to this address</label> </div> </div> <?php do_action('woocommerce_after_checkout_billing_form', $checkout); ?> </div> <?php if (!is_user_logged_in() && $checkout->is_registration_enabled()) : ?> <div class="woocommerce-account-fields"> <?php if (!$checkout->is_registration_required()) : ?> <p class="form-row form-row-wide create-account"> <label class="woocommerce-form__label woocommerce-form__label-for-checkbox checkbox"> <input class="woocommerce-form__input woocommerce-form__input-checkbox input-checkbox" id="createaccount" <?php checked((true === $checkout->get_value('createaccount') || (true === apply_filters('woocommerce_create_account_default_checked', false))), true); ?> type="checkbox" name="createaccount" value="1" /> <span><?php esc_html_e('Create an account?', 'woocommerce'); ?></span> </label> </p> <?php endif; ?> <?php do_action('woocommerce_before_checkout_registration_form', $checkout); ?> <?php if ($checkout->get_checkout_fields('account')) : ?> <div class="create-account"> <?php foreach ($checkout->get_checkout_fields('account') as $key => $field) : ?> <?php woocommerce_form_field($key, $field, $checkout->get_value($key)); ?> <?php endforeach; ?> <div class="clear"></div> </div> <?php endif; ?> <?php do_action('woocommerce_after_checkout_registration_form', $checkout); ?> </div> <?php endif; ?>
<?php /** * Review order table * * This template can be overridden by copying it to yourtheme/woocommerce/checkout/review-order.php. * * HOWEVER, on occasion WooCommerce will need to update template files and you * (the theme developer) will need to copy the new files to your theme to * maintain compatibility. We try to do this as little as possible, but it does * happen. When this occurs the version of the template file will be bumped and * the readme will list any important changes. * * @see https://woocommerce.com/document/template-structure/ * @package WooCommerce\Templates * @version 5.2.0 */ defined( 'ABSPATH' ) || exit; $total_order = WC()->cart->total; $total_sale = 0; foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) { $product = $cart_item['data']; if ( $product->is_on_sale() ) { $total_sale += ( $product->get_regular_price() - $product->get_sale_price() ) * $cart_item['quantity']; } } ?> <div class="woocommerce-checkout-review-order-table"> <?php do_action('custom-freeshiping-bar');?> <div id="total-header"> <button type="button" id="toggle-cart-items" class="button-toggle-cart"> Order Summary <i class="fa-solid fa-chevron-down"></i> </button> <div class="total-money"> <span class="total-sale">$<?php echo number_format($total_sale, 2); ?></span> <span class="total-order">$<?php echo number_format($total_order, 2); ?></span> </div> </div> <div id="cart-details"> <div class="title-in-review"> <h3 class="co-h3">PURCHARE SUMMARY</h3> <?php do_action('custom-freeshiping-bar');?> </div> <ul id="cart-items-list" class="woocommerce-mini-cart cart_list product_list_widget"> <?php if ( ! WC()->cart->is_empty() ) : ?> <?php do_action( 'woocommerce_review_order_before_cart_contents' ); foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) { $_product = apply_filters( 'woocommerce_cart_item_product', $cart_item['data'], $cart_item, $cart_item_key ); $product_id = apply_filters( 'woocommerce_cart_item_product_id', $cart_item['product_id'], $cart_item, $cart_item_key ); if ( $_product && $_product->exists() && $cart_item['quantity'] > 0 && apply_filters( 'woocommerce_checkout_cart_item_visible', true, $cart_item, $cart_item_key ) ) { $product_name = apply_filters( 'woocommerce_cart_item_name', $_product->get_name(), $cart_item, $cart_item_key ); $thumbnail = apply_filters( 'woocommerce_cart_item_thumbnail', $_product->get_image(), $cart_item, $cart_item_key ); $product_price = apply_filters( 'woocommerce_cart_item_subtotal', WC()->cart->get_product_subtotal( $_product, $cart_item['quantity'] ), $cart_item, $cart_item_key ); $product_permalink = apply_filters( 'woocommerce_cart_item_permalink', $_product->is_visible() ? $_product->get_permalink( $cart_item ) : '', $cart_item, $cart_item_key ); if ( empty( $product_permalink ) ) { $product_name = '<span class="nm-cart-panel-product-title">' . wp_kses_post( $product_name ) . '</span>'; } else { $product_permalink = esc_url( $product_permalink ); $thumbnail = '<a href="' . $product_permalink . '">' . $thumbnail . '</a>'; $product_name = '<a href="' . $product_permalink . '" class="nm-cart-panel-product-title">' . wp_kses_post( $product_name ) . '</a>'; } $product = wc_get_product($product_id); ?> <li id="nm-cart-panel-item-<?php echo esc_attr( $cart_item_key ); ?>" class="woocommerce-mini-cart-item <?php echo esc_attr( apply_filters( 'woocommerce_mini_cart_item_class', 'mini_cart_item', $cart_item, $cart_item_key ) ); ?>"> <div class="nm-cart-panel-item-thumbnail"> <div class="nm-cart-item-loader nm-loader"></div> <div class="nm-cart-panel-thumbnail-wrap"> <?php echo $thumbnail; ?> <div class="nm-cart-panel-thumbnail-loader nm-loader"></div> </div> </div> <div class="nm-cart-panel-item-details"> <?php echo apply_filters( 'woocommerce_cart_item_remove_link', sprintf( '<a href="%s" class="remove remove_from_cart_button" aria-label="%s" data-product_id="%s" data-cart_item_key="%s" data-product_sku="%s"><i class="nm-font nm-font-close2"></i></a>', esc_url( wc_get_cart_remove_url( $cart_item_key ) ), esc_attr( sprintf( __( 'Remove %s from cart', 'woocommerce' ), wp_strip_all_tags( $product_name ) ) ), esc_attr( $product_id ), esc_attr( $cart_item_key ), esc_attr( $_product->get_sku() ) ), $cart_item_key ); ?> <?php echo $product_name; ?> <?php echo wc_get_formatted_cart_item_data( $cart_item ); ?> <div class="nm-cart-panel-quantity-pricing"> <?php if ( $_product->is_sold_individually() ) : ?> <?php echo apply_filters( 'woocommerce_widget_cart_item_quantity', '<span class="quantity">' . esc_html__( 'Qty', 'woocommerce' ) . ': ' . $cart_item['quantity'] . '</span>', $cart_item, $cart_item_key ); ?> <?php else: ?> <div class="product-quantity" data-title="<?php esc_html_e( 'Quantity', 'woocommerce' ); ?>"> <?php $product_quantity = woocommerce_quantity_input( array( 'input_name' => "cart[{$cart_item_key}][qty]", 'input_value' => $cart_item['quantity'], 'max_value' => $_product->backorders_allowed() ? '' : $_product->get_stock_quantity(), 'min_value' => '1', 'nm_mini_cart_quantity' => true ), $_product, false ); echo apply_filters( 'woocommerce_widget_cart_item_quantity', $product_quantity, $cart_item, $cart_item_key ); ?> </div> <?php endif; ?> <div class="nm-cart-panel-item-price"> <?php if ( $price_html = $product->get_price_html() ) : ?> <span class="price"><?php echo $price_html; ?></span> <?php endif; ?> </div> </div> </div> </li> <?php } } do_action( 'woocommerce_review_order_after_cart_contents' ); ?> <?php else: ?> <li class="empty"> <i class="nm-font nm-font-close2"></i> <span><?php esc_html_e( 'No products in the cart.', 'woocommerce' ); ?></span> </li> <?php endif; ?> </ul> <?php do_action( 'woocommerce_custom_checkout_counpon' ); ?> <table class="shop_table"> <tfoot> <tr class="cart-subtotal"> <th><?php esc_html_e( 'Subtotal', 'woocommerce' ); ?></th> <td><?php wc_cart_totals_subtotal_html(); ?></td> </tr> <?php foreach ( WC()->cart->get_coupons() as $code => $coupon ) : ?> <tr class="cart-discount coupon-<?php echo esc_attr( sanitize_title( $code ) ); ?>"> <th><?php wc_cart_totals_coupon_label( $coupon ); ?></th> <td><?php wc_cart_totals_coupon_html( $coupon ); ?></td> </tr> <?php endforeach; ?> <?php if ( WC()->cart->needs_shipping() && WC()->cart->show_shipping() ) : ?> <?php // Get available shipping methods $available_methods = WC()->shipping->get_packages()[0]['rates']; $chosen_methods = WC()->session->get('chosen_shipping_methods'); $chosen_method = !empty($chosen_methods[0]) ? $chosen_methods[0] : ''; // Only display the chosen method if (!empty($available_methods[$chosen_method])) { echo '<tr class="shipping">'; echo '<th>' . esc_html__('Shipping', 'woocommerce') . '</th>'; echo '<td data-title="Shipping">' . wp_kses_post($available_methods[$chosen_method]->label . ': ' . wc_price($available_methods[$chosen_method]->cost)) . '</td>'; echo '</tr>'; } ?> <?php endif; ?> <?php foreach ( WC()->cart->get_fees() as $fee ) : ?> <tr class="fee"> <th><?php echo esc_html( $fee->name ); ?></th> <td><?php wc_cart_totals_fee_html( $fee ); ?></td> </tr> <?php endforeach; ?> <?php if ( wc_tax_enabled() && ! WC()->cart->display_prices_including_tax() ) : ?> <?php if ( 'itemized' === get_option( 'woocommerce_tax_total_display' ) ) : ?> <?php foreach ( WC()->cart->get_tax_totals() as $code => $tax ) : ?> <tr class="tax-rate tax-rate-<?php echo esc_attr( sanitize_title( $code ) ); ?>"> <th><?php echo esc_html( $tax->label ); ?></th> <td><?php echo wp_kses_post( $tax->formatted_amount ); ?></td> </tr> <?php endforeach; ?> <?php else : ?> <tr class="tax-total"> <th><?php echo esc_html( WC()->countries->tax_or_vat() ); ?></th> <td><?php wc_cart_totals_taxes_total_html(); ?></td> </tr> <?php endif; ?> <?php endif; ?> <?php do_action( 'woocommerce_review_order_before_order_total' ); ?> <tr class="order-total"> <th><?php esc_html_e( 'Total', 'woocommerce' ); ?></th> <td><?php wc_cart_totals_order_total_html(); ?></td> </tr> <?php do_action( 'woocommerce_review_order_after_order_total' ); ?> </tfoot> </table> </div> </div>
<?php /** * The Template for displaying product archives, including the main shop page which is a post type archive * * This template can be overridden by copying it to yourtheme/woocommerce/archive-product.php. * * HOWEVER, on occasion WooCommerce will need to update template files and you * (the theme developer) will need to copy the new files to your theme to * maintain compatibility. We try to do this as little as possible, but it does * happen. When this occurs the version of the template file will be bumped and * the readme will list any important changes. * * @see https://docs.woocommerce.com/document/template-structure/ * @package WooCommerce\Templates * @version 3.4.0 */ defined( 'ABSPATH' ) || exit; get_header( 'shop' ); /** * Hook: woocommerce_before_main_content. * * @hooked woocommerce_output_content_wrapper - 10 (outputs opening divs for the content) * @hooked woocommerce_breadcrumb - 20 * @hooked WC_Structured_Data::generate_website_data() - 30 */ do_action( 'woocommerce_before_main_content' ); ?> <div class="container-fluid"> <header class="woocommerce-products-header"> <?php if ( apply_filters( 'woocommerce_show_page_title', true ) ) : ?> <h1 class="woocommerce-products-header__title page-title"><?php woocommerce_page_title(); ?></h1> <?php endif; ?> <?php /** * Hook: woocommerce_archive_description. * * @hooked woocommerce_taxonomy_archive_description - 10 * @hooked woocommerce_product_archive_description - 10 */ do_action( 'woocommerce_archive_description' ); ?> </header> <div class="row"> <div class="col-lg-3"> <?php /** * Hook: woocommerce_sidebar. * * @hooked woocommerce_get_sidebar - 10 */ do_action( 'woocommerce_sidebar' ); ?> </div> <div class="col-lg-9"> <?php if ( woocommerce_product_loop() ) { /** * Hook: woocommerce_before_shop_loop. * * @hooked woocommerce_output_all_notices - 10 * @hooked woocommerce_result_count - 20 * @hooked woocommerce_catalog_ordering - 30 */ do_action( 'woocommerce_before_shop_loop' ); woocommerce_product_loop_start(); if ( wc_get_loop_prop( 'total' ) ) { while ( have_posts() ) { the_post(); /** * Hook: woocommerce_shop_loop. */ do_action( 'woocommerce_shop_loop' ); wc_get_template_part( 'content', 'product' ); } } woocommerce_product_loop_end(); /** * Hook: woocommerce_after_shop_loop. * * @hooked woocommerce_pagination - 10 */ do_action( 'woocommerce_after_shop_loop' ); } else { /** * Hook: woocommerce_no_products_found. * * @hooked wc_no_products_found - 10 */ do_action( 'woocommerce_no_products_found' ); } /** * Hook: woocommerce_after_main_content. * * @hooked woocommerce_output_content_wrapper_end - 10 (outputs closing divs for the content) */ do_action( 'woocommerce_after_main_content' ); ?> </div> </div> </div> <?php get_footer( 'shop' ); ?>
function custom_modify_query( $query ) { if ( ! is_admin() && $query->is_main_query() ) { if ( is_shop() ) { $query->set( 'posts_per_page', 12 ); } } } add_action( 'pre_get_posts', 'custom_modify_query' ); // Check product has sale function is_product_on_sale($product_id) { $product = wc_get_product($product_id); if ($product->is_on_sale()) { return true; } if ($product->is_type('variable')) { $variants = $product->get_children(); foreach ($variants as $variant_id) { $variant = wc_get_product($variant_id); if ($variant->is_on_sale()) { return true; } } } return false; } // Check product has sale function count_sale_products() { $transient_key = 'count_sale_products'; $cached_count = get_transient($transient_key); if ($cached_count !== false) { return $cached_count; } else { $products = wc_get_products(['return' => 'ids', 'status' => 'publish', 'limit' => -1, 'type' => array('simple', 'variable', 'bundle', 'external', 'grouped')]); $saleProduct = []; foreach ($products as $product_id) { if (is_product_on_sale($product_id)) { $saleProduct[] = $product_id; } } $sale_count = count($saleProduct); set_transient($transient_key, $sale_count, 5 * MINUTE_IN_SECONDS); return $sale_count; } } function get_discounted_variants_of_product($product_id) { $product = wc_get_product($product_id); if ($product->is_type('variable')) { $variants = $product->get_children(); $discounted_variants = array(); foreach ($variants as $variant_id) { $variant = wc_get_product($variant_id); //print_r($variant->status); die; if( $variant->status == 'publish') $discounted_variants[] = array( 'id' => $variant->get_id(), 'sale_price' => $variant->get_sale_price(), 'regular_price' => $variant->get_regular_price(), 'name' => $variant->get_name(), 'sku' => $variant->get_sku(), ); } return $discounted_variants; } return false; } function getStockStatusCountProduct($instock = true){ $stock_status = 'instock'; if(!$instock) $stock_status = 'outofstock'; $args = array( 'stock_status' => $stock_status, 'limit' => -1, 'status' => 'publish', 'type' => array('simple', 'variable'), ); $products = wc_get_products( $args ); return count($products); } function customRatingScoreHTML($productID){ $product = wc_get_product($productID); $average = $product->get_average_rating(); $rating_whole = floor($average); $rating_fraction = $average - $rating_whole; $flug = 0; for($i = 1; $i <= 5; $i++){ if( $i <= $rating_whole ){ echo '<i class="fas fa-star"></i>'; } else{ if( $rating_fraction > 0 && $flug == 0 ){ echo '<i class="fas fa-star-half-alt"></i>'; $flug = 1; } else{ echo '<i class="far fa-star empty"></i>'; } } } } function customShopGridShortcode($atts=[]){ ob_start(); $availability = isset($_GET['availability'])?$_GET['availability']:'instock'; $category = isset($_GET['category'])?$_GET['category']:''; $tag = isset($_GET['tg'])?$_GET['tg']:''; //$on_sale = isset($_GET['on_sale'])?$_GET['on_sale']:''; $orderBy = isset($_GET['orderby'])?$_GET['orderby']:''; $keyword = isset($_GET['s'])?$_GET['s']:''; $paged = max(get_query_var('paged'),1); $args = [ 'post_type' => ['product'], 'paged' => $paged, 'posts_per_page' => 12, ]; if(!empty($category) && $category!= 'all') $args['tax_query'] = [ 'relation' => 'AND', [ 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => array( $category ), ], ]; if(!empty($tag)){ if(array_key_exists ('tax_query',$args)){ $args['tax_query'][] = [ 'taxonomy' => 'product_tag', 'field' => 'slug', 'terms' => array( $tag ), ]; } else{ $args['tax_query'] = [ 'relation' => 'AND', [ 'taxonomy' => 'product_tag', 'field' => 'slug', 'terms' => array( $tag ), ], ]; } } // if(!empty($on_sale) && $on_sale == 1){ // } if(!empty($availability)){ if($availability == 'sale'){ $products = wc_get_products( ['return' => 'ids','status' => 'publish','limit' => -1,'type' => array('simple', 'variable', 'bundle','external','grouped')] ); $saleProduct = []; foreach($products as $vv){ if(is_product_on_sale($vv)){ $saleProduct[] = $vv; } } if(!empty($saleProduct)) $args['post__in'] = $saleProduct; else $args['post__in'] = [0]; // if(array_key_exists('tax_query',$args)){ // $args['tax_query'][] = [ // 'key' => '_sale_price', // 'value' => '', // 'compare' => '!=' // ]; // } // else{ // $args['tax_query'] = [ // 'relation' => 'AND', // [ // 'key' => '_sale_price', // 'value' => '', // 'compare' => '!=' // ], // ]; // } } else{ $products = wc_get_products( ['stock_status' => $availability,'return' => 'ids','status' => 'publish','limit' => -1,'type' => array('simple', 'variable', 'bundle','external','grouped')] ); if(!empty($products)) $args['post__in'] = $products; else $args['post__in'] = [0]; } //print_r($products); } if(!empty($orderBy)){ if($orderBy == 'popularity'){ $args['meta_key'] = 'total_sales'; $args['orderby'] = 'meta_value_num'; $args['order'] = 'DESC'; } if($orderBy == 'rating'){ $args['meta_key'] = '_wc_average_rating'; $args['orderby'] = 'meta_value_num'; $args['order'] = 'DESC'; } if($orderBy == 'date'){ $args['orderby'] = 'date'; $args['order'] = 'DESC'; } if($orderBy == 'price'){ $args['meta_key'] = '_price'; $args['orderby'] = 'meta_value_num'; $args['order'] = 'ASC'; } if($orderBy == 'price-desc'){ $args['meta_key'] = '_price'; $args['orderby'] = 'meta_value_num'; $args['order'] = 'DESC'; } } if(!empty($keyword)){ $args['s'] = $keyword; } if(isset($_GET['dev'])) print_r($args); $the_query = new WP_Query( $args ); ?> <div class="customShopGrid-wrap"> <form id="frmFilterProduct" method="GET" action=""> <div class="frmFilterProduct-ajax"> <?php $sort_arr = [ 'menu_order' => __('Default Sorting'), 'popularity' => __('Best Selling'), 'rating' => __('Average Rating'), 'date' => __('Latest Product'), 'price' => __('Price Low To High'), 'price-desc' => __('Price High To Low'), ]; ?> <div class="customShopGrid-order-wrap"> <div class="customShopGrid-order orderbyPC"> <span>Sort By:</span> <select id="orderby" class="slOrder" name="orderby"> <?php foreach($sort_arr as $key => $value):?> <option value="<?php echo $key; ?>" <?php if($orderBy == $key) echo 'selected'?>><?php echo $value; ?></option> <?php endforeach; ?> </select> </div> </div> <div class="customShopGrid"> <div class="customShopGrid-left"> <div class="customShopGrid-filter"> <div class="customShopGrid-filter-top customShopGrid-filter-space"> <h2 class="customShopGrid-filter-heading">Filter Products</h2> <img src="https://vancitylabs.co/wp-content/uploads/2024/04/setting-ic.svg" /> </div> <div class="customShopGrid-filter-list"> <div class="customShopGrid-filter-group"> <div class="customShopGrid-filter-group-head customShopGrid-filter-space"> <h3 class="customShopGrid-filter-heading">Availability</h3> </div> <div class="customShopGrid-filter-group-content"> <ul> <li> <label class="custom-checkbox"> <input id="Availability-instock" class="filter-checkbox" type="checkbox" name="availability" value="instock" <?php if($availability == 'instock') echo 'checked' ?> /> <span style='font-size: 18px'>In Stock (<?php echo getStockStatusCountProduct()?>)</span> </label> </li> <li> <label class="custom-checkbox"> <input id="Availability-outstock" class="filter-checkbox" type="checkbox" name="availability" value="outofstock" <?php if($availability == 'outofstock') echo 'checked' ?> /> <span style='font-size: 18px'>Out of Stock (<?php echo getStockStatusCountProduct(false)?>)</span> </label> </li> <li> <label class="custom-checkbox"> <input id="Availability-outstock" class="filter-checkbox" type="checkbox" name="availability" value="sale" <?php if($availability == 'sale') echo 'checked' ?> /> <span style='font-size: 18px'>On Sale (<?php echo count_sale_products();?>)</span> </label> </li> </ul> </div> </div> <!--end group--> <?php $cats = get_terms([ 'taxonomy' => 'product_cat', 'hide_empty' => true, 'parent' => 0, ]); if(!empty($cats)): ?> <div class="customShopGrid-filter-group"> <div class="customShopGrid-filter-group-head customShopGrid-filter-space"> <h3 class="customShopGrid-filter-heading">Categories</h3> </div> <div class="customShopGrid-filter-group-content"> <ul> <li> <label class="custom-checkbox"> <input class="filter-checkbox" type="checkbox" name="category" value="all" <?php if($category == 'all') echo 'checked' ?> /> <span style='font-size: 18px'>All</span> </label> </li> <?php foreach ($cats as $key => $value): $childs = get_term_children( $value->term_id, 'product_cat' ); $isChildOpen = false; if(!empty($childs)): foreach($childs as $child): $child = get_term_by('id',$child,'product_cat'); //print_r($category); if($category == $child->slug){ $isChildOpen = true; break; } endforeach; endif; ?> <li class="<?php if(!empty($childs)) echo 'has-child'; ?>"> <?php if(!empty($childs)):?> <div class="custom-checkbox"> <?php else: ?> <label class="custom-checkbox"> <?php endif;?> <input class="filter-checkbox" type="checkbox" name="category" value="<?php echo $value->slug ?>" <?php if($category == $value->slug) echo 'checked' ?> /> <span style='font-size: 18px'><?php echo $value->name ?> (<?php echo $value->count ?>)</span> <?php if(!empty($childs)):?> </div> <?php else: ?> </label> <?php endif;?> <?php if(!empty($childs)): ?> <ul class="customShopGrid-filter-group-content-child" style="<?php if(!$isChildOpen) echo 'display: none;'?>"> <?php foreach($childs as $child): $child = get_term_by('id',$child,'product_cat'); if($child->count > 0): ?> <li> <label class="custom-checkbox"> <input class="filter-checkbox" type="checkbox" name="category" value="<?php echo $child->slug ?>" <?php if($category == $child->slug) echo 'checked' ?> /> <span style='font-size: 18px'><?php echo $child->name; ?> (<?php echo $child->count ?>)</span> </label> </li> <?php endif; endforeach ?> </ul> <?php endif;?> </li> <?php endforeach ?> </ul> </div> </div> <!--end group--> <?php endif; ?> <div class="customShopGrid-filter-reset"> <a class="customShopGrid-filter-reset-button" href="<?php echo get_permalink( wc_get_page_id( 'shop' ) )?>">Reset Filters</a> </div> </div> </div> </div> <div class="customShopGrid-right"> <div class="customShopGrid-order show-mb-flex" hidden> <h3 class="customShopGrid-filter-heading">Sort by:</h3> <div class="orderbyMB"> </div> </div> <!--end group--> <?php if ( !empty($keyword) ) :?> <p class="customShopGrid-seach-keyword-label">Search results for <span>"<?php echo $keyword; ?>"</span> <a href="https://vancitylabs.co/shop/">Remove</a></p> <?php endif; ?> <div class="customShopGrid-list"> <?php if ( $the_query->have_posts() ) :?> <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?> <div class="customShopGrid-product"> <div class="customShopGrid-product-inner"> <div class="customShopGrid-product-image-wrap"> <?php $product = wc_get_product(get_the_ID()); $product_type = $product->get_type(); if(!$product->is_in_stock()): ?> <span class="customShopGrid-product-stockout customShopGrid-product-label">Out of stock</span> <?php endif; ?> <?php if(is_product_on_sale(get_the_ID())):?> <span class="customShopGrid-product-has-sale customShopGrid-product-label">Sale</span> <?php endif; ?> <div class="customShopGrid-product-image"> <a href="<?php the_permalink();?>" tabindex="0"> <?php the_post_thumbnail('medium')?> </a> </div> </div> <div class="customShopGrid-product-content"> <div class="customShopGrid-product-content-inner"> <div class="customShopGrid-product-ratting-wrap"> <div class="top-rated-rating"> <?php $types = get_the_terms(get_the_ID(),'product-type'); $type = ''; if(!empty($types)) $type = reset($types); if(is_object($type)): $color = get_field('color',$type); ?> <span class="customShopGrid-product-type" style="<?php if($color) echo 'background:'.$color;?>"><?php echo $type->name;?></span> <?php endif; ?> <span class="customShopGrid-product-ratting"> <span class="customShopGrid-product-user-ratting"> <?php customRatingScoreHTML(get_the_ID());?> </span> <span class="customShopGrid-product-user-ratting-count" hidden>(<?php echo $product->get_rating_count(); ?>)</span> </span> <?php $thc = get_field('thc'); if($thc > 0): ?> <span class="customShopGrid-product-thc"><b>THC</b> <?php echo $thc.'%'?></span> <?php endif; ?> </div> </div> <h4 class="customShopGrid-product-title"><a href="<?php the_permalink();?>" tabindex="0"><?php the_title();?></a></h4> <?php $add_to_card_id = get_the_ID(); $discounted_variants = get_discounted_variants_of_product(get_the_ID()); if($discounted_variants): $add_to_card_id = $discounted_variants[0]['id']; ?> <select class="customShopGrid-product-list-variable"> <?php foreach($discounted_variants as $key => $value): //print_r($value); $variable_price = ($value['sale_price']> 0)?$value['sale_price'] : $value['regular_price']; $name_parts = explode(' - ', $value['name']); //$variable_price = 0; ?> <option value="<?php echo $value['id']?>" <?php if(strtolower(end($name_parts)) == '28g'){$add_to_card_id = $value['id']; echo 'selected';}?>><?php echo end($name_parts);?> - $<?php echo $variable_price;?></option> <?php endforeach;?> </select> <?php else: ?> <div class="customShopGrid-product-price"> <?php woocommerce_template_loop_price();?> </div> <?php endif;?> <div class="wrap-btn"> <?php if($product_type !== 'bundle'):?> <a class="pb-btn-style add_to_cart_button ajax_add_to_cart" href="<?php site_url();?>?add-to-cart=<?php echo $add_to_card_id;?>&quantity=1" data-quantity="1" data-product_id="<?php echo $add_to_card_id;?>"><span>Add to cart</span> <img src="https://vancitylabs.co/wp-content/uploads/2024/04/right-arrow.svg" /></a> <?php else: ?> <a class="pb-btn-style" href="<?php the_permalink(); ?>"><span>Buy Now</span> <img src="https://vancitylabs.co/wp-content/uploads/2024/04/right-arrow.svg" /></a> <?php endif;?> </div> </div> </div> </div> </div> <?php endwhile;?> <?php else: ?> <p>No product found!</p> <?php endif;wp_reset_postdata();?> </div> <?php if($the_query->max_num_pages > 1):?> <div class="customShopGrid-pagenavi"> <?php echo paginate_links(array( 'total' => $the_query->max_num_pages, 'current' => $paged, 'prev_text' => '<img src="'.CHILD_THEME_URI.'/images/prev-arrow-green.svg" />', 'next_text' => '<img src="'.CHILD_THEME_URI.'/images/next-arrow-green.svg" />' ));?> </div> <?php endif;?> </div> </div> </div> </form> <script type="text/javascript"> (function($){ var sortDiv = $('body').find('#orderby'); //var spinner = $('') $('body').on('change','.filter-checkbox',function(){ $(this).parents('li').siblings().find('.filter-checkbox').prop('checked', false) $('#frmFilterProduct').submit(); }) $('body').on('click','.customShopGrid-filter-group-head',function(e){ $(this).toggleClass('close') $(this).parent().find('.customShopGrid-filter-group-content').slideToggle(); }) $('body').on('change','.slOrder',function(){ $('#frmFilterProduct').submit(); }) $('body').on('click','.customShopGrid-filter-top',function(e){ $(this).toggleClass('close') $(this).parent().find('.customShopGrid-filter-list').slideToggle(); }) $('body').on('click','li.has-child .custom-checkbox',function(e){ var $div = $(this); var divOffset = $div.offset(); var clickX = e.pageX - divOffset.left; if (clickX <= 28) { $(this).parents('ul').find('.filter-checkbox').prop('checked', false); $(this).find('.filter-checkbox').prop('checked', true) $('#frmFilterProduct').submit(); } else{ $(this).parent().find('.customShopGrid-filter-group-content-child').slideToggle(); } }) function moveSortDiv(){ if($(window).innerWidth() < 768){ if(!$('.orderbyMB .slOrder').length) sortDiv.appendTo('.orderbyMB'); } else{ if(!$('.orderbyPC .slOrder').length) sortDiv.appendTo('.orderbyPC'); } } moveSortDiv(); $(window).on('resize',function(){ moveSortDiv(); }) function customAjaxSend(form,fullUrl){ history.pushState({}, '', fullUrl); $.ajax({ url: fullUrl, method: form.attr('method'), data: form.serialize(), dataType: 'html', beforeSend: function () { $('.customShopGrid-list').html(`<div class="cspinner"> <div class="loadingio-spinner" style="/* display: none; */"> <div class="loadingio-spinner-spinner-gakt1tin5n"> <div class="ldio-7ufvexzivn"> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> </div> </div> </div> </div>`); $('.cspinner .loadingio-spinner').show(); $('.customShopGrid-pagenavi').css('display','none'); }, success: function(response) { const html = $(response); const items = html.find('.frmFilterProduct-ajax'); $('#frmFilterProduct').html(items); $('.cspinner .loadingio-spinner').hide(); $('.customShopGrid-pagenavi').css('display','flex'); // if (items.length) { // $('.project-box').html(items); // } else { // $('.project-box').html('<p>Aucun résultat trouvé</p>'); // } //console.log(response); moveSortDiv(); }, error: function(jqXHR, textStatus, errorThrown) { console.log('Error submitting form'); console.log(textStatus, errorThrown); } }); } $('#frmFilterProduct').on('submit', function(e) { e.preventDefault(); var form = $(this); var url = form.attr('action'); var fullUrl = url + '?' + form.serialize(); history.pushState({}, '', fullUrl); let currentUrl = window.location.href; let newUrl = currentUrl.replace(/page\/\d+\//, ''); customAjaxSend(form, newUrl); }); $('body').on('click','.customShopGrid-pagenavi a',function(e){ e.preventDefault(); var form = $('#frmFilterProduct'); var fullUrl = $(this).attr('href'); $('html, body').animate({ scrollTop: $(".customShopGrid-right").offset().top - 300 }, 1000); // 1000 milliseconds for the scroll animation customAjaxSend(form, fullUrl); // setTimeout(function() { // }, 200); // 1000 milliseconds delay before starting the scroll }) })(jQuery) </script> </div> <?php return ob_get_clean(); } add_shortcode('customShopGrid','customShopGridShortcode');
/** * @snippet Remove Zoom, Gallery @ Single Product Page * @how-to Get CustomizeWoo.com FREE * @author Rodolfo Melogli * @testedwith WooCommerce 5 * @community https://businessbloomer.com/club/ */ //add_action( 'wp', 'bbloomer_remove_zoom_lightbox_theme_support', 99 ); function bbloomer_remove_zoom_lightbox_theme_support() { //remove_theme_support( 'wc-product-gallery-zoom' ); //remove_theme_support( 'wc-product-gallery-lightbox' ); remove_theme_support( 'wc-product-gallery-slider' ); } ////Remove actions for single product remove_action('woocommerce_before_main_content','woocommerce_breadcrumb',20); remove_action('woocommerce_single_product_summary','woocommerce_template_single_meta',40); remove_action('woocommerce_single_product_summary','woocommerce_template_single_excerpt',20); remove_action('woocommerce_after_single_product_summary','woocommerce_output_product_data_tabs',10); remove_action('woocommerce_after_single_product_summary','woocommerce_upsell_display',15); remove_action('woocommerce_after_single_product_summary','woocommerce_output_related_products',20); //Add actions for single product add_action('woocommerce_single_product_summary','woocommerce_template_single_excerpt',35); function addTHCForSingleProduct(){ $thc = get_field('thc'); if(!empty($thc)) echo '<h4 class="single-product-thc">'.$thc.'</h4>'; } add_action('woocommerce_single_product_summary','addTHCForSingleProduct',6); function customTabForSingleProduct(){ ?> <div class="rst-accordion-description"> <?php if($ingredient = get_field('ingredient_field_name')):?> <div class="rst-item-accordion-description"> <h3 class="rst-heading-item-accordion-description rst-heading-item-toggle"> Ingredients <span> <img src="https://sweedies.co/wp-content/uploads/2024/05/arrows-down.png" /> </span> </h3> <div class="rst-content-item-accordion-description"> <?php echo $ingredient; ?> </div> </div> <?php endif;?> <?php $lab_test_report = get_field('lab_test_report');if(!empty($lab_test_report)):?> <div class="rst-item-accordion-description"> <a class="rst-heading-item-accordion-description" href="<?php echo $lab_test_report['url']; ?>" download> Lab test report <span> <img src="https://sweedies.co/wp-content/uploads/2024/05/PDF-Print-Icon.png" /> </span> </a> </div> <?php endif;?> </div> <script> (function($){ $('.rst-heading-item-toggle').click(function(){ if($(this).hasClass('active')){ $(this).parent().find('.rst-content-item-accordion-description').slideUp(); $(this).removeClass('active'); }else{ $('.rst-content-item-accordion-description').slideUp(); $(this).parent().find('.rst-content-item-accordion-description').slideDown(); $('.rst-heading-item-toggle').removeClass('active'); $(this).addClass('active'); } return false; }); })(jQuery) </script> <?php } add_action('woocommerce_single_product_summary','customTabForSingleProduct',45); function customBestSellerForShop(){ ?> <?php $args = [ 'post_type' => 'product', 'posts_per_page' => 15, 'meta_key' => 'total_sales', 'orderby' => 'meta_value_num', 'order' => 'DESC', ]; $the_query = new WP_Query($args); if($the_query->have_posts()): ?> <div class="customBestSellerForSingleProduct" style="clear: both;"> <div class="customBestSellerForSingleProduct-head"> <h2 class="nt-heading"> Best Sellers </h2> </div> <div class="customBestSellerForSingleProduct-list"> <div class="slider-product custom-slider-product-bestSellers"> <div class="swiper-wrapper"> <?php while ($the_query->have_posts()): $the_query->the_post(); $product = wc_get_product(get_the_ID()); $categories = wp_get_post_terms(get_the_ID(), 'product_cat'); $category_name = !empty($categories) ? $categories[0]->name : ''; $rating_count = $product->get_rating_count(); $average = $product->get_average_rating(); $regular_price = $product->get_regular_price(); $sale_price = $product->get_sale_price(); ?> <div class="swiper-slide"> <div class="slider-product-item"> <a class="product-link" href="<?php the_permalink(); ?>"> <div class="slider-product-image"> <?php echo woocommerce_get_product_thumbnail('shop_catalog'); ?> <div class="add-to-cart-btn"> <?php //echo $this->get_add_to_cart_button(get_the_ID()); ?> </div> </div> </a> <div class="slider-product-details"> <div class="product-category"><?php echo esc_html($category_name); ?></div> <a href="<?php the_permalink(); ?>"> <h2 class="slider-product-title"> <?php the_title(); ?> </h2> </a> <div class="slider-product-description"><?php echo wp_trim_words(get_the_excerpt(), 15); ?></div> <div class="product-rating"> <?php $rating = $average; $full_stars = floor($rating); $half_star = ($rating - $full_stars >= 0.5) ? 1 : 0; $empty_stars = 5 - $full_stars - $half_star; for ($i = 0; $i < $full_stars; $i++) { echo '<i class="fa-solid fa-star"></i>'; } if ($half_star) { echo '<i class="fa-solid fa-star-half-alt"></i>'; } for ($i = 0; $i < $empty_stars; $i++) { echo '<i class="fa-regular fa-star"></i>'; } ?> <span class="rating-count">(<?php echo $rating_count; ?>)</span> </div> <div class="slider-product-prices"> <?php if ($sale_price): ?> <span class="slider-product-new-price"><?php echo wc_price($sale_price); ?></span> <span class="slider-product-old-price"><?php echo wc_price($regular_price); ?></span> <?php else: ?> <span class="slider-product-new-price"><?php echo wc_price($regular_price); ?></span> <?php endif; ?> </div> </div> </div> </div> <?php endwhile; ?> </div> <div class="swiper-pagination"></div> </div> <div class="swiper-button-prev"></div> <div class="swiper-button-next"></div> </div> </div> <script> jQuery(document).ready(function ($) { var swiper_bestSellers = new Swiper(".custom-slider-product-bestSellers", { slidesPerView: 3, slidesPerGroup: 1, centeredSlides: true, loop: true, autoplay: { delay: 5000, }, spaceBetween: 24, // pagination: { // el: ".swiper-pagination", // clickable: true, // }, navigation: { nextEl: '.swiper-button-next', prevEl: '.swiper-button-prev', }, breakpoints: { 1025: { slidesPerView: 3, centeredSlides: true, }, 768: { slidesPerView: 2, centeredSlides: true, }, 320: { slidesPerView: 1.5, centeredSlides: true, }, } }); }); jQuery(document).ready(function($) { $('.slider-product .slider-product-item ').matchHeight(); }); </script> <?php endif; wp_reset_postdata(); } add_action('woocommerce_after_single_product','customBestSellerForSingleProduct',25); function customReviewForSingleProduct(){ ?> <div class="customReviewForSingleProduct"> <div class="customReviewForSingleProduct-head"> <h2 class="nt-heading"> Customer reviews </h2> </div> <div class="customReviewForSingleProduct-content"> <?php echo do_shortcode('[Woo_stamped_io type="widget"]');?> </div> </div> <?php } add_action('woocommerce_after_single_product','customBestSellerForShop',30);
let currentSelectedCell = playersTableView.cellForRow(at: indexPath) as! PlayerDetailsTableViewCell if selectedRow == -1 { currentSelectedCell.playerDetailsView.layer.borderColor = hexStringToUIColor(hex: "F34141").cgColor currentSelectedCell.playerDetailsView.layer.borderWidth = 1 selectedRow = indexPath.row } else if indexPath.row == selectedRow { currentSelectedCell.playerDetailsView.layer.borderWidth = 0 selectedRow = -1 } else { currentSelectedCell.playerDetailsView.layer.borderColor = hexStringToUIColor(hex: "F34141").cgColor currentSelectedCell.playerDetailsView.layer.borderWidth = 1 let newIndexPath = IndexPath(item: selectedRow, section: 0) if let cell = playersTableView.cellForRow(at: newIndexPath) as? PlayerDetailsTableViewCell { cell.playerDetailsView.layer.borderWidth = 0 } selectedRow = indexPath.row }