Erhalten Sie die ID der Seite, auf die ein Menüelement verweist?

9

Ich verwende derzeit einen benutzerdefinierten Walker, um die Ausgabe von anzupassen wp_nav_menu(), und ich versuche, den <a>Tags zusätzliche Informationen hinzuzufügen .

Ich möchte, dass die Ausgabe für jeden Menülink wie folgt aussieht:

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

Wo PAGEIDist die ID der Seite, auf die ich verlinke?

Der Grund dafür ist, dass ich ein Thema entwickle, das Seiteninhalte in Leuchtkästen öffnet, die von der Klasse im Tag ausgelöst werden.

Unten ist der Code des benutzerdefinierten Walkers in meiner functions.phpDatei (nach dem Code zeige ich auf den Bereich, in dem ich Probleme habe):

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

            }
}

Gegen Ende stehen ein paar Zeilen, die mit beginnen $item_output. In der zweiten Zeile versuche ich, die Seiten-ID zu generieren:

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

Wo $pageidist nach:

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

Dies gibt mir eine einzige feste ID für alle generierten Links.

Alternativ, anstatt $pageidich es zu versuchen $item->ID, gab mir das stattdessen die ID des Menüpunkts.

Irgendwelche Vorschläge?

Raiman Au
quelle
Wenn es Alternativen zur Seiten-ID gibt, würde das auch funktionieren. Ich habe anfangs versucht, $ item-> url zu verwenden, aber die URL würde nicht als Klassenname fungieren. Der Seitentitel funktioniert nur, wenn keine Leerzeichen vorhanden sind und die anderen Attribute nicht standardmäßig generiert werden.
Raiman Au

Antworten:

23

Die Seiten-ID (oder Objekt-ID, da ein Menüelement mit einem beliebigen Objekt verknüpft werden kann) wird postmetamit dem Schlüssel in der Tabelle gespeichert _menu_item_object_id. So können Sie die Seiten-ID mit dem folgenden Code erhalten:

get_post_meta( $item->ID, '_menu_item_object_id', true );
Jan Fabry
quelle
JAN !!!!! Das hat es geschafft! Entschuldigen Sie die späte Antwort, aber Ihr Vorschlag hat es geschafft! Du bist fabelhaft! Vielen Dank! Und für die Aufzeichnung für diejenigen, die nicht sicher sind, was zu tun ist: Ich habe $pageid = $wp_query->post->ID;das oben auf der Seite in$pageid = get_post_meta( $item->ID, '_menu_item_object_id', true );
Raiman Au
@ Jan Fabry: Super !!! Es spart meine Zeit. Großartig !!!
Sanjay Khatri
-1

Ich konnte Ihren Code nicht genau betrachten, aber zum Erstellen eines Menüs sollten Sie vielleicht get_pages verwenden.

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
quelle
Danke für den Vorschlag, Serdar! Leider funktioniert dies nicht, da ich das Menü über das Erscheinungsbild> Menübereich des Admin-Panels steuern muss! Deshalb benutze ich wp_menu_nav und nicht get_pages.
Raiman Au