将动态内容块添加到由自定义漫游生成的导航部分

时间:2014-10-21 作者:Sean

我正在研究一个主题,该主题需要在导航中嵌套一段动态内容。我正在使用自定义的walker生成菜单。我需要一种向代码中添加标记的方法,该方法将在后端进行编辑(可能是ACF,不重要)。

内容将嵌套在菜单的特定部分(“产品”)。不知道如何使用定制助行器来实现这一点。

步行者:

class Custom_Nav_Walker extends Walker_Nav_Menu {

    function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {

        $default_classes = empty ( $item->classes ) ? array () : (array) $item->classes;

        $custom_classes = (array)get_post_meta( $item->ID, \'_menu_item_classes\', true );

        // Is this a top-level menu item?
        if ($depth == 0)
            $custom_classes[] = \'menu-item-top-level\';

        // Does this menu item have children?
        if (in_array(\'menu-item-has-children\', $default_classes))
            $custom_classes[] = \'menu-item-has-children\';

        // Is this menu item active? (Top level only)
        $active_classes = array(\'current-menu-item\', \'current-menu-parent\', \'current-menu-ancestor\', \'current_page_item\', \'current-page-parent\', \'current-page-ancestor\');
        if ($depth == 0 && array_intersect($default_classes, $active_classes))
            $custom_classes[] = \'menu-item-active\';

        // Give menu item a class based on its level/depth
        $level = $depth + 1;
        if ($depth > 0)
            $custom_classes[] = "menu-item-level-$level";

        $classes = join(\' \', $custom_classes);

        ! empty ( $classes )
            and $classes = \' class="\'. trim(esc_attr( $classes )) . \'"\';

        $output .= "<li $classes>";

        $attributes  = \'\';

        ! empty( $item->attr_title )
            and $attributes .= \' title="\'  . esc_attr( $item->attr_title ) .\'"\';
        ! empty( $item->target )
            and $attributes .= \' target="\' . esc_attr( $item->target     ) .\'"\';
        ! empty( $item->xfn )
            and $attributes .= \' rel="\'    . esc_attr( $item->xfn        ) .\'"\';
        ! empty( $item->url )
            and $attributes .= \' href="\'   . esc_attr( $item->url        ) .\'"\';

        $title = apply_filters( \'the_title\', $item->title, $item->ID );

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

        $output .= apply_filters(
            \'walker_nav_menu_start_el\'
        ,   $item_output
        ,   $item
        ,   $depth
        ,   $args
        );
    }
}
这在我的标记中调用如下:

<nav>
    <?php wp_nav_menu( array(\'menu\' => \'main\', \'walker\' => new Custom_Nav_Walker )); ?>
</nav>
我很感激你能提供的任何帮助。

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

首先,感谢Howdy\\u McGee为我指明了正确的方向。我能用抄本把剩下的路带到那里。

最后我做的是将end\\u el()函数添加到我的自定义walker中,并根据post ID修改输出。

function end_el( &$output, $item, $depth = 0, $args = array() ) {
    if ($item->object_id == 26)
        $output .="<li class=\\"custom-content\\">DYNAMIC CONTENT WILL GO HERE</li>";
   $output .= "</li>\\n";
}
我最初使用的是项目ID,但我认为这根本不可靠,并认为帖子ID不太可能更改。使用ACF,我将删除“动态内容将转到此处”的简短代码。

再次感谢您朝着正确的方向推动!

SO网友:Howdy_McGee

在导航助行器的末尾,您只需附加到$output 像这样:

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

// This is before the ending list item:
$output .= \'<span>Inner Navigational Text</span>\';
要获取post meta(我不熟悉ACF),您可以使用$item->object_id 这将是实际的职位ID($item->ID 是导航项目ID,而不是帖子ID)。

如果要将内容添加到实际链接中,则必须预先创建内容块,将其存储在变量中(例如$navContent), 然后,您必须用以下内容替换当前链接:

$item_output = sprintf( \'%1$s<a%2$s>%3$s%4$s%5$s%6$s</a>%7$s\',
    $args->before,
    $attributes,
    $args->link_before,
    apply_filters( \'the_title\', $item->title, $item->ID ),
    $args->link_after,
    $navContent,
    $args->after
);
如果你熟悉sprinf() 这会有意义,但如果没有意义,它只会用参数列表中的第6个变量替换%6$s。这个s 指示它是一个字符串,这就是为什么您要先创建内容块。

结束

相关推荐

使用Walker添加菜单CSS类功能

我正在尝试添加将自定义CSS类插入菜单项的功能。我相信我是通过扩展walker\\u nav\\u菜单来实现的,但我不知道如何调用自定义类。这似乎是一个很简单的问题,但我已经在这里搜索过了,找不到任何简单的添加自定义类的方法。现在我只有:<?php wp_nav_menu( array( \'theme_location\' => \'top-menu\', \'walker\' => new future_walker_class() ) ); ?> 以及class f