Dapatkan ID halaman dari item nav

11

Saya mencoba untuk mendapatkan semua ID di navigasi saya dan mengonversinya menjadi string sehingga saya dapat menggunakannya dengan wp_queryuntuk mendapatkan halaman yang hanya terdaftar di nav. Kode untuk mendapatkan ID:

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

Tetapi mengembalikan nomor yang salah. Ketika saya pergi ke area admin dan mengarahkan mouse saya ke atas halaman, angka yang muncul di bilah alamat di bagian bawah layar tidak cocok. Apa yang saya lakukan salah?

Jamie
sumber

Jawaban:

13

Item menu disimpan dalam poststabel dengan post_typedari nav_menu_item. Jadi, apa yang Anda kembalikan adalah ID dari item menu itu sendiri, bukan apa yang ditunjukkannya.

ID halaman / posting yang mengacu pada item menu disimpan dalam postmetatabel, dengan post_idyang cocok dengan item menu IDdan meta_key= _menu_item_object_id. Cara termudah untuk mendapatkan meta_value(yaitu halaman yang ditunjuk oleh item menu) adalah menggunakan sesuatu seperti ini:

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

anu
sumber
Butuh beberapa saat untuk mendapatkan kode yang saya posting di atas untuk bekerja. Saya telah mencoba menambahkan kode Anda tetapi saya belum dapat membuatnya berfungsi. Saya mengambil foreach loop dan mencoba baris Anda di atas tetapi tidak mendapat apa-apa. Bagaimana saya menggunakan contoh Anda?
Jamie
@Jamie Cukup ganti baris Anda: $numbers[] = $menu_item->ID;dengan yang ada di jawaban saya.
anu
1

Saya tidak akan bisa memberi tahu Anda ketika perubahan ini terjadi tetapi pada WordPress versi 5.2.4 Anda dapat menggunakan objectdan object_iduntuk mengambil ID halaman. Begini cara saya melakukan ini:

/**
 * 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
) );
Howdy_McGee
sumber
Menarik. Terima kasih
Jamie