Creating a custom WooCommerce loop

I use an already developed wordpress theme, and now instead of regular blog posts, I would like to display WooCommerce products (which I use for custom post types).

This is the current request with a display loop:

<?php $args = array( //'posts_per_page' => '2', 'paged' => get_query_var('paged') ); $homepage_query = new WP_Query($args); ?> <?php //query_posts('posts_per_page=4&paged='.get_query_var('paged')); ?> <?php if ( have_posts() ) : ?> <?php while ( $homepage_query->have_posts() ) : $homepage_query->the_post(); ?> <?php if($style == 'blog_style') { ?> <div id="blog-style" class="post-box"> <?php get_template_part('content', 'blog'); ?> </div> <?php } else { ?> <div class="post-box grid_4 <?php aero_post_box_class(); ?>"> <?php get_template_part('content', ''); ?> </div> <?php } ?> <?php endwhile; ?> 

Is there a way to add parameters to $args so that WooCommerce products appear in the loop? I also use pagination with this loop, which is required for this project, so it's important to use this loop.

+8
source share
3 answers

You must have access to the products through the loop by setting post_type arg to product :

 <?php // Setup your custom query $args = array( 'post_type' => 'product', ... ); $loop = new WP_Query( $args ); while ( $loop->have_posts() ) : $loop->the_post(); ?> <a href="<?php echo get_permalink( $loop->post->ID ) ?>"> <?php the_title(); ?> </a> <?php endwhile; wp_reset_query(); // Remember to reset ?> 
+24
source

This is the right way to recreate and customize the WooCommerce product cycle:

  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()); $products_ids = wc_get_products(array( 'status' => 'publish', 'limit' => $products_per_page, 'page' => $paged, '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', $products_ids->total); wc_set_loop_prop('total_pages', $products_ids->max_num_pages); if($products_ids) { do_action('woocommerce_before_shop_loop'); woocommerce_product_loop_start(); foreach($products_ids->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'); } 

Using the code above, you must configure the wc_get_products() arguments to get the wc_get_products() identifiers wc_get_products() your products (if you have certain criteria). Once this code is created, you will have access to all the functions of the native WooCommerce cycle - pagination, ordering, etc. This method is superior to WP_Query and get_posts() since the two methods can WP_Query get_posts() .

I wrote a more detailed blog post on WooCommerce custom cycles here: https://cfxdesign.com/create-a-custom-woocommerce-product-loop-the-right-way/

0
source

You can also get a category using code

  $terms = get_terms('product_cat'); foreach ($terms as $term) { $term_link = get_term_link( $term, 'product_cat' ); echo '<li><a href="' . $term_link . '">' . $term->name . '</a></li>'; } 

If you want only the parent category, then

 wp_list_categories('taxonomy=product_cat&orderby=order&title_li=&depth=1'); 
-one
source

All Articles