* 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 );
?>