WordPress Version: 6.5
/**
* Calls the render callback of a widget and returns the output.
*
* @since 5.8.0
*
* @global array $wp_registered_widgets The registered widgets.
* @global array $wp_registered_sidebars The registered sidebars.
*
* @param string $widget_id Widget ID.
* @param string $sidebar_id Sidebar ID.
* @return string
*/
function wp_render_widget($widget_id, $sidebar_id)
{
global $wp_registered_widgets, $wp_registered_sidebars;
if (!isset($wp_registered_widgets[$widget_id])) {
return '';
}
if (isset($wp_registered_sidebars[$sidebar_id])) {
$sidebar = $wp_registered_sidebars[$sidebar_id];
} elseif ('wp_inactive_widgets' === $sidebar_id) {
$sidebar = array();
} else {
return '';
}
$params = array_merge(array(array_merge($sidebar, array('widget_id' => $widget_id, 'widget_name' => $wp_registered_widgets[$widget_id]['name']))), (array) $wp_registered_widgets[$widget_id]['params']);
// Substitute HTML `id` and `class` attributes into `before_widget`.
$classname_ = '';
foreach ((array) $wp_registered_widgets[$widget_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'], $widget_id, $classname_);
/** This filter is documented in wp-includes/widgets.php */
$params = apply_filters('dynamic_sidebar_params', $params);
$callback = $wp_registered_widgets[$widget_id]['callback'];
ob_start();
/** This filter is documented in wp-includes/widgets.php */
do_action('dynamic_sidebar', $wp_registered_widgets[$widget_id]);
if (is_callable($callback)) {
call_user_func_array($callback, $params);
}
return ob_get_clean();
}