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.
定义位置
相关方法
register_widgetthe_widgetunregister_widgetis_active_widgetwp_render_widget
引入
2.8.0
弃用
-

retrieve_widgets: 这是一个WordPress的函数,用来检索特定侧边栏的小工具。小工具是一些小的内容块,可以添加到网站的不同区域,如侧边栏。 retrieve_widgets检索已经添加到一个特定侧边栏的小工具。

验证并重新映射任何”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 < 2 ) {
			unset( $lost_widgets[ $key ] );
		}
	}
	$sidebars_widgets['wp_inactive_widgets'] = array_merge( $lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets'] );

	if ( 'customize' !== $theme_changed ) {
		// Update the widgets settings in the database.
		wp_set_sidebars_widgets( $sidebars_widgets );
	}

	return $sidebars_widgets;
}

常见问题

FAQs
查看更多 >