Try with below code. Here i have assumed that you are having one level category only.
Main category one //level 0
Subcategory //level 1
product
product
Subcategory
product
product
Main category two //level 0
Subcategory //level 1
product
product
Subcategory
product
product
<ul class="category-sidebar">
<?php
$get_parent_cats = array(
'parent' => '0', //get top level categories only
'taxonomy'=>'product_cat',
'hide_empty' => false
);
$all_categories = get_categories( $get_parent_cats );//get parent categories
foreach( $all_categories as $single_category ){
//for each category, get the ID
$catID = $single_category->cat_ID;
echo '<li><a href=" ' . get_category_link( $catID ) . ' ">' . $single_category->name . '</a>'; //category name & link
$get_children_cats = array(
'child_of' => $catID, //get children of this parent using the catID variable from earlier
'taxonomy'=>'product_cat',
'hide_empty' => false
);
wp_reset_postdata();
$child_cats = get_categories( $get_children_cats );//get children of parent category
if(count($child_cats)>0){
echo '<ul class="children">';
foreach( $child_cats as $child_cat ){
//for each child category, get the ID
$childID = $child_cat->cat_ID;
//for each child category, give us the link and name
echo '<a href=" ' . get_category_link( $childID ) . ' ">' . $child_cat->name . '</a>';
wp_reset_postdata();
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'id',
'terms' => $childID,
),
),
);
$loop = new WP_Query($args);
echo "<ul>";
if($loop->have_posts()) {
while ( $loop->have_posts() ) {
$loop->the_post();
// do something
echo "<li><a href=".get_the_permalink()."> Product Name : ".get_the_title()."</a></li>";
}
}
echo "</ul>";
}
echo '</ul></li>';
}else{
//$catID
wp_reset_postdata();
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'id',
'terms' => $catID,
),
),
);
$loop = new WP_Query($args);
echo "<ul>";
if($loop->have_posts()) {
while ( $loop->have_posts() ) {
$loop->the_post();
// do something
echo "<li><a href=".get_the_permalink()."> Product Name : ".get_the_title()."</a></li>";
}
}
echo "</ul>";
}
} //end of categories logic ?>