<?php /** * Handles registering Widgets Bundle widgets. * * Class SiteOrigin_Widgets_Widget_Manager */ class SiteOrigin_Widgets_Widget_Manager { /** * Regsitered widgets */ private $registered; public function __construct() { $this->registered = array(); add_action( 'widgets_init', array( $this, 'widgets_init' ) ); } /** * Get the single instance. * * @return SiteOrigin_Widgets_Widget_Manager */ public static function single() { static $single; if ( empty( $single ) ) { $single = new self(); } return $single; } /** * @param bool|false $class * * @return mixed */ public function register( $id, $path, $class = false ) { $path = wp_normalize_path( $path ); if ( empty( $class ) ) { $class = 'SiteOrigin_Widget_' . str_replace( ' ', '', ucwords( str_replace( '-', ' ', $id ) ) ) . '_Widget'; } $this->registered[ $id ] = new stdClass(); $this->registered[ $id ]->path = $path; $this->registered[ $id ]->class = $class; $this->registered[ $id ]->registered = false; return $this->registered[ $id ]; } /** * Initialize all the widgets. */ public function widgets_init() { foreach ( $this->registered as $id => & $info ) { if ( $info->registered ) { continue; } register_widget( $info->class ); $info->registered = true; } } /** * Get the path of the widget * * @return bool */ public function get_plugin_path( $id ) { if ( empty( $this->registered[ $id ] ) ) { // This call might be using the incorrect ID convention. if ( substr( $id, 0, 4 ) == 'sow-' ) { $id = substr( $id, 4 ); } else { $id = 'sow-' . $id; } } return ! empty( $this->registered[ $id ] ) ? $this->registered[ $id ]->path : false; } /** * Get the filename of the widget * * @return string|bool */ public function get_widget_filename( $id ) { $path = $this->get_plugin_path( $id ); if ( ! empty( $path ) ) { $info = pathinfo( $path ); return $info['filename']; } return false; } /** * @return string * * @todo examine this when using a widget in a theme folder. */ public function get_plugin_dir_path( $id ) { return plugin_dir_path( $this->get_plugin_path( $id ) ); } public function get_plugin_dir_url( $id ) { return plugin_dir_url( $this->get_plugin_path( $id ) ); } /** * Get a widget ID from a file path * * @param string $path The file path. * * @return string The ID. */ public function get_id_from_path( $path ) { foreach ( $this->registered as $id => $r ) { if ( $r->path == $path ) { return $id; } } return false; } /** * Get the class name of a widget from the * * @return mixed */ public function get_class_from_path( $path ) { foreach ( $this->registered as $id => $r ) { if ( $r->path == $path ) { return $r->class; } } return false; } /** * Get the list of registered widgets. * * @return array */ public function get_registered_widgets() { return $this->registered; } /** * Get the registered widget instance by it's class name or the hash generated when it was registered. * * @return array */ public static function get_widget_instance( $class_or_hash ) { global $wp_widget_factory; if ( isset( $wp_widget_factory->widgets[ $class_or_hash ] ) ) { return $wp_widget_factory->widgets[ $class_or_hash ]; } else { foreach ( $wp_widget_factory->widgets as $widget_instance ) { if ( $widget_instance instanceof $class_or_hash ) { return $widget_instance; } } } return null; } } SiteOrigin_Widgets_Widget_Manager::single(); /** * Register a widget * * @param string $id The ID of the widget * @param string $path The path of the widget * @param bool|string $class The name of the class */ function siteorigin_widget_register( $id, $path, $class = false ) { SiteOrigin_Widgets_Widget_Manager::single()->register( $id, $path, $class ); } /** * Get the base file of a widget plugin * * @param $name * * @return bool */ function siteorigin_widget_get_plugin_path( $id ) { return SiteOrigin_Widgets_Widget_Manager::single()->get_plugin_path( $id ); } /** * Get the base path folder of a widget plugin. * * @return string */ function siteorigin_widget_get_plugin_dir_path( $id ) { return SiteOrigin_Widgets_Widget_Manager::single()->get_plugin_dir_path( $id ); } /** * Get the base path URL of a widget plugin. * * @return string */ function siteorigin_widget_get_plugin_dir_url( $id ) { return SiteOrigin_Widgets_Widget_Manager::single()->get_plugin_dir_url( $id ); }