Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Create a Custom WooCommerce Product Loop (The Right Way). See https://cfxdesign.com/create-a-custom-woocommerce-product-loop-the-right-way
<?php
if(!function_exists('wc_get_products')) {
return;
}
$paged = (get_query_var('paged')) ? absint(get_query_var('paged')) : 1;
$ordering = WC()->query->get_catalog_ordering_args();
$ordering['orderby'] = array_shift(explode(' ', $ordering['orderby']));
$ordering['orderby'] = stristr($ordering['orderby'], 'price') ? 'meta_value_num' : $ordering['orderby'];
$products_per_page = apply_filters('loop_shop_per_page', wc_get_default_products_per_row() * wc_get_default_product_rows_per_page());
$featured_products = wc_get_products(array(
'meta_key' => '_price',
'status' => 'publish',
'limit' => $products_per_page,
'page' => $paged,
'featured' => true,
'paginate' => true,
'return' => 'ids',
'orderby' => $ordering['orderby'],
'order' => $ordering['order'],
));
wc_set_loop_prop('current_page', $paged);
wc_set_loop_prop('is_paginated', wc_string_to_bool(true));
wc_set_loop_prop('page_template', get_page_template_slug());
wc_set_loop_prop('per_page', $products_per_page);
wc_set_loop_prop('total', $featured_products->total);
wc_set_loop_prop('total_pages', $featured_products->max_num_pages);
if($featured_products) {
do_action('woocommerce_before_shop_loop');
woocommerce_product_loop_start();
foreach($featured_products->products as $featured_product) {
$post_object = get_post($featured_product);
setup_postdata($GLOBALS['post'] =& $post_object);
wc_get_template_part('content', 'product');
}
wp_reset_postdata();
woocommerce_product_loop_end();
do_action('woocommerce_after_shop_loop');
} else {
do_action('woocommerce_no_products_found');
}
<?php
if ( have_posts() ) {
do_action( 'woocommerce_before_shop_loop' );
woocommerce_product_loop_start();
if ( wc_get_loop_prop( 'total' ) ) {
while ( have_posts() ) {
the_post();
do_action( 'woocommerce_shop_loop' );
wc_get_template_part( 'content', 'product' );
}
}
woocommerce_product_loop_end();
do_action( 'woocommerce_after_shop_loop' );
} else {
do_action( 'woocommerce_no_products_found' );
}
@andrii-gh

This comment has been minimized.

Copy link

@andrii-gh andrii-gh commented Aug 21, 2019

Thanks!

@kenzotenma016

This comment has been minimized.

Copy link

@kenzotenma016 kenzotenma016 commented May 28, 2020

How are we able to do $featured_products->total when clearly wc_get_products returns an array?

@cfxd

This comment has been minimized.

Copy link
Owner Author

@cfxd cfxd commented May 28, 2020

How are we able to do $featured_products->total when clearly wc_get_products returns an array?

https://github.com/woocommerce/woocommerce/blob/dd49f89e77acaaa097251fe0a5dd69320ded48c6/includes/wc-product-functions.php#L25

@kenzotenma016

This comment has been minimized.

Copy link

@kenzotenma016 kenzotenma016 commented May 29, 2020

How are we able to do $featured_products->total when clearly wc_get_products returns an array?

https://github.com/woocommerce/woocommerce/blob/dd49f89e77acaaa097251fe0a5dd69320ded48c6/includes/wc-product-functions.php#L25

ah, yes. I forgot to pass the paginate property.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.