WordPress 메뉴 항목에 데이터 속성을 추가하는 방법


17

Twitter Bootstrap이고 메뉴 링크 태그에 data-toggle = "modal"속성을 추가해야합니다. 대부분의 모든 결과 참조를 검색하면 Twitter Bootstrap 드롭 다운 메뉴 걷기를 수행하지만이 메뉴에는 드롭 다운이 없으며 특정 속성 만 추가하면됩니다.

다음 나는 이것을 발견했다 : 플러그인없이 메뉴 항목에 사용자 정의 속성을 추가하십시오 .WordPress 3.6 이상에서 볼 때 매우 유용합니다. 더 이상 복잡한 보행기를 할 필요가 없으며 대신 이것을 사용할 수 있습니다 : http://codex.wordpress.org/Plugin_API / Filter_Reference / nav_menu_link_attributes

그러나이 실행 시점에서 API 참조는 거의 없으며 예제를 제공하지 않으며 너무 새롭기 때문에 Google에 대한 참조는 거의 없습니다.

나는 이것을 먼저 시도했다.

add_filter( 'nav_menu_link_attributes', 'mywp_contact_menu_atts', 10, 3 );

function pb_contact_menu_atts( $atts, $item, $args )
{
    // inspect $item, then …
    $atts['data-toggle'] = 'modal';
    return $atts;
}

그것은 예상대로 작동하지만 메뉴의 모든 a 태그에 속성을 추가합니다. 그래서 # menu-item-7857 a 등으로 하나의 메뉴 항목을 타겟팅하는 방법을 알아 내려고합니다.

메뉴 항목을 타겟팅하는 예를 어디에서 찾을 수 있는지 또는 위의 링크 된 API 참조에있는 정보를 기반으로하는 방법을 결정할 수있는 사람이 있습니까?

참고로 다음 예제를 찾았지만 도움이되지 않지만 올바른 방향에있을 수있는 자식이있는 항목 만 대상으로합니다.

add_filter('nav_menu_link_attributes', function($atts, $item, $args) {
    if ( $args->has_children )
    {
        $atts['data-toggle'] = 'dropdown';
        $atts['class'] = 'dropdown-toggle';
    }

    return $atts;
}, 10, 3);

업데이트-아래의 유일한 대답은 무언가에있는 것처럼 들리지만 실제로 특정 링크를 대상으로하는 숫자를 찾는 방법과 실제 예제에서 해당 조건을 추가하는 위치 / 방법을 결정할 수 없었습니다. 댓글을 추가했지만 듣지 못했습니다. 약 18 일 동안 현상금이 도움이 될지 알 것으로 생각했습니다.

링크의 코드를 볼 때 타겟팅하고 싶습니다.

<li id="menu-item-7858" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-7858"><a href="#" data-toggle="modal">Chat</a></li>

7858이라는 숫자가 표시되므로 타겟팅해야하는 숫자 일 수 있습니다.

그러나 예를 들어 시도하면 :

add_filter( 'nav_menu_link_attributes', 'my_chat_menu_atts', 10, 3 );


function my_chat_menu_atts( $atts, $item, $args ) {
    if ( 7857 == $item['ID'] ) {
        // inspect $item, then …
        $atts['onclick'] = 'SnapEngage.startLink();';
        return $atts;
    }
}

그러나 한 의견 제시자가 제안한 if 문을 추가하면 다음 오류가 발생합니다.

Fatal error: Cannot use object of type WP_Post as array

더 많은 코드가 필요하지만 잃어버린 것으로 가정합니다. if 문이없는 알림은 작동하지만 타겟팅하려는 하나의 링크가 아닌 모든 링크를 대상으로합니다.


<? php the_id ();?>를 $ atts 변수에 삽입하고 싶습니다. // $ item if ($ item-> ID == $ menu_target) {$ atts [ 'data-toggle'] = 'modal-<? php the_id ();?>'; } $ atts를 반환합니다. the_id를 $ atts 변수에 삽입하는 방법을 알려주세요. 감사합니다
nadzhq

답변:


36

원래 질문에서 제공 한 코드를 구체적으로 편집하십시오.

add_filter( 'nav_menu_link_attributes', 'wpse121123_contact_menu_atts', 10, 3 );
function wpse121123_contact_menu_atts( $atts, $item, $args )
{
  // The ID of the target menu item
  $menu_target = 123;

  // inspect $item
  if ($item->ID == $menu_target) {
    $atts['data-toggle'] = 'modal';
  }
  return $atts;
}

내가 한 내 자신의 가치 중 일부를 바꾼 후에! 감사합니다! 그것을 올바른 것으로 표시했지만 현상금을 수여하기 전에 23 시간 더 기다려야한다고 말합니다.
cchiera

도와 줄 수있어서 기뻐! : D
Jen

내일 현상금을 수여하는 것을 잊지 않도록 Fantastical에서 알림을 설정했습니다.
cchiera

대상으로 여러 메뉴 항목이있는 경우 어떻게합니까?
Eric Mitjans

데이터 토글 값이 다른 경우 여러 if 문을 사용하십시오. 또는 id를 배열 키에 저장하고 (고유 한 것으로 간주) 모달 이름을 배열 값으로 저장할 수 있습니다. 그런 다음 if 문을 확인하십시오array_key_exists()
Sisir

8

$item필터 함수에서 사용할 수있는 두 번째 인수에는 메뉴 항목 객체가 포함되어 있습니다. 덤프하면 다음과 같이 보입니다.

[1] => WP_Post Object
    (
        [ID] => 2220
        [post_author] => 1
        [post_date] => 2012-12-26 19:29:44
        [post_date_gmt] => 2012-12-26 17:29:44
        [post_content] => 
        [post_title] => Home
        [post_excerpt] => 
        [post_status] => publish
        [comment_status] => open
        [ping_status] => open
        [post_password] => 
        [post_name] => home-3
        [to_ping] => 
        [pinged] => 
        [post_modified] => 2013-06-05 01:55:20
        [post_modified_gmt] => 2013-06-04 22:55:20
        [post_content_filtered] => 
        [post_parent] => 0
        [guid] => http://dev.rarst.net/?p=2220
        [menu_order] => 1
        [post_type] => nav_menu_item
        [post_mime_type] => 
        [comment_count] => 0
        [filter] => raw
        [db_id] => 2220
        [menu_item_parent] => 0
        [object_id] => 2220
        [object] => custom
        [type] => custom
        [type_label] => Custom
        [title] => Home
        [url] => http://dev.rarst.net/
        [target] => 
        [attr_title] => 
        [description] => 
        [classes] => Array
            (
                [0] => 
                [1] => menu-item
                [2] => menu-item-type-custom
                [3] => menu-item-object-custom
                [4] => current-menu-item
                [5] => current_page_item
                [6] => menu-item-home
            )

        [xfn] => 
        [current] => 1
        [current_item_ancestor] => 
        [current_item_parent] => 
    )

특정 메뉴 항목을 타겟팅하려면 조건을 공식화하고 객체에서 사용 가능한 데이터와 비교하여 확인해야합니다 (예 : if ( 2220 == $item['ID'] )


감사합니다! 특정 메뉴 항목의 $ item ID를 얻는 방법을 잘 모르겠습니다. 귀하의 예에서 2220은 또한 URL " dev.rarst.net/?p=2220 " 과 동일합니다 . 내 링크는 데이터 속성을 추가하여 다른 워드 프레스 URL로 이동하지 않고 오히려 href = "# ContactForm"입니다. 위의 예를 기반으로 더 많은 구글을 ​​검색하고 echo var_export ($ GLOBALS [ 'post'], TRUE); 그러나 개별 메뉴 항목 근처를 보면 고유 ID가 표시되지 않습니다. 당신은 명확히 할 수 있습니까? 또는 "if (2220 == $ item [ 'ID'])"에서 미리 감사드립니다!
cchiera

2
여러분이보고있는 오류 $item는 배열이 아닌 객체 이기 때문 입니다. 변화 $item['ID']에를 $item->ID.
Jen

1

왜 다른 방향에서이 문제에 접근하지 않습니까? id == ??로 메뉴 항목을 타겟팅하려고 시도하는 대신 특정 시점 (ID가 아닌 메뉴 항목)에서 변경 될 수있는 경우 WP 관리 영역을 사용하여 대상 메뉴 항목에 사용자 정의 클래스 를 추가하십시오 . 그런 다음 Javascript에서 해당 클래스를 사용하여 필요한 정보를 트리거하십시오.

$('.my-class').click(function(e){
  // do other stuff
  e.preventDefault;
});

내 자바 스크립트가 보장되지 않습니다. jQuery를 사용하지 않는 경우 이것을 시도 할 수 있습니다.


1

WordPress에서 만든 사용자 지정 메뉴에 데이터 문자를 추가하고 싶었습니다.

내가 선택한 단계는 다음과 같습니다.

  1. 내 메뉴의 ID 번호를 찾았습니다.
  2. @guiniveretoo에서 해당 코드 줄을 추가했습니다.
  3. 각 메뉴 항목에 대해 if 문을 작성했습니다 (다른 속성 값을 주입하기를 원했기 때문에).
  4. 일했다!

여기 내 코드가 있습니다.

add_filter( 'nav_menu_link_attributes', 'wpse121123_contact_menu_atts', 10, 3 );
function wpse121123_contact_menu_atts( $atts, $item, $args )
{  
  $menu_target = 6;

  if ($item->ID == $menu_target) {
    $atts['data-letters'] = 'PROJECTS';
  }

  elseif ($item->ID == 7) {
    $atts['data-letters'] = 'RESUME';
  }
  elseif ($item->ID == 8) {
    $atts['data-letters'] = 'ARTWORKS';
  }
  elseif ($item->ID == 9) {
    $atts['data-letters'] = 'HELLO!';
  }
  return $atts;
}

이것이 도움이되기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.