วิธีรับชื่อรายการเมนูปัจจุบันเป็นตัวแปรอย่างไร


10

เป็นไปได้ที่จะได้รับรายการเมนูปัจจุบันเป็นตัวแปร php?

ฉันกำลังแสดงรายการหมวดหมู่พิพิธภัณฑ์ผ่านรายการเมนู 'พิพิธภัณฑ์ที่เราสนับสนุน' ดังนั้นฉันต้องการได้รับ 'พิพิธภัณฑ์ที่เราสนับสนุน' บิตและแสดงที่ไหน?

ความช่วยเหลือใด ๆ ชื่นชม!

คำตอบ:


15

สิ่งนี้เป็นไปได้โดยการกรองwp_nav_menu_objectsซึ่งเป็นสถานที่ที่ง่ายที่สุดในการตรวจสอบว่ารายการใดเป็นรายการเมนูปัจจุบันเนื่องจากWordPress ได้เพิ่มคลาสสำหรับคุณแล้ว

add_filter( 'wp_nav_menu_objects', 'wpse16243_wp_nav_menu_objects' );
function wpse16243_wp_nav_menu_objects( $sorted_menu_items )
{
    foreach ( $sorted_menu_items as $menu_item ) {
        if ( $menu_item->current ) {
            $GLOBALS['wpse16243_title'] = $menu_item->title;
            break;
        }
    }
    return $sorted_menu_items;
}

ตอนนี้คุณสามารถใช้ตัวแปรโกลบอลใหม่นี้แทนชื่อปกติ ตัวอย่างง่ายๆ:

add_filter( 'single_cat_title', 'wpse16243_single_cat_title' );
function wpse16243_single_cat_title( $cat_title )
{
    if ( isset( $GLOBALS['wpse16243_title'] ) ) {
        return $GLOBALS['wpse16243_title'];
    }
    return $cat_title;
}

แน่นอนว่าจะใช้งานได้เฉพาะเมื่อคุณแสดงเมนูก่อนที่จะแสดงชื่อ หากคุณจำเป็นต้องใช้มันก่อนหน้านี้ (อาจจะใน<title>องค์ประกอบ?) คุณควรแรกทำให้เมนูและจากนั้นจะแสดงได้ในภายหลัง


สวัสดี ม.ค. - แค่สงสัยว่ามีวิธีสร้างอาร์เรย์ของ $ menu_item-> children ของรายการปัจจุบันหรือไม่ พยายามหลายสิ่งหลายอย่าง แต่ไม่ไกลมาก .. !
v3nt

จัดการสิ่งนี้ด้วยความช่วยเหลือของตัวกรองของคุณ - คำตอบด้านล่าง ไชโย!
v3nt

Jan Fabry / ฉันพยายามใช้wpse16243_wp_nav_menu_objectsเพื่อดึง ID เมนูปัจจุบัน แต่มันก็ไม่สอดคล้องกัน การสลับระหว่างโฮมเพจและรายการเมนูจะไม่ให้รายการเมนูที่ถูกต้องกับฉันเสมอ - มันเป็น "lags" ข้อเสนอแนะใด ๆ เกี่ยวกับวิธีที่ฉันสามารถดึง ID เมนูปัจจุบันได้?
Steven

มีเหตุผลที่คุณนำหน้าชื่อฟังก์ชันด้วยwpse16243หรือไม่? ฉันเห็นชื่อแปลก ๆ นี้ค่อนข้างธรรมดาและสงสัยว่ามันคืออะไร ข้อจำกัดความรับผิดชอบ: Wordpress noob
สตีเฟ่น Watkins

2
@Steve: เพียงคำนำหน้าเฉพาะ: WordPress Stack Exchange question number 16243. หากผู้คนคัดลอกรหัสนี้โดยตรงมันจะไม่ขัดแย้งกับปลั๊กอินอื่น ๆ ที่อาจใช้ชื่อฟังก์ชั่นเดียวกัน
ม.ค. Fabry

4

wp_get_nav_menu_items()คุณสามารถใช้ นี่คือตัวอย่างfunction:

<?php
function my_get_menu_item_name( $loc ) {
    global $post;

    $locs = get_nav_menu_locations();

    $menu = wp_get_nav_menu_object( $locs[$loc] );

    if($menu) {

        $items = wp_get_nav_menu_items($menu->term_id);

        foreach ($items as $k => $v) {
            // Check if this menu item links to the current page
            if ($items[$k]->object_id == $post->ID) {
                $name = $items[$k]->title;
                break;
            }
        }

    }
    return $name;
}

จากนั้นโทรfunctionด้วยชื่อตำแหน่งของเมนู nav ที่คุณต้องการใช้:

<?php
$menu_name = my_get_menu_item_name( 'NAV_MENU_LOCATION_NAME' ); // eg. 'primary'

echo $menu_name;

2
add_filter( 'wp_nav_menu_objects', 'wpse16243_wp_nav_menu_objects' );
function wpse16243_wp_nav_menu_objects( $sorted_menu_items )
{
    foreach ( $sorted_menu_items as $menu_item ) {

        if ($menu_item->current ) {
            $GLOBALS['currentMenuTitle'] = $menu_item->title;
            $GLOBALS['currentMenuID'] = $menu_item->ID;



            break;
        }
    }


    return $sorted_menu_items;
}


function get_menu_items_children( $menu_item_id='' )
{   
    global $wpdb;

      //     AND meta_key='_menu_item_menu_item_parent'

    $myrows = $wpdb->get_results( "SELECT * FROM $wpdb->postmeta JOIN $wpdb->posts ON $wpdb->postmeta.post_id=$wpdb->posts.id WHERE meta_value = '".$menu_item_id."' AND meta_key='_menu_item_menu_item_parent' ORDER BY $wpdb->posts.menu_order ASC" );


    foreach ( $myrows as $menu_item ) {

        $sc = get_object_vars($menu_item);  

        $myrowsb = $wpdb->get_results( "SELECT * FROM $wpdb->postmeta WHERE post_id = '".$sc['post_id']."' AND meta_key='_menu_item_object_id' " );

        foreach ( $myrowsb as $menu_itemb ) {

            $scb = get_object_vars($menu_itemb);    
            $pmIDs[] = $scb['meta_value'];

        }

    }


    return $pmIDs;
}

0

ฉันไม่แน่ใจว่าฉันทำตามอย่างแน่นอน

"พิพิธภัณฑ์ที่เราให้การสนับสนุน" สร้างขึ้นโดยชื่อโพสต์ชื่อหน้าชื่อหมวดหมู่ ฯลฯ (หรือหากคุณใช้เมนูการนำทางที่กำหนดเองอาจเป็นชื่อที่กำหนดเองได้)

คุณพยายามทำอะไรกับข้อความนี้ คุณพยายามแสดงที่ไหน ฉันคิดว่าคุณพยายามที่จะแสดงมันในหน้าดัชนีหมวดหมู่ (เนื่องจากคุณระบุว่าเป็นcurrent-menu-item) ถ้าเป็นเช่นนั้นเพียงโทร<?php single_cat_title(); ?>ออกชื่อหมวดหมู่

หากคุณต้องการข้อมูลหมวดหมู่เพิ่มเติมคุณสามารถใช้สิ่งต่อไปนี้:

$cat = get_the_category();
$currentcat = $cat[0];

ซึ่งทำให้พร้อมใช้งานตัวแปรต่อไปนี้:

$currentcat=>cat_ID // Category ID
$currentcat=>cat_name // Category Name (Same as Title)
$currentcat=>category_nicename // Category Slug
$currentcat=>category_description // Category Description
$currentcat=>category_count // Category Count (# of Posts w/ this Category)

หากคุณอยู่ที่อื่นนอกเหนือจากหน้าดัชนีหมวดหมู่คุณจะต้องส่ง $ catid ไปยังฟังก์ชันเหล่านี้

แก้ไข:

เนื่องจากคุณระบุว่า "พิพิธภัณฑ์ที่เราให้การสนับสนุน" เป็นชื่อเมนูที่กำหนดเองวิธีที่ง่ายที่สุดคือเปลี่ยนชื่อหมวดหมู่จาก "พิพิธภัณฑ์" เป็น "พิพิธภัณฑ์ที่เราให้การสนับสนุน" (หมายเหตุ: คุณสามารถออกจากกระสุนได้museumsโดยไม่เปลี่ยนแปลง) อย่างไรก็ตามการทำเช่นนั้นหมายความว่า "พิพิธภัณฑ์ที่เราให้การสนับสนุน" จะปรากฏเป็นชื่อหมวดหมู่ไม่ว่าที่ใดก็ตามที่อาจแสดงผลในเทมเพลตของคุณ หากเป็นที่ยอมรับก็ไม่ต้องกังวล

มิฉะนั้นคุณจะต้องใช้สิ่งที่ต้องการwp_get_nav_menu_items()(การอ้างอิง Codex ) เพื่อที่จะคว้าชื่อสำหรับรายการเมนูที่เฉพาะเจาะจง


เฮ้ชิป - หน้านี้; bfami.modernactivity.co.uk/category/museumดังนั้นโดยทั่วไปแมวคือ 'พิพิธภัณฑ์' แต่ฉันต้องการแสดง 'MUSEUMS WE SUPPORT' ซึ่งเป็นป้ายนำทาง (ชื่อที่กำหนดเอง) ที่ตั้งอยู่ในหน้าเมนู คิดว่าเป็นไปได้ไหมที่จะคว้ามันไว้?
v3nt

ที่ช่วยในการ ดูคำตอบของฉันแก้ไข คุณมีตัวเลือกที่สอง: wp_get_nav_menu_items()เปลี่ยนชื่อหมวดหมู่หรือการใช้งาน
Chip Bennett

ไชโยชิป - เพิ่งเปลี่ยนชื่อหมวดหมู่ในที่สุด! แค่คิดว่าจะมีวิธีที่ง่ายที่จะคว้าป้ายเมนู ...
v3nt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.