2010-09-27 16:26:36 -04:00
< ? php
2012-07-10 16:32:48 -04:00
/**
* The WordPress Toolbar
*
* @ since 3.1 . 0
*
* @ package WordPress
* @ subpackage Toolbar
*/
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
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 ) {
case 'proto' :
return is_ssl () ? 'https://' : 'http://' ;
break ;
case 'menu' :
_deprecated_argument ( 'WP_Admin_Bar' , '3.3' , '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.' );
return array (); // Sorry, folks.
break ;
}
}
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
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 () ) {
$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 ) );
$this -> user -> account_domain = $this -> user -> domain ;
} else {
$this -> user -> active_blog = $this -> user -> blogs [ get_current_blog_id ()];
$this -> user -> domain = trailingslashit ( home_url () );
$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' ) ) {
$admin_bar_args = get_theme_support ( 'admin-bar' ); // add_theme_support( 'admin-bar', array( 'callback' => '__return_false') );
$header_callback = $admin_bar_args [ 0 ][ 'callback' ];
}
if ( empty ( $header_callback ) )
$header_callback = '_admin_bar_bump_cb' ;
add_action ( 'wp_head' , $header_callback );
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' );
do_action ( 'admin_bar_init' );
2010-09-27 16:26:36 -04:00
}
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
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
/**
* Add a node to the menu .
*
* @ param array $args - The arguments for each node .
2011-11-09 14:12:48 -05:00
* - id - string - The ID of the item .
* - title - string - The title of the node .
* - parent - string - The ID of the parent node . Optional .
* - href - string - The link for the item . Optional .
2011-11-23 16:46:47 -05:00
* - group - boolean - If the node is a group . Optional . Default false .
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
* - meta - array - Meta data including the following keys : html , class , onclick , target , title , tabindex .
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 )
if ( func_num_args () >= 3 && is_string ( func_get_arg ( 0 ) ) )
$args = array_merge ( array ( 'parent' => func_get_arg ( 0 ) ), func_get_arg ( 2 ) );
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
if ( is_object ( $args ) )
$args = get_object_vars ( $args );
2011-11-04 13:41:38 -04:00
// Ensure we have a valid title.
if ( empty ( $args [ 'id' ] ) ) {
2011-11-23 16:46:47 -05:00
if ( empty ( $args [ 'title' ] ) )
return ;
2011-11-04 13:41:38 -04:00
_doing_it_wrong ( __METHOD__ , __ ( 'The menu ID should not be empty.' ), '3.3' );
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.
2011-12-05 22:42:11 -05:00
if ( $maybe_defaults = $this -> get_node ( $args [ 'id' ] ) )
$defaults = get_object_vars ( $maybe_defaults );
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.
2012-07-10 17:26:35 -04: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' ] );
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' ),
'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 );
}
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 .
*
* @ return object Node .
*/
final public function get_node ( $id ) {
2011-12-05 22:42:11 -05:00
if ( $node = $this -> _get_node ( $id ) )
return clone $node ;
}
final protected function _get_node ( $id ) {
if ( $this -> bound )
return ;
if ( empty ( $id ) )
$id = '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
if ( isset ( $this -> nodes [ $id ] ) )
return $this -> nodes [ $id ];
}
2011-12-05 22:42:11 -05:00
final public function get_nodes () {
2012-07-10 16:32:48 -04:00
if ( ! $nodes = $this -> _get_nodes () )
return ;
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
}
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 () {
2011-12-05 22:42:11 -05:00
if ( $this -> bound )
return ;
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
*
2011-11-23 16:46:47 -05:00
* @ param array $args - The arguments for each node .
* - id - string - The ID of the item .
* - parent - string - The ID of the parent node . Optional . Default root .
* - meta - array - Meta data including the following keys : class , onclick , target , title .
*/
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 .
*
* @ return object The removed node .
*/
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 );
}
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
2011-11-02 16:34:54 -04:00
public function render () {
2011-12-05 22:42:11 -05:00
$root = $this -> _bind ();
2011-12-30 18:04:28 -05:00
if ( $root )
$this -> _render ( $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
}
2011-11-20 13:39:54 -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 protected function _bind () {
2011-12-05 22:42:11 -05:00
if ( $this -> bound )
return ;
// Add the root node.
// Clear it first, just in case. Don't mess with The Root.
$this -> remove_node ( 'root' );
$this -> add_node ( array (
'id' => 'root' ,
'group' => false ,
) );
// Normalize nodes: define internal 'children' and 'type' properties.
foreach ( $this -> _get_nodes () as $node ) {
$node -> children = array ();
$node -> type = ( $node -> group ) ? 'group' : 'item' ;
unset ( $node -> group );
// The Root wants your orphans. No lonely items allowed.
if ( ! $node -> parent )
$node -> parent = '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
foreach ( $this -> _get_nodes () as $node ) {
if ( 'root' == $node -> id )
continue ;
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' ) {
if ( empty ( $node -> meta [ 'class' ] ) )
2012-06-30 07:47:21 -04:00
$node -> meta [ 'class' ] = $group_class ;
else
$node -> meta [ 'class' ] .= ' ' . $group_class ;
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.
$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 );
$parent -> children [] = $default ;
2011-11-23 16:46:47 -05:00
}
2011-12-05 22:42:11 -05:00
$parent = $default ;
// Groups in groups aren't allowed. Add a special 'container' node.
// The container will invisibly wrap both groups.
} 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.
$this -> _set_node ( array (
'id' => $container_id ,
'type' => 'container' ,
'children' => array ( $parent ),
'parent' => false ,
'title' => false ,
'href' => false ,
'meta' => array (),
) );
$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 );
if ( $index === false )
$grandparent -> children [] = $container ;
else
array_splice ( $grandparent -> children , $index , 1 , array ( $container ) );
}
$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
$root = $this -> _get_node ( 'root' );
$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
}
2011-12-05 22:42:11 -05:00
final protected function _render ( $root ) {
2012-04-09 21:19:30 -04:00
global $is_IE ;
2011-11-02 16:34:54 -04:00
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' ;
if ( $is_IE ) {
if ( strpos ( $_SERVER [ 'HTTP_USER_AGENT' ], 'MSIE 7' ) )
$class .= ' ie7' ;
elseif ( strpos ( $_SERVER [ 'HTTP_USER_AGENT' ], 'MSIE 8' ) )
$class .= ' ie8' ;
2011-11-22 16:35:08 -05:00
elseif ( strpos ( $_SERVER [ 'HTTP_USER_AGENT' ], 'MSIE 9' ) )
$class .= ' ie9' ;
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
?>
2011-11-29 20:27:33 -05:00
< div id = " wpadminbar " class = " <?php echo $class ; ?> " role = " navigation " >
2011-12-05 12:47:23 -05:00
< div class = " quicklinks " >
2011-12-05 22:42:11 -05:00
< ? php foreach ( $root -> children as $group ) {
$this -> _render_group ( $group );
2011-11-23 16:46:47 -05:00
} ?>
2010-09-27 16:26:36 -04:00
</ div >
</ div >
< ? php
}
2011-12-05 22:42:11 -05:00
final protected function _render_container ( $node ) {
if ( $node -> type != 'container' || empty ( $node -> children ) )
2011-11-23 16:46:47 -05:00
return ;
2011-12-05 22:42:11 -05:00
?> <div id="<?php echo esc_attr( 'wp-admin-bar-' . $node->id ); ?>" class="ab-group-container"><?php
foreach ( $node -> children as $group ) {
$this -> _render_group ( $group );
2011-11-23 16:46:47 -05:00
}
2011-12-05 22:42:11 -05:00
?> </div><?php
}
2011-11-23 16:46:47 -05:00
2011-12-05 22:42:11 -05:00
final protected function _render_group ( $node ) {
if ( $node -> type == 'container' )
return $this -> _render_container ( $node );
2011-11-23 16:46:47 -05:00
2011-12-05 22:42:11 -05:00
if ( $node -> type != 'group' || empty ( $node -> children ) )
return ;
2011-11-23 16:46:47 -05:00
2012-06-30 07:47:21 -04:00
if ( ! empty ( $node -> meta [ 'class' ] ) )
$class = ' class="' . esc_attr ( trim ( $node -> meta [ 'class' ] ) ) . '"' ;
else
$class = '' ;
2011-11-23 16:46:47 -05:00
2012-06-30 07:47:21 -04:00
?> <ul id="<?php echo esc_attr( 'wp-admin-bar-' . $node->id ); ?>"<?php echo $class; ?>><?php
2011-12-05 22:42:11 -05:00
foreach ( $node -> children as $item ) {
$this -> _render_item ( $item );
}
?> </ul><?php
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 protected function _render_item ( $node ) {
2011-12-05 22:42:11 -05:00
if ( $node -> type != 'item' )
2011-11-23 16:46:47 -05:00
return ;
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
$is_parent = ! empty ( $node -> children );
$has_link = ! empty ( $node -> href );
$tabindex = isset ( $node -> meta [ 'tabindex' ] ) ? ( int ) $node -> meta [ 'tabindex' ] : 10 ;
2011-11-29 20:27:33 -05:00
$menuclass = '' ;
2011-12-05 12:47:23 -05:00
$aria_attributes = 'tabindex="' . $tabindex . '"' ;
2011-11-29 20:27:33 -05:00
if ( $is_parent ) {
2012-06-30 07:47:21 -04:00
$menuclass = 'menupop ' ;
2011-11-29 20:27:33 -05:00
$aria_attributes .= ' aria-haspopup="true"' ;
}
2011-02-09 12:35:36 -05:00
2011-11-02 16:34:54 -04:00
if ( ! empty ( $node -> meta [ 'class' ] ) )
2012-06-30 07:47:21 -04:00
$menuclass .= $node -> meta [ 'class' ];
if ( $menuclass )
$menuclass = ' class="' . esc_attr ( trim ( $menuclass ) ) . '"' ;
2011-11-07 15:38:38 -05:00
2011-01-12 20:34:15 -05:00
?>
2010-10-28 04:31:36 -04:00
2012-06-30 07:47:21 -04:00
< li id = " <?php echo esc_attr( 'wp-admin-bar-' . $node->id ); ?> " < ? php echo $menuclass ; ?> ><?php
2011-11-17 19:12:57 -05:00
if ( $has_link ) :
2011-11-29 20:27:33 -05:00
?> <a class="ab-item" <?php echo $aria_attributes; ?> href="<?php echo esc_url( $node->href ) ?>"<?php
2011-11-17 19:12:57 -05:00
if ( ! empty ( $node -> meta [ 'onclick' ] ) ) :
?> onclick="<?php echo esc_js( $node->meta['onclick'] ); ?>"<?php
endif ;
if ( ! empty ( $node -> meta [ 'target' ] ) ) :
?> target="<?php echo esc_attr( $node->meta['target'] ); ?>"<?php
2010-10-28 04:31:36 -04:00
endif ;
2011-11-17 19:12:57 -05:00
if ( ! empty ( $node -> meta [ 'title' ] ) ) :
?> title="<?php echo esc_attr( $node->meta['title'] ); ?>"<?php
endif ;
?> ><?php
else :
2011-11-30 18:59:10 -05:00
?> <div class="ab-item ab-empty-item" <?php echo $aria_attributes;
if ( ! empty ( $node -> meta [ 'title' ] ) ) :
?> title="<?php echo esc_attr( $node->meta['title'] ); ?>"<?php
endif ;
?> ><?php
2010-11-17 13:47:34 -05:00
endif ;
2011-11-02 16:34:54 -04:00
echo $node -> title ;
2010-11-17 13:47:34 -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
if ( $has_link ) :
2011-11-17 19:12:57 -05:00
?> </a><?php
else :
?> </div><?php
endif ;
2010-10-28 04:31:36 -04:00
2011-11-09 14:12:48 -05:00
if ( $is_parent ) :
2011-11-14 06:05:37 -05:00
?> <div class="ab-sub-wrapper"><?php
2011-11-23 16:46:47 -05:00
foreach ( $node -> children as $group ) {
2011-12-05 22:42:11 -05:00
$this -> _render_group ( $group );
2011-11-09 14:12:48 -05:00
}
2011-11-14 06:05:37 -05:00
?> </div><?php
2011-11-09 14:12:48 -05:00
endif ;
2010-11-17 13:47:34 -05:00
2011-11-02 16:34:54 -04:00
if ( ! empty ( $node -> meta [ 'html' ] ) )
echo $node -> meta [ 'html' ];
?>
</ li >< ? php
2011-11-23 16:46:47 -05:00
}
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
public function recursive_render ( $id , $node ) {
_deprecated_function ( __METHOD__ , '3.3' , 'WP_Admin_bar::render(), WP_Admin_Bar::_render_item()' );
$this -> _render_item ( $node );
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
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.
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 );
2011-10-05 20:02:18 -04:00
add_action ( 'admin_bar_menu' , 'wp_admin_bar_updates_menu' , 40 );
// 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 );
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
}