如何使顶层菜单项没有链接,但有链接的子菜单?

时间:2011-10-05 作者:PVA

我正在构建一个水平菜单,该菜单上的一些条目将有下拉菜单(子菜单),而有些则没有。那些有子菜单的条目实际上不是页面。它们只是用来指导下拉列表。

例如,假设水平菜单如下所示:

主页|关于我们|产品|方向|联系

“products”li项下有3个垂直下拉列表链接的页面,因此“products”本身实际上并不代表页面,我如何在WP中做到这一点?

(我使用WP作为CMS,带有静态主页和内部页面。我构建自己的模板,用CSS设置菜单样式,然后在functions.php中注册菜单并在模板中调用它们。)在WP中,您可以通过页面列表或自定义链接向菜单添加条目。但我不想把“产品”联系起来。如果我不向自定义链接添加链接,它将不允许我将其添加到菜单。

这是否可以通过菜单管理员实现,还是我必须以其他方式实现?

谢谢你的帮助!

18 个回复
最合适的回答,由SO网友:Brooke. 整理而成

我有一些想法:

将自定义链接设置为# 不会返回任何内容Add a custom class to the items and then use jQuery to remove the links.

  • Use a PHP equivalent to the jQuery methodDisable Parent Menu Link 插件(或将其拆开并编写自己的插件)
  • SO网友:GavinR

    无需插件或任何东西,最简单的方法就是使用WordPress的“菜单”功能。以下是WordPress 4.8的说明:

    从WordPress仪表板,进入“编辑菜单”选项卡中的“外观->菜单”,选择“自定义链接”作为URL,输入“#”(无引号)作为链接文本,在下拉菜单的顶层输入所需文本,单击“添加到菜单”按钮,将菜单项拖动到菜单中所需的位置。对于刚才添加的菜单项,单击项目右侧的向下箭头(项目左侧将显示“自定义链接”)从URL中删除“#”。这在所有浏览器中都会将链接转换为纯文本

    SO网友:shea

    我想到的最简单的方法是创建一个链接URL值为的自定义链接项#. 这将用户发送到同一页面上的空哈希,因此基本上没有链接。

    然而,对占位符链接使用空哈希会产生一些副作用。该链接仍将显示并表现为链接,因此当用户单击看似链接但什么都没有发生时,可能会混淆用户。另一个影响是,单击空哈希链接将覆盖任何现有哈希,将用户发送到页面顶部。对于位于页面顶部的菜单来说,这可能并不那么令人担忧,但当页面在您不期望的情况下意外跳转时,尤其是对于页脚菜单,这是非常不和谐的。

    解决方案是将空哈希方法与一段代码相结合,以检测菜单中何时使用空哈希链接,并删除href 属性完全来自该链接。一a 不带href 属性是correct HTML 5 method 创建占位符链接。

    /**
     * Remove the href from empty links `<a href="#">` in the nav menus
     * @param string $menu the current menu HTML
     * @return string the modified menu HTML
     */
    add_filter( \'wp_nav_menu_items\', function ( $menu ) {
        return str_replace( \'<a href="#"\', \'<a\', $menu );
    } );
    

    SO网友:Tahi Reu

    创建(&Q);自定义链接“;菜单项和添加javascript:; 到URL字段。这是比使用# 因为它不会在单击时将页面滚动到顶部。

    SO网友:RickyBono

    这对我很有用:

    我已激活CSS Classes 在“菜单>屏幕选项>CSS类”中,我给出了要停用该类的菜单元素“.nolink”,并将这段代码添加到自定义CSS面板中:

    .nolink {
       pointer-events: none;
       cursor: default;
    }
    

    SO网友:user1249523

    请注意,这是一个旧线程,但要在Wordpress中快速而肮脏地创建链接,请将链接URL设置为:

    #_

    请注意标签后面的下划线。这样,如果您的菜单向下滚动页面(即修复),您在单击页面时不会跳转到页面顶部,也不需要任何插件/脚本。

    SO网友:calmohallag

    将自定义链接设置为#,它不会返回任何列表项添加此筛选器:

    add_filter( \'wp_nav_menu_items\', \'wpse_remove_empty_links\' );
    
    function wpse_remove_empty_links( $menu ) {
    
        return preg_replace("/<a href=\\"#\\">(.+?)<\\/a>/is", "<span>$1</span>", $menu);
    
    }
    
    编辑span CSS以获得与相同的样式<a>, 别忘了cursor: context-menu;.

    SO网友:Sam Bull

    使用PHP方法,我将此代码添加到函数中。php:

    function remove_link_contact_menu($item_output, $item) {
        if ($item->post_name == \'contact\')
            return \'<span>\' . $item->title . \'</span>\';
    
        return $item_output;
    }
    add_filter(\'walker_nav_menu_start_el\', \'remove_link_contact_menu\', 20, 2);
    add_filter(\'megamenu_walker_nav_menu_start_el\', \'remove_link_contact_menu\', 20, 2);
    
    这将用一个span元素替换项目菜单的链接,该元素的post\\u name==“contact”,这正是我所寻找的。您可以轻松地更改它来检查菜单标题或ID,或者添加一些代码来检查它是否有子菜单项等。

    SO网友:Doug Cassidy

    这将删除单击(并取消项目样式)。这样,您就不必使用菜单中的自定义链接。

    add_action( \'wp_footer\', function(){
        ?>
        <script>
        (function( $ ) {
            var itemm = $(\'#main-menu .menu-item-has-children > a\');
            itemm.click(function(){
                document.activeElement && document.activeElement.blur();
                return false;
            });
        })(jQuery);
        </script>
    <?php
     }, 1, 0 );
    

    SO网友:deweydb

    正如其他人所建议的,您可以创建一个自定义链接菜单项,url为#。将#添加到菜单后,请将其擦除。最后,您可以使用这个简单的正则表达式从这些链接中去除实际的标记。

    preg_replace(\'/<a>([^<]+)<\\/a>/i\', \'<span class="no-link">$1</span>\', $navHTML);
    

    SO网友:Barry

    我意识到我在比赛中迟到了,但我使用以下两种方法:

    1) 使父菜单项与第一个子项重复,并更改其标签。例如,如果“Products”下的第一项是“Product 1”,请使用“Product 1”作为父菜单项,然后将其标签更改为“Products”。这样,“Products”和“Product 1”都将指向Product 1页面。

    2) 添加重定向,以便产品页面重定向到产品1。此选项的好处是,它允许您创建一个空白产品页面,以在页面中创建分层列表,但如果有人试图转到空白产品页面,他们将被重定向。

    SO网友:Rob

    转到“外观”,然后单击菜单。在本节中,转到“菜单结构”下,单击向下箭头展开页面,您将看到一个显示“禁用链接”的框。选中该框并保存。

    SO网友:niente0

    我这样解决:在header.php (关于你的主题)我搜索了:

    \'link_before\'     => \'\',
    \'link_after\'      => \'\',
    
    并替换为:

    \'link_before\'     => \'<script>var scriptTag=document.getElementsByTagName("script");scriptTag=scriptTag[scriptTag.length-1];if(scriptTag.parentNode.href)if(scriptTag.parentNode.href.slice(-1)=="#")document.write("<span onclick=\\"return false\\">")</script>\',
    \'link_after\'      => \'<script>var scriptTag=document.getElementsByTagName("script");scriptTag=scriptTag[scriptTag.length-1];if(scriptTag.parentNode.href)if(scriptTag.parentNode.href.slice(-1)=="#")document.write("</span>")</script>\',
    
    简单地说,该脚本检查其父链接是否以“#”结尾,在这种情况下,它会在标记的内容周围添加一个span元素,从而禁用单击。

    希望有帮助:-)

    SO网友:DavGarcia

    从2019年1月开始,产生合适HTML5的解决方案是执行以下操作。

    添加URL设置为#的自定义链接,以及您想要的任何名称。这两个字段都是必填字段这将生成一个顶级nav,即<a>Menu</a> 这是表示不可单击链接的正确方法。

    SO网友:hugobq

    如前所述,创建自定义链接菜单。查看源代码并查找子菜单的href,例如:#mm-1。将其粘贴到自定义链接的URL中并保存菜单。这将使移动版本在您点击菜单文本时也能正常工作。

    SO网友:Alex_t

    我的版本如下所示:

    首先,在管理面板的菜单中,在href 现场put# 或者让它空着,然后进去function.php 添加主题:

    function replace_empty_menu_links( $item_output, $item, $depth, $args ) {
      if ( $item->url == \'#\' || $item->url == \'\' ) {
        $item_output = sprintf( \'%1$s<\' . \'div\' . \'%2$s>%3$s%4$s%5$s</\' . \'div\' . \'>%6$s\',
          $args->before,
          $attributes,
          $args->link_before,
          apply_filters( \'the_title\', $item->title, $item->ID ),
          $args->link_after,
          $args->after
        );
      }
      return $item_output;
    }
    add_filter( \'walker_nav_menu_start_el\', \'replace_empty_menu_links\', 10, 4 );
    
    您可以替换\'div\' 任何适合你的元素。

    这适用于版本5.3.2(在此版本中进行了测试,但也应适用于其他版本)。

    在这种形式下,所有参数的工作\'before\', \'after\', \'link_before\', \'link_after\', 等来自wp_nav_menu() 已保留。

    此外,这也适用于子菜单。

    SO网友:Jeff Vdovjak

    可以在另一个问题上找到更简单的解决方案:

    Admin Menu - Highlight top-level menu when on a sub-menu page (without showing sub-menu)

    寻找Askelon的答案。工作非常完美,无需进行任何preg\\u替换或jquery。

    SO网友:Karl Adler

    您可以禁用<a> 使用纯css标记所有一级菜单项。.main-menu 根据菜单命名,类可能有另一个名称。

    /* disable parent menu items */
    ul.main-menu > li > a {
        pointer-events: none;
    }
    

    结束

    相关推荐

    Menu API not switching menus?

    我正在使用菜单API,我想切换到其他菜单,但出于某种原因,它保留了第一个菜单这是我的密码在函数中。php add_action( \'init\', \'register_my_menus\',10 ); function register_my_menus() { register_nav_menu(\'main-navigation\', \'Main Navigation\'); } 下面是我的主题文件(header.ph