如何使用插件将子菜单添加到wp_NAV_MENU生成的菜单中

时间:2012-11-05 作者:Tahir Yasin

我有一个菜单wp_nav_menu 看起来像

<ul class="nav-menu" id="menu-top-nav">
    <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-43" id="menu-item-43"><a href="http://www.example.com/item1.com">Item 1</a></li>
    <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-44" id="menu-item-44"><a href="http://www.example.com/item2.com">Item 2</a></li>
    <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-45" id="menu-item-45"><a href="http://www.example.com/item3.com">Item 3</a></li>
    <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-46" id="menu-item-46"><a href="http://www.example.com/item4.com">Item 4</a></li>
</ul>
我想通过使用我的插件在“项目3”中添加一个子菜单来修改上面的菜单,所以下面是我想要的输出。

<ul class="nav-menu" id="menu-top-nav"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-43" id="menu-item-43"><a href="http://www.example.com/item1.com">Item 1</a></li>
  <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-44" id="menu-item-44"><a href="http://www.example.com/item2.com">Item 2</a></li>
  <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-45" id="menu-item-45"><a href="http://www.example.com/item3.com">Item 3</a>
    <ul class="sub-menu">
      <li class="menu-item" id="menu-item-48"><a href="http://www.example.com/child1.com">child 1</a></li>
      <li class="menu-item" id="menu-item-49"><a href="http://www.example.com/child2.com">child 2</a></li>
      <li class="menu-item" id="menu-item-50"><a href="http://www.example.com/child3.com">child 3</a></li>
   </ul>
  </li>
  <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-46" id="menu-item-46"><a href="http://www.example.com/item4.com">Item 4</a></li>
</ul>
我尝试了以下过滤器,但这些并没有帮助我实现上述输出。

wp_setup_nav_menu_item
wp_get_nav_menu_items
wp_nav_menu_items

Workaround 1:

add_filter(\'wp_nav_menu_items\', \'my_custom_menu_item\', 10, 2);

function my_custom_menu_item($items, $args)
{
    $parent_item_number = 3;
    $pos = nth_strpos($items, \'</a>\', $parent_item_number) + 4;
    $cat_id = 9;
    $args = array(\'numberposts\' => 5, \'category\' => $cat_id);
    $myposts = get_posts($args);
    if (!empty($myposts))
    {
        $str_to_insert = \'<ul class="sub-menu">\';
        global $post;
        foreach ($myposts as $post) : 
            setup_postdata($post);
            $str_to_insert .= \'<li><a href="\' . get_permalink() . \'">\' . get_the_title() . \'</a></li>\';
        endforeach;
        $str_to_insert .= \'</ul>\';

        $items = substr($items, 0, $pos) . $str_to_insert . substr($items, $pos);
    }
    return $items;
}

function nth_strpos($str, $substr, $n, $stri = false)
{
    if ($stri)
    {
        $str = strtolower($str);
        $substr = strtolower($substr);
    }
    $ct = 0;
    $pos = 0;
    while (($pos = strpos($str, $substr, $pos)) !== false)
    {
        if (++$ct == $n)
        {
            return $pos;
        }
        $pos++;
    }
    return false;
}
上述解决方案可行,但我认为这不是实现预期结果的正确方法。我希望你能给我一个好的解决方案。

2 个回复
最合适的回答,由SO网友:Addy 整理而成

您可以使用walker修改菜单。

include(\'subMenu.php\');
$menu =  wp_nav_menu( array(\'menu\' => \'YOUR-MENU-NAME\',\'menu_class\' => \'megamenu\',\'walker\' => new subMenu));
创建文件子菜单。php在主题文件夹中添加以下代码。

<?php
class subMenu extends Walker_Nav_Menu {
    function end_el(&$output, $item, $depth=0, $args=array()) {

    if( \'Item 3\' == $item->title ){
        $output .= \'<ul class="sub-menu">
        <li class="menu-item" id="menu-item-48"><a href="http://www.example.com/child1.com">child 1</a></li>
        <li class="menu-item" id="menu-item-49"><a href="http://www.example.com/child2.com">child 2</a></li>
        <li class="menu-item" id="menu-item-50"><a href="http://www.example.com/child3.com">child 3</a></li>
        </ul>\';
    }
    $output .= "</li>\\n";  
    }
}

SO网友:bueltge

钩子wp_nav_menu_items 如果将项目添加到WP Nav菜单的结构中,则为正确。有关添加静态“主页”链接的信息,请参见下面的示例。从函数来看,链接是静态的home_url() 我只在WP Nav Menu fpr前后的值的参数中使用了这个。li项是静态的,仅在WordPress中更改,如果您对此元素使用Walker。钩子wp_nav_menu_items 在列表中ul. 为新项目内容定义变量后,我将其添加到变量的默认列表中$items, 在列表输出之前设置。现在只返回所有内容。

add_filter( \'wp_nav_menu_items\', \'fb_add_home_link\', 10, 2 );
function fb_add_home_link( $items, $args ) {

    $home_item =
            \'<li>\' .
            $args->before .
            \'<a href="\' . home_url( \'/\' ) . \'" title="Home">\' .
            $args->link_before . __( \'Home\' ) . $args->link_after .
            \'</a>\' .
            $args->after .
            \'</li>\';

    $items = $home_item . $items;

    return $items;
}

结束

相关推荐

我如何才能只在单个帖子上链接一个css文件?

如果我理解is_single() 没错,它只应该回来true 当当前的“post”(在一般意义上)是文字post(即,它有一个post_type 属于post), 它会回来的false 当当前的“帖子”是一个页面、附件等时,这就是法典所说的:is_single() returns true if any single post is being displayed is_singular() returns true when any page, attachment, or single pos