使用wp_NAV_MENU制作面包屑

时间:2013-01-26 作者:jtwg

我正在寻找一种快速而肮脏的方法来在WP站点上输出面包屑导航,而不需要安装插件,也不需要利用内置的WP菜单。

这是我想到的。我很想知道我是否缺少一个更好的解决方案,和/或这样做是否有任何明显的错误。到目前为止,在我的测试中,它运行得很好。

class BreadcrumbWalker extends Walker_Nav_Menu {
    private $i_current_page_id;
    private $i_depth;
    private $a_output;

    function __construct() {
        // sets our current page so we know when to exit
        $this->i_current_page_id = get_queried_object()->ID;
    }

    function start_lvl(&$output, $depth=0, $args=array()) {
        // increment the depth every time a new ul is entered
        $this->i_depth++;
    }

    function end_lvl(&$output, $depth=0, $args=array()) {
        // decrement the depth when we exit a ul
        $this->i_depth--;
    }

    function start_el(&$output, $item, $depth=0, $args=array()) {
        // if this value is zero, we\'re starting a new branch
        if($item->menu_item_parent == 0) {
            // reset the output array and depth counters
            $this->a_output = array();
            $this->i_depth = 0;
        }
        // if we haven\'t set the representative menu item for this depth, do so
        if(!isset($this->a_output[$this->i_depth])) {
            $this->a_output[$this->i_depth] = \'<a href="\' . get_permalink($item->object_id) . \'">\' . $item->title . \'</a>\';
        }
    }

    function end_el(&$output, $item, $depth=0, $args=array()) {
        if($this->i_current_page_id == $item->object_id) {
            // check to see if this is our last item, if so display the breadcrumb
            if($this->i_depth > 0) {
                // but only show it if we actually have a breadcrumb trail
                $this->display_breadcrumb();
            }
        } else {
            // if not, unset the item for this depth since this isn\'t what we\'re going to display
            unset($this->a_output[$this->i_depth]);
        }
    }

    function display_breadcrumb() {
        // implode our array into a string
        echo implode(\' &raquo; \', $this->a_output);
    }
}
基本上,我所做的是使用Walker\\u Nav\\u菜单方法来设置一个输出数组,该数组使用深度作为其键,并且一旦调用end\\u el方法,如果不是页面的ID作为面包屑的结尾,它将在该深度处取消设置该项,并在该数组上不断迭代。如果ID正确,则调用display\\u breadcrumb方法输出菜单。

提前感谢您的任何意见。我觉得可能有更好的方法来做到这一点,但目前我很困惑这可能是什么。

干杯

3 个回复
SO网友:Jules

我简直不敢相信没有一个免费的插件可以做到这一点。所以我写了自己的函数。给你。只需将此复制到您的函数。php:

function my_breadcrumb($theme_location = \'main\', $separator = \' &gt; \') {
    
    $theme_locations = get_nav_menu_locations();
    
    if( ! isset( $theme_locations[ $theme_location ] ) ) {
        return \'\';
    }
    
    $items = wp_get_nav_menu_items( $theme_locations[ $theme_location ] );
    _wp_menu_item_classes_by_context( $items ); // Set up the class variables, including current-classes
    $crumbs = array();

    foreach($items as $item) {
        if ($item->current_item_ancestor || $item->current) {
            $crumbs[] = "<a href=\\"{$item->url}\\" title=\\"{$item->title}\\">{$item->title}</a>";
        }
    }
    echo implode($separator, $crumbs);
}
然后,您可以在主题的任何位置输出面包屑,如下所示:

<?php my_breadcrumb(\'menu-slug\'); ?>
通过省略$theme\\u location参数并获取每个可用菜单的列表,只在$crumbs数组不为空时输出结果,可以轻松扩展此代码。我可能会写一篇关于这个的博客文章,或者很快把它变成一个免费的插件。随时更新您的信息。

您还可以通过检查$item->;为当前项目添加类或不同的标记;现在的

SO网友:laychinhan

这是我为zurb foundation 5面包屑元素开发的walker类,如果您想在无序列表标记中显示面包屑,这将非常有用。

      class BreadCrumbWalker extends Walker_Nav_Menu
      {

        function start_lvl( &$output, $depth = 0, $args = array() )
        {
        }

        function end_lvl( &$output, $depth = 0, $args = array() )
        {
        }

        function start_el( &$output, $item, $depth, $args )
        {

          //Check if menu item is an ancestor of the current page
          $classes           = empty( $item->classes ) ? array() : (array)$item->classes;

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

          if( in_array(\'current-menu-item\', $classes) OR in_array( \'current-menu-parent\', $classes ) ){
            //Link tag 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 ) . \'"\' : \'\';

            //Add to the HTML output

            if( in_array(\'current-menu-item\', $classes) ){
              $output .= \'<li>\'.$title.\'</li>\';
            }else{
              $output .= \'<li><a\' . $attributes . \'>\' . $title . \'</a></li>\';
            }

          }//if current

        }//start_el

      }

SO网友:user1924165

为什么不做类似的事情;

function the_breadcrumb() {
if (!is_home()) {
    echo \'<a href="\';
    echo get_option(\'home\');
    echo \'">\';
    bloginfo(\'name\');
    echo "</a> » ";
    if (is_category() || is_single()) {
        the_category(\'title_li=\');
        if (is_single()) {
            echo " » ";
            the_title();
        }
    } elseif (is_page()) {
        echo the_title();
    }
}
}
然后,无论你想在哪里使用它们;

<?php the_breadcrumb(); ?>

结束

相关推荐

Remove menus and submenus

所以我找到了一些方便的代码片段来帮助删除管理菜单项。但是,我对子菜单项有问题。我想保留外观菜单,但去掉主题、小部件和编辑器。function remove_menus() { global $menu; global $current_user; get_currentuserinfo(); if($current_user->user_login == \'username\') { $restricted = array(__(\'