Dapatkan ID halaman yang terhubung dengan item menu?

9

Saat ini saya menggunakan walker khusus untuk menyesuaikan output wp_nav_menu(), dan saya mencoba menambahkan informasi tambahan ke <a>tag.

Apa yang saya ingin output untuk setiap tautan menu terlihat seperti:

<a class="boxPAGEID" href="#">About Me Page</a>

Di mana PAGEIDID halaman yang saya tautkan.

Alasannya adalah karena saya mengembangkan tema yang membuka konten halaman di lightbox, yang dipicu oleh kelas dalam tag.

Di bawah ini adalah kode custom walker di functions.phpfile saya (setelah kode saya akan menunjuk ke area di mana saya mengalami masalah):

class description_walker extends Walker_Nav_Menu
{

      function start_el(&$output, $item, $depth, $args)
      {
           global $wp_query;     
           $pageid = $wp_query->post->ID;

           $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';

           $class_names = $value = '';

           $classes = empty( $item->classes ) ? array() : (array) $item->classes;

           $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) );
           $class_names = ' class="'. esc_attr( $class_names ) . '"';

           $output .= $indent . '<li id="menu-item-'. $item->ID . '"' . $value . $class_names .'>';

           $attributes  = ! empty( $item->attr_title ) ? ' title="'  . esc_attr( $item->attr_title ) .'"' : '';
           $attributes .= ! empty( $item->target )     ? ' target="' . esc_attr( $item->target     ) .'"' : '';
           $attributes .= ! empty( $item->xfn )        ? ' rel="'    . esc_attr( $item->xfn        ) .'"' : '';
           $attributes .= ! empty( $item->url )        ? ' href="'   . '#' .'"' : '';

           $prepend = '<strong>';
           $append = '</strong>';
           $description  = ! empty( $item->description ) ? '<span>'.esc_attr( $item->description ).'</span>' : '';

           if($depth != 0)
           {
                     $description = $append = $prepend = "";
           }

            $item_output = $args->before;
            $item_output .= '<a'. $attributes . 'class="box' . $pageid . '"' .'>';
            $item_output .= $args->link_before .$prepend.apply_filters( 'the_title', $item->title, $item->ID ).$append;
            $item_output .= $args->link_after;
            $item_output .= '</a>';
            $item_output .= $args->after;

            $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );

            if ($item->menu_order == 1) {
                $classes[] = 'first';
            }

            }
}

Menjelang akhir adalah beberapa garis yang dimulai dengan $item_output. Baris kedua adalah tempat saya mencoba membuat ID halaman:

$item_output .= '<a'. $attributes . 'class="box' . $pageid . '"' .'>';

Di mana $pageidmenurut:

global $wp_query;    
$pageid = $wp_query->post->ID;

Ini memberi saya satu ID tetap untuk semua tautan yang dibuat.

Atau, alih-alih $pageidsaya mencoba menggunakan $item->ID, tetapi itu memberi saya ID dari item menu sebagai gantinya.

Ada saran?

Raiman Au
sumber
Jika ada alternatif untuk id halaman, itu akan berhasil juga. Saya awalnya mencoba menggunakan $ item-> url, tetapi url tidak akan berfungsi sebagai nama kelas. Judul halaman hanya berfungsi jika tidak ada spasi, dan atribut lainnya tidak dihasilkan secara default.
Raiman Au

Jawaban:

23

ID halaman (atau ID objek, karena item menu dapat menautkan ke objek apa pun) disimpan dalam postmetatabel, dengan kunci _menu_item_object_id. Jadi Anda bisa mendapatkan ID halaman dengan kode berikut:

get_post_meta( $item->ID, '_menu_item_object_id', true );
Jan Fabry
sumber
JAN !!!!! Ini berhasil! Maaf atas respons yang terlambat, tetapi saran Anda berhasil! Kamu luar biasa! Terima kasih! Dan sebagai catatan bagi mereka yang tidak yakin apa yang harus dilakukan: Saya mengubah $pageid = $wp_query->post->ID;bagian atas halaman menjadi$pageid = get_post_meta( $item->ID, '_menu_item_object_id', true );
Raiman Au
@ Jan Fabry: Luar Biasa !!! menghemat waktu saya..Bagus !!!
Sanjay Khatri
-1

Saya tidak bisa melihat kode Anda secara mendalam tetapi untuk membuat menu mungkin Anda harus menggunakan get_pages ..

http://codex.wordpress.org/Function_Reference/get_pages

<?php 
  $pages = get_pages(); 
  foreach ($pages as $pagg) {
    $option = '<a class="box' . $pagg->ID . '" href="#">';
    $option .= $pagg->post_title;
    $option .= '</a>';
    echo $option;
  }
 ?>
Serdar Buyuktemiz
sumber
Terima kasih atas sarannya, Serdar! Sayangnya ini tidak akan berhasil karena saya perlu menu untuk dapat dikendalikan dari tampilan> bagian menu di panel admin! Itu sebabnya saya menggunakan wp_menu_nav dan bukan get_pages.
Raiman Au