Cách thêm thuộc tính dữ liệu vào mục menu WordPress


17

Tôi là Twitter Bootstrap và cần thêm thuộc tính data-toggle = "modal" vào thẻ liên kết menu. Khi tìm kiếm hầu hết tất cả các tham chiếu kết quả thực hiện việc đi bộ cho các menu thả xuống Bootstrap của Twitter tuy nhiên menu này không có danh sách thả xuống và tôi chỉ cần thêm thuộc tính cụ thể.

Tiếp theo tôi đã tìm thấy điều này: Thêm thuộc tính tùy chỉnh vào các mục menu không có plugin rất hữu ích vì nó xuất hiện trong WordPress 3.6+, chúng tôi không còn phải thực hiện các bước đi phức tạp dài và thay vào đó có thể sử dụng điều này: http://codex.wordpress.org/Plugin_API / Filter_Reference / nav_menu_link_attribut

Tuy nhiên, do hoạt động này mà tham chiếu API khá trống rỗng và không có ví dụ nào và vì nó rất mới nên có rất ít tài liệu tham khảo về nó trên Google.

Tôi đã thử điều này đầu tiên:

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;
}

và điều đó không hoạt động tuy nhiên như mong đợi sẽ thêm thuộc tính cho tất cả các thẻ trong menu. Vì vậy, tôi đang cố gắng tìm ra cách nhắm mục tiêu một mục menu với # menu-item-7857 a hoặc tương tự.

Có ai biết nơi để tìm một ví dụ về việc nhắm mục tiêu một mục menu hoặc có thể xác định cách dựa vào thông tin trong tham chiếu API được liên kết ở trên không?

Để lưu ý, tôi đã tìm thấy một ví dụ sau đây nhưng nó chỉ nhắm mục tiêu các mục có con không giúp ích nhưng có thể đi đúng hướng:

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);

CẬP NHẬT - Câu trả lời duy nhất dưới đây nghe có vẻ giống với một cái gì đó nhưng từ đó không thể xác định làm thế nào để thực sự tìm thấy số để nhắm mục tiêu liên kết cụ thể của tôi và nơi / cách thêm điều kiện đó vào một ví dụ hoạt động. Đã thêm một bình luận nhưng không nghe lại. Kể từ khoảng 18 ngày, tôi nghĩ rằng liệu tiền thưởng có giúp được gì không.

Khi tôi nhìn vào mã cho liên kết tôi muốn nhắm mục tiêu:

<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>

Tôi thấy số 7858 nên nghĩ có lẽ đó là số tôi nên nhắm mục tiêu.

Nhưng khi tôi thử chẳng hạn:

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;
    }
}

Tuy nhiên, thêm vào đó nếu câu lệnh mà một người bình luận đề nghị tôi gặp phải lỗi sau:

Fatal error: Cannot use object of type WP_Post as array

Tôi giả sử cần nhiều mã hơn nhưng bị mất. Như một lời nhắc mà không có câu lệnh if, nó hoạt động tuy nhiên nó nhắm mục tiêu tất cả các liên kết chứ không phải là một liên kết tôi muốn nhắm mục tiêu.


Tôi muốn chèn <? Php the_id ();?> Vào biến $ atts. Một cái gì đó tương tự // kiểm tra $ item if ($ item-> ID == $ menu_target) {$ atts ['data-toggle'] = 'phương thức - <? php the_id ();?>'; } trả lại $ atts; Bạn có thể vui lòng giúp tôi làm thế nào tôi có thể chèn the_id vào biến $ atts không. Cảm ơn
nadzhq

Câu trả lời:


36

Cụ thể chỉnh sửa mã bạn đã cung cấp trong câu hỏi ban đầu:

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;
}

Sau khi tôi trao đổi trong một số giá trị của riêng tôi đã làm điều đó! Cảm ơn bạn! Đánh dấu là chính xác, nhưng nói rằng tôi cần đợi thêm 23 giờ nữa trước khi tôi có thể trao giải thưởng.
cchiera

Vui vẻ giúp đỡ! : D
Jen

Tôi đặt một lời nhắc trong Fantastical để tôi không quên trao tiền thưởng vào ngày mai.
cchiera

Điều gì nếu bạn có một số mục menu là mục tiêu?
Eric Mitjans

chỉ sử dụng nhiều câu lệnh if nếu giá trị chuyển đổi dữ liệu là khác nhau. Hoặc bạn có thể lưu id vào khóa mảng (coi chúng là duy nhất) và tên phương thức là giá trị mảng. Sau đó kiểm tra câu lệnh if vớiarray_key_exists()
Sisir

8

Đối $itemsố thứ hai , được cung cấp cho chức năng lọc của bạn, chứa một đối tượng mục menu. Nếu bị đổ, nó trông giống như thế này:

[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] => 
    )

Để nhắm mục tiêu mục menu cụ thể, bạn cần xây dựng tình trạng của mình và kiểm tra nó dựa trên dữ liệu có sẵn trong đối tượng, ví dụ if ( 2220 == $item['ID'] )


Cảm ơn vì điều đó! Tôi không chắc chắn tôi hiểu làm thế nào để có được ID $ item cho mục menu cụ thể của tôi. Trong ví dụ của bạn, 2220 cũng giống như url của bạn " dev.rarst.net/?p=2220 ". Liên kết của tôi Tôi muốn thêm thuộc tính dữ liệu để không chuyển sang url wordpress khác mà thay vào đó là href = "# ContactForm". Dựa vào ví dụ của bạn ở trên, tôi đã tìm hiểu thêm và thử chạy echo var_export ($ GLOBALS ['post'], TRUE); nhưng khi tôi nhìn gần mục menu bất đắc dĩ tôi không thấy bất kỳ ID duy nhất nào. Bạn có thể làm rõ? Hoặc trong "if (2220 == $ item ['ID'])" Cảm ơn trước!
cchiera

2
Lỗi bạn thấy là do $itemmột đối tượng, không phải là một mảng; thay đổi $item['ID']thành $item->ID.
Jen

1

Tại sao bạn không tiếp cận vấn đề này từ một hướng khác? Thay vì cố gắng nhắm mục tiêu mục menu với id == ?? có thể thay đổi tại một số điểm (mục menu, không phải id), sử dụng khu vực Quản trị WP để thêm lớp tùy chỉnh vào mục menu bạn muốn nhắm mục tiêu. Sau đó sử dụng lớp đó trong Javascript của bạn để kích hoạt thông tin bạn cần:

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

Javascript của tôi không được đảm bảo. Nếu bạn không sử dụng jQuery, bạn có thể thử điều này .


1

Tôi muốn thêm các chữ cái dữ liệu vào menu tùy chỉnh mà tôi đã tạo trong WordPress.

Các bước tôi chọn là:

  1. Tìm thấy số id của menu của tôi.
  2. đã thêm những dòng mã từ @guiniveretoo
  3. đã viết nếu các câu lệnh cho từng mục menu (như tôi muốn chèn các giá trị thuộc tính khác nhau.)
  4. đã làm việc!

Đây là mã của tôi.

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;
}

Hy vọng điều này sẽ giúp bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.