[wp-trac] [WordPress Trac] #9952: Unregistering default widgets is not backwards compatible

WordPress Trac wp-trac at lists.automattic.com
Wed May 27 21:04:55 GMT 2009


#9952: Unregistering default widgets is not backwards compatible
--------------------------+-------------------------------------------------
 Reporter:  mtdewvirus    |       Owner:  azaozz 
     Type:  defect (bug)  |      Status:  new    
 Priority:  normal        |   Milestone:  2.8    
Component:  Widgets       |     Version:  2.8    
 Severity:  normal        |    Keywords:  widgets
--------------------------+-------------------------------------------------
 Themes and plugins use wp_unregister_sidebar_widget to remove default
 widgets and then register their own with register_sidebar_widget. Default
 widgets have been updated to use WP_Widget, so they do not get
 unregistered.

 As an example...

 {{{
 function sapphire_widgets_init() {
         register_sidebars(1, array(
                 'before_widget' => '<div id="%1$s" class="widget %2$s">',
                 'after_widget' => '</div>'
         ));
         function widget_sapphire_pages($args) {
                 extract( $args );
                 $options = get_option( 'widget_pages' );

                 $title = empty( $options['title'] ) ? __( 'Pages' ) :
 apply_filters('widget_title', $options['title']);
                 $sortby = empty( $options['sortby'] ) ? 'menu_order' :
 $options['sortby'];
                 $exclude = empty( $options['exclude'] ) ? '' :
 $options['exclude'];

                 if ( $sortby == 'menu_order' ) {
                         $sortby = 'menu_order, post_title';
                 }

                 $out = wp_list_pages( array('title_li' => '', 'echo' => 0,
 'sort_column' => $sortby, 'exclude' => $exclude) );

                 echo $before_widget;
                 echo $before_title . $title . $after_title;
         ?>
                 <ul>
                         <li class="page_item"><a href="<?php
 bloginfo('url'); ?>">Home</a></li>
                         <?php echo $out; ?>
                 </ul>
         <?php
                 echo $after_widget;
         }

         unregister_sidebar_widget('pages');
         unregister_widget_control('pages');
         wp_register_sidebar_widget('pages', __('Pages'),
 'widget_sapphire_pages', null, 'pages');
         wp_register_widget_control('pages', __('Pages'),
 'wp_widget_pages_control' );
 }
 add_action('widgets_init', 'sapphire_widgets_init');
 }}}


 When an action runs this on widgets_init the default Pages widget is not
 removed. The Widgets screen will display both Pages widgets but only one
 of them will work because both the default widget and the new widget are
 using the same id.

-- 
Ticket URL: <http://core.trac.wordpress.org/ticket/9952>
WordPress Trac <http://core.trac.wordpress.org/>
WordPress blogging software


More information about the wp-trac mailing list