Skip to content

Instantly share code, notes, and snippets.

@peltopiri
Created March 27, 2019 12:38
Show Gist options
  • Save peltopiri/d69df19d8669b11ae3aa7b4716e6171e to your computer and use it in GitHub Desktop.
Save peltopiri/d69df19d8669b11ae3aa7b4716e6171e to your computer and use it in GitHub Desktop.
WooCommerce - Nested Category/Subcategory Layout, FIXED: show subcategory content
<?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' );
?>
<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>
<?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' );
/* Category - SubCategory START */
$term = get_queried_object();
$parent_id = empty( $term->term_id ) ? 0 : $term->term_id;
$product_categories = get_categories( array( 'taxonomy' => 'product_cat', 'child_of' => $parent_id) );
if(empty($product_categories)) {
woocommerce_product_loop_start();
if ( wc_get_loop_prop( 'total' ) ) {
while ( have_posts() ) {
the_post();
/**
* Hook: woocommerce_shop_loop.
*
* @hooked WC_Structured_Data::generate_product_data() - 10
*/
do_action( 'woocommerce_shop_loop' );
wc_get_template_part( 'content', 'product' );
}
}
woocommerce_product_loop_end();
} else {
$i = 1;
foreach ($product_categories as $product_category) {
echo '<h2>'.$product_category->name.'</h2>';
woocommerce_product_loop_start(); //open ul
$args = array(
'posts_per_page' => -1,
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => $product_category->slug
),
),
'post_type' => 'product',
'orderby' => 'menu_order',
'order' => 'asc',
);
$cat_query = new WP_Query( $args );
while ( $cat_query->have_posts() ) : $cat_query->the_post();
wc_get_template_part( 'content', 'product' );
endwhile; // end of the loop.
wp_reset_postdata();
woocommerce_product_loop_end(); //close ul
if ( $i < count($product_categories) )
echo '<div class="content-seperator"></div>';
$i++;
}//foreach
}
/* Category - SubCategory 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' );
/**
* Hook: woocommerce_sidebar.
*
* @hooked woocommerce_get_sidebar - 10
*/
do_action( 'woocommerce_sidebar' );
get_footer( 'shop' );
@Sarotis2
Copy link

Hi! Thanks for your code! I have same problem as Sascha, any recommendation to solve it?

Hi. Superior script. Its that was I'm looking for. But I've one problem. I've a few categories and one category has subcategories. On the shop page it will show products from the subcategories on the parent category and than twice in the subcategories.

It should be

Cat1

  • SubCat1
    -- Prod 1
    -- Prod 2
    -- Prod 3
  • SubCat1
    -- Prod 4
    -- Prod 5
  • SubCat1
    -- Prod 6
    -- Prod 7
    -- Prod 8
    Cat2
    -- Prod 9
    -- Prod 10
    Cat3
    -- Prod 11
    -- Prod 12
    Cat4
    -- Prod 13
    -- Prod 14

But it looks like this ;-(

Cat1 -- Prod 1 -- Prod 2 -- Prod 3 -- Prod 4 -- Prod 5 -- Prod 6 -- Prod 7 -- Prod 8

  • SubCat1
    -- Prod 1
    -- Prod 2
    -- Prod 3
  • SubCat1
    -- Prod 4
    -- Prod 5
  • SubCat1
    -- Prod 6
    -- Prod 7
    -- Prod 8
    Cat2
    -- Prod 9
    -- Prod 10
    Cat3
    -- Prod 11
    -- Prod 12
    Cat4
    -- Prod 13
    -- Prod 14

Has anyone a tip for me? How can I fix?

Thanks Sascha

@limeshlomal
Copy link

Anyone get a solution for that ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment