web-dev-qa-db-ja.com

Wp_nav_menuでブレッドクラムを作る

私は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_Nav_Menuメソッドを使用してdepthをキーとして使用する出力配列を設定し、end_elメソッドが呼び出されると、それがブレッドクラムの最後であるページのIDではない場合は、それを設定解除します。その深さにあるitemは配列を反復処理し続けます。正しいIDの場合、display_breadcrumbメソッドを呼び出してメニューを出力します。

ご意見ありがとうございます。これを行うにはおそらくもっと良い方法があるように思えますが、現時点ではそれがどうなるかについて困惑しています。

乾杯。

6
jtwg

私はこれを行う利用可能な単一の無料のプラグインがないと信じることができませんでした。それで私は私自身の機能を書きました。どうぞ。これを自分のfunctions.phpにコピーするだけです。

function my_breadcrumb($theme_location = 'main', $separator = ' &gt; ') {

    $items = wp_get_nav_menu_items($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_locationパラメータを省略して使用可能なすべてのメニューのリストを取得し、$ crumbs配列が空でない場合にのみ結果を出力することで簡単に拡張できます。私はこれについてブログ記事を書くか、またはすぐに無料のプラグインに変えるかもしれません。常に最新の状態に保ってください。

$ item-> currentをチェックして、現在の項目にクラスまたは別のマークアップを追加することもできます。

5
Jules

私はちょうどこれをするプラグインを書きました!

  • WPナビゲーションメニューに基づくブレッドクラム
  • リッチスニペット(Microdata)が含まれています
  • 3つの異なるスタイル
  • カスタムCSSエディタ
  • 各種設定
  • 多言語対応、今は英語だけ

あなたはそれを見つけることができます: http://codecanyon.net/item/wp-nav-menu-breadcrumbs/4706192

1
R3dRidle

これは私が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

      }
1
laychinhan

これに似たことをしないでください。

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(); ?>
0
user1924165