* if (!class_exists('WpmuDev_HelpTooltips')) require_once YOUR_PLUGIN_BASE_DIR . '/lib/external/class-wd-help-tooltips.php'; * $tips = new WpmuDev_HelpTooltips(); * $tips->set_icon_url("URL_TO_YOUR_ICON"); * echo $tips->add_tip("Tip 1 text here"); * // ... * echo $tips->add_tip("Tip 2 text here"); * * This is a basic usage scenario. * * Alternative usage example: * * if (!class_exists('WpmuDev_HelpTooltips')) require_once YOUR_PLUGIN_BASE_DIR . '/lib/external/class-wd-help-tooltips.php'; * $tips = new WpmuDev_HelpTooltips(); * $tips->set_icon_url("URL_TO_YOUR_ICON"); * $tips->bind_tip('My tip text here', '.icon32:first ~h2'); * // Note that you don't echo anything in this usage example - the tip will be * // added automatically next to the supplied selector (second argument) * * This scenario may be useful for e.g. adding our tips to UI elements created by WP or other plugins. * You can freely alternate between add_tip() and bind_tip() methods, * just remember to echo add_tip() and *not* echo bind_tip(). * * Another alternative usage example, setting tips for multiple pages in one place: * * if (!class_exists('WpmuDev_HelpTooltips')) require_once YOUR_PLUGIN_BASE_DIR . '/lib/external/class-wd-help-tooltips.php'; * // Tips added to $tips1 object will only show on Social Marketing add/edit advert page * $tips1 = new WpmuDev_HelpTooltips(); * $tips1->set_icon_url("URL_TO_YOUR_ICON"); * $tips1->set_screen_id("social_marketing_ad"); * $tips1->bind_tip('My tip 1 text here', '.icon32:first ~h2'); * // ... * // Tips added to $tips2 object will only show on Social Marketing getting started page * $tips2 = new WpmuDev_HelpTooltips(); * $tips2->set_icon_url("URL_TO_YOUR_ICON"); * $tips2->set_screen_id("social_marketing_ad_page_wdsm-get_started"); * $tips2->bind_tip('My tip 2 text here', '.icon32:first ~h2'); * * Using add_tip() method will do nothing in this last scenario, as it doesn't make sense in that context. * This scenario may be useful for adding tooltips to all pages in one central location. * E.g. for adding tooltips in a plugin add-on. */ class WpmuDev_HelpTooltips { /** * Holds an array of inline tips: used as dependency inclusion switch. */ private $_inline_tips = array(); /** * Holds an array of bound tips: used as dependency inclusion switch and bound tips buffer. */ private $_bound_tips = array(); /** * Holds an array of bound tips selectors: used as bound tips selectors buffer. */ private $_bound_selectors = array(); /** * Full URL to help icon, which is used as tip anchor * and as notice background image. */ private $_icon_url; /** * Flag that determines do we want to use notices * (tips expanded on click). * Defaults to true. */ private $_use_notice = true; /** * Limits tip output to a screen (page). * Optional. * Works best with bind_tip() method. */ private $_screen_id = false; /** * Bind to footer hooks when instantiated. */ public function __construct() { global $wp_version; $version = preg_replace( '/-.*$/', '', $wp_version ); if ( version_compare( $version, '3.3', '>=' ) ) { add_action( 'admin_footer', array( $this, 'add_bound_tips' ), 999 ); add_action( 'admin_print_footer_scripts', array( $this, 'initialize' ) ); } } /** * Sets icon URL. * @param string $icon_url Full URL to help anchor icon */ public function set_icon_url( $icon_url ) { $this->_icon_url = $icon_url; } /** * Set show notices (tips expanded on click) flag. * @param bool $use_notice True to use notices (default), false otherwise. */ public function set_use_notice( $use_notice = true ) { $this->_use_notice = $use_notice; } /** * Set screen limiting flag. * @param $screen_id Screen ID that tips in this object apply to. */ public function set_screen_id( $screen_id ) { $this->_screen_id = $screen_id; } /** * Returns inline tip markup. * Scenario: for echoing inline tips next to elements on the page. * Usage example: * * echo $tips->add_tip('My tip text here'); * * @param string $tip Tip text * @return string Inline tip markup */ public function add_tip( $tip ) { if ( ! $this->_check_screen() ) return false; $this->_inline_tips[] = $tip; return $this->_get_tip_markup( $tip ); } /** * Binds a tip to selector. * This is different from inline tips, as you don't have to output them yourself. * Scenario: for adding help tips next to elements determined by the selector on page load time. * Usage example: * * $tips->bind_tip('My tip text here', '.icon32:first ~h2'); * * @param string $tip Tip text * @param string $selector jQuery selector of the element that tip is related to. */ public function bind_tip( $tip, $bind_to_selector ) { $tip_id = 'wpmudev-help-tip-for-' . md5( $bind_to_selector ); $this->_bound_tips[ $tip_id ] = $tip; $this->_bound_selectors[ $tip_id ] = $bind_to_selector; } /** * Bounded tips injection handler. * Will queue up the bounded tips. */ function add_bound_tips() { if ( ! $this->_check_screen() ) return false; if ( ! $this->_bound_tips ) return false; foreach ( $this->_bound_tips as $id => $tip ) { echo $this->_get_tip_markup( $tip, 'id="' . $id . '" style=display:none' ); } } /** * Dependency injection handler. * Will only add dependencies if there are actual tooltips to show. */ function initialize() { if ( ! $this->_check_screen()) return false; if ( ! $this->_inline_tips && ! $this->_bound_tips ) return false; $this->_print_styles(); $this->_print_scripts(); } /** * Screen limitation check. * @return bool True if we're good to go, false if we're on a wrong screen. */ private function _check_screen() { if (!$this->_screen_id) return true; // No screen dependency $screen = get_current_screen(); if ( ! is_object( $screen ) ) return false; // Actually older then 3.3 if ( $this->_screen_id != @$screen->id ) return false; // Not for this screen return true; } private function _get_tip_markup( $tip, $arg = '' ) { return "{$tip}"; } /** * Private helper method that prints style dependencies. */ private function _print_styles() { // Have we already done this? if ( ! defined( 'WPMUDEV_TOOLTIPS_CSS_ADDED' ) ) define( 'WPMUDEV_TOOLTIPS_CSS_ADDED', true ); else return false; ?> _bound_selectors ); ?>