wp_render_widget()
云策文档标注
概述
wp_render_widget() 函数用于调用指定小部件的渲染回调并返回输出内容。它处理小部件和侧边栏的注册状态,并应用相关过滤器和动作钩子。
关键要点
- 函数接受两个必需参数:$widget_id(小部件ID)和 $sidebar_id(侧边栏ID),返回渲染后的HTML字符串。
- 内部检查 $wp_registered_widgets 和 $wp_registered_sidebars 全局变量,确保小部件和侧边栏存在,否则返回空字符串。
- 合并侧边栏和小部件参数,包括处理 before_widget 中的HTML id 和 class 属性。
- 应用 dynamic_sidebar_params 过滤器,并触发 dynamic_sidebar 动作钩子。
- 通过 call_user_func_array() 调用小部件的回调函数,使用输出缓冲捕获并返回结果。
代码示例
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']
);
$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_ );
$params = apply_filters( 'dynamic_sidebar_params', $params );
$callback = $wp_registered_widgets[ $widget_id ]['callback'];
ob_start();
do_action( 'dynamic_sidebar', $wp_registered_widgets[ $widget_id ] );
if ( is_callable( $callback ) ) {
call_user_func_array( $callback, $params );
}
return ob_get_clean();
}注意事项
- 确保小部件和侧边栏已正确注册,否则函数可能返回空字符串。
- dynamic_sidebar_params 过滤器可用于修改传递给小部件回调的参数。
- dynamic_sidebar 动作钩子在小部件显示回调调用前触发。
- 此函数自 WordPress 5.8.0 版本引入。
原文内容
Calls the render callback of a widget and returns the output.
Parameters
$widget_idstringrequired-
Widget ID.
$sidebar_idstringrequired-
Sidebar ID.
Source
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();
}
Hooks
- do_action( ‘dynamic_sidebar’, array $widget )
-
Fires before a widget’s display callback is called.
- apply_filters( ‘dynamic_sidebar_params’, array $params )
-
Filters the parameters passed to a widget’s display callback.
Changelog
| Version | Description |
|---|---|
| 5.8.0 | Introduced. |