WordPress Version: 6.5
/**
* Display dynamic sidebar.
*
* By default this displays the default sidebar or 'sidebar-1'. If your theme specifies the 'id' or
* 'name' parameter for its registered sidebars you can pass an ID or name as the $index parameter.
* Otherwise, you can pass in a numerical index to display the sidebar at that index.
*
* @since 2.2.0
*
* @global array $wp_registered_sidebars The registered sidebars.
* @global array $wp_registered_widgets The registered widgets.
*
* @param int|string $index Optional. Index, name or ID of dynamic sidebar. Default 1.
* @return bool True, if widget sidebar was found and called. False if not found or not called.
*/
function dynamic_sidebar($index = 1)
{
global $wp_registered_sidebars, $wp_registered_widgets;
if (is_int($index)) {
$index = "sidebar-{$index}";
} else {
$index = sanitize_title($index);
foreach ((array) $wp_registered_sidebars as $key => $value) {
if (sanitize_title($value['name']) === $index) {
$index = $key;
break;
}
}
}
$sidebars_widgets = wp_get_sidebars_widgets();
if (empty($wp_registered_sidebars[$index]) || empty($sidebars_widgets[$index]) || !is_array($sidebars_widgets[$index])) {
/** This action is documented in wp-includes/widget.php */
do_action('dynamic_sidebar_before', $index, false);
/** This action is documented in wp-includes/widget.php */
do_action('dynamic_sidebar_after', $index, false);
/** This filter is documented in wp-includes/widget.php */
return apply_filters('dynamic_sidebar_has_widgets', false, $index);
}
$sidebar = $wp_registered_sidebars[$index];
$sidebar['before_sidebar'] = sprintf($sidebar['before_sidebar'], $sidebar['id'], $sidebar['class']);
/**
* Fires before widgets are rendered in a dynamic sidebar.
*
* Note: The action also fires for empty sidebars, and on both the front end
* and back end, including the Inactive Widgets sidebar on the Widgets screen.
*
* @since 3.9.0
*
* @param int|string $index Index, name, or ID of the dynamic sidebar.
* @param bool $has_widgets Whether the sidebar is populated with widgets.
* Default true.
*/
do_action('dynamic_sidebar_before', $index, true);
if (!is_admin() && !empty($sidebar['before_sidebar'])) {
echo $sidebar['before_sidebar'];
}
$did_one = false;
foreach ((array) $sidebars_widgets[$index] as $id) {
if (!isset($wp_registered_widgets[$id])) {
continue;
}
$params = array_merge(array(array_merge($sidebar, array('widget_id' => $id, 'widget_name' => $wp_registered_widgets[$id]['name']))), (array) $wp_registered_widgets[$id]['params']);
// Substitute HTML `id` and `class` attributes into `before_widget`.
$classname_ = '';
foreach ((array) $wp_registered_widgets[$id]['classname'] as $cn) {
if (is_string($cn)) {
$classname_ .= '_' . $cn;
} elseif (is_object($cn)) {
$classname_ .= '_' . get_class($cn);
}
}
$classname_ = ltrim($classname_, '_');
$params[0]['before_widget'] = sprintf($params[0]['before_widget'], str_replace('\\', '_', $id), $classname_);
/**
* Filters the parameters passed to a widget's display callback.
*
* Note: The filter is evaluated on both the front end and back end,
* including for the Inactive Widgets sidebar on the Widgets screen.
*
* @since 2.5.0
*
* @see register_sidebar()
*
* @param array $params {
* @type array $args {
* An array of widget display arguments.
*
* @type string $name Name of the sidebar the widget is assigned to.
* @type string $id ID of the sidebar the widget is assigned to.
* @type string $description The sidebar description.
* @type string $class CSS class applied to the sidebar container.
* @type string $before_widget HTML markup to prepend to each widget in the sidebar.
* @type string $after_widget HTML markup to append to each widget in the sidebar.
* @type string $before_title HTML markup to prepend to the widget title when displayed.
* @type string $after_title HTML markup to append to the widget title when displayed.
* @type string $widget_id ID of the widget.
* @type string $widget_name Name of the widget.
* }
* @type array $widget_args {
* An array of multi-widget arguments.
*
* @type int $number Number increment used for multiples of the same widget.
* }
* }
*/
$params = apply_filters('dynamic_sidebar_params', $params);
$callback = $wp_registered_widgets[$id]['callback'];
/**
* Fires before a widget's display callback is called.
*
* Note: The action fires on both the front end and back end, including
* for widgets in the Inactive Widgets sidebar on the Widgets screen.
*
* The action is not fired for empty sidebars.
*
* @since 3.0.0
*
* @param array $widget {
* An associative array of widget arguments.
*
* @type string $name Name of the widget.
* @type string $id Widget ID.
* @type callable $callback When the hook is fired on the front end, `$callback` is an array
* containing the widget object. Fired on the back end, `$callback`
* is 'wp_widget_control', see `$_callback`.
* @type array $params An associative array of multi-widget arguments.
* @type string $classname CSS class applied to the widget container.
* @type string $description The widget description.
* @type array $_callback When the hook is fired on the back end, `$_callback` is populated
* with an array containing the widget object, see `$callback`.
* }
*/
do_action('dynamic_sidebar', $wp_registered_widgets[$id]);
if (is_callable($callback)) {
call_user_func_array($callback, $params);
$did_one = true;
}
}
if (!is_admin() && !empty($sidebar['after_sidebar'])) {
echo $sidebar['after_sidebar'];
}
/**
* Fires after widgets are rendered in a dynamic sidebar.
*
* Note: The action also fires for empty sidebars, and on both the front end
* and back end, including the Inactive Widgets sidebar on the Widgets screen.
*
* @since 3.9.0
*
* @param int|string $index Index, name, or ID of the dynamic sidebar.
* @param bool $has_widgets Whether the sidebar is populated with widgets.
* Default true.
*/
do_action('dynamic_sidebar_after', $index, true);
/**
* Filters whether a sidebar has widgets.
*
* Note: The filter is also evaluated for empty sidebars, and on both the front end
* and back end, including the Inactive Widgets sidebar on the Widgets screen.
*
* @since 3.9.0
*
* @param bool $did_one Whether at least one widget was rendered in the sidebar.
* Default false.
* @param int|string $index Index, name, or ID of the dynamic sidebar.
*/
return apply_filters('dynamic_sidebar_has_widgets', $did_one, $index);
}