2010-09-27 16:26:36 -04:00
< ? php
2012-07-10 16:32:48 -04:00
/**
2015-10-14 13:27:25 -04:00
* Toolbar API : WP_Admin_Bar class
2012-07-10 16:32:48 -04:00
*
* @ package WordPress
* @ subpackage Toolbar
2015-10-14 13:27:25 -04:00
* @ since 3.1 . 0
*/
/**
* Core class used to implement the Toolbar API .
*
* @ since 3.1 . 0
2012-07-10 16:32:48 -04:00
*/
2010-09-27 16:26:36 -04:00
class WP_Admin_Bar {
2011-11-02 16:34:54 -04:00
private $nodes = array ();
2011-12-05 22:42:11 -05:00
private $bound = false ;
2011-11-02 16:34:54 -04:00
public $user ;
2010-09-27 16:26:36 -04:00
2015-05-21 17:39:24 -04:00
/**
* @ param string $name
2015-05-24 01:40:25 -04:00
* @ return string | array | void
2015-05-21 17:39:24 -04:00
*/
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
public function __get ( $name ) {
switch ( $name ) {
2017-11-30 18:11:00 -05:00
case 'proto' :
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
return is_ssl () ? 'https://' : 'http://' ;
2014-05-06 14:29:15 -04:00
2017-11-30 18:11:00 -05:00
case 'menu' :
2016-07-06 08:40:29 -04:00
_deprecated_argument ( 'WP_Admin_Bar' , '3.3.0' , 'Modify admin bar nodes with WP_Admin_Bar::get_node(), WP_Admin_Bar::add_node(), and WP_Admin_Bar::remove_node(), not the <code>menu</code> property.' );
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
return array (); // Sorry, folks.
}
}
2010-09-27 16:26:36 -04:00
2015-05-29 17:37:24 -04:00
/**
*/
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
public function initialize () {
2010-09-27 16:26:36 -04:00
$this -> user = new stdClass ;
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
2011-09-16 06:56:06 -04:00
if ( is_user_logged_in () ) {
/* Populate settings we need for the menu based on the current user. */
$this -> user -> blogs = get_blogs_of_user ( get_current_user_id () );
if ( is_multisite () ) {
2017-11-30 18:11:00 -05:00
$this -> user -> active_blog = get_active_blog_for_user ( get_current_user_id () );
$this -> user -> domain = empty ( $this -> user -> active_blog ) ? user_admin_url () : trailingslashit ( get_home_url ( $this -> user -> active_blog -> blog_id ) );
2011-09-16 06:56:06 -04:00
$this -> user -> account_domain = $this -> user -> domain ;
} else {
2017-11-30 18:11:00 -05:00
$this -> user -> active_blog = $this -> user -> blogs [ get_current_blog_id () ];
$this -> user -> domain = trailingslashit ( home_url () );
2011-09-16 06:56:06 -04:00
$this -> user -> account_domain = $this -> user -> domain ;
}
2010-09-27 16:26:36 -04:00
}
2010-10-28 04:31:36 -04:00
add_action ( 'wp_head' , 'wp_admin_bar_header' );
2010-10-29 03:25:58 -04:00
2010-10-28 04:31:36 -04:00
add_action ( 'admin_head' , 'wp_admin_bar_header' );
2010-11-30 16:50:57 -05:00
if ( current_theme_supports ( 'admin-bar' ) ) {
2013-09-22 10:34:11 -04:00
/**
* To remove the default padding styles from WordPress for the Toolbar , use the following code :
* add_theme_support ( 'admin-bar' , array ( 'callback' => '__return_false' ) );
*/
2017-11-30 18:11:00 -05:00
$admin_bar_args = get_theme_support ( 'admin-bar' );
2010-11-30 16:50:57 -05:00
$header_callback = $admin_bar_args [ 0 ][ 'callback' ];
}
2017-11-30 18:11:00 -05:00
if ( empty ( $header_callback ) ) {
2010-11-30 16:50:57 -05:00
$header_callback = '_admin_bar_bump_cb' ;
2017-11-30 18:11:00 -05:00
}
2010-11-30 16:50:57 -05:00
2017-11-30 18:11:00 -05:00
add_action ( 'wp_head' , $header_callback );
2010-11-30 16:50:57 -05:00
2010-10-29 03:25:58 -04:00
wp_enqueue_script ( 'admin-bar' );
2010-10-28 04:31:36 -04:00
wp_enqueue_style ( 'admin-bar' );
2013-09-18 03:42:09 -04:00
/**
2013-09-18 07:58:19 -04:00
* Fires after WP_Admin_Bar is initialized .
2013-09-18 03:42:09 -04:00
*
2013-09-18 07:58:19 -04:00
* @ since 3.1 . 0
2013-09-18 03:42:09 -04:00
*/
2010-10-28 04:31:36 -04:00
do_action ( 'admin_bar_init' );
2010-09-27 16:26:36 -04:00
}
2015-05-21 17:39:24 -04:00
/**
* @ param array $node
*/
2011-11-02 16:34:54 -04:00
public function add_menu ( $node ) {
$this -> add_node ( $node );
}
2010-09-27 16:26:36 -04:00
2015-05-21 17:39:24 -04:00
/**
* @ param string $id
*/
2011-11-02 16:34:54 -04:00
public function remove_menu ( $id ) {
$this -> remove_node ( $id );
}
2010-09-27 16:26:36 -04:00
2011-11-02 16:34:54 -04:00
/**
2016-03-03 10:58:27 -05:00
* Adds a node to the menu .
2011-11-02 16:34:54 -04:00
*
2016-03-03 10:58:27 -05:00
* @ since 3.1 . 0
2015-12-06 16:37:25 -05:00
* @ since 4.5 . 0 Added the ability to pass 'lang' and 'dir' meta data .
*
2014-03-03 01:11:13 -05:00
* @ param array $args {
* Arguments for adding a node .
*
* @ type string $id ID of the item .
* @ type string $title Title of the node .
* @ type string $parent Optional . ID of the parent node .
* @ type string $href Optional . Link for the item .
* @ type bool $group Optional . Whether or not the node is a group . Default false .
2015-12-06 16:37:25 -05:00
* @ type array $meta Meta data including the following keys : 'html' , 'class' , 'rel' , 'lang' , 'dir' ,
2014-03-03 01:11:13 -05:00
* 'onclick' , 'target' , 'title' , 'tabindex' . Default empty .
* }
2011-11-02 16:34:54 -04:00
*/
public function add_node ( $args ) {
// Shim for old method signature: add_node( $parent_id, $menu_obj, $args )
2017-11-30 18:11:00 -05:00
if ( func_num_args () >= 3 && is_string ( func_get_arg ( 0 ) ) ) {
$args = array_merge ( array ( 'parent' => func_get_arg ( 0 ) ), func_get_arg ( 2 ) );
}
2011-11-02 16:34:54 -04:00
2017-11-30 18:11:00 -05:00
if ( is_object ( $args ) ) {
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
$args = get_object_vars ( $args );
2017-11-30 18:11:00 -05:00
}
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
2011-11-04 13:41:38 -04:00
// Ensure we have a valid title.
if ( empty ( $args [ 'id' ] ) ) {
2017-11-30 18:11:00 -05:00
if ( empty ( $args [ 'title' ] ) ) {
2011-11-23 16:46:47 -05:00
return ;
2017-11-30 18:11:00 -05:00
}
2011-11-23 16:46:47 -05:00
2016-07-06 08:40:29 -04:00
_doing_it_wrong ( __METHOD__ , __ ( 'The menu ID should not be empty.' ), '3.3.0' );
2011-11-23 16:46:47 -05:00
// Deprecated: Generate an ID from the title.
2011-11-04 13:41:38 -04:00
$args [ 'id' ] = esc_attr ( sanitize_title ( trim ( $args [ 'title' ] ) ) );
}
2011-11-02 16:34:54 -04:00
$defaults = array (
2011-11-23 16:46:47 -05:00
'id' => false ,
'title' => false ,
'parent' => false ,
'href' => false ,
'group' => false ,
'meta' => array (),
2011-11-02 16:34:54 -04:00
);
2010-09-27 16:26:36 -04:00
2011-11-02 16:34:54 -04:00
// If the node already exists, keep any data that isn't provided.
2017-11-30 18:11:00 -05:00
if ( $maybe_defaults = $this -> get_node ( $args [ 'id' ] ) ) {
2011-12-05 22:42:11 -05:00
$defaults = get_object_vars ( $maybe_defaults );
2017-11-30 18:11:00 -05:00
}
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
// Do the same for 'meta' items.
2017-11-30 18:11:00 -05:00
if ( ! empty ( $defaults [ 'meta' ] ) && ! empty ( $args [ 'meta' ] ) ) {
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
$args [ 'meta' ] = wp_parse_args ( $args [ 'meta' ], $defaults [ 'meta' ] );
2017-11-30 18:11:00 -05:00
}
2010-09-27 16:26:36 -04:00
2011-11-02 16:34:54 -04:00
$args = wp_parse_args ( $args , $defaults );
2010-09-27 16:26:36 -04:00
2011-12-05 19:31:11 -05:00
$back_compat_parents = array (
2011-12-05 22:42:11 -05:00
'my-account-with-avatar' => array ( 'my-account' , '3.3' ),
2017-11-30 18:11:00 -05:00
'my-blogs' => array ( 'my-sites' , '3.3' ),
2011-12-05 19:31:11 -05:00
);
if ( isset ( $back_compat_parents [ $args [ 'parent' ] ] ) ) {
list ( $new_parent , $version ) = $back_compat_parents [ $args [ 'parent' ] ];
2011-12-05 19:46:03 -05:00
_deprecated_argument ( __METHOD__ , $version , sprintf ( 'Use <code>%s</code> as the parent for the <code>%s</code> admin bar node instead of <code>%s</code>.' , $new_parent , $args [ 'id' ], $args [ 'parent' ] ) );
2011-12-05 19:31:11 -05:00
$args [ 'parent' ] = $new_parent ;
}
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
$this -> _set_node ( $args );
}
2015-05-21 17:39:24 -04:00
/**
* @ param array $args
*/
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
final protected function _set_node ( $args ) {
2011-11-02 16:34:54 -04:00
$this -> nodes [ $args [ 'id' ] ] = ( object ) $args ;
2010-09-27 16:26:36 -04:00
}
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
/**
* Gets a node .
*
2015-05-21 17:39:24 -04:00
* @ param string $id
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
* @ return object Node .
*/
final public function get_node ( $id ) {
2017-11-30 18:11:00 -05:00
if ( $node = $this -> _get_node ( $id ) ) {
2011-12-05 22:42:11 -05:00
return clone $node ;
2017-11-30 18:11:00 -05:00
}
2011-12-05 22:42:11 -05:00
}
2015-05-21 17:39:24 -04:00
/**
* @ param string $id
2015-05-24 01:40:25 -04:00
* @ return object | void
2015-05-21 17:39:24 -04:00
*/
2011-12-05 22:42:11 -05:00
final protected function _get_node ( $id ) {
2017-11-30 18:11:00 -05:00
if ( $this -> bound ) {
2011-12-05 22:42:11 -05:00
return ;
2017-11-30 18:11:00 -05:00
}
2011-12-05 22:42:11 -05:00
2017-11-30 18:11:00 -05:00
if ( empty ( $id ) ) {
2011-12-05 22:42:11 -05:00
$id = 'root' ;
2017-11-30 18:11:00 -05:00
}
2011-12-05 22:42:11 -05:00
2017-11-30 18:11:00 -05:00
if ( isset ( $this -> nodes [ $id ] ) ) {
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
return $this -> nodes [ $id ];
2017-11-30 18:11:00 -05:00
}
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
}
2015-05-21 17:39:24 -04:00
/**
2015-05-24 01:40:25 -04:00
* @ return array | void
2015-05-21 17:39:24 -04:00
*/
2011-12-05 22:42:11 -05:00
final public function get_nodes () {
2017-11-30 18:11:00 -05:00
if ( ! $nodes = $this -> _get_nodes () ) {
2012-07-10 16:32:48 -04:00
return ;
2017-11-30 18:11:00 -05:00
}
2011-12-05 22:42:11 -05:00
2012-07-10 16:32:48 -04:00
foreach ( $nodes as & $node ) {
$node = clone $node ;
}
return $nodes ;
2011-12-05 22:42:11 -05:00
}
2015-05-21 17:39:24 -04:00
/**
2015-05-24 01:40:25 -04:00
* @ return array | void
2015-05-21 17:39:24 -04:00
*/
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
final protected function _get_nodes () {
2017-11-30 18:11:00 -05:00
if ( $this -> bound ) {
2011-12-05 22:42:11 -05:00
return ;
2017-11-30 18:11:00 -05:00
}
2011-12-05 22:42:11 -05:00
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
return $this -> nodes ;
}
2011-11-23 16:46:47 -05:00
/**
* Add a group to a menu node .
*
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
* @ since 3.3 . 0
*
2014-03-03 01:11:13 -05:00
* @ param array $args {
* Array of arguments for adding a group .
*
* @ type string $id ID of the item .
* @ type string $parent Optional . ID of the parent node . Default 'root' .
* @ type array $meta Meta data for the group including the following keys :
* 'class' , 'onclick' , 'target' , and 'title' .
* }
2011-11-23 16:46:47 -05:00
*/
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
final public function add_group ( $args ) {
2011-11-23 16:46:47 -05:00
$args [ 'group' ] = true ;
$this -> add_node ( $args );
}
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
/**
* Remove a node .
*
2015-05-21 17:39:24 -04:00
* @ param string $id The ID of the item .
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
*/
2011-11-02 16:34:54 -04:00
public function remove_node ( $id ) {
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
$this -> _unset_node ( $id );
}
2015-05-21 17:39:24 -04:00
/**
* @ param string $id
*/
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
final protected function _unset_node ( $id ) {
2011-11-02 16:34:54 -04:00
unset ( $this -> nodes [ $id ] );
2010-09-27 16:26:36 -04:00
}
2010-10-28 11:46:11 -04:00
2015-05-29 17:37:24 -04:00
/**
*/
2011-11-02 16:34:54 -04:00
public function render () {
2011-12-05 22:42:11 -05:00
$root = $this -> _bind ();
2017-11-30 18:11:00 -05:00
if ( $root ) {
2011-12-30 18:04:28 -05:00
$this -> _render ( $root );
2017-11-30 18:11:00 -05:00
}
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
}
2011-11-20 13:39:54 -05:00
2015-05-21 17:39:24 -04:00
/**
2015-05-24 01:40:25 -04:00
* @ return object | void
2015-05-21 17:39:24 -04:00
*/
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
final protected function _bind () {
2017-11-30 18:11:00 -05:00
if ( $this -> bound ) {
2011-12-05 22:42:11 -05:00
return ;
2017-11-30 18:11:00 -05:00
}
2011-12-05 22:42:11 -05:00
// Add the root node.
// Clear it first, just in case. Don't mess with The Root.
$this -> remove_node ( 'root' );
2017-11-30 18:11:00 -05:00
$this -> add_node (
array (
'id' => 'root' ,
'group' => false ,
)
);
2011-12-05 22:42:11 -05:00
// Normalize nodes: define internal 'children' and 'type' properties.
foreach ( $this -> _get_nodes () as $node ) {
$node -> children = array ();
2017-11-30 18:11:00 -05:00
$node -> type = ( $node -> group ) ? 'group' : 'item' ;
2011-12-05 22:42:11 -05:00
unset ( $node -> group );
// The Root wants your orphans. No lonely items allowed.
2017-11-30 18:11:00 -05:00
if ( ! $node -> parent ) {
2011-12-05 22:42:11 -05:00
$node -> parent = 'root' ;
2017-11-30 18:11:00 -05:00
}
2011-12-05 22:42:11 -05:00
}
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
foreach ( $this -> _get_nodes () as $node ) {
2017-11-30 18:11:00 -05:00
if ( 'root' == $node -> id ) {
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
continue ;
2017-11-30 18:11:00 -05:00
}
2011-11-02 16:34:54 -04:00
2011-12-05 22:42:11 -05:00
// Fetch the parent node. If it isn't registered, ignore the node.
if ( ! $parent = $this -> _get_node ( $node -> parent ) ) {
2011-11-02 16:34:54 -04:00
continue ;
2011-11-09 14:12:48 -05:00
}
2011-11-02 16:34:54 -04:00
2011-12-05 22:42:11 -05:00
// Generate the group class (we distinguish between top level and other level groups).
$group_class = ( $node -> parent == 'root' ) ? 'ab-top-menu' : 'ab-submenu' ;
if ( $node -> type == 'group' ) {
2017-11-30 18:11:00 -05:00
if ( empty ( $node -> meta [ 'class' ] ) ) {
2012-06-30 07:47:21 -04:00
$node -> meta [ 'class' ] = $group_class ;
2017-11-30 18:11:00 -05:00
} else {
2012-06-30 07:47:21 -04:00
$node -> meta [ 'class' ] .= ' ' . $group_class ;
2017-11-30 18:11:00 -05:00
}
2011-12-05 22:42:11 -05:00
}
// Items in items aren't allowed. Wrap nested items in 'default' groups.
if ( $parent -> type == 'item' && $node -> type == 'item' ) {
$default_id = $parent -> id . '-default' ;
$default = $this -> _get_node ( $default_id );
2011-11-23 16:46:47 -05:00
// The default group is added here to allow groups that are
// added before standard menu items to render first.
2011-12-05 22:42:11 -05:00
if ( ! $default ) {
// Use _set_node because add_node can be overloaded.
// Make sure to specify default settings for all properties.
2017-11-30 18:11:00 -05:00
$this -> _set_node (
array (
'id' => $default_id ,
'parent' => $parent -> id ,
'type' => 'group' ,
'children' => array (),
'meta' => array (
'class' => $group_class ,
),
'title' => false ,
'href' => false ,
)
);
$default = $this -> _get_node ( $default_id );
2011-12-05 22:42:11 -05:00
$parent -> children [] = $default ;
2011-11-23 16:46:47 -05:00
}
2011-12-05 22:42:11 -05:00
$parent = $default ;
2017-11-30 18:11:00 -05:00
// Groups in groups aren't allowed. Add a special 'container' node.
// The container will invisibly wrap both groups.
2011-12-05 22:42:11 -05:00
} elseif ( $parent -> type == 'group' && $node -> type == 'group' ) {
$container_id = $parent -> id . '-container' ;
$container = $this -> _get_node ( $container_id );
// We need to create a container for this group, life is sad.
if ( ! $container ) {
// Use _set_node because add_node can be overloaded.
// Make sure to specify default settings for all properties.
2017-11-30 18:11:00 -05:00
$this -> _set_node (
array (
'id' => $container_id ,
'type' => 'container' ,
'children' => array ( $parent ),
'parent' => false ,
'title' => false ,
'href' => false ,
'meta' => array (),
)
);
2011-12-05 22:42:11 -05:00
$container = $this -> _get_node ( $container_id );
// Link the container node if a grandparent node exists.
$grandparent = $this -> _get_node ( $parent -> parent );
if ( $grandparent ) {
$container -> parent = $grandparent -> id ;
$index = array_search ( $parent , $grandparent -> children , true );
2017-11-30 18:11:00 -05:00
if ( $index === false ) {
2011-12-05 22:42:11 -05:00
$grandparent -> children [] = $container ;
2017-11-30 18:11:00 -05:00
} else {
2011-12-05 22:42:11 -05:00
array_splice ( $grandparent -> children , $index , 1 , array ( $container ) );
2017-11-30 18:11:00 -05:00
}
2011-12-05 22:42:11 -05:00
}
$parent -> parent = $container -> id ;
}
$parent = $container ;
2011-11-23 16:46:47 -05:00
}
// Update the parent ID (it might have changed).
$node -> parent = $parent -> id ;
// Add the node to the tree.
$parent -> children [] = $node ;
2011-11-02 16:34:54 -04:00
}
2011-12-05 22:42:11 -05:00
2017-11-30 18:11:00 -05:00
$root = $this -> _get_node ( 'root' );
2011-12-05 22:42:11 -05:00
$this -> bound = true ;
return $root ;
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
}
2015-05-21 17:39:24 -04:00
/**
2016-08-31 11:22:31 -04:00
* @ global bool $is_IE
2015-05-21 17:39:24 -04:00
* @ param object $root
*/
2011-12-05 22:42:11 -05:00
final protected function _render ( $root ) {
2016-08-31 11:22:31 -04:00
global $is_IE ;
2011-11-21 18:07:54 -05:00
// Add browser classes.
// We have to do this here since admin bar shows on the front end.
$class = 'nojq nojs' ;
2016-08-31 11:22:31 -04:00
if ( $is_IE ) {
2017-11-30 18:11:00 -05:00
if ( strpos ( $_SERVER [ 'HTTP_USER_AGENT' ], 'MSIE 7' ) ) {
2011-11-21 18:07:54 -05:00
$class .= ' ie7' ;
2017-11-30 18:11:00 -05:00
} elseif ( strpos ( $_SERVER [ 'HTTP_USER_AGENT' ], 'MSIE 8' ) ) {
2011-11-21 18:07:54 -05:00
$class .= ' ie8' ;
2017-11-30 18:11:00 -05:00
} elseif ( strpos ( $_SERVER [ 'HTTP_USER_AGENT' ], 'MSIE 9' ) ) {
2011-11-22 16:35:08 -05:00
$class .= ' ie9' ;
2017-11-30 18:11:00 -05:00
}
2012-04-09 21:19:30 -04:00
} elseif ( wp_is_mobile () ) {
2011-11-21 18:07:54 -05:00
$class .= ' mobile' ;
}
2010-10-28 04:31:36 -04:00
?>
2015-04-01 09:17:27 -04:00
< div id = " wpadminbar " class = " <?php echo $class ; ?> " >
< ? php if ( ! is_admin () ) { ?>
< a class = " screen-reader-shortcut " href = " #wp-toolbar " tabindex = " 1 " >< ? php _e ( 'Skip to toolbar' ); ?> </a>
< ? php } ?>
2019-01-17 06:55:51 -05:00
< div class = " quicklinks " id = " wp-toolbar " role = " navigation " aria - label = " <?php esc_attr_e( 'Toolbar' ); ?> " >
2017-11-30 18:11:00 -05:00
< ? php
foreach ( $root -> children as $group ) {
2011-12-05 22:42:11 -05:00
$this -> _render_group ( $group );
2017-11-30 18:11:00 -05:00
}
?>
2010-09-27 16:26:36 -04:00
</ div >
2013-06-19 04:15:04 -04:00
< ? php if ( is_user_logged_in () ) : ?>
2017-11-30 18:11:00 -05:00
< a class = " screen-reader-shortcut " href = " <?php echo esc_url( wp_logout_url() ); ?> " >< ? php _e ( 'Log Out' ); ?> </a>
2013-06-19 04:15:04 -04:00
< ? php endif ; ?>
2010-09-27 16:26:36 -04:00
</ div >
< ? php
}
2015-05-21 17:39:24 -04:00
/**
* @ param object $node
*/
2011-12-05 22:42:11 -05:00
final protected function _render_container ( $node ) {
2017-11-30 18:11:00 -05:00
if ( $node -> type != 'container' || empty ( $node -> children ) ) {
2011-11-23 16:46:47 -05:00
return ;
2017-11-30 18:11:00 -05:00
}
2011-11-23 16:46:47 -05:00
2017-11-08 03:35:51 -05:00
echo '<div id="' . esc_attr ( 'wp-admin-bar-' . $node -> id ) . '" class="ab-group-container">' ;
foreach ( $node -> children as $group ) {
$this -> _render_group ( $group );
}
echo '</div>' ;
2011-12-05 22:42:11 -05:00
}
2011-11-23 16:46:47 -05:00
2015-05-21 17:39:24 -04:00
/**
* @ param object $node
*/
2011-12-05 22:42:11 -05:00
final protected function _render_group ( $node ) {
2015-05-21 17:39:24 -04:00
if ( $node -> type == 'container' ) {
$this -> _render_container ( $node );
return ;
}
2017-11-30 18:11:00 -05:00
if ( $node -> type != 'group' || empty ( $node -> children ) ) {
2011-12-05 22:42:11 -05:00
return ;
2017-11-30 18:11:00 -05:00
}
2011-11-23 16:46:47 -05:00
2017-11-30 18:11:00 -05:00
if ( ! empty ( $node -> meta [ 'class' ] ) ) {
2012-06-30 07:47:21 -04:00
$class = ' class="' . esc_attr ( trim ( $node -> meta [ 'class' ] ) ) . '"' ;
2017-11-30 18:11:00 -05:00
} else {
2012-06-30 07:47:21 -04:00
$class = '' ;
2017-11-30 18:11:00 -05:00
}
2011-11-23 16:46:47 -05:00
2017-11-08 03:35:51 -05:00
echo " <ul id=' " . esc_attr ( 'wp-admin-bar-' . $node -> id ) . " ' $class > " ;
foreach ( $node -> children as $item ) {
$this -> _render_item ( $item );
}
echo '</ul>' ;
2011-11-23 16:46:47 -05:00
}
2015-05-21 17:39:24 -04:00
/**
* @ param object $node
*/
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
final protected function _render_item ( $node ) {
2017-11-30 18:11:00 -05:00
if ( $node -> type != 'item' ) {
2011-11-23 16:46:47 -05:00
return ;
2017-11-30 18:11:00 -05:00
}
2011-11-23 16:46:47 -05:00
2016-11-05 12:28:33 -04:00
$is_parent = ! empty ( $node -> children );
$has_link = ! empty ( $node -> href );
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
2016-07-12 07:18:30 -04:00
// Allow only numeric values, then casted to integers, and allow a tabindex value of `0` for a11y.
2017-11-30 18:11:00 -05:00
$tabindex = ( isset ( $node -> meta [ 'tabindex' ] ) && is_numeric ( $node -> meta [ 'tabindex' ] ) ) ? ( int ) $node -> meta [ 'tabindex' ] : '' ;
2016-07-12 07:18:30 -04:00
$aria_attributes = ( '' !== $tabindex ) ? ' tabindex="' . $tabindex . '"' : '' ;
2011-11-29 20:27:33 -05:00
2016-11-05 12:28:33 -04:00
$menuclass = '' ;
2011-11-29 20:27:33 -05:00
if ( $is_parent ) {
2017-11-30 18:11:00 -05:00
$menuclass = 'menupop ' ;
2011-11-29 20:27:33 -05:00
$aria_attributes .= ' aria-haspopup="true"' ;
}
2011-02-09 12:35:36 -05:00
2017-11-30 18:11:00 -05:00
if ( ! empty ( $node -> meta [ 'class' ] ) ) {
2012-06-30 07:47:21 -04:00
$menuclass .= $node -> meta [ 'class' ];
2017-11-30 18:11:00 -05:00
}
2012-06-30 07:47:21 -04:00
2017-11-30 18:11:00 -05:00
if ( $menuclass ) {
2012-06-30 07:47:21 -04:00
$menuclass = ' class="' . esc_attr ( trim ( $menuclass ) ) . '"' ;
2017-11-30 18:11:00 -05:00
}
2011-11-07 15:38:38 -05:00
2017-11-08 03:35:51 -05:00
echo " <li id=' " . esc_attr ( 'wp-admin-bar-' . $node -> id ) . " ' $menuclass > " ;
2010-10-28 04:31:36 -04:00
2017-11-08 03:35:51 -05:00
if ( $has_link ) {
$attributes = array ( 'onclick' , 'target' , 'title' , 'rel' , 'lang' , 'dir' );
2017-11-08 03:52:48 -05:00
echo " <a class='ab-item' $aria_attributes href=' " . esc_url ( $node -> href ) . " ' " ;
2017-11-08 03:35:51 -05:00
if ( ! empty ( $node -> meta [ 'onclick' ] ) ) {
echo ' onclick="' . esc_js ( $node -> meta [ 'onclick' ] ) . '"' ;
}
} else {
$attributes = array ( 'onclick' , 'target' , 'title' , 'rel' , 'lang' , 'dir' );
echo '<div class="ab-item ab-empty-item"' . $aria_attributes ;
}
2010-11-17 13:47:34 -05:00
2017-11-08 03:35:51 -05:00
foreach ( $attributes as $attribute ) {
if ( ! empty ( $node -> meta [ $attribute ] ) ) {
2017-11-08 18:13:46 -05:00
echo " $attribute =' " . esc_attr ( $node -> meta [ $attribute ] ) . " ' " ;
2017-11-08 03:35:51 -05:00
}
}
echo " > { $node -> title } " ;
if ( $has_link ) {
echo '</a>' ;
} else {
echo '</div>' ;
}
if ( $is_parent ) {
echo '<div class="ab-sub-wrapper">' ;
foreach ( $node -> children as $group ) {
$this -> _render_group ( $group );
}
echo '</div>' ;
}
if ( ! empty ( $node -> meta [ 'html' ] ) ) {
echo $node -> meta [ 'html' ];
}
2011-11-02 16:34:54 -04:00
2017-11-08 03:35:51 -05:00
echo '</li>' ;
2011-11-23 16:46:47 -05:00
}
2010-09-27 16:26:36 -04:00
2015-05-21 17:39:24 -04:00
/**
2017-06-25 17:58:41 -04:00
* Renders toolbar items recursively .
*
* @ since 3.1 . 0
* @ deprecated 3.3 . 0 Use WP_Admin_Bar :: _render_item () or WP_Admin_bar :: render () instead .
* @ see WP_Admin_Bar :: _render_item ()
* @ see WP_Admin_Bar :: render ()
*
2015-05-21 17:39:24 -04:00
* @ param string $id Unused .
* @ param object $node
*/
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
public function recursive_render ( $id , $node ) {
2016-07-06 08:40:29 -04:00
_deprecated_function ( __METHOD__ , '3.3.0' , 'WP_Admin_bar::render(), WP_Admin_Bar::_render_item()' );
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
$this -> _render_item ( $node );
2010-09-27 16:26:36 -04:00
}
2015-05-29 17:37:24 -04:00
/**
*/
Finalize the WP_Admin_Bar architecture for 3.3.
* Introduce a get_node() method for plugins.
* Deprecate $wp_admin_bar->menu. Plugins will need to use get_node(), remove_node(), add_node() to make modifications. This finalizes a backwards incompatible change made earlier in the cycle.
* Allow add_node() to take a node object (which could come from get_node(), then be modified).
* Ensure that our underlying storage (the nodes property) is private to core. Introduce _set_node, _unset_node, _get_nodes, get_nodes as the only ways to interface with this.
* Protect and finalize _render_item, and _render_group. render() remains public and technically overridable, though I would discourage this of plugin authors.
* Deprecate recursive_render(). Use render() or _render_item().
More about the internals:
* Late-binds a node's 'children' array.
* Eliminates the root property, leverages a 'root' node.
* Splits render() into _bind() and _render(), both protected and finalized.
Fixes #19371.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19501 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2011-11-30 19:25:04 -05:00
public function add_menus () {
2011-10-05 20:02:18 -04:00
// User related, aligned right.
2011-12-05 22:51:58 -05:00
add_action ( 'admin_bar_menu' , 'wp_admin_bar_my_account_menu' , 0 );
add_action ( 'admin_bar_menu' , 'wp_admin_bar_search_menu' , 4 );
add_action ( 'admin_bar_menu' , 'wp_admin_bar_my_account_item' , 7 );
2011-10-05 20:02:18 -04:00
// Site related.
2013-11-13 13:00:10 -05:00
add_action ( 'admin_bar_menu' , 'wp_admin_bar_sidebar_toggle' , 0 );
2011-10-05 20:02:18 -04:00
add_action ( 'admin_bar_menu' , 'wp_admin_bar_wp_menu' , 10 );
2011-10-05 14:45:32 -04:00
add_action ( 'admin_bar_menu' , 'wp_admin_bar_my_sites_menu' , 20 );
2011-10-07 15:52:26 -04:00
add_action ( 'admin_bar_menu' , 'wp_admin_bar_site_menu' , 30 );
2015-07-08 16:03:24 -04:00
add_action ( 'admin_bar_menu' , 'wp_admin_bar_customize_menu' , 40 );
add_action ( 'admin_bar_menu' , 'wp_admin_bar_updates_menu' , 50 );
2011-10-05 20:02:18 -04:00
// Content related.
2011-11-22 11:19:05 -05:00
if ( ! is_network_admin () && ! is_user_admin () ) {
add_action ( 'admin_bar_menu' , 'wp_admin_bar_comments_menu' , 60 );
add_action ( 'admin_bar_menu' , 'wp_admin_bar_new_content_menu' , 70 );
}
2011-10-10 14:40:00 -04:00
add_action ( 'admin_bar_menu' , 'wp_admin_bar_edit_menu' , 80 );
2010-12-13 16:21:50 -05:00
2011-11-23 16:46:47 -05:00
add_action ( 'admin_bar_menu' , 'wp_admin_bar_add_secondary_groups' , 200 );
2013-09-18 03:42:09 -04:00
/**
2013-09-18 07:58:19 -04:00
* Fires after menus are added to the menu bar .
2013-09-18 03:42:09 -04:00
*
2013-09-18 07:58:19 -04:00
* @ since 3.1 . 0
2013-09-18 03:42:09 -04:00
*/
2010-12-09 11:55:09 -05:00
do_action ( 'add_admin_bar_menus' );
2010-10-28 04:31:36 -04:00
}
2010-09-27 16:26:36 -04:00
}