retrieve_widgets

函数


retrieve_widgets ( $theme_changed = false )
参数
  • (string|bool)
    $theme_changed
    Whether the theme was changed as a boolean. A value of ‘customize’ defers updates for the Customizer.
    Required:
    Default: false
返回值
  • (array) Updated sidebars widgets.
定义位置
  • wp-includes/widgets.php
    , line 1313
引入
2.8.0
弃用

验证并重新映射任何 “orphaned”部件到wp_inactive_widgets侧边栏,并保存部件设置。这至少要在每次更换主题时运行。

例如,假设主题A有一个 “footer”侧边栏,而主题B没有。从主题A切换到主题B后,所有之前分配给页脚的小工具都将无法使用。这个函数可以检测到这种情况,并将之前分配给页脚的所有部件移到wp_inactive_widgets下。

尽管名字中有 “retrieve”一词,这个函数实际上是在更新数据库和全局的`$sidebars_widgets`。由于这个原因,它不应该在前端运行,除非`$theme_changed`的值是’customize’(以绕过数据库的写入)。

function retrieve_widgets( $theme_changed = false ) {
	global $wp_registered_sidebars, $sidebars_widgets, $wp_registered_widgets;

	$registered_sidebars_keys = array_keys( $wp_registered_sidebars );
	$registered_widgets_ids   = array_keys( $wp_registered_widgets );

	if ( ! is_array( get_theme_mod( 'sidebars_widgets' ) ) ) {
		if ( empty( $sidebars_widgets ) ) {
			return array();
		}

		unset( $sidebars_widgets['array_version'] );

		$sidebars_widgets_keys = array_keys( $sidebars_widgets );
		sort( $sidebars_widgets_keys );
		sort( $registered_sidebars_keys );

		if ( $sidebars_widgets_keys === $registered_sidebars_keys ) {
			$sidebars_widgets = _wp_remove_unregistered_widgets( $sidebars_widgets, $registered_widgets_ids );

			return $sidebars_widgets;
		}
	}

	// Discard invalid, theme-specific widgets from sidebars.
	$sidebars_widgets = _wp_remove_unregistered_widgets( $sidebars_widgets, $registered_widgets_ids );
	$sidebars_widgets = wp_map_sidebars_widgets( $sidebars_widgets );

	// Find hidden/lost multi-widget instances.
	$shown_widgets = array_merge( ...array_values( $sidebars_widgets ) );
	$lost_widgets  = array_diff( $registered_widgets_ids, $shown_widgets );

	foreach ( $lost_widgets as $key => $widget_id ) {
		$number = preg_replace( '/.+?-([0-9]+)$/', '$1', $widget_id );

		// Only keep active and default widgets.
		if ( is_numeric( $number ) && (int) $number