Make WordPress Core

Ticket #36772: 36772.diff

File 36772.diff, 2.2 KB (added by welcher, 9 years ago)

Initial Patch

  • src/wp-includes/class-wp-widget-factory.php

    diff --git src/wp-includes/class-wp-widget-factory.php src/wp-includes/class-wp-widget-factory.php
    index 0616258..c4398b8 100644
    class WP_Widget_Factory { 
    2323         * @var array
    2424         */
    2525        public $widgets = array();
     26       
     27       
     28        /**
     29         * Base Ids for registered widgets.
     30         *
     31         * @since 4.9
     32         * @access public
     33         * @var array
     34         */
     35        public $widget_base_ids = array();
    2636
    2737        /**
    2838         * PHP5 constructor.
    class WP_Widget_Factory { 
    3242         */
    3343        public function __construct() {
    3444                add_action( 'widgets_init', array( $this, '_register_widgets' ), 100 );
     45                add_filter( 'sidebars_widgets', array( $this, '_purge_unregistered_widgets' ) );
    3546        }
    3647
    3748        /**
    class WP_Widget_Factory { 
    102113        public function register( $widget ) {
    103114                if ( $widget instanceof WP_Widget ) {
    104115                        $this->widgets[ $this->hash_object( $widget ) ] = $widget;
     116                        $this->widget_base_ids[]  = $widget->id_base;
    105117                } else {
    106                         $this->widgets[ $widget ] = new $widget();
     118                        $instance = new $widget();
     119                        $this->widgets[ $widget ] = $instance;
     120                        $this->widget_base_ids[]  = $instance->id_base;
    107121                }
    108122        }
    109123
    class WP_Widget_Factory { 
    120134        public function unregister( $widget ) {
    121135                if ( $widget instanceof WP_Widget ) {
    122136                        unset( $this->widgets[ $this->hash_object( $widget ) ] );
     137                        unset( $this->widget_base_ids[ $widget->id_base ] );
    123138                } else {
    124139                        unset( $this->widgets[ $widget ] );
     140                        unset( $this->widget_base_ids[ $this->widgets[ $widget ]->id_base ] );
    125141                }
    126142        }
    127143
    class WP_Widget_Factory { 
    149165                        $this->widgets[$key]->_register();
    150166                }
    151167        }
     168       
     169       
     170        /**
     171         * Utility method to purge any widget instances that are not registered.
     172         *
     173         * @since 4.9
     174         * @access public
     175         * @param $sidebars_widgets
     176         *
     177         * @return array $sidebars_widgets
     178         */
     179        public function _purge_unregistered_widgets( $sidebars_widgets ) {
     180                foreach ( $sidebars_widgets as $sidebar => $widgets ) {
     181                        for( $i = 0; $i < count ( $widgets ); $i++ ) {
     182                                $id_base = _get_widget_id_base( $widgets[ $i ] );
     183                                if ( ! in_array( $id_base, $this->widget_base_ids, true ) ) {
     184                                        unset( $sidebars_widgets[ $sidebar ][ $i ] );
     185                                }
     186                        }
     187                }
     188                return $sidebars_widgets;
     189        }
    152190}