]> scripts.mit.edu Git - autoinstalls/wordpress.git/blobdiff - wp-includes/class-wp-widget-factory.php
Wordpress 4.6
[autoinstalls/wordpress.git] / wp-includes / class-wp-widget-factory.php
index c7abcc80d04dd8d023a51f8227c13295174b2caf..061625816e3004151591cc57cfdf58f053811f64 100644 (file)
  * @since 4.4.0 Moved to its own file from wp-includes/widgets.php
  */
 class WP_Widget_Factory {
+
+       /**
+        * Widgets array.
+        *
+        * @since 2.8.0
+        * @access public
+        * @var array
+        */
        public $widgets = array();
 
        /**
         * PHP5 constructor.
+        *
+        * @since 4.3.0
+        * @access public
         */
        public function __construct() {
                add_action( 'widgets_init', array( $this, '_register_widgets' ), 100 );
@@ -25,6 +36,9 @@ class WP_Widget_Factory {
 
        /**
         * PHP4 constructor.
+        *
+        * @since 2.8.0
+        * @access public
         */
        public function WP_Widget_Factory() {
                _deprecated_constructor( 'WP_Widget_Factory', '4.2.0' );
@@ -32,31 +46,87 @@ class WP_Widget_Factory {
        }
 
        /**
-        * Register a widget subclass.
+        * Memory for the number of times unique class instances have been hashed.
+        *
+        * This can be eliminated in favor of straight spl_object_hash() when 5.3
+        * is the minimum requirement for PHP.
+        *
+        * @since 4.6.0
+        * @access private
+        * @var array
+        *
+        * @see WP_Widget_Factory::hash_object()
+        */
+       private $hashed_class_counts = array();
+
+       /**
+        * Hashes an object, doing fallback of `spl_object_hash()` if not available.
+        *
+        * This can be eliminated in favor of straight spl_object_hash() when 5.3
+        * is the minimum requirement for PHP.
+        *
+        * @since 4.6.0
+        * @access private
+        *
+        * @param WP_Widget $widget Widget.
+        * @return string Object hash.
+        */
+       private function hash_object( $widget ) {
+               if ( function_exists( 'spl_object_hash' ) ) {
+                       return spl_object_hash( $widget );
+               } else {
+                       $class_name = get_class( $widget );
+                       $hash = $class_name;
+                       if ( ! isset( $widget->_wp_widget_factory_hash_id ) ) {
+                               if ( ! isset( $this->hashed_class_counts[ $class_name ] ) ) {
+                                       $this->hashed_class_counts[ $class_name ] = 0;
+                               }
+                               $this->hashed_class_counts[ $class_name ] += 1;
+                               $widget->_wp_widget_factory_hash_id = $this->hashed_class_counts[ $class_name ];
+                       }
+                       $hash .= ':' . $widget->_wp_widget_factory_hash_id;
+                       return $hash;
+               }
+       }
+
+       /**
+        * Registers a widget subclass.
         *
         * @since 2.8.0
+        * @since 4.6.0 Updated the `$widget` parameter to also accept a WP_Widget instance object
+        *              instead of simply a `WP_Widget` subclass name.
         * @access public
         *
-        * @param string $widget_class The name of a {@see WP_Widget} subclass.
+        * @param string|WP_Widget $widget Either the name of a `WP_Widget` subclass or an instance of a `WP_Widget` subclass.
         */
-       public function register( $widget_class ) {
-               $this->widgets[$widget_class] = new $widget_class();
+       public function register( $widget ) {
+               if ( $widget instanceof WP_Widget ) {
+                       $this->widgets[ $this->hash_object( $widget ) ] = $widget;
+               } else {
+                       $this->widgets[ $widget ] = new $widget();
+               }
        }
 
        /**
-        * Un-register a widget subclass.
+        * Un-registers a widget subclass.
         *
         * @since 2.8.0
+        * @since 4.6.0 Updated the `$widget` parameter to also accept a WP_Widget instance object
+        *              instead of simply a `WP_Widget` subclass name.
         * @access public
         *
-        * @param string $widget_class The name of a {@see WP_Widget} subclass.
+        * @param string|WP_Widget $widget Either the name of a `WP_Widget` subclass or an instance of a `WP_Widget` subclass.
         */
-       public function unregister( $widget_class ) {
-               unset( $this->widgets[ $widget_class ] );
+       public function unregister( $widget ) {
+               if ( $widget instanceof WP_Widget ) {
+                       unset( $this->widgets[ $this->hash_object( $widget ) ] );
+               } else {
+                       unset( $this->widgets[ $widget ] );
+               }
        }
 
        /**
-        * Utility method for adding widgets to the registered widgets global.
+        * Serves as a utility method for adding widgets to the registered widgets global.
         *
         * @since 2.8.0
         * @access public