Custom Query For Woo
Sat Jun 29 2024 02:06:13 GMT+0000 (Coordinated Universal Time)
Saved by @quanganh141220 #php #single #product
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');
Custom query use for filter product
Comments