将插入符号添加到带有WordPress主题中的子菜单的菜单项

时间:2011-08-25 作者:Rose Kunkel

我正在使用wp\\u nav\\u menu()处理自定义主题。我想做的是在有子菜单的菜单项中添加插入符号。例如,如果我的菜单如下所示:

菜单项1菜单项2菜单项2a菜单项2b菜单项3格式如下:

在不知道菜单结构的情况下,列出菜单项1菜单项2菜单项2a菜单项2b菜单项3。这似乎是一个非常常见的格式问题,所以我想知道是否有任何内置功能可以提供此功能。

3 个回复
最合适的回答,由SO网友:Jennifer Stuart 整理而成

我使用jQuery来实现这一点(因为它不一定需要在文本中(对于屏幕阅读器等)-只是另一个选项…:

jQuery(document).ready(function() {
  jQuery(\'ul#nav li\').has(\'ul\').addClass(\'parentul\');
});
然后,对于“parentul”类,我放入一个箭头的背景图像,并将其放置在右侧>。。。

SO网友:Devin Humbert

您可以使用自定义助行器执行此操作。在函数的底部粘贴以下类。php:

class Nfr_Menu_Walker extends Walker_Nav_Menu{

                /**
         * Traverse elements to create list from elements.
         *
         * Display one element if the element doesn\'t have any children otherwise,
         * display the element and its children. Will only traverse up to the max
         * depth and no ignore elements under that depth. It is possible to set the
         * max depth to include all depths, see walk() method.
         *
         * This method shouldn\'t be called directly, use the walk() method instead.
         *
         * @since 2.5.0
         *
         * @param object $element Data object
         * @param array $children_elements List of elements to continue traversing.
         * @param int $max_depth Max depth to traverse.
         * @param int $depth Depth of current element.
         * @param array $args
         * @param string $output Passed by reference. Used to append additional content.
         * @return null Null on failure with no changes to parameters.
         */
        function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ) {

                if ( !$element )
                        return;

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

                //display this element
                if ( is_array( $args[0] ) )
                        $args[0][\'has_children\'] = ! empty( $children_elements[$element->$id_field] );

                //Adds the \'parent\' class to the current item if it has children               
                if( ! empty( $children_elements[$element->$id_field] ) ) {
                        array_push($element->classes,\'parent\');
                        $element->title .= \' >\';
                }

                $cb_args = array_merge( array(&$output, $element, $depth), $args);

                call_user_func_array(array(&$this, \'start_el\'), $cb_args);

                $id = $element->$id_field;

                // 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);
                                        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);
        }
}
然后在标题中。php(或无论您的wp\\U nav\\U菜单是什么)执行以下操作:

<?php
    $walker = new Nfr_Menu_Walker(); 
    wp_nav_menu( array( \'theme_location\' => \'primary\', \'walker\' => $walker ) ); 
?>
助行器的关键部分是以下if语句:

if( ! empty( $children_elements[$element->$id_field] ) ) {
                    array_push($element->classes,\'parent\');
                    $element->title .= \' &gt;\';
}
这将检查项目是否有子项,如果有,则会向其添加“父”css类,然后将标题从“xxxx”更改为“xxxx>”。

(改编自http://wordpress.org/support/topic/wp_nav_menu-add-a-parent-class)

SO网友:Chiubaka

这些天来,WordPress本身似乎输出了menu-item-has-children 菜单上的类li 有一个ul.sub-menu.

可以很容易地添加样式来添加背景图像,而不必使用jQuery等。

结束

相关推荐

Menu API not switching menus?

我正在使用菜单API,我想切换到其他菜单,但出于某种原因,它保留了第一个菜单这是我的密码在函数中。php add_action( \'init\', \'register_my_menus\',10 ); function register_my_menus() { register_nav_menu(\'main-navigation\', \'Main Navigation\'); } 下面是我的主题文件(header.ph