X-Git-Url: https://scripts.mit.edu/gitweb/autoinstallsdev/wordpress.git/blobdiff_plain/4feeb71a9d812a9ae371c28a3d8b442a4394ded7..607b7e02d77e7326161e8ec15639052d2040f745:/wp-includes/class-wp-widget-factory.php diff --git a/wp-includes/class-wp-widget-factory.php b/wp-includes/class-wp-widget-factory.php index 12b45532..06162581 100644 --- a/wp-includes/class-wp-widget-factory.php +++ b/wp-includes/class-wp-widget-factory.php @@ -45,28 +45,84 @@ class WP_Widget_Factory { self::__construct(); } + /** + * 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 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-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 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 ] ); + } } /**