Learning Objectives
- Display widget areas using dynamic_sidebar()
- Check for active widgets before display
- Create fallback content for empty widget areas
- Implement conditional widget display
- Structure widget areas in templates
- Style widget output effectively
- Handle multiple widget areas
- Create custom widget display functions
Displaying Widgets in Templates
After registering widget areas, you need to display them in your theme templates using the dynamic_sidebar() function. This function outputs all widgets assigned to a specific widget area.
Key Concept
Basic Widget Display
Simple Widget Area Display
<?php
// In sidebar.php or any template file
if ( is_active_sidebar( 'primary-sidebar' ) ) : ?>
<aside id="secondary" class="widget-area" role="complementary">
<?php dynamic_sidebar( 'primary-sidebar' ); ?>
</aside>
<?php endif; ?>
Widget Display with Fallback Content
<?php
// Display widgets or fallback content
if ( is_active_sidebar( 'primary-sidebar' ) ) : ?>
<aside id="secondary" class="widget-area">
<?php dynamic_sidebar( 'primary-sidebar' ); ?>
</aside>
<?php else : ?>
<aside id="secondary" class="widget-area">
<div class="no-widgets">
<h3><?php _e( 'Content Suggestions', 'mytheme' ); ?></h3>
<p><?php _e( 'This sidebar is empty. Add some widgets to customize your site!', 'mytheme' ); ?></p>
<!-- Default content -->
<div class="widget default-widget">
<h4 class="widget-title"><?php _e( 'Recent Posts', 'mytheme' ); ?></h4>
<ul>
<?php
$recent_posts = wp_get_recent_posts( array(
'numberposts' => 5,
'post_status' => 'publish'
) );
foreach( $recent_posts as $post ) : ?>
<li>
<a href="<?php echo get_permalink( $post['ID'] ); ?>">
<?php echo $post['post_title']; ?>
</a>
</li>
<?php endforeach; ?>
</ul>
</div>
<div class="widget default-widget">
<h4 class="widget-title"><?php _e( 'Categories', 'mytheme' ); ?></h4>
<ul>
<?php wp_list_categories( array(
'title_li' => '',
'number' => 10,
) ); ?>
</ul>
</div>
</div>
</aside>
<?php endif; ?>
Implementing in Theme Templates
Common Template Files for Widgets
theme/
├── sidebar.php - Primary sidebar
├── sidebar-page.php - Page sidebar
├── sidebar-shop.php - Shop sidebar
├── header.php - Header widgets
├── footer.php - Footer widgets
└── front-page.php - Homepage widgets
sidebar.php Template
<?php
/**
* The sidebar containing the main widget area
*
* @package MyTheme
*/
if ( ! is_active_sidebar( 'sidebar-1' ) ) {
return;
}
?>
<aside id="secondary" class="widget-area" role="complementary" aria-label="<?php esc_attr_e( 'Primary Sidebar', 'mytheme' ); ?>">
<?php dynamic_sidebar( 'sidebar-1' ); ?>
</aside><!-- #secondary -->
Including Sidebar in Page Templates
<?php
// In single.php, page.php, or index.php
get_header(); ?>
<div class="content-area">
<main id="main" class="site-main">
<?php
while ( have_posts() ) :
the_post();
get_template_part( 'template-parts/content', get_post_type() );
endwhile;
?>
</main>
<?php get_sidebar(); // Loads sidebar.php ?>
</div>
<?php get_footer(); ?>
<?php
// Load specific sidebar
get_sidebar( 'page' ); // Loads sidebar-page.php
get_sidebar( 'shop' ); // Loads sidebar-shop.php
?>
Footer Widget Implementation
Footer with Multiple Widget Areas
<?php
// In footer.php
?>
<footer id="colophon" class="site-footer">
<?php if ( is_active_sidebar( 'footer-1' ) ||
is_active_sidebar( 'footer-2' ) ||
is_active_sidebar( 'footer-3' ) ||
is_active_sidebar( 'footer-4' ) ) : ?>
<div class="footer-widgets">
<div class="container">
<div class="footer-widget-areas">
<?php if ( is_active_sidebar( 'footer-1' ) ) : ?>
<div class="footer-widget-column">
<?php dynamic_sidebar( 'footer-1' ); ?>
</div>
<?php endif; ?>
<?php if ( is_active_sidebar( 'footer-2' ) ) : ?>
<div class="footer-widget-column">
<?php dynamic_sidebar( 'footer-2' ); ?>
</div>
<?php endif; ?>
<?php if ( is_active_sidebar( 'footer-3' ) ) : ?>
<div class="footer-widget-column">
<?php dynamic_sidebar( 'footer-3' ); ?>
</div>
<?php endif; ?>
<?php if ( is_active_sidebar( 'footer-4' ) ) : ?>
<div class="footer-widget-column">
<?php dynamic_sidebar( 'footer-4' ); ?>
</div>
<?php endif; ?>
</div>
</div>
</div>
<?php endif; ?>
<div class="site-info">
<div class="container">
<p>© <?php echo date('Y'); ?> <?php bloginfo( 'name' ); ?></p>
</div>
</div>
</footer>
Dynamic Footer Columns Based on Active Widgets
<?php
// Calculate active footer widgets
function mytheme_footer_widget_classes() {
$count = 0;
for ( $i = 1; $i <= 4; $i++ ) {
if ( is_active_sidebar( 'footer-' . $i ) ) {
$count++;
}
}
$class = '';
switch ( $count ) {
case 1:
$class = 'footer-widgets-1';
break;
case 2:
$class = 'footer-widgets-2';
break;
case 3:
$class = 'footer-widgets-3';
break;
case 4:
$class = 'footer-widgets-4';
break;
}
return $class;
}
// In footer.php
?>
<div class="footer-widget-areas <?php echo mytheme_footer_widget_classes(); ?>">
<?php for ( $i = 1; $i <= 4; $i++ ) : ?>
<?php if ( is_active_sidebar( 'footer-' . $i ) ) : ?>
<div class="footer-widget-column">
<?php dynamic_sidebar( 'footer-' . $i ); ?>
</div>
<?php endif; ?>
<?php endfor; ?>
</div>
<style>
/* CSS for dynamic columns */
.footer-widgets-1 .footer-widget-column { width: 100%; }
.footer-widgets-2 .footer-widget-column { width: 50%; }
.footer-widgets-3 .footer-widget-column { width: 33.333%; }
.footer-widgets-4 .footer-widget-column { width: 25%; }
</style>
Conditional Widget Display
Page-Specific Widget Areas
<?php
/**
* Display widgets based on page type
*/
function mytheme_get_sidebar() {
// Homepage sidebar
if ( is_front_page() && is_active_sidebar( 'homepage-sidebar' ) ) {
?>
<aside class="homepage-widgets">
<?php dynamic_sidebar( 'homepage-sidebar' ); ?>
</aside>
<?php
}
// Blog sidebar
elseif ( is_home() || is_archive() || is_single() ) {
if ( is_active_sidebar( 'blog-sidebar' ) ) {
?>
<aside class="blog-sidebar">
<?php dynamic_sidebar( 'blog-sidebar' ); ?>
</aside>
<?php
}
}
// Page sidebar
elseif ( is_page() && ! is_front_page() ) {
if ( is_active_sidebar( 'page-sidebar' ) ) {
?>
<aside class="page-sidebar">
<?php dynamic_sidebar( 'page-sidebar' ); ?>
</aside>
<?php
}
}
// WooCommerce sidebar
elseif ( class_exists( 'WooCommerce' ) && is_woocommerce() ) {
if ( is_active_sidebar( 'shop-sidebar' ) ) {
?>
<aside class="shop-sidebar">
<?php dynamic_sidebar( 'shop-sidebar' ); ?>
</aside>
<?php
}
}
// Default sidebar
else {
get_sidebar();
}
}
// Usage in templates
mytheme_get_sidebar();
Widget Display Based on User Role
<?php
// Display widgets based on user capabilities
if ( is_user_logged_in() && is_active_sidebar( 'members-sidebar' ) ) : ?>
<aside class="members-only-widgets">
<?php dynamic_sidebar( 'members-sidebar' ); ?>
</aside>
<?php elseif ( ! is_user_logged_in() && is_active_sidebar( 'guest-sidebar' ) ) : ?>
<aside class="guest-widgets">
<?php dynamic_sidebar( 'guest-sidebar' ); ?>
</aside>
<?php endif; ?>
<?php
// Admin-only widgets
if ( current_user_can( 'manage_options' ) && is_active_sidebar( 'admin-sidebar' ) ) : ?>
<aside class="admin-widgets">
<?php dynamic_sidebar( 'admin-sidebar' ); ?>
</aside>
<?php endif; ?>
Custom Widget Display Functions
Widget Area Wrapper Function
<?php
/**
* Display widget area with custom wrapper
*/
function mytheme_widget_area( $sidebar_id, $args = array() ) {
// Default arguments
$defaults = array(
'before' => '<aside class="widget-area">',
'after' => '</aside>',
'fallback' => false,
'class' => '',
'echo' => true
);
$args = wp_parse_args( $args, $defaults );
// Check if sidebar has widgets
if ( ! is_active_sidebar( $sidebar_id ) ) {
if ( $args['fallback'] && is_callable( $args['fallback'] ) ) {
call_user_func( $args['fallback'] );
}
return false;
}
// Build output
$output = '';
if ( $args['class'] ) {
$args['before'] = str_replace( 'class="', 'class="' . esc_attr( $args['class'] ) . ' ', $args['before'] );
}
$output .= $args['before'];
ob_start();
dynamic_sidebar( $sidebar_id );
$output .= ob_get_clean();
$output .= $args['after'];
// Echo or return
if ( $args['echo'] ) {
echo $output;
} else {
return $output;
}
}
// Usage examples
mytheme_widget_area( 'primary-sidebar', array(
'class' => 'primary-widgets',
'before' => '<div class="sidebar-wrapper">',
'after' => '</div>',
'fallback' => 'mytheme_default_sidebar_content'
) );
function mytheme_default_sidebar_content() {
echo '<p>No widgets found. Add some widgets to this area.</p>';
}
Widget Counter Function
<?php
/**
* Count widgets in a sidebar
*/
function mytheme_count_widgets( $sidebar_id ) {
$sidebars = wp_get_sidebars_widgets();
if ( ! isset( $sidebars[ $sidebar_id ] ) ) {
return 0;
}
return count( $sidebars[ $sidebar_id ] );
}
/**
* Get widget area class based on widget count
*/
function mytheme_widget_area_class( $sidebar_id ) {
$count = mytheme_count_widgets( $sidebar_id );
if ( $count === 0 ) {
return 'no-widgets';
} elseif ( $count === 1 ) {
return 'single-widget';
} elseif ( $count <= 3 ) {
return 'few-widgets';
} else {
return 'many-widgets';
}
}
// Usage
?>
<aside class="widget-area <?php echo mytheme_widget_area_class( 'sidebar-1' ); ?>">
<?php dynamic_sidebar( 'sidebar-1' ); ?>
</aside>
Common Widget Layouts
Two Column Layout
<div class="content-wrapper">
<main class="main-content">
<!-- Main content -->
</main>
<aside class="sidebar">
<?php dynamic_sidebar( 'sidebar-1' ); ?>
</aside>
</div>
Main Content
Sidebar
Three Column Layout
<div class="three-column">
<aside class="left-sidebar">
<?php dynamic_sidebar( 'left-sidebar' ); ?>
</aside>
<main class="main-content">
<!-- Main content -->
</main>
<aside class="right-sidebar">
<?php dynamic_sidebar( 'right-sidebar' ); ?>
</aside>
</div>
Left
Main
Right
Widget Action Hooks
Using Widget Hooks
<?php
// Add content before widget area
add_action( 'dynamic_sidebar_before', function( $index ) {
if ( $index === 'primary-sidebar' ) {
echo '<div class="widget-area-header">';
echo '<h2>Sidebar Content</h2>';
echo '</div>';
}
});
// Add content after widget area
add_action( 'dynamic_sidebar_after', function( $index ) {
if ( $index === 'primary-sidebar' ) {
echo '<div class="widget-area-footer">';
echo '<a href="/widgets">Manage Widgets</a>';
echo '</div>';
}
});
// Filter widget output
add_filter( 'widget_display_callback', function( $instance, $widget, $args ) {
// Add custom class to specific widget
if ( $widget->id_base === 'text' ) {
$args['before_widget'] = str_replace(
'class="',
'class="custom-text-widget ',
$args['before_widget']
);
}
return $instance;
}, 10, 3 );
Best Practices
Widget Display Best Practices
- Always check for active widgets: Use is_active_sidebar() before display
- Provide fallback content: Show default content for empty areas
- Use semantic HTML: Wrap widgets in appropriate elements
- Add ARIA labels: Improve accessibility for screen readers
- Keep markup consistent: Use similar structure across widget areas
- Make responsive: Ensure widgets work on all screen sizes
- Avoid hardcoding: Use dynamic functions for flexibility
- Document widget areas: Comment template locations clearly
Never assume a widget area has content. Always check with is_active_sidebar() to avoid empty HTML containers that can break layouts.
Practice Exercise
Implement Widget Display System