如何在SPAN属性中显示每个菜单项的标题

时间:2013-09-20 作者:Daem0n

我正在尝试将CSS悬停效果添加到主题的主菜单中,该效果基于<span> 要素问题是,我无法用每个菜单项的标题动态生成这个。下面是我想要生成的HTML:

<nav>
    <a href="#"><span data-hover="Home">Home</span></a>
    <a href="#"><span data-hover="About">About</span></a>
    <a href="#"><span data-hover="Contact">Contact</span></a>
</nav>
现在在WP中,我尝试添加link_beforelink_after 属性以添加<span> 元素,但我不确定如何为“数据悬停”属性的每个菜单项生成标题。任何帮助都将不胜感激。

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

调用wp_nav_menu() 函数可以传递<span> 中的标记link_before Ylink_after 参数:

wp_nav_menu(array(\'link_before\' = > \'<span>\', \'link_after\' => \'</span>\'));
要在每个菜单项的范围中具有不同的属性,您可能需要使用自定义nav\\u walker。例如,下一个自定义Nav\\u Walker是Wordpress的默认值,我刚刚对其进行了修改,添加了<span> 使用data-hover 属性:

//First, define the callback when displaying the menu
<nav>
    <?php wp_nav_menu( array( 
            \'container\'       => \'\',
            \'container_class\' => \'\',
                \'theme_location\'  => \'topmenu\',
            \'menu_class\'      => \'nav\',
                \'fallback_cb\'      => \'\',
            \'walker\' => new Custom_Walker(),
                     ) );
?>

在这种情况下,自定义导航助行器Custom_Walker 必须在函数中。php或包含在其中:

class Custom_Walker extends Walker_Nav_Menu {
/**
 * @see Walker::$tree_type
 * @since 3.0.0
 * @var string
 */
var $tree_type = array( \'post_type\', \'taxonomy\', \'custom\' );

/**
 * @see Walker::$db_fields
 * @since 3.0.0
 * @todo Decouple this.
 * @var array
 */
var $db_fields = array( \'parent\' => \'menu_item_parent\', \'id\' => \'db_id\' );

/**
 * @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.
 */
function start_lvl( &$output, $depth = 0, $args = array() ) {
    $indent = str_repeat("\\t", $depth);
    $output .= "\\n$indent<ul class=\\"sub-menu\\">\\n";
}

/**
 * @see Walker::end_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.
 */
function end_lvl( &$output, $depth = 0, $args = array() ) {
    $indent = str_repeat("\\t", $depth);
    $output .= "$indent</ul>\\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
 */
function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
    $indent = ( $depth ) ? str_repeat( "\\t", $depth ) : \'\';

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

    $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;
    $item_output .= \'<a\'. $attributes .\'>\';
    $item_output .= $args->link_before;
            // HERE are your <span> tags
            $item_output .= \'<span data-hover="\'.esc_attr($item->title).\'">\';
            $item_output .= apply_filters( \'the_title\', $item->title, $item->ID );
            $item_output .= \'</span>\';
            $item_output .= $args->link_after;
    $item_output .= \'</a>\';
    $item_output .= $args->after;

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

/**
 * @see Walker::end_el()
 * @since 3.0.0
 *
 * @param string $output Passed by reference. Used to append additional content.
 * @param object $item Page data object. Not used.
 * @param int $depth Depth of page. Not Used.
 */
function end_el( &$output, $item, $depth = 0, $args = array() ) {
    $output .= "</li>\\n";
}
}
或者更好(或者不是,我不确定,因为它需要通过get_post() 函数如果我们只想对菜单标题而不是所有帖子标题运行过滤器,请使用the_title 过滤器挂钩(有关更好的使用方法,请参阅toscho答案the_title 过滤器挂钩(如果您决定使用此过滤器而不是自定义导航步行器):

function add_span_to_menu($title, $id) {

    //Run this function only for nav_menu_item post types
    $item = get_post( $id );
    if($item->post_type != \'nav_menu_item\') return;

    $title = \'<span data-hover="\'.esc_attr($title).\'">\'.$title.\'</span>\';

    return $title;

}
add_filter(\'the_title\', \'add_span_to_menu\', 10, 2);

SO网友:fuxia

您可以使用筛选导航菜单项的标题the_title.

// from wp-includes/nav-menu-template.php, Walker_Nav_Menu::start_el()
$item_output .= $args->link_before . apply_filters( \'the_title\', $item->title, $item->ID ) . $args->link_after;
不幸的是,此过滤器也在许多其他地方使用,因此您必须尽可能晚地打开过滤器,并且应该在分析项目后将其关闭。

样本、代码、未测试:

// turn it on
add_filter( \'wp_nav_menu_objects\', function( $items )
{
    add_filter( \'the_title\', \'change_nav_title\' );
    return $items;
});
// turn it off
add_filter( \'wp_nav_menu\', function( $nav_menu )
{
    remove_filter( \'the_title\', \'change_nav_title\' );
    return $nav_menu;
});

// change the title
function change_nav_title( $title )
{
    return sprintf(
        \'<span data-hover="%1$s">%2$s</span>\',
        esc_attr( $title ),
        $title
    );
}

结束

相关推荐

Primary and secondary menus

我试图使主菜单上的每个选项卡都链接到次菜单,这样实际上,每个主选项卡都会指向次菜单中的一组选项卡,而不是保持静态。我希望你能帮助我,我不是一个高级WP用户,所以可以使用简单的术语。更新我已经添加了代码,但它已经显示在我的网页和仪表板上,所以我一定是弄错了,所以我将其粘贴在下面,以便您可以看到。我不知道如何找到主弹头,但我想这是我在主弹头上添加的内容。function km_dynamic_secondary_menu_reg() { global $km_nav_menus;