函数文档

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.

Return

string

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.