summaryrefslogtreecommitdiffstats
path: root/wp-includes/class-wp-widget-factory.php
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 07:56:49 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 07:56:49 +0000
commita415c29efee45520ae252d2aa28f1083a521cd7b (patch)
treef4ade4b6668ecc0765de7e1424f7c1427ad433ff /wp-includes/class-wp-widget-factory.php
parentInitial commit. (diff)
downloadwordpress-a415c29efee45520ae252d2aa28f1083a521cd7b.tar.xz
wordpress-a415c29efee45520ae252d2aa28f1083a521cd7b.zip
Adding upstream version 6.4.3+dfsg1.upstream/6.4.3+dfsg1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'wp-includes/class-wp-widget-factory.php')
-rw-r--r--wp-includes/class-wp-widget-factory.php141
1 files changed, 141 insertions, 0 deletions
diff --git a/wp-includes/class-wp-widget-factory.php b/wp-includes/class-wp-widget-factory.php
new file mode 100644
index 0000000..ed719b9
--- /dev/null
+++ b/wp-includes/class-wp-widget-factory.php
@@ -0,0 +1,141 @@
+<?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
+ */
+#[AllowDynamicProperties]
+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
+ * @deprecated 4.3.0 Use __construct() instead.
+ *
+ * @see WP_Widget_Factory::__construct()
+ */
+ public function WP_Widget_Factory() {
+ _deprecated_constructor( 'WP_Widget_Factory', '4.3.0' );
+ self::__construct();
+ }
+
+ /**
+ * 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[ spl_object_hash( $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[ spl_object_hash( $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();
+ }
+ }
+
+ /**
+ * Returns the registered WP_Widget object for the given widget type.
+ *
+ * @since 5.8.0
+ *
+ * @param string $id_base Widget type ID.
+ * @return WP_Widget|null
+ */
+ public function get_widget_object( $id_base ) {
+ $key = $this->get_widget_key( $id_base );
+ if ( '' === $key ) {
+ return null;
+ }
+
+ return $this->widgets[ $key ];
+ }
+
+ /**
+ * Returns the registered key for the given widget type.
+ *
+ * @since 5.8.0
+ *
+ * @param string $id_base Widget type ID.
+ * @return string
+ */
+ public function get_widget_key( $id_base ) {
+ foreach ( $this->widgets as $key => $widget_object ) {
+ if ( $widget_object->id_base === $id_base ) {
+ return $key;
+ }
+ }
+
+ return '';
+ }
+}