Sidebar functions for your functions.php
Initializing the sidebars
This method will reduce the amount of cut and pasting you do when registering sidebars. It basically allows you to have a central location for each of the $vars that are consistent throughout all of the sidebars and just loops through them creating each of the sidebars based on the title.
if (!function_exists('mytheme_sidebar_init')) { function mytheme_sidebar_init() { $before_widget = "<div id=\"".'%1$s'."\" class=\"widget ".'%2$s'."\">\r\n<div class=\"widget-content\">\r\n"; $after_widget = "</div>\r\n</div>\r\n"; foreach (array( __('Above Header', 'mytheme'), __('Header', 'mytheme'), __('Menubar', 'mytheme'), __('Left Sidebar', 'mytheme'), __('Right Sidebar', 'mytheme'), __('Over Blog', 'mytheme'), __('Under Blog', 'mytheme'), __('The Footer', 'mytheme') ) as $sidebartitle) { register_sidebar(array( 'name'=> $sidebartitle, 'id' => sanitize_title($sidebartitle), // 'description' => $sidebartitle, 'before_widget' => $before_widget, 'after_widget' => $after_widget, 'before_title' => "<h2 class=\"widgettitle\">", 'after_title' => "</h2>\r\n" )); } } }
Getting the sidebars
Now that we have the sidebar’s registered and ready to be used in your theme, with this next chunk of code, you do *not* need to have all of those individual sidebar-$location.php files in your theme and it creates a dynamic one for them all. However it also checks if there *is* a sidebar-$location.php file if it does exist it will use it.
function mytheme_get_sidebar($location = '') { if (empty($location)) { get_sidebar(); return; } if (file_exists(get_stylesheet_directory().'/sidebar-'.$location.'.php')) { get_sidebar($location); } elseif (is_active_sidebar('sidebar-'.$location)) { ?> <div id="sidebar-<?php echo $location; ?>" class="sidebar"> <?php dynamic_sidebar('sidebar-'.$location); ?> </div> <?php } }
P.S. You probably can take out the elseif (is_active_sidebar( statement and have it just go else { – before the creation of the dynamic sidebar if you use the if (is_active_sidebar() code before the call to the mytheme_get_sidebar() function.
First thing this function does if checks if you have a $location, if it doesn’t it will just load up the generic sidebar, which comes from the sidebar.php file from the theme. Next, it checks if the sidebar-$location.php exists and uses it if it does. After that it just creates the dynamic sidebar location with divs.
Using the mytheme_get_sidebar($location);
In this example, it will check if the sidebar is ‘active’ meaning if there’s actually any widgets in it, if there are it will then try to render the sidebar. If there is a file in the theme/child theme’s directory called sidebar-over.php it will use that, if not it will use the generic div’s created by the function. If it’s a generated sidebar, the CSS for it will be #sidebar-over {} with the class of .sidebar {} in this example.
<?php if (is_active_sidebar('over-blog')) mytheme_get_sidebar('over'); ?>
Else, if you want it to stay rendered in the theme for CSS sake, to keep the block there just do the same without the is_active_sidebar() code.
<?php mytheme_get_sidebar('over'); ?>
And there you have it.
– Phil
I’d suggest you to use other prefix instead of ‘mytheme_’ – I’ve seen a lot of tutorials with ‘mytheme_’ and then track the same thing copy-pasted directly in some custom projects or themes submitted to WPORG – with a custom prefix you could track who has used your tutorial instead 🙂
True that, fortunately I know the theme review team should probably catch those in the themes submitted before they get accepted. 😉 But good point, leaving this here for reference for people to change the mytheme_ to something consistent with their own themes.