このクラスは、WordPressメニュー構造(入れ子配列/オブジェクト)を反復して完成したメニューを生成するように設計されています。私のデータのソースはWordPressですが、この問題はWP.SOの代わりにSOに属していると思います。なぜならPHPで問題がより根付いているからです(再帰を試みる人には当てはまります)。ループ時に繰り返し結果を生成するforeach()
何らかの理由で、階層内に重複した結果が表示されています。また、特定のHTML要素が適切に閉じられていないことに気づいています。私はすべてを適切に入れ子にしたようですが、結果はここにあります。
デバッグを支援するために、私は視覚的にマークアップに影響を与えるために*
を追加しました。たぶんあなたは私がしていないことを知っているかもしれません。指が交差して、あなたの入力に事前に感謝!バックエンドでの
私のクラス
class Nav_Menu
{
public $wp_nav;
public $nested_nav;
public $recursion_depth = 0;
function __construct($menu, $args = array())
{
$format = new Format;
if($menu)
{
$this->wp_nav = wp_get_nav_menu_items($menu, $args);
$this->nested_nav = $this->build_tree($this->wp_nav);
$output = $this->build_output($this->nested_nav);
$output_formatted = $format->HTML($output);
// echo $output;
echo $output_formatted;
}
}
private function build_output($menu = array())
{
$output = '**';
$output.= $this->recurse_menu($menu, $output);
return $output;
}
private function recurse_menu($menu = array(), $output)
{
global $post;
if(!empty($menu) && !empty($output))
{
$this->recursion_depth++;
// ul classes
$classes_ul = array();
$classes_ul[] = ($this->recursion_depth > 1 ? 'sub-menu' : '');
$classes_ul[] = 'depth-' . $this->recursion_depth;
// process list wrappers
$output.= '<ul class="' . $this->process_classes($classes_ul) . '">';
// loop through menu items
foreach($menu as $menu_key => $menu_val)
{
// process list items
$output.= '<li>' . $menu_val->title;
// if necessary, handle children and recurse
if(!empty($menu_val->children))
{
// recurse, and call this again
$output.= $this->recurse_menu($menu_val->children, $output);
}
// process list items
$output.= '</li>';
}
// process list wrappers
$output.= '</ul>';
}
return $output;
}
private function process_classes($classes = array())
{
if(!$classes)
{
return;
}
return trim(implode(' ', $classes));
}
private function build_tree($elements = array(), $parent_id = 0)
{
$branch = array();
foreach($elements as $element)
{
if ($element->menu_item_parent == $parent_id)
{
$children = $this->build_tree($elements, $element->ID);
if ($children)
{
$element->children = $children;
}
$branch[] = $element;
}
}
return $branch;
}
}
$mynav = new Nav_Menu('Test Menu');
結果の出力
****
<ul class="depth-1">
<li>
One**
<ul class="depth-1">
<li>
One
<ul class="sub-menu depth-2">
<li>
Sub One
</li>
<li>
Sub Two
</li>
<li>
Sub Three
</li>
</ul>
</li>
<li>
Two
</li>
<li>
Three**
<ul class="depth-1">
<li>
One**
<ul class="depth-1">
<li>
One
<ul class="sub-menu depth-2">
<li>
Sub One
</li>
<li>
Sub Two
</li>
<li>
Sub Three
</li>
</ul>
</li>
<li>
Two
</li>
<li>
Three
<ul class="sub-menu depth-3">
<li>
Sub One
</li>
<li>
Sub Two
</li>
</ul>
</li>
<li>
Four
</li>
</ul>
WordPressのメニュー
また、 '$ output_formatted'の代わりに' $ output'をエコーすると、同じ結果が生成されます。ちょうど連結されています。私はあなたがこのポストで "Format"クラスを見逃していることに気づき、ここに掲載されたコードに問題があることを皆に保証したいと思っていました。 –