如何在MENU_NAV的子菜单中添加div或更改li

时间:2017-04-18 作者:Alvin Ofori-Adjei

我想将div和class添加到父[li]的[ul class=“sub menu”]之后的子[li]元素中。问题是,当我试图修改start\\el函数中的[li]时,所有[li]都会被修改,即使是在[ul class=“sub menu”]之外的那些,父级也会被修改。请帮助我分离[li],这样我就只能在没有Javascript的情况下修改[ul class=“sub menu”]中的那些。

public function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
        if ( isset( $args->item_spacing ) && \'discard\' === $args->item_spacing ) {
            $t = \'\';
            $n = \'\';
        } else {
            $t = "\\t";
            $n = "\\n";
        }
        $indent = ( $depth ) ? str_repeat( $t, $depth ) : \'\';

        $classes = empty( $item->classes ) ? array() : (array) $item->classes;
        $classes[] = \'menu-item-\' . $item->ID;

        $class_names = join( \' \', apply_filters( \'nav_menu_css_class\', array_filter( $classes ), $item, $args, $depth ) );
        $class_names = $class_names ? \' class="\' . esc_attr( $class_names ) . \'"\' : \'\';
        $id = apply_filters( \'nav_menu_item_id\', \'menu-item-\'. $item->ID, $item, $args, $depth );
        $id = $id ? \' id="\' . esc_attr( $id ) . \'"\' : \'\';

        $output .= $indent . \'<li\' . $id . $class_names .\'>\';

        $atts = array();
        $atts[\'title\']  = ! empty( $item->attr_title ) ? $item->attr_title : \'\';
        $atts[\'target\'] = ! empty( $item->target )     ? $item->target     : \'\';
        $atts[\'rel\']    = ! empty( $item->xfn )        ? $item->xfn        : \'\';
        $atts[\'href\']   = ! empty( $item->url )        ? $item->url        : \'\';
        $atts = apply_filters( \'nav_menu_link_attributes\', $atts, $item, $args, $depth );

        $attributes = \'\';
        foreach ( $atts as $attr => $value ) {
            if ( ! empty( $value ) ) {
                $value = ( \'href\' === $attr ) ? esc_url( $value ) : esc_attr( $value );
                $attributes .= \' \' . $attr . \'="\' . $value . \'"\';
            }
        }
        $title = apply_filters( \'the_title\', $item->title, $item->ID );

        $title = apply_filters( \'nav_menu_item_title\', $title, $item, $args, $depth );

        $item_output = $args->before;
        $item_output .= \'<a\'. $attributes .\'>\';
        $item_output .= $args->link_before . $title . $args->link_after;
        $item_output .= \'</a>\';
        $item_output .= $args->after;

        $output .= apply_filters( \'walker_nav_menu_start_el\', $item_output, $item, $depth, $args );
    }

2 个回复
SO网友:ngearing

您不需要制作一个全新的walker,只需使用一个过滤器和一些基于函数参数的条件即可。

我们需要的过滤器是walker_nav_menu_start_el 您可以在代码示例的底部看到。

为了确保只针对子页面,我们可以使用$depth 参数,请参见下面的示例。

function ngstyle_child_menu_items($item_output, $item, $depth, $args)
{
    // Check we are on the right menu & right depth
    if ($args->theme_location != \'primary\' || $depth !== 1) {
        return $item_output;
    }

    $new_output = $item_output;
    $new_output .= \'<div class="super-mega-awesome"></div>\'; // Add custom elems

    return $new_output;
}
add_filter(\'walker_nav_menu_start_el\', \'ngstyle_child_menu_items\', 10, 4);

SO网友:Diogo

如果你想直接插入这些<div>基于某些条件或触发器,您将需要javascript(或jQuery或php)。无法摆脱脚本语言。

这个<li>来自此函数的´在以下变量中定义:

$output .= $indent . \'<li\' . $id . $class_names .\'>\';

因此,如果您要添加<div> 在它里面,您可以尝试以下操作:

$output .= $indent . \'<li\' . $id . $class_names .\'>\' . \'<div class="class-1 class-2">\';

但是,如果这些<div>\'s应该始终存在,您可以在它来自的php文件中对其进行硬编码。

当涉及到仅将样式更改应用于那些特定的<li>如果你是通过CSS来实现的,那么它非常简单,你所要做的就是明确<li> 你想成为目标。

像这样:

ul.sub-menu li.the-li-class {
   property: value;
}
例如,如果您使用jQuery进行操作,它将如下所示:

$(\'.sub-menu\').find(\'.li-class\');
   $(this).css({\'property-1\' : \'value\', \'property-2\' : \'value\' });
对于jQuery,还有其他方法。这一切都是关于知道如何遍历DOM树,如果不熟悉的话,您可能想深入了解这一点。