X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/138998bbd8f7a1ac38b2f1eacbdf7cd522be4b13..refs/tags/wordpress-4.6.1-scripts:/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 c7abcc80..06162581 100644 --- a/wp-includes/class-wp-widget-factory.php +++ b/wp-includes/class-wp-widget-factory.php @@ -14,10 +14,21 @@ * @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