WordPress/wp-includes/class-wp-widget-factory.php
Drew Jaynes 0860bb2771 Docs: Remove @access notations from method DocBlocks in wp-includes/* classes.
Prior to about 2013, many class methods lacked even access modifiers which made the `@access` notations that much more useful. Now that we've gotten to a point where the codebase is more mature from a maintenance perspective and we can finally remove these notations. Notable exceptions to this change include standalone functions notated as private as well as some classes still considered to represent "private" APIs.

See #41452.

Built from https://develop.svn.wordpress.org/trunk@41162


git-svn-id: http://core.svn.wordpress.org/trunk@41002 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-27 00:41:44 +00:00

145 lines
3.7 KiB
PHP

<?php
/**
* Widget API: WP_Widget_Factory class
*
* @package WordPress
* @subpackage Widgets
* @since 4.4.0
*/
/**
* Singleton that registers and instantiates WP_Widget classes.
*
* @since 2.8.0
* @since 4.4.0 Moved to its own file from wp-includes/widgets.php
*/
class WP_Widget_Factory {
/**
* Widgets array.
*
* @since 2.8.0
* @var array
*/
public $widgets = array();
/**
* PHP5 constructor.
*
* @since 4.3.0
*/
public function __construct() {
add_action( 'widgets_init', array( $this, '_register_widgets' ), 100 );
}
/**
* PHP4 constructor.
*
* @since 2.8.0
*/
public function WP_Widget_Factory() {
_deprecated_constructor( 'WP_Widget_Factory', '4.2.0' );
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
* @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
*
* @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.
*
* @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 ) {
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.
*
* @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 ) {
if ( $widget instanceof WP_Widget ) {
unset( $this->widgets[ $this->hash_object( $widget ) ] );
} else {
unset( $this->widgets[ $widget ] );
}
}
/**
* Serves as a utility method for adding widgets to the registered widgets global.
*
* @since 2.8.0
*
* @global array $wp_registered_widgets
*/
public function _register_widgets() {
global $wp_registered_widgets;
$keys = array_keys($this->widgets);
$registered = array_keys($wp_registered_widgets);
$registered = array_map('_get_widget_id_base', $registered);
foreach ( $keys as $key ) {
// don't register new widget if old widget with the same id is already registered
if ( in_array($this->widgets[$key]->id_base, $registered, true) ) {
unset($this->widgets[$key]);
continue;
}
$this->widgets[$key]->_register();
}
}
}