diff --git a/wp-includes/default-widgets.php b/wp-includes/default-widgets.php index 5be856a632..92db181932 100644 --- a/wp-includes/default-widgets.php +++ b/wp-includes/default-widgets.php @@ -1219,19 +1219,19 @@ function wp_widgets_init() { if ( !is_blog_installed() ) return; - new WP_Widget_Pages(); + register_widget('WP_Widget_Pages'); - new WP_Widget_Calendar(); + register_widget('WP_Widget_Calendar'); - new WP_Widget_Archives(); + register_widget('WP_Widget_Archives'); - new WP_Widget_Links(); + register_widget('WP_Widget_Links'); - new WP_Widget_Meta(); + register_widget('WP_Widget_Meta'); - new WP_Widget_Search(); + register_widget('WP_Widget_Search'); - new WP_Widget_Text(); + register_widget('WP_Widget_Text'); $widget_ops = array('classname' => 'widget_recent_entries', 'description' => __( "The most recent posts on your blog") ); wp_register_sidebar_widget('recent-posts', __('Recent Posts'), 'wp_widget_recent_entries', $widget_ops); diff --git a/wp-includes/widgets.php b/wp-includes/widgets.php index e096f26cc9..488d12c665 100644 --- a/wp-includes/widgets.php +++ b/wp-includes/widgets.php @@ -43,6 +43,30 @@ $wp_registered_widgets = array(); $wp_registered_widget_controls = array(); $wp_registered_widget_updates = array(); +/** + * Singleton that registers and instantiates WP_Widget classes. + * + * @package WordPress + * @subpackage Widgets + * @since 2.8 + */ +class WP_Widget_Factory { + var $widgets = array(); + + function WP_Widget_Factory() { + add_action( 'widgets_init', array( &$this, '_register_widgets' ), 100 ); + } + + function register($widget_class) { + $this->widgets[] = new $widget_class(); + } + + function _register_widgets() { + foreach ( $this->widgets as $widget ) + $widget->_register(); + } +} + /** * This class must be extended for each widget and WP_Widget::widget(), WP_Widget::update() * and WP_Widget::form() need to be over-ridden. @@ -107,7 +131,7 @@ class WP_Widget { $this->widget_options = wp_parse_args( $widget_options, array('classname' => $this->option_name) ); $this->control_options = wp_parse_args( $control_options, array('id_base' => $this->id_base) ); - add_action( 'widgets_init', array( &$this, 'register' ) ); + //add_action( 'widgets_init', array( &$this, '_register' ) ); } /** Helper function to be called by form(). @@ -124,7 +148,7 @@ class WP_Widget { /** Registers this widget-type. * Called during the 'widgets_init' action. */ - function register() { + function _register() { $settings = $this->get_settings(); if ( empty($settings) ) { @@ -288,6 +312,25 @@ class WP_Widget { /* Template tags & API functions */ +/** + * Register a widget + * + * Registers a WP_Widget widget + * + * @since 2.8.0 + * + * @see WP_Widget + * @see WP_Widget_Factory + * @uses WP_Widget_Factory + * + * @param string $widget_class The name of a class that extends WP_Widget + */ +function register_widget($widget_class) { + global $wp_widget_factory; + + $wp_widget_factory->register($widget_class); +} + /** * Creates multiple sidebars. * diff --git a/wp-settings.php b/wp-settings.php index a77a4e3834..079f612ec7 100644 --- a/wp-settings.php +++ b/wp-settings.php @@ -589,6 +589,13 @@ $wp_rewrite =& new WP_Rewrite(); */ $wp =& new WP(); +/** + * WordPress Widget Factory Object + * @global object $wp_widget_factory + * @since 2.8.0 + */ +$wp_widget_factory =& new WP_Widget_Factory(); + do_action('setup_theme'); /**