解决了从平面阵列构建树的问题here 使用此稍加修改的递归解决方案:
/**
* Modification of "Build a tree from a flat array in PHP"
*
* Authors: @DSkinner, @ImmortalFirefly and @SteveEdson
*
* @link https://stackoverflow.com/a/28429487/2078474
*/
function buildTree( array &$elements, $parentId = 0 )
{
$branch = array();
foreach ( $elements as &$element )
{
if ( $element->menu_item_parent == $parentId )
{
$children = buildTree( $elements, $element->ID );
if ( $children )
$element->wpse_children = $children;
$branch[$element->ID] = $element;
unset( $element );
}
}
return $branch;
}
在这里我们添加了前缀
wpse_children
属性以避免名称冲突。
现在,我们只需定义一个简单的助手函数:
/**
* Transform a navigational menu to it\'s tree structure
*
* @uses buildTree()
* @uses wp_get_nav_menu_items()
*
* @param String $menud_id
* @return Array|null $tree
*/
function wpse_nav_menu_2_tree( $menu_id )
{
$items = wp_get_nav_menu_items( $menu_id );
return $items ? buildTree( $items, 0 ) : null;
}
现在,将导航菜单转换为其树状结构变得非常简单:
$tree = wpse_nav_menu_2_tree( \'my_menu\' ); // <-- Modify this to your needs!
print_r( $tree );
对于JSON,我们可以简单地使用:
$json = json_encode( $tree );
对于一个稍微不同的版本,我们在其中手工挑选了属性,请查看此答案的第一次修订
here.
更新:Walker类这里有一个相当粗略的想法,我们可以尝试连接到display_element()
摘要方法Walker
班
$w = new WPSE_Nav_Menu_Tree;
$args = (object) [ \'items_wrap\' => \'\', \'depth\' => 0, \'walker\' => $w ];
$items = wp_get_nav_menu_items( \'my_menu\' );
walk_nav_menu_tree( $items, $args->depth, $args );
print_r( $w->branch );
在哪里
WPSE_Nav_Menu_Tree
是
Walker_Nav_Menu
类别:
class WPSE_Nav_Menu_Tree extends Walker_Nav_Menu
{
public $branch = [];
public function display_element($element, &$children, $max_depth, $depth = 0, $args, &$output )
{
if( 0 == $depth )
$this->branch[$element->ID] = $element;
if ( isset($children[$element->ID] ) )
$element->wpse_children = $children[$element->ID];
parent::display_element($element, $children, $max_depth, $depth, $args, $output);
}
}
如果可行的话,这可能会给我们提供另一种方法。