메뉴에 첫 번째 / 마지막 CSS 클래스 추가


15

자바 스크립트 해킹없이 가능합니까? 이처럼 :

<ul class="my_menu">
  <li class="first"> ... </li>
  <li> ... </li>
  <li> ... </li>
  <li class"with_sub"> ... 
    <ul class="my_menu_sub">
      <li class="first"> ... </li>
      <li> ... </li>
      <li> ... </li>
      <li class="last"> ... </li>
    </ul>
  </li>
  <li> ... </li>
  <li> ... </li>
  <li class="last"> ... </li>
</ul>

1
자바 스크립트 사용에 어떤 문제가 있습니까? 핵심 기능입니까? 아니면 점진적인 향상으로 볼 수 있습니까?
Mild Fuzz

답변:


14

더 좋고 간단한 접근법 :

function add_first_and_last($items) {
  $items[1]->classes[] = 'first-menu-item';
  $items[count($items)]->classes[] = 'last-menu-item';
  return $items;
}

add_filter('wp_nav_menu_objects', 'add_first_and_last');

1
좋고 간단합니다. 나는 그것을 좋아한다!
Jonathan Wold

이 코드가 사용자 정의 탐색 메뉴에서 작동하는 것을 보았습니다 (사용자 정의 메뉴 위젯에서 작동하는 것을 보았습니다).하지만 기본 탐색 표시 줄 (Twenty Eleven에서 테스트 됨)에서 사용되는 동일한 메뉴에서 작동하지 않습니다. 그래야합니까? 아니면 다른 코드입니까? 아니면 다른 필터입니까? 감사!
Evan Mattson

2
단일 레벨 메뉴에서는 작동하지만이 시점에서는 최상위 레벨이 아닌 모든 항목으로 배열되므로 더 복잡한 메뉴에서는 작동하지 않을 수 있습니다.
Rarst

6

다음은 메뉴 출력을 수정하고 첫 번째 클래스와 마지막 클래스를 첫 번째 클래스와 마지막 클래스에 추가하는 거친 스 니펫입니다 ( ul이 단계에서는 외부 가 적용되지 않으므로 계산되지 않음). 참고-PHP5가 필요합니다strripos()

add_filter( 'wp_nav_menu_items', 'first_last_class' );

function first_last_class( $items ) {

    $first = strpos( $items, 'class=' );

    if( false !== $first )
         $items = substr_replace( $items, 'first ', $first+7, 0 );

    $last = strripos( $items, 'class=');

    if( false !== $last )
         $items = substr_replace( $items, 'last ', $last+7, 0 );

    return $items;
}

중첩 목록을 처리하는 방법에 약간의 어려움이 있지만 적어도 시작해야합니다.


6

다음은 첫 번째 / 마지막 클래스를 부모 메뉴 항목에만 추가하는 기능입니다. 대부분의 CSS 스타일링에는 이것이 필요한 전부입니다.

function nav_menu_add_classes( $items, $args ) {
    //Add first item class
    $items[1]->classes[] = 'menu-item-first';

    //Add last item class
    $i = count($items);
    while($items[$i]->menu_item_parent != 0 && $i > 0) {
        $i--;
    }
    $items[$i]->classes[] = 'menu-item-last';

    return $items;
}
add_filter( 'wp_nav_menu_objects', 'nav_menu_add_classes', 10, 2 );

1
정확히 내가 찾던 것. 감사. 자동으로이 작업을 수행하지 않습니다 wp_nav_menu 의외의 종류의
yitwail

나는 동의한다. Wordpress 버그 추적기에서 잠시 동안 기능 요청이 있었지만 아무것도 없었습니다. 최소한 적절한 필터가 존재하므로 이러한 클래스를 추가 할 수 있습니다.).
Chaoix

1
감사. 메뉴 워커에서 사용할 수있는 카운터를 찾고있었습니다. 당신의 대답은 이것을 허용합니다. 방금 $ item-> number = $ i; 워커에 넣었습니다. 감사!!!
BasTaller

5

워드 프레스 3 의 새로운 메뉴 API 에 대해 자세히 알아보십시오 . 클래스 자체의 요소를 수동으로 지정할 수 있습니다. 또한 일단 마스터하면 메뉴를 편집하는 것이 즐겁습니다.


2
이것은 관리자의 탐색 메뉴 화면을 불러 와서 첫 번째 항목과 마지막 항목에 클래스를 추가하는 방법입니다. 물론 사용자가 이러한 메뉴 항목을 이동하면 클래스를 다시 할당해야하지만 코딩이 관련되지 않았기 때문에 가장 유효하고 최상의 답변이라고 생각합니다.
t31os

5

중첩 메뉴가있는 경우

function add_first_and_last($items) {
    // first class on parent most level
    $items[1]->classes[] = 'first';
    // separate parents and children
    $parents = $children = array();
    foreach($items as $k => $item){
        if($item->menu_item_parent == '0'){
            $parents[] = $k;
        } else {
            $children[$item->menu_item_parent] = $k;
        }
    }
    // last class on parent most level
    $last = end(array_keys($parents));
    foreach ($parents as $k => $parent) {
        if ($k == $last) {
            $items[$parent]->classes[] = 'last';
        }
    }
    // last class on children levels
    foreach($children as $child){
        $items[$child]->classes[] = 'last';
    }
    // first class on children levels
    $r_items = array_reverse($items, true);
    foreach($r_items as $k => $item){
        if($item->menu_item_parent !== '0'){
            $children[$item->menu_item_parent] = $k;
        }
    }
    foreach($children as $child){
        $items[$child]->classes[] = 'first';
    }
    return $items;
}
add_filter('wp_nav_menu_objects', 'add_first_and_last');

나는 Ismaelj의 대답의 단순함을 좋아하지만 하위 메뉴 클래스를 원한다면 더 많은 것이 필요합니다.


2

IE8 이하를 지원할 필요가없는 경우 순수 CSS를 사용할 수도 있습니다.

.my_menu > :first-child,
.my_menu > :last-child {
    /* some styles */
}

jQuery 브라우저 지원은 훨씬 나아지지만 피하려고하는 것 같습니다.


마지막 자식은 이제 IE 9에서도 지원되므로 8, 7에 대해서는 더 이상 신경 쓰지 않습니다.
Alex

2

다음은 중첩 하위 메뉴에 대한 지원을 포함하는 첫 번째 및 마지막 메뉴 항목 클래스를 추가하기위한 더 나은 코드입니다.

add_filter( 'wp_nav_menu_objects', 'tgm_filter_menu_class', 10, 2 );
/**
 * Filters the first and last nav menu objects in your menus
 * to add custom classes.
 *
 * This also supports nested menus.
 *
 * @since 1.0.0
 *
 * @param array $objects An array of nav menu objects
 * @param object $args Nav menu object args
 * @return object $objects Amended array of nav menu objects with new class
 */
function tgm_filter_menu_class( $objects, $args ) {

    // Add first/last classes to nested menu items
    $ids        = array();
    $parent_ids = array();
    $top_ids    = array();
    foreach ( $objects as $i => $object ) {
        // If there is no menu item parent, store the ID and skip over the object
        if ( 0 == $object->menu_item_parent ) {
            $top_ids[$i] = $object;
            continue;
        }

        // Add first item class to nested menus
        if ( ! in_array( $object->menu_item_parent, $ids ) ) {
            $objects[$i]->classes[] = 'first-menu-item';
            $ids[]          = $object->menu_item_parent;
        }

        // If we have just added the first menu item class, skip over adding the ID
        if ( in_array( 'first-menu-item', $object->classes ) )
            continue;

        // Store the menu parent IDs in an array
        $parent_ids[$i] = $object->menu_item_parent;
    }

    // Remove any duplicate values and pull out the last menu item
    $sanitized_parent_ids = array_unique( array_reverse( $parent_ids, true ) );

    // Loop through the IDs and add the last menu item class to the appropriate objects
    foreach ( $sanitized_parent_ids as $i => $id )
        $objects[$i]->classes[] = 'last-menu-item';

    // Finish it off by adding classes to the top level menu items
    $objects[1]->classes[] = 'first-menu-item'; // We can be assured 1 will be the first item in the menu :-)
    $objects[end( array_keys( $top_ids ) )]->classes[] = 'last-menu-item';

    // Return the menu objects
    return $objects;

}

당신은 요점을 찾을 수 있습니다 여기 및 관련 튜토리얼 여기를 .



0

순수한 CSS는 나를 위해 작동합니다. 하위 메뉴에서도 작동합니다.

ul.nav>li:last-of-type a

IE9 이상에서만 내가 할 수있는 거의 모든 것을 배제한다 :)
Milo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.