質問: wp_nav_menu()を使用してメニューツリーの一部/枝を表示する 私はwp adminで定義されたメニューを持っています。親ページにいるときはいつでもサイドバーにすべての子リンクを表示できるようにしたいです。たとえば、ユーザーが[会社情報]ページにいる場合、サイドバーに4つのリンクの一覧を緑色でハイライト表示します。 wp_nav_menu() のドキュメントを調べましたが、リンクを生成するときに開始点として使用する特定のメニューの特定のノードを指定するための組み込みの方法はありません。私は 同様の状況 の解決策を作成しました。これは親ページによって作成された関係に依存していましたが、特にメニューシステムを使用するものを探しています。任意の助けがいただければ幸いです。
回答: 私は助けるべきである修正された歩行者を作りました!完璧ではありません - それはいくつかの空の要素を残しますが、それはトリックを行います。修正は基本的にそれらの$ current_branchビットです。誰かに役立つことを願っています!class kanec_walker_nav_menu extends walker { /** * @see walker::$tree_type * @since 3.0.0 * @var string */ var $tree_type = array( 'post_type', 'taxonomy', 'custom' ); /** * @see walker::$db_fields * @since 3.0.0 * @todo decouple this. * @var array */ var $db_fields = array( 'parent' => 'menu_item_parent', 'id' => 'db_id' ); /** * @see walker::start_lvl() * @since 3.0.0 * * @param string $output passed by reference. used to append additional content. * @param int $depth depth of page. used for padding. */ function start_lvl(&$output, $depth) { $indent = str_repeat("\t", $depth); $output .= "\n$indent<ul class=\"sub-menu\">\n"; } /** * @see walker::end_lvl() * @since 3.0.0 * * @param string $output passed by reference. used to append additional content. * @param int $depth depth of page. used for padding. */ function end_lvl(&$output, $depth) { global $current_branch; if ($depth == 0) $current_branch = false; $indent = str_repeat("\t", $depth); $output .= "$indent</ul>\n"; } /** * @see walker::start_el() * @since 3.0.0 * * @param string $output passed by reference. used to append additional content. * @param object $item menu item data object. * @param int $depth depth of menu item. used for padding. * @param int $current_page menu item id. * @param object $args */ function start_el(&$output, $item, $depth, $args) { global $wp_query; global $current_branch; // is this menu item in the current branch? if(in_array('current-menu-ancestor',$item->classes) || in_array('current-menu-parent',$item->classes) || in_array('current-menu-item',$item->classes)) { $current_branch = true; } if($current_branch && $depth > 0) { $indent = ( $depth ) ? str_repeat( "\t", $depth ) : ''; $class_names = $value = ''; $classes = empty( $item->classes ) ? array() : (array) $item->classes; $classes[] = 'menu-item-' . $item->id; $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) ); $class_names = ' class="' . esc_attr( $class_names ) . '"'; $id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->id, $item, $args ); $id = strlen( $id ) ? ' id="' . esc_attr( $id ) . '"' : ''; $output .= $indent . '<li' . $id . $value . $class_names .'>'; $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 ) .'"' : ''; $item_output = $args->before; $item_output .= '<a'. $attributes .'>'; $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->id ) . $args->link_after; $item_output .= '</a>'; $item_output .= $args->after; $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args ); } } /** * @see walker::end_el() * @since 3.0.0 * * @param string $output passed by reference. used to append additional content. * @param object $item page data object. not used. * @param int $depth depth of page. not used. */ function end_el(&$output, $item, $depth) { global $current_branch; if($current_branch && $depth > 0) $output .= "</li>\n"; if($depth == 0) $current_branch = 0; } }