TIP 공유

Share Your Tips

워드프레스 운영 및 제작 노하우를 공유하고 함께 발전시켜 나갈 수 있습니다.
회원님들의 많은 참여 바랍니다.

Showing the current page’s parent’s sub-menu items from a custom nav menu in WordPress

기타
작성자
북극海
작성일
2016-09-21 00:28
조회
216

Showing the current page’s parent’s sub-menu items from a custom nav menu in WordPress


링크: http://wordpress.stackexchange.com/questions/32274/display-only-page-specific-sub-menu-items-using-custom-walker


functions.php 파일에 다음 코드 추가


class Custom_Walker_Nav_Sub_Menu extends Walker_Nav_Menu {


var $found_parents = array();


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


global $wp_query;


//this only works for second level sub navigations

$parent_item_id = 0;


$indent = ( $depth ) ? str_repeat( "t", $depth ) : '';


$class_names = $value = '';


$classes = empty( $item->classes ) ? array() : (array) $item->classes;


$class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) );

$class_names = ' class="' . esc_attr( $class_names ) . '"';




if ( ($item->menu_item_parent==0) && (strpos($class_names, 'current-menu-parent')) ) {

$output.= '

<li>';

}




// Checks if the current element is in the current selection

if (strpos($class_names, 'current-menu-item')

|| strpos($class_names, 'current-menu-parent')

|| strpos($class_names, 'current-menu-ancestor')

|| (is_array($this->found_parents) && in_array( $item->menu_item_parent, $this->found_parents )) ) {


// Keep track of all selected parents

$this->found_parents[] = $item->ID;


//check if the item_parent matches the current item_parent

if($item->menu_item_parent!=$parent_item_id){


$output .= $indent . '<li id="menu-item-'. $item->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 );

}




}

}


function end_el(&$output, $item, $depth) {

// Closes only the opened li

if ( is_array($this->found_parents) && in_array( $item->ID, $this->found_parents ) ) {

$output .= "</li>n";

}

}


function end_lvl(&$output, $depth) {

$indent = str_repeat("t", $depth);

// If the sub-menu is empty, strip the opening tag, else closes it

if (substr($output, -22)=="<ul class="sub-menu">n") {

$output = substr($output, 0, strlen($output)-23);

} else {

$output .= "$indent</ul>n";

}

}


}


 


sidebar.php 에 다음 코드 추가


$menu_args = array(

'walker' => new Custom_Walker_Nav_Sub_Menu(),

'container' => '',

'menu_class' => 'sister-pages',

s);

wp_nav_menu($menu_args);


 



 


How-to get a menu label via $post-> or $page->ID


(현재 페이지 1depth 메뉴의 label 추출)


링크:  http://stackoverflow.com/questions/22806170/how-to-get-a-menu-label-via-post-or-page-id


functions.php에 다음 코드 추가


function get_menu_label_by_post_id($post_id, $menu) {


$menu_title = '';

$nav = wp_get_nav_menu_items($menu);


foreach ( $nav as $item ) {


if ( $post_id == $item->object_id ) {

$menu_title = $item->post_title;

break;

}


}


return ($menu_title !== '') ? $menu_title : get_the_title($post_id);


}


 


sidebar.php에 다음 코드 추가


echo get_menu_label_by_post_id($post->ID, 'gnb');

전체 0

위로이동