dynamic_sidebar

The timeline below displays how wordpress function dynamic_sidebar has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

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);
}

WordPress Version: 5.8

/**
 * 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 Registered sidebars.
 * @global array $wp_registered_widgets  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);
}

WordPress Version: 5.7

/**
 * 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 Registered sidebars.
 * @global array $wp_registered_widgets  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'], $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);
}

WordPress Version: 5.6

/**
 * 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 Registered sidebars.
 * @global array $wp_registered_widgets  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'], $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_id {
         *     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);
}

WordPress Version: 5.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 Registered sidebars.
 * @global array $wp_registered_widgets  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);
    }
    /**
     * 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);
    $sidebar = $wp_registered_sidebars[$index];
    $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'], $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_id {
         *     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;
        }
    }
    /**
     * 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);
}

WordPress Version: 5.4

/**
 * 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 Registered sidebars.
 * @global array $wp_registered_widgets
 *
 * @param int|string $index Optional, default is 1. Index, name or ID of dynamic sidebar.
 * @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);
    }
    /**
     * 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);
    $sidebar = $wp_registered_sidebars[$index];
    $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'], $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_id {
         *     An associative array of widget arguments.
         *
         *     @type string $name                Name of the widget.
         *     @type string $id                  Widget ID.
         *     @type array|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;
        }
    }
    /**
     * 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);
}

WordPress Version: 5.1

/**
 * 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 Registered sidebars.
 * @global array $wp_registered_widgets
 *
 * @param int|string $index Optional, default is 1. Index, name or ID of dynamic sidebar.
 * @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);
    }
    /**
     * 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);
    $sidebar = $wp_registered_sidebars[$index];
    $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'], $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_id {
         *     An associative array of widget arguments.
         *
         *     @type string $name                Name of the widget.
         *     @type string $id                  Widget ID.
         *     @type array|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;
        }
    }
    /**
     * 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);
}

WordPress Version: 4.6

/**
 * 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
 * @global array $wp_registered_widgets
 *
 * @param int|string $index Optional, default is 1. Index, name or ID of dynamic sidebar.
 * @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);
    }
    /**
     * 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);
    $sidebar = $wp_registered_sidebars[$index];
    $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'], $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_id {
         *     An associative array of widget arguments.
         *
         *     @type string $name                Name of the widget.
         *     @type string $id                  Widget ID.
         *     @type array|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;
        }
    }
    /**
     * 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);
}

WordPress Version: 4.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
 * @global array $wp_registered_widgets
 *
 * @param int|string $index Optional, default is 1. Index, name or ID of dynamic sidebar.
 * @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);
    }
    /**
     * 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);
    $sidebar = $wp_registered_sidebars[$index];
    $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'], $id, $classname_);
        /**
         * Filter 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_id {
         *     An associative array of widget arguments.
         *
         *     @type string $name                Name of the widget.
         *     @type string $id                  Widget ID.
         *     @type array|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;
        }
    }
    /**
     * 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);
    /**
     * Filter 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);
}

WordPress Version: 4.1

/**
 * 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
 * @global array $wp_registered_widgets
 *
 * @param int|string $index Optional, default is 1. Index, name or ID of dynamic sidebar.
 * @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);
    }
    /**
     * 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);
    $sidebar = $wp_registered_sidebars[$index];
    $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'], $id, $classname_);
        /**
         * Filter 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_id {
         *     An associative array of widget arguments.
         *
         *     @type string $name                Name of the widget.
         *     @type string $id                  Widget ID.
         *     @type array|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;
        }
    }
    /**
     * 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);
    /**
     * Filter 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);
}

WordPress Version: 4.4

/**
 * 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
 * @global array $wp_registered_widgets
 *
 * @param int|string $index Optional, default is 1. Index, name or ID of dynamic sidebar.
 * @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 {
        $sanitized_index = sanitize_title($index);
        foreach ((array) $wp_registered_sidebars as $key => $value) {
            if (sanitize_title($value['name']) == $sanitized_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);
    }
    /**
     * 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);
    $sidebar = $wp_registered_sidebars[$index];
    $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'], $id, $classname_);
        /**
         * Filter 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_id {
         *     An associative array of widget arguments.
         *
         *     @type string $name                Name of the widget.
         *     @type string $id                  Widget ID.
         *     @type array|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;
        }
    }
    /**
     * 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);
    /**
     * Filter 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);
}

WordPress Version: 4.3

/**
 * 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
 * @global array $wp_registered_widgets
 *
 * @param int|string $index Optional, default is 1. Index, name or ID of dynamic sidebar.
 * @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/widgets.php */
        do_action('dynamic_sidebar_before', $index, false);
        /** This action is documented in wp-includes/widgets.php */
        do_action('dynamic_sidebar_after', $index, false);
        /** This filter is documented in wp-includes/widgets.php */
        return apply_filters('dynamic_sidebar_has_widgets', false, $index);
    }
    /**
     * 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);
    $sidebar = $wp_registered_sidebars[$index];
    $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'], $id, $classname_);
        /**
         * Filter 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_id {
         *     An associative array of widget arguments.
         *
         *     @type string $name                Name of the widget.
         *     @type string $id                  Widget ID.
         *     @type array|callback $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;
        }
    }
    /**
     * 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);
    /**
     * Filter 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);
}

WordPress Version: 3.9

/**
 * 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
 *
 * @param int|string $index Optional, default is 1. Index, name or ID of dynamic sidebar.
 * @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/widgets.php */
        do_action('dynamic_sidebar_before', $index, false);
        /** This action is documented in wp-includes/widgets.php */
        do_action('dynamic_sidebar_after', $index, false);
        /** This filter is documented in wp-includes/widgets.php */
        return apply_filters('dynamic_sidebar_has_widgets', false, $index);
    }
    /**
     * 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);
    $sidebar = $wp_registered_sidebars[$index];
    $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'], $id, $classname_);
        /**
         * Filter 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_id {
         *     An associative array of widget arguments.
         *
         *     @type string $name                Name of the widget.
         *     @type string $id                  Widget ID.
         *     @type array|callback $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;
        }
    }
    /**
     * 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);
    /**
     * Filter 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.
     */
    $did_one = apply_filters('dynamic_sidebar_has_widgets', $did_one, $index);
    return $did_one;
}

WordPress Version: 3.7

/**
 * 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
 *
 * @param int|string $index Optional, default is 1. Index, name or ID of dynamic sidebar.
 * @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])) {
        return false;
    }
    $sidebar = $wp_registered_sidebars[$index];
    $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'], $id, $classname_);
        $params = apply_filters('dynamic_sidebar_params', $params);
        $callback = $wp_registered_widgets[$id]['callback'];
        do_action('dynamic_sidebar', $wp_registered_widgets[$id]);
        if (is_callable($callback)) {
            call_user_func_array($callback, $params);
            $did_one = true;
        }
    }
    return $did_one;
}