วิธีเพิ่มแอททริบิวข้อมูลไปยังรายการเมนู 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;
}

และใช้งานได้ตามที่คาดหวังจะเพิ่มแอททริบิวให้กับแท็กทั้งหมดในเมนู ดังนั้นฉันจึงพยายามหาวิธีกำหนดเป้าหมายหนึ่งรายการเมนูด้วย # 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;
    }
}

อย่างไรก็ตามการเพิ่มว่าถ้าคำสั่งผู้วิจารณ์คนเดียวแนะนำว่าฉันได้รับข้อผิดพลาดต่อไปนี้:

Fatal error: Cannot use object of type WP_Post as array

ฉันคาดว่าจะต้องใช้รหัสมากขึ้น แต่ก็หายไป เพื่อเป็นการเตือนความจำหากไม่มีคำสั่ง if จะทำงานได้ แต่มันจะกำหนดเป้าหมายไปยังลิงก์ทั้งหมดแทนที่จะเป็นลิงค์เดียวที่ฉันต้องการกำหนดเป้าหมาย


ฉันต้องการแทรก <? php the_id ();?> ลงในตัวแปร $ atts อะไรอย่างนั้น // ตรวจสอบ $ item ถ้า ($ 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

เพียงใช้หลายคำสั่งถ้าค่า data-toggle แตกต่างกัน หรือคุณสามารถบันทึกรหัสลงในคีย์อาร์เรย์ (พิจารณาว่าเป็นค่าเฉพาะ) และชื่อ modal เป็นค่าอาร์เรย์ จากนั้นตรวจสอบข้อความสั่งถ้าด้วย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'] )


ขอบคุณสำหรับสิ่งนี้! ฉันค่อนข้างแน่ใจว่าฉันเข้าใจวิธีรับ ID รายการ $ สำหรับรายการเมนูของฉันโดยเฉพาะ ในตัวอย่างของคุณ 2220 ก็เหมือนกับ url ของคุณ " dev.rarst.net/?p=2220 " ลิงก์ของฉันฉันต้องการเพิ่ม data-attribute เพื่อไม่ไปยัง wordpress url อื่น แต่จะเป็น href = "# ContactForm" จากตัวอย่างของคุณด้านบนฉันลองค้นหาเพิ่มเติมและลองใช้ echo var_export ($ GLOBALS ['post'], TRUE); แต่เมื่อฉันมองใกล้รายการเมนูที่ชวนไม่ได้ฉันไม่เห็นรหัสเฉพาะใด ๆ คุณช่วยอธิบายได้ไหม หรือใน "if (2220 == $ item ['ID'])" ขอบคุณล่วงหน้า!
cchiera

2
ข้อผิดพลาดที่คุณเห็นคือเนื่องจาก$itemเป็นวัตถุไม่ใช่อาร์เรย์ เปลี่ยนไป$item['ID'] $item->ID
Jen

1

ทำไมคุณไม่เข้าใกล้ปัญหานี้จากทิศทางที่แตกต่างกัน? แทนที่จะพยายามกำหนดเป้าหมายรายการเมนูด้วย id == ?? ซึ่งสามารถเปลี่ยนแปลงได้ในบางจุด (รายการเมนูไม่ใช่รหัส) ใช้พื้นที่ WP Admin เพื่อเพิ่มคลาสแบบกำหนดเองให้กับรายการเมนูที่คุณต้องการกำหนดเป้าหมาย จากนั้นใช้คลาสนั้นใน Javascript ของคุณเพื่อเรียกข้อมูลที่คุณต้องการ:

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

จาวาสคริปต์ของฉันไม่รับประกัน หากคุณไม่ได้ใช้ jQuery คุณสามารถลองสิ่งนี้ได้


1

ฉันต้องการเพิ่มตัวอักษรข้อมูลลงในเมนูกำหนดเองที่ฉันสร้างขึ้นใน WordPress

ขั้นตอนที่ฉันเลือกคือ:

  1. พบหมายเลขประจำตัวเมนูของฉัน
  2. เพิ่มบรรทัดของรหัสเหล่านั้นจาก @guiniveretoo
  3. เขียนว่างบสำหรับแต่ละรายการเมนู (เพราะฉันต้องการค่าคุณลักษณะที่แตกต่างกันที่จะถูกฉีด)
  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.