Add product category tree sidebar to archive and single product pages (v0.1.7)
All checks were successful
Create Release Package / PHP Lint (push) Successful in 1m4s
Create Release Package / PHPUnit Tests (push) Successful in 50s
Create Release Package / Build Release (push) Successful in 58s

Hierarchical category navigation with collapsible sub-levels up to 3 levels
deep, using Bootstrap 5 list-group and collapse components. Sidebar renders
on both archive/shop and single product pages with responsive offcanvas on
mobile. Active category highlighting and ancestor auto-expand for intuitive
navigation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-29 15:19:53 +02:00
parent 5e4af247fa
commit 9860a184cd
9 changed files with 332 additions and 8 deletions

View File

@@ -22,10 +22,66 @@ defined( 'ABSPATH' ) || exit;
*/
do_action( 'woocommerce_before_main_content' );
while ( have_posts() ) {
the_post();
wc_get_template_part( 'content', 'single-product' );
}
$category_tree = wc_bootstrap_get_category_tree();
$has_widgets = is_active_sidebar( 'shop-sidebar' );
$has_sidebar = ! empty( $category_tree ) || $has_widgets;
?>
<div class="row g-4">
<?php if ( $has_sidebar ) : ?>
<aside class="col-lg-3 mb-4 mb-lg-0">
<button class="btn btn-outline-secondary w-100 d-lg-none mb-3"
type="button"
data-bs-toggle="offcanvas"
data-bs-target="#shopSidebar"
aria-controls="shopSidebar">
<i class="bi bi-list me-1" aria-hidden="true"></i>
<?php esc_html_e( 'Categories', 'wc-bootstrap' ); ?>
</button>
<div class="offcanvas-lg offcanvas-start"
id="shopSidebar"
tabindex="-1"
aria-labelledby="shopSidebarLabel">
<div class="offcanvas-header d-lg-none">
<h5 class="offcanvas-title" id="shopSidebarLabel">
<?php esc_html_e( 'Categories', 'wc-bootstrap' ); ?>
</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="<?php esc_attr_e( 'Close', 'wc-bootstrap' ); ?>"></button>
</div>
<div class="offcanvas-body p-0">
<?php
if ( ! empty( $category_tree ) ) {
$twig = \WPBootstrap\Twig\TwigService::getInstance();
echo $twig->render( 'global/category-tree.html.twig', [
'categories' => $category_tree,
'shop_url' => wc_get_page_permalink( 'shop' ),
'current_cat' => 0,
] );
}
if ( $has_widgets ) {
dynamic_sidebar( 'shop-sidebar' );
}
?>
</div>
</div>
</aside>
<div class="col-lg-9">
<?php else : ?>
<div class="col-12">
<?php endif; ?>
<?php
while ( have_posts() ) {
the_post();
wc_get_template_part( 'content', 'single-product' );
}
?>
</div>
</div>
<?php
/**
* Hook: woocommerce_after_main_content.