正在从“<li>”菜单中删除某些没有JS的“链接”的链接“<a>”

时间:2016-05-27 作者:V0RT3R

我希望我的一些导航菜单项显示纯文本,而不显示超链接。通常出现以下代码:

<ul class="..." id="...">
<li><a href="">my item</a>
</li>
</ul>
我想知道:

<ul class="..." id="...">
<li>my item
</li>
</ul>
当然,不是所有的菜单项,而是其中的一些。简单地说:我想从菜单的特定项目中删除超链接。这类事情有什么选择吗?

P、 S.wp\\U nav\\U菜单:

$items_wrap = \'<nav class="...">\';
$items_wrap .= \'<ul id="%1$s" class="%2$s">%3$s</ul>\';
$items_wrap .= \'</nav>\';
wp_nav_menu( array(
\'container\'       => false,
 \'container_class\' => false,
 \'menu_class\' => \'...\',
 \'echo\' => true,
 \'before\' => \'\',
 \'after\' => \'\',
 \'link_before\' => \'\',
 \'link_after\' => \'\',
 \'depth\' => 0,
 \'theme_location\' => \'...\',
 \'items_wrap\'        => $items_wrap,)
 );
由“...“我删除了自定义导航类、菜单类和主题位置名称

非常感谢。

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

假设您正在使用wp_nav_menu() 要显示导航,可以应用查找css类的walker:

$items_wrap  = \'<nav class="...">\';
$items_wrap .= \'<ul id="%1$s" class="%2$s">%3$s</ul>\';
$items_wrap .= \'</nav>\';

wp_nav_menu( array(
    \'container\'         => false,
    \'container_class\'   => false,
    \'menu_class\'        => \'...\',
    \'echo\'              => true,
    \'before\'            => \'\',
    \'after\'             => \'\',
    \'link_before\'       => \'\',
    \'link_after\'        => \'\',
    \'depth\'             => 0,
    \'theme_location\'    => \'...\',
    \'items_wrap\'        => $items_wrap,
    \'walker\'            => new Texas_Ranger(),
) );
注意新的Walker Classwp_nav_menu() 参数列表。

然后需要将下面的walker类添加到functions.php 文件:

class Texas_Ranger extends Walker_Nav_Menu {

    /**
     * Building the List Item element
     * @param Referenced string $output
     * @param Post Object $item
     * @param int $depth
     * @param array $args
     * @return void
     */
    function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
        $indent         = ( $depth > 0 ? str_repeat( "\\t", $depth ) : \'\' );

        // Passed Classes
        $classes = empty( $item->classes ) ? array() : (array) $item->classes;
        $class_names = esc_attr( implode( \' \', apply_filters( \'nav_menu_css_class\', array_filter( $classes ), $item ) ) );

        // build html
        $output .= $indent . \'<li id="nav-menu-item-\'. $item->ID . \'" class="\' . $class_names . \'">\';

        // If \'noLink\' exists in classes, don\'t HTML anchor tag.
        if( in_array( \'noLink\', $classes ) ) {

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

        } else {

            // link attributes
            $attributes  = ! empty( $item->attr_title ) ? \' title="\'  . esc_attr( $item->attr_title ) .\'"\' : \'\';
            $attributes .= ! empty( $item->target )     ? \' target="\' . esc_attr( $item->target     ) .\'"\' : \'\';
            $attributes .= ! empty( $item->xfn )        ? \' rel="\'    . esc_attr( $item->xfn        ) .\'"\' : \'\';
            $attributes .= ! empty( $item->url )        ? \' href="\'   . esc_attr( $item->url        ) .\'"\' : \'\';
            $attributes .= \' class="menu-link \' . ( $depth > 0 ? \'sub-menu-link\' : \'main-menu-link\' ) . \'"\';

            $item_output = sprintf( \'%1$s<a%2$s>%3$s%4$s%5$s</a>%6$s\',
                $args->before,
                $attributes,
                $args->link_before,
                apply_filters( \'the_title\', $item->title, $item->ID ),
                $args->link_after,
                $args->after
            );
        }

        // build html
        $output .= apply_filters( \'walker_nav_menu_start_el\', $item_output, $item, $depth, $args );
    }
}
它的作用是寻找一个类noLink 如果它存在于列表项中,我们将跳过锚定HTML过程。

最后一步是登录WordPress,导航到Appearance -> Menus 在右上角,单击Screen Options 并确保选中“CSS类”:

Menus Screen Options CSS Classes

然后在我们只想显示为文本的列表项上添加类noLinks 像这样:

Add Class 'noLink' to Home

相关推荐

Disable automatic embed links

在当前的wordpress版本(5.2..)上有什么方法吗,要打开自动嵌入链接(wp embed.min.js),这会将url转换为iframe吗?我尝试过插件、代码片段和函数。php。。。很明显,对于wp的最新版本,它们都不再有效。