위젯에서 작성된 메뉴에 사용자 정의 워커 추가


10

테마 ( primary이 예제에서 이름 이 지정된 메뉴)로 작성된 사용자 정의 메뉴에 Walker를 추가하는 방법을 알고 있지만 기본 wordpress 사용자 정의 메뉴 위젯으로 위젯에서 작성된 메뉴를 어떻게 대상으로 지정할 수 있습니까?

if ( has_nav_menu( 'primary' ) ) {

$args = array(
    'menu' => 'main-menu',
    'menu_id' => 'main-menu',
    'theme_location' => 'primary',
    'depth' => 0,
    'container' => false,
    'menu_class' => 'nav',
    'walker' => new Myprefix_Walker_Nav_Menu(),
    'echo' => 0
);

$nav = wp_nav_menu( $args );

}

답변:


14

WP_Nav_Menu_Widget클래스 구현을 보면 다음 코드가 표시됩니다.

function widget($args, $instance) {
    // Get menu
    $nav_menu = ! empty( $instance['nav_menu'] ) ? wp_get_nav_menu_object( $instance['nav_menu'] ) : false;

    if ( !$nav_menu )
        return;

    $instance['title'] = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base );

    echo $args['before_widget'];

    if ( !empty($instance['title']) )
        echo $args['before_title'] . $instance['title'] . $args['after_title'];

    wp_nav_menu( array( 'fallback_cb' => '', 'menu' => $nav_menu ) );

    echo $args['after_widget'];
}

메뉴를 연결할 기회가 없음을 의미합니다. 따라서 wp_nav_menu다음 코드 줄을 찾을 수있는 함수 구현을 살펴 봐야 합니다.

$defaults = array(
  'menu' => '',
  'container' => 'div',
  'container_class' => '',
  'container_id' => '',
  'menu_class' => 'menu',
  'menu_id' => '',
  'echo' => true,
  'fallback_cb' => 'wp_page_menu',
  'before' => '',
  'after' => '',
  'link_before' => '',
  'link_after' => '',
  'items_wrap' => '<ul id="%1$s" class="%2$s">%3$s</ul>',
  'depth' => 0,
  'walker' => '',
  'theme_location' => ''
);

$args = wp_parse_args( $args, $defaults );
$args = apply_filters( 'wp_nav_menu_args', $args );
$args = (object) $args;

여기서 wp_nav_menu함수에 전달 된 모든 인수를 바꿀 수 있음을 알 수 있습니다. 따라서 필요한 것은 워커를 탐색 메뉴에 추가하는 고유 한 후크 처리기를 만드는 것입니다. 다음과 같이 간단 할 수 있습니다.

function myplugin_custom_walker( $args ) {
    return array_merge( $args, array(
        'walker' => new My_Custom_Walker(),
        // another setting go here ... 
    ) );
}
add_filter( 'wp_nav_menu_args', 'myplugin_custom_walker' );

감사합니다. 이것이 모든 메뉴의 기본값 인 것처럼 보입니다. 내가 이것을 사용할 때이 워커가있는 모든 메뉴가 붙어 있다고 가정 할 수 있습니까? 내가 tryed 때문에 'walker' => new Walker_Nav_Menu()하나 개의 메뉴에 대한 워드 프레스 기본 워커가되기 위해 다시 재정의 내 특정 메뉴의 인수,하지만 슬프게도이되지 작동하지.
amy

@amy 예, 모든 메뉴의 기본값입니다.
Eugene Manuilov

@amy args를 검사하는 코드를 포함시킬 수 있습니다. 그런 다음 워커 적용 여부에 관계없이 if 조건을 지정하십시오.
Wayne

4

@Eugene의 답변을 확장하여 특정 메뉴로 제한하려면 메뉴의 용어 ID를 확인하십시오.

function custom_nav_args($args){
$menu = $args['menu'];
    if($menu->term_id === 17)  /* replace term_id with menu id, or use $menu->name to do it by menu name*/
    {
        $args['walker'] = new My_Custom_Walker();
    }
    return $args;
}
add_filter('wp_nav_menu_args', 'custom_nav_args');

사이드 바 ID로 어떻게 필터링합니까?
Steven Vachon

1

이것은 메뉴를 대상으로하는 대안 term_id이며 ID를 조회하지 않고도 여러 메뉴를 수정하는 방법으로 누군가에게 유용 할 수 있다고 생각했습니다.

print_r($args)필터에 추가 하면 $args['menu']미리 정의 된 테마 위치의 메뉴와 WP_Term_Object사이드 바의 사용자 정의 메뉴 위젯에 대한 문자열 임을 알 수 있습니다.

나는 이것을 슬러그로 메뉴를 목표로 삼고 컨테이너에 클래스를 추가했습니다. 슬러그에 공통 문자열을 포함시켜 많은 메뉴를 타겟팅 할 수 있습니다. 참고 : 메뉴 슬러그는의 배열 키에서 제공 register_nav_menus()됩니다.

function my_menu_thingy( $args ) {
  if( is_object($args['menu']) && strpos($args['menu']->{slug},'my-common-string') !== false ) {
    $args['walker'] = new My_Custom_Walker();
  }
  return $args;
}
add_filter( 'wp_nav_menu_args', 'my_menu_thingy' );

단일 메뉴 $args['menu']->{slug} == 'your-slug'의 경우 위의 strpos () 비트 대신 해당 메뉴를 확인하면 됩니다.


1

widget_nav_menu_argswordpress에 추가 된 필터를 사용하여 위젯에서 작성된 탐색 메뉴에 사용자 정의 워커를 추가 할 수 있습니다 4.2.0. 네 개의 인수를 허용합니다 (참조 wp-includes/widgets/class-wp-nav-menu-widget.php). 그러나 사용자 정의 워커 만 추가하려면 wp_nav_menu_args필터 를 사용하는 것과 같은 방식으로 첫 번째 인수 만 사용하면 됩니다.

    add_filter('wp_nav_menu_args', 'my_args'); //for menus
    add_filter('widget_nav_menu_args', 'my_args'); //for menus in widgets
    function my_args($args) { //$args is only argument needed to add custom walker
       return array_merge( $args, array(
          'walker' => new My_Custom_Walker(),
       ) );
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.