¿Obtener el ID de la página a la que se vincula un elemento de menú?

9

Actualmente estoy usando un andador personalizado para personalizar la salida de wp_nav_menu(), y estoy tratando de agregar información adicional a las <a>etiquetas.

Lo que quiero es que se vea el resultado de cada enlace de menú:

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

¿Dónde PAGEIDestá la identificación de la página a la que estoy enlazando?

La razón es porque estoy desarrollando un tema que abre el contenido de la página en cajas de luz, que son activadas por la clase en la etiqueta.

A continuación se muestra el código del andador personalizado en mi functions.phparchivo (después del código señalaré el área donde tengo problemas):

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

            }
}

Hacia el final hay un par de líneas que comienzan con $item_output. La segunda línea es donde estoy tratando de generar la ID de la página:

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

¿Dónde $pageidestá de acuerdo con:

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

Esto me da una identificación única y fija para todos los enlaces generados.

Alternativamente, en lugar de $pageidintentar usarlo $item->ID, pero eso me dio la ID del elemento del menú.

¿Alguna sugerencia?

Raiman Au
fuente
Si hay alternativas a la identificación de la página, eso también funcionaría. Inicialmente intenté usar $ item-> url, pero la url no funcionaría como un nombre de clase. El título de la página solo funciona si no hay espacios, y los otros atributos no se generan de forma predeterminada.
Raiman Au

Respuestas:

23

El ID de la página (o ID del objeto, ya que un elemento de menú puede vincularse a cualquier objeto) se almacena en la postmetatabla, con la clave _menu_item_object_id. Para que pueda obtener la ID de la página con el siguiente código:

get_post_meta( $item->ID, '_menu_item_object_id', true );
Jan Fabry
fuente
¡¡¡¡¡ENE!!!!! Esto lo hizo! Perdón por la respuesta tardía, ¡pero su sugerencia funcionó! ¡Eres fabulosa! ¡Gracias! Y para el registro de aquellos que no están seguros de qué hacer: cambié el $pageid = $wp_query->post->ID;en la parte superior de la página a$pageid = get_post_meta( $item->ID, '_menu_item_object_id', true );
Raiman Au
@ Jan Fabry: ¡Excelente! me ahorra tiempo ... genial !!!
Sanjay Khatri
-1

No pude ver tu código en profundidad, pero para crear un menú quizás deberías usar 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
fuente
Gracias por la sugerencia, Serdar! Desafortunadamente, esto no funcionará porque necesito que el menú pueda controlarse desde la sección> menú de apariencia del panel de administración. Es por eso que estoy usando wp_menu_nav y no get_pages.
Raiman Au