BP_Walker_Nav_Menu::walk( array $elements, int $max_depth )
Display array of elements hierarchically.
Description
This method is almost identical to the version in Walker::walk(). The only change is on one line which has been commented. An IF was comparing 0 to a non-empty string which was preventing child elements being grouped under their parent menu element.
This caused a problem for BuddyPress because our primary/secondary navigations don’t have a unique numerical ID that describes a hierarchy (we use a slug). Obviously, WordPress Menus use Posts, and those have ID/post_parent.
See also
Parameters
- $elements
-
(Required) See Walker::walk().
- $max_depth
-
(Required) See Walker::walk().
Return
(string) See Walker::walk().
Source
File: bp-core/classes/class-bp-walker-nav-menu.php
public function walk( $elements, $max_depth ) {
$args = array_slice( func_get_args(), 2 );
$output = '';
if ( $max_depth < -1 ) // Invalid parameter.
return $output;
if ( empty( $elements ) ) // Nothing to walk.
return $output;
$parent_field = $this->db_fields['parent'];
// Flat display.
if ( -1 == $max_depth ) {
$empty_array = array();
foreach ( $elements as $e )
$this->display_element( $e, $empty_array, 1, 0, $args, $output );
return $output;
}
/*
* Need to display in hierarchical order
* separate elements into two buckets: top level and children elements
* children_elements is two dimensional array, eg.
* children_elements[10][] contains all sub-elements whose parent is 10.
*/
$top_level_elements = array();
$children_elements = array();
foreach ( $elements as $e ) {
// BuddyPress: changed '==' to '==='. This is the only change from version in Walker::walk().
if ( 0 === $e->$parent_field )
$top_level_elements[] = $e;
else
$children_elements[$e->$parent_field][] = $e;
}
/*
* When none of the elements is top level
* assume the first one must be root of the sub elements.
*/
if ( empty( $top_level_elements ) ) {
$first = array_slice( $elements, 0, 1 );
$root = $first[0];
$top_level_elements = array();
$children_elements = array();
foreach ( $elements as $e ) {
if ( $root->$parent_field == $e->$parent_field )
$top_level_elements[] = $e;
else
$children_elements[$e->$parent_field][] = $e;
}
}
foreach ( $top_level_elements as $e )
$this->display_element( $e, $children_elements, $max_depth, 0, $args, $output );
/*
* If we are displaying all levels, and remaining children_elements is not empty,
* then we got orphans, which should be displayed regardless.
*/
if ( ( $max_depth == 0 ) && count( $children_elements ) > 0 ) {
$empty_array = array();
foreach ( $children_elements as $orphans )
foreach ( $orphans as $op )
$this->display_element( $op, $empty_array, 1, 0, $args, $output );
}
return $output;
}
Changelog
| Version | Description |
|---|---|
| BuddyPress 1.7.0 | Introduced. |
Questions?
We're always happy to help with code or other questions you might have! Search our developer docs, contact support, or connect with our sales team.