Woocommerce products from category loop

13,961

Solution 1

Your code should work, although it will take all products in the loop (including those marked as "draft" when you are logged in). You can define only published by adding 'post_status' => 'publish' to your argument variable.

And you should take a look at those anchor tags (specifically the close part)

Solution 2

I Hope this code gonna help you guys :)

    <ul class="products">
    <?php
    $args = array(
        'product_cat' => 'Shampoo',
        'posts_per_page' => 4,
        'orderby' => 'rand'
    );
    $loop = new WP_Query($args);
    while ($loop->have_posts()) : $loop->the_post();
        global $product; ?>
        <div class="row">
            <!-- <h2>Shampoo</h2> -->
            <li class="product">

                <a href="<?php echo get_permalink($loop->post->ID) ?>" title="<?php echo esc_attr($loop->post->post_title ? $loop->post->post_title : $loop->post->ID); ?>">

                    <?php woocommerce_show_product_sale_flash($post, $product); ?>

                    <?php if (has_post_thumbnail($loop->post->ID)) echo get_the_post_thumbnail($loop->post->ID, 'shop_catalog');
                    else echo '<img src="' . woocommerce_placeholder_img_src() . '" alt="Placeholder" width="300px" height="300px" />'; ?>

                    <h3><?php the_title(); ?></h3>

                    <span class="price"><?php echo $product->get_price_html(); ?></span>

                </a>

                <?php woocommerce_template_loop_add_to_cart($loop->post, $product); ?>
            </li>
        </div>
    <?php endwhile; ?>
    <?php wp_reset_query(); ?>
</ul>
<!--/.products-->

Solution 3

You need to do a tax query instead this way:

$loop = new WP_Query( array(
    'post_type' => 'product',
    'post_status' => 'publish',
    'posts_per_page' => 5,
    'tax_query' => array( array(
        'taxonomy'         => 'product_cat',
        'field'            => 'slug', // Or 'term_id' or 'name'
        'terms'            => get_query_var( 'product_cat' ), // A slug term
        // 'include_children' => false // or true (optional)
    )),
    'orderby' => 'rand'
) );

Tested and works on Woocommerce product category archive pages…

Share:
13,961

Related videos on Youtube

Aurimas Gelžinis
Author by

Aurimas Gelžinis

Updated on June 04, 2022

Comments

  • Aurimas Gelžinis
    Aurimas Gelžinis almost 2 years

    In Woocommerce, I Need some help with this custom product loop, in my code my result is : how it looks like

    The loop doesn't stop and it is looping the same products for three or four times.

    The code I am using is here :

    <div class="container">
        <div id="default_products_page_container" class="wrap wpsc_container">
            <?php
                remove_action( 'woocommerce_before_shop_loop', 'woocommerce_catalog_ordering', 30 );
                remove_action( 'woocommerce_before_shop_loop', 'woocommerce_result_count', 20 );
                $cat = get_query_var( 'product_cat' );
                $args = array( 'post_type' => 'product', 'posts_per_page' => 5, 'product_cat' => $cat, 'orderby' => 'rand' );
                $loop = new WP_Query( $args );
            ?>
            <div class="wpsc_default_product_list">
                <?php
                while ( $loop->have_posts() ) : $loop->the_post(); global $product; ?>
                <div class="col-lg-4 col-md-4 col-sm-12 col-xs-12">
                    <div class="default_product_display product_view_<?php echo get_permalink( $loop->post->ID ); ?>group">
                        <a href="<?php echo get_permalink( $loop->post->ID ) ?>" title="<?php echo esc_attr($loop->post->post_title ? $loop->post->post_title : $loop->post->ID); ?>"/>
                        <?php if (has_post_thumbnail( $loop->post->ID ))
                        {            
                        ?>         
                        <div class="product-image-thumb"> 
                            <img src="<?php echo the_post_thumbnail_url( $loop->post->ID );?>"/>
                        </div>
                        <?php
                        } else 
                        {?>
                        <div class="product-image-thumb">
                            <a>
                                <img src="<?php echo woocommerce_placeholder_img_src();?>"/>
                            </a>
                        </div>
                        <?php } ?>
                    </div>
                </div>
                <?php endwhile; ?>
            </div>
            <?php wp_reset_query(); ?>
        </div>
    </div>
    
    • kakabali
      kakabali about 6 years
      please edit the code for better indentation
  • Aurimas Gelžinis
    Aurimas Gelžinis about 6 years
    Same problem. I have only 6 products in my shop, but the code was printing 9 :D
  • Aurimas Gelžinis
    Aurimas Gelžinis about 6 years
    I think the main problem is at posts per page
  • LoicTheAztec
    LoicTheAztec about 6 years
    @AurimasGelžinis The post_per_page limit the number of displayed products… If you use the value -1, there is no limitation… I have tested your code and for me it works without duplicated products… So there is something else somewhere that is making this happen.
  • Aurimas Gelžinis
    Aurimas Gelžinis about 6 years
    It can be because of my css? when i do it without, it work's great