WordPress模板-如果存在子菜单,如何将类添加到li标记

时间:2015-02-16 作者:Shahin Ataei

例如,我想创建此菜单:

<div class="menu_wrap">
 <ul class="nav sf-menu">
  <li class="sub-menu"><a href="">Main Menu 1</a>
    <ul>
        <li><a href=""><span>-</span>Sub Menu 1</a></li>
        <li><a href=""><span>-</span>Sub Menu 2</a></li>
    </ul>
  </li>
  <li class="sub-menu"><a href="">Main Menu 2</a>
    <ul>
        <li><a href=""><span>-</span>Sub Menu 1</a></li>
        <li><a href=""><span>-</span>Sub Menu 2</a></li>
    </ul>
  </li>
  <li><a href="">Main Menu 3 without sub menu</a></li>
</ul>
如果存在子菜单,如何在li标签中添加class=“子菜单”:

<li class="sub-menu"><a href="">Main Menu 1</a>
如果不存在没有class=“子菜单”的回音li:

<li><a href="">Main Menu 3 without sub menu</a></li>
我有这个函数代码。php:

//Adds Menus
    add_theme_support( \'menus\' );
    register_nav_menus(
            array(
                \'mainmenu\' => \'The Main Menu\'
            )
        );
    function dtuts_main_nav() {
        // display the wp3 menu if available
        wp_nav_menu(array(
            \'theme_location\'  => \'mainmenu\',
            \'menu\'            => \'mainmenu\',
            \'container\'       => \'div\',
            \'container_class\' => \'menu_wrap\',
            \'menu_class\'      => \'nav sf-menu\',
            \'echo\'            => true,
            \'items_wrap\'      => \'<ul class="%2$s">%3$s</ul>\',
            \'depth\'           => 1,
            \'walker\'          => new themeslug_walker_nav_menu
        ));
    } 
我不会写菜单类,请帮忙。

1 个回复
最合适的回答,由SO网友:cristian.raiber 整理而成

这是我正在使用的代码,它是一个用于引导的自定义导航助行器,但您可以轻松地将其改编为自己的。顺便说一下,您可以复制;粘贴我的导航助行器,并确保更改此行:

$class_names .= \' dropdown\';

$class_names .= \' sub-menu\';
希望这有帮助。

/**
 * Custom Bootstrap Nav Walker
 */

class macho_bootstrap_walker extends Walker_Nav_Menu
{

/**
 * @see Walker::start_lvl()
 * @since 3.0.0
 *
 * @param string $output Passed by reference. Used to append additional content.
 * @param int $depth Depth of page. Used for padding.
 */
public function start_lvl(&$output, $depth = 0, $args = array())
{
    $indent = str_repeat("\\t", $depth);
    $output .= "\\n$indent<ul role=\\"menu\\" class=\\" dropdown-menu\\">\\n";
}

/**
 * @see Walker::start_el()
 * @since 3.0.0
 *
 * @param string $output Passed by reference. Used to append additional content.
 * @param object $item Menu item data object.
 * @param int $depth Depth of menu item. Used for padding.
 * @param int $current_page Menu item ID.
 * @param object $args
 */
public function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0)
{
    $indent = ($depth) ? str_repeat("\\t", $depth) : \'\';

    /**
     * Dividers, Headers or Disabled
     * =============================
     * Determine whether the item is a Divider, Header, Disabled or regular
     * menu item. To prevent errors we use the strcasecmp() function to so a
     * comparison that is not case sensitive. The strcasecmp() function returns
     * a 0 if the strings are equal.
     */
    if (strcasecmp($item->attr_title, \'divider\') == 0 && $depth === 1) {
        $output .= $indent . \'<li role="presentation" class="divider">\';
    } else if (strcasecmp($item->title, \'divider\') == 0 && $depth === 1) {
        $output .= $indent . \'<li role="presentation" class="divider">\';
    } else if (strcasecmp($item->attr_title, \'dropdown-header\') == 0 && $depth === 1) {
        $output .= $indent . \'<li role="presentation" class="dropdown-header">\' . esc_attr($item->title);
    } else if (strcasecmp($item->attr_title, \'disabled\') == 0) {
        $output .= $indent . \'<li role="presentation" class="disabled"><a href="#">\' . esc_attr($item->title) . \'</a>\';
    } else {

        $class_names = $value = \'\';

        $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));

        if ($args->has_children)
            $class_names .= \' dropdown\';

        if (in_array(\'current-menu-item\', $classes))
            $class_names .= \' active\';

        $class_names = $class_names ? \' class="\' . esc_attr($class_names) . \'"\' : \'\';

        $id = apply_filters(\'nav_menu_item_id\', \'menu-item-\' . $item->ID, $item, $args);
        $id = $id ? \' id="\' . esc_attr($id) . \'"\' : \'\';

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

        $atts = array();
        $atts[\'title\'] = !empty($item->title) ? $item->title : \'\';
        $atts[\'target\'] = !empty($item->target) ? $item->target : \'\';
        $atts[\'rel\'] = !empty($item->xfn) ? $item->xfn : \'\';


        $atts[\'custom\'] = !empty($item->custom) ? $item->custom : \'\';

        // If item has_children add atts to a.
        if ($args->has_children && $depth === 0) {
            $atts[\'href\'] = \'#\';
            $atts[\'data-toggle\'] = \'dropdown\';
            $atts[\'class\'] = \'dropdown-toggle\';
            $atts[\'aria-haspopup\'] = \'true\';
        } else {
            $atts[\'href\'] = !empty($item->url) ? $item->url : \'\';
        }

        $atts = apply_filters(\'nav_menu_link_attributes\', $atts, $item, $args);


        $attributes = \'\';
        foreach ($atts as $attr => $value) {


            if (!empty($value)) {
                $value = (\'href\' === $attr) ? esc_url($value) : esc_attr($value);
                $attributes .= \' \' . $attr . \'="\' . $value . \'"\';
            }
        }

        $item_output = $args->before;

        /*
         * Glyphicons
         * ===========
         * Since the the menu item is NOT a Divider or Header we check the see
         * if there is a value in the attr_title property. If the attr_title
         * property is NOT null we apply it as the class name for the glyphicon.
         */
        if (!empty($item->attr_title))
            $item_output .= \'<a\' . $attributes . \'><span class="glyphicon \' . esc_attr($item->attr_title) . \'"></span>&nbsp;\';
        else
            $item_output .= \'<a\' . $attributes . \'>\';


        $item_output .= $args->link_before . apply_filters(\'the_title\', $item->title, $item->ID) . $args->link_after;
        $item_output .= ($args->has_children && 0 === $depth) ? \' <span class="caret"></span></a>\' : \'</a>\';
        $item_output .= $args->after;

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

/**
 * 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.
 *
 * This method shouldn\'t be called directly, use the walk() method instead.
 *
 * @see Walker::start_el()
 * @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.
 */
public function display_element($element, &$children_elements, $max_depth, $depth, $args, &$output)
{
    if (!$element)
        return;

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

    // Display this element.
    if (is_object($args[0]))
        $args[0]->has_children = !empty($children_elements[$element->$id_field]);

    parent::display_element($element, $children_elements, $max_depth, $depth, $args, $output);
}

/**
 * Menu Fallback
 * =============
 * If this function is assigned to the wp_nav_menu\'s fallback_cb variable
 * and a manu has not been assigned to the theme location in the WordPress
 * menu manager the function with display nothing to a non-logged in user,
 * and will add a link to the WordPress menu manager if logged in as an admin.
 *
 * @param array $args passed from the wp_nav_menu function.
 *
 */
public static function fallback($args)
{
    if (current_user_can(\'manage_options\')) {

        extract($args);

        $fb_output = null;

        if ($container) {
            $fb_output = \'<\' . $container;

            if ($container_id)
                $fb_output .= \' id="\' . $container_id . \'"\';

            if ($container_class)
                $fb_output .= \' class="\' . $container_class . \'"\';

            $fb_output .= \'>\';
        }

        $fb_output .= \'<ul\';

        if ($menu_id)
            $fb_output .= \' id="\' . $menu_id . \'"\';

        if ($menu_class)
            $fb_output .= \' class="\' . $menu_class . \'"\';

        $fb_output .= \'>\';
        $fb_output .= \'<li><a href="\' . admin_url(\'nav-menus.php\') . \'">Add a menu</a></li>\';
        $fb_output .= \'</ul>\';

        if ($container)
            $fb_output .= \'</\' . $container . \'>\';

        echo $fb_output;
    }
}
}

结束

相关推荐

Add Protocol to Custom Menus

我一直在使用tel: 自定义菜单中的链接与响应性设计相结合,为我的智能手机主题添加了“立即呼叫”按钮。它一直运行良好。一位客户刚刚要求我也添加一个“发送文本”按钮。我想我会用sms: 它似乎有可接受的设备支持。然而,当我保存菜单时,WordPress将其从URL中删除。经过研究,我得出结论,这与esc_url() 和/或wp_kses() (参见Trac ticket #18268). 我编造了以下代码,试图自己添加SMS协议并将其放入函数中。php:<?php function add_n