【问题标题】:How to add a custom item to a specific WordPress menu item position如何将自定义项添加到特定的 WordPress 菜单项位置
【发布时间】:2014-05-02 14:08:24
【问题描述】:

我注册并显示了一个主菜单,其中包含 4 个链接(主页、关于、新闻、博客)。我想在第二个和第三个菜单之间添加 html(徽标),我想知道这是否可能。

这是一个图表: 主页 |关于 |标志 |新闻 |博客

我正在查看挂钩 wp_nav_menu_items 但我只能将自定义项目添加到第一个位置或最后一个位置。

在我使用 jQuery 添加 html 之前,但由于 DOM 必须完全加载,所以徽标最后加载,我试图让徽标首先显示或与页面内容同时显示。

【问题讨论】:

    标签: php wordpress menu


    【解决方案1】:

    我用这种方式解决了类似的问题:

    add_filter('wp_nav_menu_items','add_custom_in_menu', 10, 2);
    
    function add_custom_in_menu( $items, $args ) 
    {
        if( $args->theme_location == 'primary' ) // only for primary menu
        {
            $items_array = array();
            while ( false !== ( $item_pos = strpos ( $items, '<li', 3 ) ) )
            {
                $items_array[] = substr($items, 0, $item_pos);
                $items = substr($items, $item_pos);
            }
            $items_array[] = $items;
            array_splice($items_array, 2, 0, '<li>custom HTML here</li>'); // insert custom item after 2nd one
    
            $items = implode('', $items_array);
        }
        return $items;
    }
    

    请注意,它仅适用于单级菜单。

    【讨论】:

    • 我还没有尝试过这种方法,因为 Stewartside 建议的 css 方法适合我的项目。尽管如此,这对其他人来说仍然是一个很好的参考。
    【解决方案2】:

    Compass 解决方案的变化很小,摆脱了循环。

    add_filter('wp_nav_menu_items','add_custom_in_menu', 10, 2);
    
    // add in Logo in the middle of the menu
    //
    function add_custom_in_menu( $items, $args )
    {
        if( $args->theme_location == 'footer_navigation' )
        {
            $new_item       = array( '<li class="menu-logo"><a href="/"><img src="' . get_template_directory_uri() . '/assets/img/logo.png" alt=""></a></li>' );
            $items          = preg_replace( '/<\/li>\s<li/', '</li>,<li',  $items );
    
            $array_items    = explode( ',', $items );
            array_splice( $array_items, 2, 0, $new_item ); // splice in at position 3
            $items          = implode( '', $array_items );
        }
        return $items;
    }
    

    不确定使用内置函数是否会快得多。你的选择

    【讨论】:

      【解决方案3】:

      PHP 版本

      一种方法是创建 2 个导航菜单,然后使用它们。

      header_menu_1 |标志 | header_menu_2

      在后端,您需要创建一个新的标题位置,然后向其中添加 2 个菜单项。

      然后在你的header.php 文件中,有这个代码。

      <?php
          $args1 = array( 'menu' => 'header_menu_1' );
          $args2 = array( 'menu' => 'header_menu_2' );
          wp_nav_menu($args1);
      ?>
      
      <img src="LOGO SOURCE" />
      
      <?php
          wp_nav_menu($args2);
      ?>
      

      这将是最简单的方法,无需使用 jQuery 或使用插件。

      WP Nav Menu

      Adding New WordPress Menus

      jQuery 版本

      $(document).ready(function() {
          var i = 1;
          $('ul li').each(function() {
              if(i == 2) {
                  $(this).after('<img src="http://www.socialtalent.co/images/blog-content/so-logo.png" width="250" />');
              }
              i++;
          });
      });
      

      Demo

      CSS 版本

      这是一种非常肮脏的黑客方式。

      使用 nth-child 选择第二个和第三个元素。这两个项目的中间都有更多的边距,所以第二个元素右边距为 30px,第三个元素左边距为 30px。

      然后将带有logo的div放在绝对中间。

      例子:

      CSS:

      #container {
          width: 100%;
      }
      
      ul {
          display: block;
          width: 100%;
      }
      li {
          display: inline-block;
          width: 15%;
          padding: 1.25%;
          margin: 1.25%;
          background: blue;
      }
      
      li:nth-child(2) {
          margin-right:10%;
      }
      li:nth-child(3) {
          margin-left: 10%;
      }
      
      #container img {
          width: 20%;
          position: absolute;
          left: 50%;
          margin-left: -7.5%;
      }
      

      HTML:

      <div id="container">
          <img src="http://cdn.sstatic.net/stackexchange/img/logos/so/so-logo.png" />
          <ul>
              <li>Home</li>
              <li>Home</li>
              <li>Home</li>
              <li>Home</li>
          </ul>
      </div>
      

      Demo

      【讨论】:

      • 是的,我正在考虑这样做,但我的客户只想管理一个菜单。我只是不知道从哪里开始。我必须与 walker 类一起工作吗?
      • 在 jQuery 中试试可以吗?如果可以的话,我看看我能不能快速把东西拼在一起。
      • 现在我正在使用 jQuery 在第二项之后添加 html 标记。同样,因为必须首先加载 DOM,所以徽标最终会被最后加载,我需要它先加载或与内容一起加载。除非有办法告诉 jQuery 在 DOM 完成加载之前的正确时间立即添加标记。
      • 我不太清楚为什么最后加载的标志太重要了。除非您有一个内容非常丰富的网页,否则内容将只有几毫秒的差异。我已经将我使用的 jquery 添加到我的答案中。
      • 加载所有内容后,徽标会在这些菜单之间弹出。我目前正在使用此代码:'$('.nav li:eq(2)').after("
      • ");'你可以在本站看到:againstallgrain
      【解决方案4】:
      function add_admin_link($items, $args){
          if( $args->menu_id == 'header_menu' ){
              $items .= '<li class="nav-item">Paste the text or code here</li>';
          }
          return $items;
      }
      add_filter('wp_nav_menu_items', 'add_admin_link',20,2);
      

      【讨论】:

      • 在 WordPress 的 functions.php 文件中定义这个函数
      猜你喜欢
      相关资源
      最近更新 更多
      热门标签