Ottenere l'ID della pagina a cui punta un elemento del menu?

31 mar 2011, 12:44:47
Visualizzazioni: 30.2K
Voti: 10

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?

1
Commenti

Se ci sono alternative all'ID della pagina, potrebbero funzionare anch'esse. Inizialmente ho provato a usare $item->url, ma l'URL non funzionava come nome di classe. Il titolo della pagina funziona solo se non ci sono spazi, e gli altri attributi non sono generati di default.

Raiman Au Raiman Au
31 mar 2011 12:54:55
Tutte le risposte alla domanda 3
2
27

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 );
5 apr 2011 17:36:52
Commenti

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

Raiman Au Raiman Au
15 apr 2011 07:42:40

@Jan Fabry : Superbo!!! mi hai fatto risparmiare tempo..Fantastico!!!

Sanjay Khatri Sanjay Khatri
20 lug 2012 11:17:18
1

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.

17 giu 2020 12:01:31
Commenti

Questa dovrebbe essere la risposta accettata in quanto è più performante dell'approccio get_post_meta.

turboLoop turboLoop
8 lug 2022 12:32:21
1
-1

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;
  }
 ?>
31 mar 2011 16:05:42
Commenti

Grazie per il suggerimento, Serdar! Purtroppo questa soluzione non funzionerà perché ho bisogno che il menu possa essere controllato dalla sezione aspetto > menu del pannello di amministrazione! Ecco perché sto usando wp_menu_nav e non get_pages.

Raiman Au Raiman Au
1 apr 2011 07:38:41