2010-09-27 22:26:36 +02:00
< ? php
2012-07-10 22:32:48 +02:00
/**
2015-10-14 19:27:25 +02:00
* Toolbar API : WP_Admin_Bar class
2012-07-10 22:32:48 +02:00
*
* @ package WordPress
* @ subpackage Toolbar
2015-10-14 19:27:25 +02:00
* @ since 3.1 . 0
*/
/**
* Core class used to implement the Toolbar API .
*
* @ since 3.1 . 0
2012-07-10 22:32:48 +02:00
*/
2010-09-27 22:26:36 +02:00
class WP_Admin_Bar {
2011-11-02 21:34:54 +01:00
private $nodes = array ();
2011-12-06 04:42:11 +01:00
private $bound = false ;
2011-11-02 21:34:54 +01:00
public $user ;
2010-09-27 22:26:36 +02:00
2015-05-21 23:39:24 +02:00
/**
* @ param string $name
2015-05-24 07:40:25 +02:00
* @ return string | array | void
2015-05-21 23:39:24 +02: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-12-01 01:25:04 +01:00
public function __get ( $name ) {
switch ( $name ) {
2017-12-01 00:11:00 +01: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-12-01 01:25:04 +01:00
return is_ssl () ? 'https://' : 'http://' ;
2014-05-06 20:29:15 +02:00
2017-12-01 00:11:00 +01:00
case 'menu' :
2016-07-06 14:40:29 +02: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-12-01 01:25:04 +01:00
return array (); // Sorry, folks.
}
}
2010-09-27 22:26:36 +02:00
2015-05-29 23:37:24 +02: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-12-01 01:25:04 +01:00
public function initialize () {
2010-09-27 22:26:36 +02: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-12-01 01:25:04 +01:00
2011-09-16 12:56:06 +02: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-12-01 00:11:00 +01: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 12:56:06 +02:00
$this -> user -> account_domain = $this -> user -> domain ;
} else {
2017-12-01 00:11:00 +01:00
$this -> user -> active_blog = $this -> user -> blogs [ get_current_blog_id () ];
$this -> user -> domain = trailingslashit ( home_url () );
2011-09-16 12:56:06 +02:00
$this -> user -> account_domain = $this -> user -> domain ;
}
2010-09-27 22:26:36 +02:00
}
2010-10-28 10:31:36 +02:00
add_action ( 'wp_head' , 'wp_admin_bar_header' );
2010-10-29 09:25:58 +02:00
2010-10-28 10:31:36 +02:00
add_action ( 'admin_head' , 'wp_admin_bar_header' );
2010-11-30 22:50:57 +01:00
if ( current_theme_supports ( 'admin-bar' ) ) {
2013-09-22 16:34:11 +02: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-12-01 00:11:00 +01:00
$admin_bar_args = get_theme_support ( 'admin-bar' );
2010-11-30 22:50:57 +01:00
$header_callback = $admin_bar_args [ 0 ][ 'callback' ];
}
2017-12-01 00:11:00 +01:00
if ( empty ( $header_callback ) ) {
2010-11-30 22:50:57 +01:00
$header_callback = '_admin_bar_bump_cb' ;
2017-12-01 00:11:00 +01:00
}
2010-11-30 22:50:57 +01:00
2017-12-01 00:11:00 +01:00
add_action ( 'wp_head' , $header_callback );
2010-11-30 22:50:57 +01:00
2010-10-29 09:25:58 +02:00
wp_enqueue_script ( 'admin-bar' );
2010-10-28 10:31:36 +02:00
wp_enqueue_style ( 'admin-bar' );
2013-09-18 09:42:09 +02:00
/**
2013-09-18 13:58:19 +02:00
* Fires after WP_Admin_Bar is initialized .
2013-09-18 09:42:09 +02:00
*
2013-09-18 13:58:19 +02:00
* @ since 3.1 . 0
2013-09-18 09:42:09 +02:00
*/
2010-10-28 10:31:36 +02:00
do_action ( 'admin_bar_init' );
2010-09-27 22:26:36 +02:00
}
2015-05-21 23:39:24 +02:00
/**
2019-11-03 23:14:01 +01:00
* Add a node ( menu item ) to the Admin Bar menu .
*
* @ since 3.3 . 0
* @ since 5.4 . 0 Deprecated in favor of { @ see WP_Admin_Bar :: add_node ()} .
*
* @ param array $node The attributes that define the node .
2015-05-21 23:39:24 +02:00
*/
2011-11-02 21:34:54 +01:00
public function add_menu ( $node ) {
$this -> add_node ( $node );
}
2010-09-27 22:26:36 +02:00
2015-05-21 23:39:24 +02:00
/**
2019-11-03 23:14:01 +01:00
* Remove a node from the admin bar .
*
* @ since 3.1 . 0
* @ since 5.4 . 0 Deprecated in favor of { @ see WP_Admin_Bar :: remove_node ()} .
*
* @ param string $id The menu slug to remove .
2015-05-21 23:39:24 +02:00
*/
2011-11-02 21:34:54 +01:00
public function remove_menu ( $id ) {
$this -> remove_node ( $id );
}
2010-09-27 22:26:36 +02:00
2011-11-02 21:34:54 +01:00
/**
2016-03-03 16:58:27 +01:00
* Adds a node to the menu .
2011-11-02 21:34:54 +01:00
*
2016-03-03 16:58:27 +01:00
* @ since 3.1 . 0
2015-12-06 22:37:25 +01:00
* @ since 4.5 . 0 Added the ability to pass 'lang' and 'dir' meta data .
*
2014-03-03 07:11:13 +01: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 22:37:25 +01:00
* @ type array $meta Meta data including the following keys : 'html' , 'class' , 'rel' , 'lang' , 'dir' ,
2014-03-03 07:11:13 +01:00
* 'onclick' , 'target' , 'title' , 'tabindex' . Default empty .
* }
2011-11-02 21:34:54 +01:00
*/
public function add_node ( $args ) {
// Shim for old method signature: add_node( $parent_id, $menu_obj, $args )
2019-09-15 13:46:54 +02:00
if ( func_num_args () >= 3 && is_string ( $args ) ) {
$args = array_merge ( array ( 'parent' => $args ), func_get_arg ( 2 ) );
2017-12-01 00:11:00 +01:00
}
2011-11-02 21:34:54 +01:00
2017-12-01 00:11:00 +01: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-12-01 01:25:04 +01:00
$args = get_object_vars ( $args );
2017-12-01 00:11:00 +01: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-12-01 01:25:04 +01:00
2011-11-04 18:41:38 +01:00
// Ensure we have a valid title.
if ( empty ( $args [ 'id' ] ) ) {
2017-12-01 00:11:00 +01:00
if ( empty ( $args [ 'title' ] ) ) {
2011-11-23 22:46:47 +01:00
return ;
2017-12-01 00:11:00 +01:00
}
2011-11-23 22:46:47 +01:00
2016-07-06 14:40:29 +02:00
_doing_it_wrong ( __METHOD__ , __ ( 'The menu ID should not be empty.' ), '3.3.0' );
2011-11-23 22:46:47 +01:00
// Deprecated: Generate an ID from the title.
2011-11-04 18:41:38 +01:00
$args [ 'id' ] = esc_attr ( sanitize_title ( trim ( $args [ 'title' ] ) ) );
}
2011-11-02 21:34:54 +01:00
$defaults = array (
2011-11-23 22:46:47 +01:00
'id' => false ,
'title' => false ,
'parent' => false ,
'href' => false ,
'group' => false ,
'meta' => array (),
2011-11-02 21:34:54 +01:00
);
2010-09-27 22:26:36 +02:00
2011-11-02 21:34:54 +01:00
// If the node already exists, keep any data that isn't provided.
2019-07-03 01:42:58 +02:00
$maybe_defaults = $this -> get_node ( $args [ 'id' ] );
if ( $maybe_defaults ) {
2011-12-06 04:42:11 +01:00
$defaults = get_object_vars ( $maybe_defaults );
2017-12-01 00:11:00 +01: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-12-01 01:25:04 +01:00
// Do the same for 'meta' items.
2017-12-01 00:11:00 +01: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-12-01 01:25:04 +01:00
$args [ 'meta' ] = wp_parse_args ( $args [ 'meta' ], $defaults [ 'meta' ] );
2017-12-01 00:11:00 +01:00
}
2010-09-27 22:26:36 +02:00
2011-11-02 21:34:54 +01:00
$args = wp_parse_args ( $args , $defaults );
2010-09-27 22:26:36 +02:00
2011-12-06 01:31:11 +01:00
$back_compat_parents = array (
2011-12-06 04:42:11 +01:00
'my-account-with-avatar' => array ( 'my-account' , '3.3' ),
2017-12-01 00:11:00 +01:00
'my-blogs' => array ( 'my-sites' , '3.3' ),
2011-12-06 01:31:11 +01:00
);
if ( isset ( $back_compat_parents [ $args [ 'parent' ] ] ) ) {
list ( $new_parent , $version ) = $back_compat_parents [ $args [ 'parent' ] ];
2011-12-06 01:46:03 +01: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-06 01:31:11 +01: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-12-01 01:25:04 +01:00
$this -> _set_node ( $args );
}
2015-05-21 23:39:24 +02: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-12-01 01:25:04 +01:00
final protected function _set_node ( $args ) {
2011-11-02 21:34:54 +01:00
$this -> nodes [ $args [ 'id' ] ] = ( object ) $args ;
2010-09-27 22:26:36 +02: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-12-01 01:25:04 +01:00
/**
* Gets a node .
*
2015-05-21 23:39:24 +02:00
* @ param string $id
2019-08-16 21:35:58 +02:00
* @ return object | void 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-12-01 01:25:04 +01:00
*/
final public function get_node ( $id ) {
2019-07-03 01:42:58 +02:00
$node = $this -> _get_node ( $id );
if ( $node ) {
2011-12-06 04:42:11 +01:00
return clone $node ;
2017-12-01 00:11:00 +01:00
}
2011-12-06 04:42:11 +01:00
}
2015-05-21 23:39:24 +02:00
/**
* @ param string $id
2015-05-24 07:40:25 +02:00
* @ return object | void
2015-05-21 23:39:24 +02:00
*/
2011-12-06 04:42:11 +01:00
final protected function _get_node ( $id ) {
2017-12-01 00:11:00 +01:00
if ( $this -> bound ) {
2011-12-06 04:42:11 +01:00
return ;
2017-12-01 00:11:00 +01:00
}
2011-12-06 04:42:11 +01:00
2017-12-01 00:11:00 +01:00
if ( empty ( $id ) ) {
2011-12-06 04:42:11 +01:00
$id = 'root' ;
2017-12-01 00:11:00 +01:00
}
2011-12-06 04:42:11 +01:00
2017-12-01 00:11:00 +01: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-12-01 01:25:04 +01:00
return $this -> nodes [ $id ];
2017-12-01 00:11:00 +01: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-12-01 01:25:04 +01:00
}
2015-05-21 23:39:24 +02:00
/**
2015-05-24 07:40:25 +02:00
* @ return array | void
2015-05-21 23:39:24 +02:00
*/
2011-12-06 04:42:11 +01:00
final public function get_nodes () {
2019-07-03 01:42:58 +02:00
$nodes = $this -> _get_nodes ();
if ( ! $nodes ) {
2012-07-10 22:32:48 +02:00
return ;
2017-12-01 00:11:00 +01:00
}
2011-12-06 04:42:11 +01:00
2012-07-10 22:32:48 +02:00
foreach ( $nodes as & $node ) {
$node = clone $node ;
}
return $nodes ;
2011-12-06 04:42:11 +01:00
}
2015-05-21 23:39:24 +02:00
/**
2015-05-24 07:40:25 +02:00
* @ return array | void
2015-05-21 23:39:24 +02: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-12-01 01:25:04 +01:00
final protected function _get_nodes () {
2017-12-01 00:11:00 +01:00
if ( $this -> bound ) {
2011-12-06 04:42:11 +01:00
return ;
2017-12-01 00:11:00 +01:00
}
2011-12-06 04:42:11 +01: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-12-01 01:25:04 +01:00
return $this -> nodes ;
}
2011-11-23 22:46:47 +01: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-12-01 01:25:04 +01:00
* @ since 3.3 . 0
*
2014-03-03 07:11:13 +01: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 22:46:47 +01: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-12-01 01:25:04 +01:00
final public function add_group ( $args ) {
2011-11-23 22:46:47 +01: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-12-01 01:25:04 +01:00
/**
* Remove a node .
*
2015-05-21 23:39:24 +02: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-12-01 01:25:04 +01:00
*/
2011-11-02 21:34:54 +01: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-12-01 01:25:04 +01:00
$this -> _unset_node ( $id );
}
2015-05-21 23:39:24 +02: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-12-01 01:25:04 +01:00
final protected function _unset_node ( $id ) {
2011-11-02 21:34:54 +01:00
unset ( $this -> nodes [ $id ] );
2010-09-27 22:26:36 +02:00
}
2010-10-28 17:46:11 +02:00
2015-05-29 23:37:24 +02:00
/**
*/
2011-11-02 21:34:54 +01:00
public function render () {
2011-12-06 04:42:11 +01:00
$root = $this -> _bind ();
2017-12-01 00:11:00 +01:00
if ( $root ) {
2011-12-31 00:04:28 +01:00
$this -> _render ( $root );
2017-12-01 00:11:00 +01: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-12-01 01:25:04 +01:00
}
2011-11-20 19:39:54 +01:00
2015-05-21 23:39:24 +02:00
/**
2015-05-24 07:40:25 +02:00
* @ return object | void
2015-05-21 23:39:24 +02: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-12-01 01:25:04 +01:00
final protected function _bind () {
2017-12-01 00:11:00 +01:00
if ( $this -> bound ) {
2011-12-06 04:42:11 +01:00
return ;
2017-12-01 00:11:00 +01:00
}
2011-12-06 04:42:11 +01:00
// Add the root node.
// Clear it first, just in case. Don't mess with The Root.
$this -> remove_node ( 'root' );
2017-12-01 00:11:00 +01:00
$this -> add_node (
array (
'id' => 'root' ,
'group' => false ,
)
);
2011-12-06 04:42:11 +01:00
// Normalize nodes: define internal 'children' and 'type' properties.
foreach ( $this -> _get_nodes () as $node ) {
$node -> children = array ();
2017-12-01 00:11:00 +01:00
$node -> type = ( $node -> group ) ? 'group' : 'item' ;
2011-12-06 04:42:11 +01:00
unset ( $node -> group );
// The Root wants your orphans. No lonely items allowed.
2017-12-01 00:11:00 +01:00
if ( ! $node -> parent ) {
2011-12-06 04:42:11 +01:00
$node -> parent = 'root' ;
2017-12-01 00:11:00 +01:00
}
2011-12-06 04:42:11 +01: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-12-01 01:25:04 +01:00
foreach ( $this -> _get_nodes () as $node ) {
2017-12-01 00:11:00 +01: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-12-01 01:25:04 +01:00
continue ;
2017-12-01 00:11:00 +01:00
}
2011-11-02 21:34:54 +01:00
2011-12-06 04:42:11 +01:00
// Fetch the parent node. If it isn't registered, ignore the node.
2019-07-03 01:42:58 +02:00
$parent = $this -> _get_node ( $node -> parent );
if ( ! $parent ) {
2011-11-02 21:34:54 +01:00
continue ;
2011-11-09 20:12:48 +01:00
}
2011-11-02 21:34:54 +01:00
2011-12-06 04:42:11 +01: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-12-01 00:11:00 +01:00
if ( empty ( $node -> meta [ 'class' ] ) ) {
2012-06-30 13:47:21 +02:00
$node -> meta [ 'class' ] = $group_class ;
2017-12-01 00:11:00 +01:00
} else {
2012-06-30 13:47:21 +02:00
$node -> meta [ 'class' ] .= ' ' . $group_class ;
2017-12-01 00:11:00 +01:00
}
2011-12-06 04:42:11 +01: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 22:46:47 +01:00
// The default group is added here to allow groups that are
// added before standard menu items to render first.
2011-12-06 04:42:11 +01:00
if ( ! $default ) {
// Use _set_node because add_node can be overloaded.
// Make sure to specify default settings for all properties.
2017-12-01 00:11:00 +01: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-06 04:42:11 +01:00
$parent -> children [] = $default ;
2011-11-23 22:46:47 +01:00
}
2011-12-06 04:42:11 +01:00
$parent = $default ;
2017-12-01 00:11:00 +01:00
// Groups in groups aren't allowed. Add a special 'container' node.
// The container will invisibly wrap both groups.
2011-12-06 04:42:11 +01: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-12-01 00:11:00 +01:00
$this -> _set_node (
array (
'id' => $container_id ,
'type' => 'container' ,
'children' => array ( $parent ),
'parent' => false ,
'title' => false ,
'href' => false ,
'meta' => array (),
)
);
2011-12-06 04:42:11 +01: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-12-01 00:11:00 +01:00
if ( $index === false ) {
2011-12-06 04:42:11 +01:00
$grandparent -> children [] = $container ;
2017-12-01 00:11:00 +01:00
} else {
2011-12-06 04:42:11 +01:00
array_splice ( $grandparent -> children , $index , 1 , array ( $container ) );
2017-12-01 00:11:00 +01:00
}
2011-12-06 04:42:11 +01:00
}
$parent -> parent = $container -> id ;
}
$parent = $container ;
2011-11-23 22:46:47 +01: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 21:34:54 +01:00
}
2011-12-06 04:42:11 +01:00
2017-12-01 00:11:00 +01:00
$root = $this -> _get_node ( 'root' );
2011-12-06 04:42:11 +01: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-12-01 01:25:04 +01:00
}
2015-05-21 23:39:24 +02:00
/**
2016-08-31 17:22:31 +02:00
* @ global bool $is_IE
2015-05-21 23:39:24 +02:00
* @ param object $root
*/
2011-12-06 04:42:11 +01:00
final protected function _render ( $root ) {
2016-08-31 17:22:31 +02:00
global $is_IE ;
2011-11-22 00:07:54 +01:00
// Add browser classes.
// We have to do this here since admin bar shows on the front end.
$class = 'nojq nojs' ;
2016-08-31 17:22:31 +02:00
if ( $is_IE ) {
2017-12-01 00:11:00 +01:00
if ( strpos ( $_SERVER [ 'HTTP_USER_AGENT' ], 'MSIE 7' ) ) {
2011-11-22 00:07:54 +01:00
$class .= ' ie7' ;
2017-12-01 00:11:00 +01:00
} elseif ( strpos ( $_SERVER [ 'HTTP_USER_AGENT' ], 'MSIE 8' ) ) {
2011-11-22 00:07:54 +01:00
$class .= ' ie8' ;
2017-12-01 00:11:00 +01:00
} elseif ( strpos ( $_SERVER [ 'HTTP_USER_AGENT' ], 'MSIE 9' ) ) {
2011-11-22 22:35:08 +01:00
$class .= ' ie9' ;
2017-12-01 00:11:00 +01:00
}
2012-04-10 03:19:30 +02:00
} elseif ( wp_is_mobile () ) {
2011-11-22 00:07:54 +01:00
$class .= ' mobile' ;
}
2010-10-28 10:31:36 +02:00
?>
2015-04-01 15:17:27 +02: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 12:55:51 +01:00
< div class = " quicklinks " id = " wp-toolbar " role = " navigation " aria - label = " <?php esc_attr_e( 'Toolbar' ); ?> " >
2017-12-01 00:11:00 +01:00
< ? php
foreach ( $root -> children as $group ) {
2011-12-06 04:42:11 +01:00
$this -> _render_group ( $group );
2017-12-01 00:11:00 +01:00
}
?>
2010-09-27 22:26:36 +02:00
</ div >
2013-06-19 10:15:04 +02:00
< ? php if ( is_user_logged_in () ) : ?>
2017-12-01 00:11:00 +01:00
< a class = " screen-reader-shortcut " href = " <?php echo esc_url( wp_logout_url() ); ?> " >< ? php _e ( 'Log Out' ); ?> </a>
2013-06-19 10:15:04 +02:00
< ? php endif ; ?>
2010-09-27 22:26:36 +02:00
</ div >
< ? php
}
2015-05-21 23:39:24 +02:00
/**
* @ param object $node
*/
2011-12-06 04:42:11 +01:00
final protected function _render_container ( $node ) {
2017-12-01 00:11:00 +01:00
if ( $node -> type != 'container' || empty ( $node -> children ) ) {
2011-11-23 22:46:47 +01:00
return ;
2017-12-01 00:11:00 +01:00
}
2011-11-23 22:46:47 +01:00
2017-11-08 09:35:51 +01: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-06 04:42:11 +01:00
}
2011-11-23 22:46:47 +01:00
2015-05-21 23:39:24 +02:00
/**
* @ param object $node
*/
2011-12-06 04:42:11 +01:00
final protected function _render_group ( $node ) {
2015-05-21 23:39:24 +02:00
if ( $node -> type == 'container' ) {
$this -> _render_container ( $node );
return ;
}
2017-12-01 00:11:00 +01:00
if ( $node -> type != 'group' || empty ( $node -> children ) ) {
2011-12-06 04:42:11 +01:00
return ;
2017-12-01 00:11:00 +01:00
}
2011-11-23 22:46:47 +01:00
2017-12-01 00:11:00 +01:00
if ( ! empty ( $node -> meta [ 'class' ] ) ) {
2012-06-30 13:47:21 +02:00
$class = ' class="' . esc_attr ( trim ( $node -> meta [ 'class' ] ) ) . '"' ;
2017-12-01 00:11:00 +01:00
} else {
2012-06-30 13:47:21 +02:00
$class = '' ;
2017-12-01 00:11:00 +01:00
}
2011-11-23 22:46:47 +01:00
2017-11-08 09:35:51 +01: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 22:46:47 +01:00
}
2015-05-21 23:39:24 +02: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-12-01 01:25:04 +01:00
final protected function _render_item ( $node ) {
2017-12-01 00:11:00 +01:00
if ( $node -> type != 'item' ) {
2011-11-23 22:46:47 +01:00
return ;
2017-12-01 00:11:00 +01:00
}
2011-11-23 22:46:47 +01:00
2019-03-04 23:46:52 +01:00
$is_parent = ! empty ( $node -> children );
$has_link = ! empty ( $node -> href );
$is_root_top_item = 'root-default' === $node -> parent ;
$is_top_secondary_item = 'top-secondary' === $node -> 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-12-01 01:25:04 +01:00
2016-07-12 13:18:30 +02:00
// Allow only numeric values, then casted to integers, and allow a tabindex value of `0` for a11y.
2017-12-01 00:11:00 +01:00
$tabindex = ( isset ( $node -> meta [ 'tabindex' ] ) && is_numeric ( $node -> meta [ 'tabindex' ] ) ) ? ( int ) $node -> meta [ 'tabindex' ] : '' ;
2016-07-12 13:18:30 +02:00
$aria_attributes = ( '' !== $tabindex ) ? ' tabindex="' . $tabindex . '"' : '' ;
2011-11-30 02:27:33 +01:00
2016-11-05 17:28:33 +01:00
$menuclass = '' ;
2019-03-04 23:46:52 +01:00
$arrow = '' ;
2011-11-30 02:27:33 +01:00
if ( $is_parent ) {
2017-12-01 00:11:00 +01:00
$menuclass = 'menupop ' ;
2011-11-30 02:27:33 +01:00
$aria_attributes .= ' aria-haspopup="true"' ;
}
2011-02-09 18:35:36 +01:00
2017-12-01 00:11:00 +01:00
if ( ! empty ( $node -> meta [ 'class' ] ) ) {
2012-06-30 13:47:21 +02:00
$menuclass .= $node -> meta [ 'class' ];
2017-12-01 00:11:00 +01:00
}
2012-06-30 13:47:21 +02:00
2019-03-04 23:46:52 +01:00
// Print the arrow icon for the menu children with children.
if ( ! $is_root_top_item && ! $is_top_secondary_item && $is_parent ) {
$arrow = '<span class="wp-admin-bar-arrow" aria-hidden="true"></span>' ;
}
2017-12-01 00:11:00 +01:00
if ( $menuclass ) {
2012-06-30 13:47:21 +02:00
$menuclass = ' class="' . esc_attr ( trim ( $menuclass ) ) . '"' ;
2017-12-01 00:11:00 +01:00
}
2011-11-07 21:38:38 +01:00
2017-11-08 09:35:51 +01:00
echo " <li id=' " . esc_attr ( 'wp-admin-bar-' . $node -> id ) . " ' $menuclass > " ;
2010-10-28 10:31:36 +02:00
2017-11-08 09:35:51 +01:00
if ( $has_link ) {
$attributes = array ( 'onclick' , 'target' , 'title' , 'rel' , 'lang' , 'dir' );
2017-11-08 09:52:48 +01:00
echo " <a class='ab-item' $aria_attributes href=' " . esc_url ( $node -> href ) . " ' " ;
2017-11-08 09:35:51 +01:00
} else {
$attributes = array ( 'onclick' , 'target' , 'title' , 'rel' , 'lang' , 'dir' );
echo '<div class="ab-item ab-empty-item"' . $aria_attributes ;
}
2010-11-17 19:47:34 +01:00
2017-11-08 09:35:51 +01:00
foreach ( $attributes as $attribute ) {
2019-11-16 00:24:02 +01:00
if ( empty ( $node -> meta [ $attribute ] ) ) {
continue ;
}
if ( 'onclick' === $attribute ) {
echo " $attribute =' " . esc_js ( $node -> meta [ $attribute ] ) . " ' " ;
} else {
2017-11-09 00:13:46 +01:00
echo " $attribute =' " . esc_attr ( $node -> meta [ $attribute ] ) . " ' " ;
2017-11-08 09:35:51 +01:00
}
}
2019-03-04 23:46:52 +01:00
echo " > { $arrow } { $node -> title } " ;
2017-11-08 09:35:51 +01:00
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 21:34:54 +01:00
2017-11-08 09:35:51 +01:00
echo '</li>' ;
2011-11-23 22:46:47 +01:00
}
2010-09-27 22:26:36 +02:00
2015-05-21 23:39:24 +02:00
/**
2017-06-25 23:58:41 +02: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 23:39:24 +02: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-12-01 01:25:04 +01:00
public function recursive_render ( $id , $node ) {
2016-07-06 14:40:29 +02: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-12-01 01:25:04 +01:00
$this -> _render_item ( $node );
2010-09-27 22:26:36 +02:00
}
2015-05-29 23:37:24 +02: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-12-01 01:25:04 +01:00
public function add_menus () {
2011-10-06 02:02:18 +02:00
// User related, aligned right.
2011-12-06 04:51:58 +01: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 );
Bootstrap/Load: Introduce a recovery mode for fixing fatal errors.
Using the new fatal handler introduced in [44962], an email is sent to the admin when a fatal error occurs. This email includes a secret link to enter recovery mode. When clicked, the link will be validated and on success a cookie will be placed on the client, enabling recovery mode for that user. This functionality is executed early before plugins and themes are loaded, in order to be unaffected by potential fatal errors these might be causing.
When in recovery mode, broken plugins and themes will be paused for that client, so that they are able to access the admin backend despite of these errors. They are notified about the broken extensions and the errors caused, and can then decide whether they would like to temporarily deactivate the extension or fix the problem and resume the extension.
A link in the admin bar allows the client to exit recovery mode.
Props timothyblynjacobs, afragen, flixos90, nerrad, miss_jwo, schlessera, spacedmonkey, swissspidy.
Fixes #46130, #44458.
Built from https://develop.svn.wordpress.org/trunk@44973
git-svn-id: http://core.svn.wordpress.org/trunk@44804 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-03-21 22:53:51 +01:00
add_action ( 'admin_bar_menu' , 'wp_admin_bar_recovery_mode_menu' , 8 );
2011-10-06 02:02:18 +02:00
// Site related.
2013-11-13 19:00:10 +01:00
add_action ( 'admin_bar_menu' , 'wp_admin_bar_sidebar_toggle' , 0 );
2011-10-06 02:02:18 +02:00
add_action ( 'admin_bar_menu' , 'wp_admin_bar_wp_menu' , 10 );
2011-10-05 20:45:32 +02:00
add_action ( 'admin_bar_menu' , 'wp_admin_bar_my_sites_menu' , 20 );
2011-10-07 21:52:26 +02:00
add_action ( 'admin_bar_menu' , 'wp_admin_bar_site_menu' , 30 );
2015-07-08 22:03:24 +02: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-06 02:02:18 +02:00
// Content related.
2011-11-22 17:19:05 +01: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 20:40:00 +02:00
add_action ( 'admin_bar_menu' , 'wp_admin_bar_edit_menu' , 80 );
2010-12-13 22:21:50 +01:00
2011-11-23 22:46:47 +01:00
add_action ( 'admin_bar_menu' , 'wp_admin_bar_add_secondary_groups' , 200 );
2013-09-18 09:42:09 +02:00
/**
2013-09-18 13:58:19 +02:00
* Fires after menus are added to the menu bar .
2013-09-18 09:42:09 +02:00
*
2013-09-18 13:58:19 +02:00
* @ since 3.1 . 0
2013-09-18 09:42:09 +02:00
*/
2010-12-09 17:55:09 +01:00
do_action ( 'add_admin_bar_menus' );
2010-10-28 10:31:36 +02:00
}
2010-09-27 22:26:36 +02:00
}