Add div to specific sub-menu

时间:2016-04-13 作者:user3185638

我在谷歌yandex进行了研究,但没有成功。

使用此代码,我可以将div设置为子菜单,但此代码添加到所有子菜单,我只需要将div添加到特定的子菜单。

class Megratron_div extends Walker_Nav_Menu
{
    function start_lvl( &$output, $depth = 0, $args = array() ) {
        $indent = str_repeat("\\t", $depth);
        $output .= "\\n$indent<div id=\'megatron\'><ul class=\'sub-menu\'>\\n";
    }
    function end_lvl( &$output, $depth = 0, $args = array() ) {
        $indent = str_repeat("\\t", $depth);
        $output .= "$indent</ul></div>\\n";
    }
}
?我该怎么做?

我真的很感谢你的支持。

1 个回复
SO网友:Caspar

WordPress本机Walker 类不会将所需的参数传递给start_lvl() 方法为此,您需要添加一个自定义display_element() 方法创建自定义walker。您可以使用大部分原始内容,与下面的注释部分类似:

public function display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output ) {
    if ( ! $element ) {
        return;
    }

    $id_field = $this->db_fields[\'id\'];
    $id       = $element->$id_field;

    //display this element
    $this->has_children = ! empty( $children_elements[ $id ] );
    if ( isset( $args[0] ) && is_array( $args[0] ) ) {
        $args[0][\'has_children\'] = $this->has_children; // Backwards compatibility.
    }

    $cb_args = array_merge( array( &$output, $element, $depth ), $args );
    call_user_func_array( array( $this, \'start_el\' ), $cb_args );

    // descend only when the depth is right and there are childrens for this element
    if ( ( $max_depth == 0 || $max_depth > $depth + 1 ) && isset( $children_elements[ $id ] ) ) {

        foreach ( $children_elements[ $id ] as $child ) {

            if ( ! isset( $newlevel ) ) {
                $newlevel = true;
                //start the child delimiter
                $cb_args = array_merge( array( &$output, $depth ), $args );

                /** Additional check for custom addition of id to sub-level */
                if ( $element->post_name = \'Megatron\' ) {
                    $cb_args[\'sub_menu_id\'] = \'megatron\';
                }
                /** End custom check */

                call_user_func_array( array( $this, \'start_lvl\' ), $cb_args );
            }
            $this->display_element( $child, $children_elements, $max_depth, $depth + 1, $args, $output );
        }
        unset( $children_elements[ $id ] );
    }

    if ( isset( $newlevel ) && $newlevel ) {
        //end the child delimiter
        $cb_args = array_merge( array( &$output, $depth ), $args );
        call_user_func_array( array( $this, \'end_lvl\' ), $cb_args );
    }

    //end this element
    $cb_args = array_merge( array( &$output, $element, $depth ), $args );
    call_user_func_array( array( $this, \'end_el\' ), $cb_args );
}
此处添加的代码检查主元素名称,然后将id信息附加到将发送到的参数start_lvl().

现在,您可以在start_lvl() 方法,例如:

public function start_lvl( &$output, $depth = 0, $args = array(), $sub_menu_div = null ) {
    $indent = str_repeat("\\t", $depth);
    if ( $sub_menu_div ) {
        $output .= "\\n$indent<div id=\\"$sub_menu_div\\"><ul class=\\"sub-menu\\">\\n";
    } else {
        $output .= "\\n$indent<ul class=\\"sub-menu\\">\\n";
    }
}
希望这有帮助。祝你好运

相关推荐

WordPress中声明SplitMenuWalker::Walk($Elements,$max_Depth)时出现警告

我开始在WordPress网站上收到以下错误:警告:SplitMenuWalker::walk($elements,$max\\u depth)的声明应与/home/relati67/public\\u html/wp content/themes/mentis/inc/mega menu/split menu中的walk::walk($elements,$max\\u depth,$args)兼容。php第0行我不知道在这里该怎么办。我发现了一个具有类似内容的线程,但错误指向特定行(不是第0行),并且不