使用 WordPress walker (Walker_Nav_Menu) 时出错,在子菜单中插入 Anchor 父类

问题描述

这个类创建了一个具有不同子级别的菜单:

class Bootstrap_Collapse_NavWalker extends Walker_Nav_Menu{
public function start_lvl( &$output,$depth = 0,$args = null ) {
    $output .= "<ul>";
}

public function end_lvl(&$output,$args = []){
    $output .= "</ul>";
}

public function start_el(&$output,$item,$args = [],$id = 0){

    $itemClasses = empty( $item->classes ) ? array() : (array) $item->classes;
    $class_names_li = "";
    $class_names_a = "";
    $class_names_i = "";
    $item_output = "";
    $hasChildrenElm = $args->walker->has_children;
    if ( $hasChildrenElm ) {
        $class_names_li = 'dropdown';
    }

    if ( $depth === 0 && !$hasChildrenElm ) {
        $class_names_a = 'nav-link scrollto';
    }

    $activeElement = "";
    if ( in_array( 'current-menu-item',$itemClasses ) ) $activeElement .'active';

    $elementUrl = ! empty( $item->url ) ? esc_url($item->url) : '';
    $output .= '<li class="'.$class_names_li.'">';
    if ( $hasChildrenElm ) {
        $output .= '<a class="'.$class_names_a.$activeElement.'" href="'.$elementUrl.'">
                        <span>'.$item->title.'</span>';
        $class_names_i .= ($depth !== 0) ? "bi bi-chevron-right" : "bi bi-chevron-down";
        $output .= '<i class="'.$class_names_i.'"></i>';
    }elseif($item->title !== ""){
        $output .= '<a class="'.$class_names_a.$activeElement.'" href="'.$elementUrl.'-1">'.$item->title.'</a>';
    }
}
public function end_el(&$output,$args = []){
    $output .= "</li>";
}
}

我正在等待以下 HTML :

<ul>
<li><a class="nav-link scrollto" href="#menu1">menu 1</a></li>
<li><a class="nav-link scrollto" href="#menu2">menu 2</a></li>
<li class="dropdown">
    <a href="#"><span>Drop Down</span> <i class="bi bi-chevron-down"></i></a>
    <ul>
        <li><a href="#">Drop Down 1</a></li>
        <li class="dropdown">
            <a href="#"><span>Deep Drop Down</span> <i class="bi bi-chevron-right"></i></a>
            <ul>
                <li><a href="#">Deep Drop Down 1</a></li>
            </ul>
        </li>
    </ul>
</li>
</ul>

但是它打印了这个 HTML :

<ul>
<li><a class="nav-link scrollto" href="#menu1">menu 1</a></li>
<li><a class="nav-link scrollto" href="#menu2">menu 2</a></li>
<li class="dropdown">
    <a href="#dropdownLink"><span>Drop Down</span> <i class="bi bi-chevron-down"></i></a>
    <ul>
        <a class="" href="#dropdownLink"></a>
        <li>
            <a class="" href="#dropdownLink"></a>
            <a href="#">Drop Down 1</a>
        </li>
        <li class="dropdown">
            <a href="#"><span>Deep Drop Down</span> <i class="bi bi-chevron-right"></i></a>
            <ul>
                <a class="" href="#dropdownLink"></a>
                <li>
                    <a class="" href="#dropdownLink"></a>
                    <a href="#">Deep Drop Down 1</a>
                </li>
            </ul>
        </li>
    </ul>
</li>
</ul>

正如您在每个菜单级别看到的,脚本再次打印父菜单的锚标记,我无法识别脚本循环何时插入父 TAG 锚,您可以帮我解决这个问题

解决方法

已修复,缺少关闭锚标记正确代码:

class Bootstrap_Collapse_NavWalker extends Walker_Nav_Menu{
public function start_lvl( &$output,$depth = 0,$args = null ) {
    $output .= "<ul>";
}

public function end_lvl(&$output,$args = [])
{
    $output .= "</ul>";
}

public function start_el(&$output,$item,$args = [],$id = 0){

    $itemClasses = empty( $item->classes ) ? array() : (array) $item->classes;
    $class_names_li = "";
    $class_names_a = "";
    $class_names_i = "";
    $item_output = "";
    $hasChildrenElm = $args->walker->has_children;
    if ( $hasChildrenElm ) {
        $class_names_li = 'dropdown';
    }

    if ( $depth === 0 && !$hasChildrenElm ) {
        $class_names_a = 'nav-link scrollto';
    }

    $activeElement = "";
    if ( in_array( 'current-menu-item',$itemClasses ) ) $activeElement .'active';

    $elementUrl = ! empty( $item->url ) ? esc_url($item->url) : '';
    if(!empty($elementUrl)){
        $output .= '<li class="'.$class_names_li.'">';
        if ( $hasChildrenElm ) {
            $output .= '<a class="'.$class_names_a.$activeElement.'" href="'.$elementUrl.'">
                            <span>'.$item->title.'</span>';
            $class_names_i .= ($depth !== 0) ? "bi bi-chevron-right" : "bi bi-chevron-down";
            $output .= '<i class="'.$class_names_i.'"></i></a>';
        }else{ 
            $output .= '<a class="'.$class_names_a.$activeElement.'11" href="'.$elementUrl.'">'.$item->title.'</a>';
        }
    }
}
public function end_el(&$output,$args = [])
{

    $output .= "</li>";
}
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...