wp/wp-includes/class-wp-admin-bar.php
changeset 7 cf61fcea0001
parent 5 5e2f62d02dcd
child 9 177826044cd9
--- a/wp/wp-includes/class-wp-admin-bar.php	Tue Jun 09 11:14:17 2015 +0000
+++ b/wp/wp-includes/class-wp-admin-bar.php	Mon Oct 14 17:39:30 2019 +0200
@@ -1,28 +1,39 @@
 <?php
 /**
- * The WordPress Toolbar
- *
- * @since 3.1.0
+ * Toolbar API: WP_Admin_Bar class
  *
  * @package WordPress
  * @subpackage Toolbar
+ * @since 3.1.0
+ */
+
+/**
+ * Core class used to implement the Toolbar API.
+ *
+ * @since 3.1.0
  */
 class WP_Admin_Bar {
 	private $nodes = array();
 	private $bound = false;
 	public $user;
 
+	/**
+	 * @param string $name
+	 * @return string|array|void
+	 */
 	public function __get( $name ) {
 		switch ( $name ) {
 			case 'proto' :
 				return is_ssl() ? 'https://' : 'http://';
 
 			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.' );
+				_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.' );
 				return array(); // Sorry, folks.
 		}
 	}
 
+	/**
+	 */
 	public function initialize() {
 		$this->user = new stdClass;
 
@@ -69,16 +80,25 @@
 		do_action( 'admin_bar_init' );
 	}
 
+	/**
+	 * @param array $node
+	 */
 	public function add_menu( $node ) {
 		$this->add_node( $node );
 	}
 
+	/**
+	 * @param string $id
+	 */
 	public function remove_menu( $id ) {
 		$this->remove_node( $id );
 	}
 
 	/**
-	 * Add a node to the menu.
+	 * Adds a node to the menu.
+	 *
+	 * @since 3.1.0
+	 * @since 4.5.0 Added the ability to pass 'lang' and 'dir' meta data.
 	 *
 	 * @param array $args {
 	 *     Arguments for adding a node.
@@ -88,7 +108,7 @@
 	 *     @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.
-	 *     @type array  $meta   Meta data including the following keys: 'html', 'class', 'rel',
+	 *     @type array  $meta   Meta data including the following keys: 'html', 'class', 'rel', 'lang', 'dir',
 	 *                          'onclick', 'target', 'title', 'tabindex'. Default empty.
 	 * }
 	 */
@@ -105,7 +125,7 @@
 			if ( empty( $args['title'] ) )
 				return;
 
-			_doing_it_wrong( __METHOD__, __( 'The menu ID should not be empty.' ), '3.3' );
+			_doing_it_wrong( __METHOD__, __( 'The menu ID should not be empty.' ), '3.3.0' );
 			// Deprecated: Generate an ID from the title.
 			$args['id'] = esc_attr( sanitize_title( trim( $args['title'] ) ) );
 		}
@@ -143,6 +163,9 @@
 		$this->_set_node( $args );
 	}
 
+	/**
+	 * @param array $args
+	 */
 	final protected function _set_node( $args ) {
 		$this->nodes[ $args['id'] ] = (object) $args;
 	}
@@ -150,6 +173,7 @@
 	/**
 	 * Gets a node.
 	 *
+	 * @param string $id
 	 * @return object Node.
 	 */
 	final public function get_node( $id ) {
@@ -157,6 +181,10 @@
 			return clone $node;
 	}
 
+	/**
+	 * @param string $id
+	 * @return object|void
+	 */
 	final protected function _get_node( $id ) {
 		if ( $this->bound )
 			return;
@@ -168,6 +196,9 @@
 			return $this->nodes[ $id ];
 	}
 
+	/**
+	 * @return array|void
+	 */
 	final public function get_nodes() {
 		if ( ! $nodes = $this->_get_nodes() )
 			return;
@@ -178,6 +209,9 @@
 		return $nodes;
 	}
 
+	/**
+	 * @return array|void
+	 */
 	final protected function _get_nodes() {
 		if ( $this->bound )
 			return;
@@ -208,22 +242,30 @@
 	/**
 	 * Remove a node.
 	 *
-	 * @param string The ID of the item.
+	 * @param string $id The ID of the item.
 	 */
 	public function remove_node( $id ) {
 		$this->_unset_node( $id );
 	}
 
+	/**
+	 * @param string $id
+	 */
 	final protected function _unset_node( $id ) {
 		unset( $this->nodes[ $id ] );
 	}
 
+	/**
+	 */
 	public function render() {
 		$root = $this->_bind();
 		if ( $root )
 			$this->_render( $root );
 	}
 
+	/**
+	 * @return object|void
+	 */
 	final protected function _bind() {
 		if ( $this->bound )
 			return;
@@ -345,6 +387,11 @@
 		return $root;
 	}
 
+	/**
+	 *
+	 * @global bool $is_IE
+	 * @param object $root
+	 */
 	final protected function _render( $root ) {
 		global $is_IE;
 
@@ -380,6 +427,9 @@
 		<?php
 	}
 
+	/**
+	 * @param object $node
+	 */
 	final protected function _render_container( $node ) {
 		if ( $node->type != 'container' || empty( $node->children ) )
 			return;
@@ -391,10 +441,14 @@
 		?></div><?php
 	}
 
+	/**
+	 * @param object $node
+	 */
 	final protected function _render_group( $node ) {
-		if ( $node->type == 'container' )
-			return $this->_render_container( $node );
-
+		if ( $node->type == 'container' ) {
+			$this->_render_container( $node );
+			return;
+		}
 		if ( $node->type != 'group' || empty( $node->children ) )
 			return;
 
@@ -410,6 +464,9 @@
 		?></ul><?php
 	}
 
+	/**
+	 * @param object $node
+	 */
 	final protected function _render_item( $node ) {
 		if ( $node->type != 'item' )
 			return;
@@ -417,8 +474,9 @@
 		$is_parent = ! empty( $node->children );
 		$has_link  = ! empty( $node->href );
 
-		$tabindex = isset( $node->meta['tabindex'] ) ? (int) $node->meta['tabindex'] : '';
-		$aria_attributes = $tabindex ? 'tabindex="' . $tabindex . '"' : '';
+		// Allow only numeric values, then casted to integers, and allow a tabindex value of `0` for a11y.
+		$tabindex = ( isset( $node->meta['tabindex'] ) && is_numeric( $node->meta['tabindex'] ) ) ? (int) $node->meta['tabindex'] : '';
+		$aria_attributes = ( '' !== $tabindex ) ? ' tabindex="' . $tabindex . '"' : '';
 
 		$menuclass = '';
 
@@ -437,7 +495,7 @@
 
 		<li id="<?php echo esc_attr( 'wp-admin-bar-' . $node->id ); ?>"<?php echo $menuclass; ?>><?php
 			if ( $has_link ):
-				?><a class="ab-item" <?php echo $aria_attributes; ?> href="<?php echo esc_url( $node->href ) ?>"<?php
+				?><a class="ab-item"<?php echo $aria_attributes; ?> href="<?php echo esc_url( $node->href ) ?>"<?php
 					if ( ! empty( $node->meta['onclick'] ) ) :
 						?> onclick="<?php echo esc_js( $node->meta['onclick'] ); ?>"<?php
 					endif;
@@ -450,12 +508,24 @@
 				if ( ! empty( $node->meta['rel'] ) ) :
 					?> rel="<?php echo esc_attr( $node->meta['rel'] ); ?>"<?php
 				endif;
+				if ( ! empty( $node->meta['lang'] ) ) :
+					?> lang="<?php echo esc_attr( $node->meta['lang'] ); ?>"<?php
+				endif;
+				if ( ! empty( $node->meta['dir'] ) ) :
+					?> dir="<?php echo esc_attr( $node->meta['dir'] ); ?>"<?php
+				endif;
 				?>><?php
 			else:
-				?><div class="ab-item ab-empty-item" <?php echo $aria_attributes;
+				?><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;
+				if ( ! empty( $node->meta['lang'] ) ) :
+					?> lang="<?php echo esc_attr( $node->meta['lang'] ); ?>"<?php
+				endif;
+				if ( ! empty( $node->meta['dir'] ) ) :
+					?> dir="<?php echo esc_attr( $node->meta['dir'] ); ?>"<?php
+				endif;
 				?>><?php
 			endif;
 
@@ -482,11 +552,24 @@
 		</li><?php
 	}
 
+	/**
+	 * 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()
+	 *
+	 * @param string $id    Unused.
+	 * @param object $node
+	 */
 	public function recursive_render( $id, $node ) {
-		_deprecated_function( __METHOD__, '3.3', 'WP_Admin_bar::render(), WP_Admin_Bar::_render_item()' );
+		_deprecated_function( __METHOD__, '3.3.0', 'WP_Admin_bar::render(), WP_Admin_Bar::_render_item()' );
 		$this->_render_item( $node );
 	}
 
+	/**
+	 */
 	public function add_menus() {
 		// User related, aligned right.
 		add_action( 'admin_bar_menu', 'wp_admin_bar_my_account_menu', 0 );
@@ -498,7 +581,8 @@
 		add_action( 'admin_bar_menu', 'wp_admin_bar_wp_menu', 10 );
 		add_action( 'admin_bar_menu', 'wp_admin_bar_my_sites_menu', 20 );
 		add_action( 'admin_bar_menu', 'wp_admin_bar_site_menu', 30 );
-		add_action( 'admin_bar_menu', 'wp_admin_bar_updates_menu', 40 );
+		add_action( 'admin_bar_menu', 'wp_admin_bar_customize_menu', 40 );
+		add_action( 'admin_bar_menu', 'wp_admin_bar_updates_menu', 50 );
 
 		// Content related.
 		if ( ! is_network_admin() && ! is_user_admin() ) {