
开发者测试调试工具Xdebug安装及集成使用教程
retrieve_widgets ( $theme_changed = false )
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; }