Ottenere l'ID della pagina a cui punta un elemento del menu?
Attualmente sto usando un walker personalizzato per personalizzare l'output di wp_nav_menu()
, e sto cercando di aggiungere informazioni aggiuntive ai tag <a>
.
Quello che voglio ottenere come output per ogni link del menu è:
<a class="boxPAGEID" href="#">Pagina Chi Sono</a>
Dove PAGEID
è l'ID della pagina a cui sto collegando.
Il motivo è che sto sviluppando un tema che apre i contenuti delle pagine in lightbox, che vengono attivati dalla classe nel tag a.
Di seguito il codice del walker personalizzato nel mio file functions.php
(dopo il codice indicherò l'area dove ho difficoltà):
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';
}
}
}
Verso la fine ci sono un paio di righe che iniziano con $item_output
. La seconda riga è dove sto cercando di generare l'ID della pagina:
$item_output .= '<a'. $attributes . 'class="box' . $pageid . '"' .'>';
Dove $pageid
è definito secondo:
global $wp_query;
$pageid = $wp_query->post->ID;
Questo mi dà un singolo ID fisso per tutti i link generati.
In alternativa, invece di $pageid
ho provato a usare $item->ID
, ma questo mi ha dato l'ID dell'elemento del menu invece che della pagina.
Qualche suggerimento?
L'ID della pagina (o ID dell'oggetto, poiché una voce di menu può collegarsi a qualsiasi oggetto) è memorizzato nella tabella postmeta
, con la chiave _menu_item_object_id
. Pertanto, puoi ottenere l'ID della pagina con il seguente codice:
get_post_meta( $item->ID, '_menu_item_object_id', true );

JAN!!!!! Questo ha funzionato! Scusa per la risposta tardiva, ma il tuo suggerimento ha risolto il problema! Sei fantastico! Grazie!
E per la cronaca, per coloro che non sono sicuri su cosa fare:
Ho cambiato $pageid = $wp_query->post->ID;
all'inizio della pagina con $pageid = get_post_meta( $item->ID, '_menu_item_object_id', true );

Il PAGEID
è disponibile in $item->object_id
, se $item->object
è page
.
$item->object
contiene il tipo di voce del menu. I valori possibili sono page
, post
, category
,...
$item->object_id
contiene l'ID dell'oggetto.
Ho scoperto questo facendo var_dump($item)
su WordPress 5.4.2.

Non ho potuto analizzare il tuo codice in profondità, ma per creare un menu forse dovresti usare 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;
}
?>
