WP_Admin_Bar::_bind(): object|void

In this article

Return

object|void

Source

final protected function _bind() {
	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';
		}
	}

	foreach ( $this->_get_nodes() as $node ) {
		if ( 'root' === $node->id ) {
			continue;
		}

		// Fetch the parent node. If it isn't registered, ignore the node.
		$parent = $this->_get_node( $node->parent );
		if ( ! $parent ) {
			continue;
		}

		// Generate the group class (we distinguish between top level and other level groups).
		$group_class = ( 'root' === $node->parent ) ? 'ab-top-menu' : 'ab-submenu';

		if ( 'group' === $node->type ) {
			if ( empty( $node->meta['class'] ) ) {
				$node->meta['class'] = $group_class;
			} else {
				$node->meta['class'] .= ' ' . $group_class;
			}
		}

		// Items in items aren't allowed. Wrap nested items in 'default' groups.
		if ( 'item' === $parent->type && 'item' === $node->type ) {
			$default_id = $parent->id . '-default';
			$default    = $this->_get_node( $default_id );

			/*
			 * The default group is added here to allow groups that are
			 * added before standard menu items to render first.
			 */
			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;
			}
			$parent = $default;

			/*
			 * Groups in groups aren't allowed. Add a special 'container' node.
			 * The container will invisibly wrap both groups.
			 */
		} elseif ( 'group' === $parent->type && 'group' === $node->type ) {
			$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 ( false === $index ) {
						$grandparent->children[] = $container;
					} else {
						array_splice( $grandparent->children, $index, 1, array( $container ) );
					}
				}

				$parent->parent = $container->id;
			}

			$parent = $container;
		}

		// Update the parent ID (it might have changed).
		$node->parent = $parent->id;

		// Add the node to the tree.
		$parent->children[] = $node;
	}

	$root        = $this->_get_node( 'root' );
	$this->bound = true;
	return $root;
}

Changelog

VersionDescription
3.3.0Introduced.

User Contributed Notes

You must log in before being able to contribute a note or feedback.