รับ ID หน้าจากรายการนำทาง


11

ฉันกำลังพยายามรับรหัสทั้งหมดในการนำทางของฉันและแปลงเป็นสตริงเพื่อให้ฉันสามารถใช้กับwp_queryเพื่อรับหน้าที่ระบุไว้ใน nav เท่านั้น รหัสเพื่อรับรหัส:

$menu_name = 'primary';

if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] )) {
    $menu = wp_get_nav_menu_object( $locations[ $menu_name ] );
    $menu_items = wp_get_nav_menu_items($menu->term_id);
}

foreach ( $menu_items as $menu_item ) {
    $numbers[] = $menu_item->ID;
}

$number = implode(',',$numbers);

แต่มันกลับมาเป็นตัวเลขที่ผิด เมื่อฉันไปที่พื้นที่ผู้ดูแลระบบและเลื่อนเมาส์ไปที่หน้าจำนวนที่ปรากฏในแถบที่อยู่ด้านล่างของหน้าจอไม่ตรงกัน ผมทำอะไรผิดหรือเปล่า?

คำตอบ:


13

รายการเมนูจะถูกเก็บไว้ในpostsตารางที่มีของpost_type nav_menu_itemดังนั้นสิ่งที่คุณส่งคืนคือ ID ของรายการเมนูไม่ใช่สิ่งที่ชี้ไป

หน้า / โพสต์ว่า ID รายการเมนูหมายถึงถูกเก็บไว้ในpostmetaตารางที่มีpost_idที่ตรงกับรายการเมนูIDและ=meta_key _menu_item_object_idวิธีที่ง่ายที่สุดในการรับmeta_value(เช่นหน้าที่ถูกชี้ไปที่รายการเมนู) คือการใช้สิ่งนี้:

$numbers[] = get_post_meta( $menu_item->ID, '_menu_item_object_id', true );


ฉันใช้เวลาสักครู่เพื่อให้ได้รหัสที่ฉันโพสต์ไว้ด้านบนเพื่อให้ทำงานได้ ฉันพยายามเพิ่มรหัสของคุณ แต่ฉันไม่สามารถใช้งานได้ ฉันเอาวง foreach ออกมาแล้วลองบรรทัดของคุณด้านบน แต่ก็ไม่ได้อะไร ฉันจะใช้ตัวอย่างของคุณได้อย่างไร
เจมี่

@Jamie เพียงแค่แทนที่สายของคุณ: $numbers[] = $menu_item->ID;กับหนึ่งในคำตอบของฉัน
anu

1

ฉันจะไม่สามารถบอกคุณได้เมื่อการเปลี่ยนแปลงนี้เกิดขึ้น แต่ใน WordPress เวอร์ชั่น 5.2.4 คุณสามารถใช้objectและobject_idเรียก ID หน้าได้ นี่คือวิธีที่ฉันจะทำ:

/**
 * The `0` is added as a default case.
 * In case our menu does not contain any pages this
 * will prevent our query from returning all pages
 */
$page_ids           = array( 0 );
$registered_menu    = 'my_registered_menu';
$locations          = get_nav_menu_locations();

if( ! empty( $locations ) && isset( $locations[ $registered_menu ] ) ) {

    $menu = wp_get_nav_menu_object( $locations[ $registered_menu ] );
    $menu_items = wp_get_nav_menu_items( $menu->term_id );

    if( ! empty( $menu_items ) ) {

        foreach( $menu_items as $item ) {

            // Only grab page IDs
            if( 'page' !== $item->object ) {
                continue;
            }

            $page_ids[] = $item->object_id;

        }

    }

}

$page_query = new WP_Query( array(
    'post_type'     => 'page',
    'post_status'   => 'publish',
    'no_found_rows' => true,
    'post__in'      => $page_ids,
    'posts_per_page'=> 100, // Large upper limit
) );

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