web-dev-qa-db-fra.com

Obtenir l'ID de la page à laquelle un élément de menu est lié?

J'utilise actuellement un lecteur personnalisé pour personnaliser la sortie de wp_nav_menu() et j'essaie d'ajouter des informations supplémentaires aux balises <a>.

Ce que je veux que la sortie de chaque lien de menu ressemble à ceci est:

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

PAGEID est l'ID de la page vers laquelle je me connecte.

La raison en est que je développe un thème qui ouvre le contenu de la page dans des lightboxes, qui sont déclenchés par la classe dans la balise.

Vous trouverez ci-dessous le code du lecteur personnalisé dans mon fichier functions.php (après le code, nous indiquerons la zone où j'ai des problèmes):

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';
            }

            }
}

Vers la fin, quelques lignes commencent par $item_output. La deuxième ligne est l'endroit où j'essaie de générer l'ID de la page:

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

$pageid correspond à:

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

Cela me donne un identifiant unique et fixe pour tous les liens générés.

Alternativement, au lieu de $pageid j'ai essayé d'utiliser $item->ID, mais cela m'a donné l'ID de l'élément de menu à la place.

Aucune suggestion?

8
Raiman Au

L'ID de page (ou ID d'objet, puisqu'un élément de menu peut être lié à n'importe quel objet) est stocké dans la table postmeta, avec la clé _menu_item_object_id. Ainsi, vous pouvez obtenir l'ID de la page avec le code suivant:

get_post_meta( $item->ID, '_menu_item_object_id', true );
22
Jan Fabry