¿Por qué mi orden de menú no funciona con wp_nav_menu?

4

Tengo un menú personalizado con el nuevo Sistema de menús, pero no vuelve en el orden correcto. No tengo idea de en qué orden está, no es alfabético, ni por fecha ni por ningún patrón que pueda ver.

El enlace es enlace .

Se supone que las páginas "sponsors", "archives" y "fewtchafests" aparecen como los últimos 3 elementos, después de la serie de números, no antes de ellos. Si el primer elemento no fuera también un número, podría pensar que fue la última versión de todos los números, pero ese primer elemento ("8333") es una especie de estafadores.

Captura de pantalla del orden de menú adjunto arrastrado y soltado correctamente, captura de pantalla del sitio web que muestra el orden incorrecto adjunto y el código utilizado para llamar al menú se encuentra a continuación.

    <!-- BEGIN ADVENT CALENDAR -->
    <nav role="navigation">
        <?php 
            wp_nav_menu( array(
                'theme_location' => 'advent-calendar',
                'menu' => 'advent-calendar',
                'menu_class' => 'component-calendar',
                'container_id' => 'calendar',
                'container_class' => 'advent',
                'orderby' => 'menu_order',
                'walker'=> new Salamander_Advent_Walker()
                ) 
            );
        ?>
    </nav>
    <!-- END ADVENT CALENDAR -->

EDITAR: Definitivamente es un problema con mi andador personalizado (código a continuación): si comento la llamada a la función de andador personalizado, se genera en el orden correcto:

    class Salamander_Advent_Walker extends Walker_page {
        function start_el(&$output, $item, $depth, $args) {
           private $color_idx = 1;

            $advent_thumbnail = get_post_meta($item->object_id, 'advent-thumb', true);
            $advent_slug = get_post_meta($item->object_id, 'advent-slug', true);
            $advent_oneliner = get_post_meta($item->object_id, 'advent-oneliner', true);
            $advent_color = get_post_meta($item->object_id, 'advent-color', true);
            $advent_small_title = get_post_meta($item->object_id, 'advent-title', true);

            $advent_title = ( !empty($advent_small_title) ? $advent_small_title : $advent_slug);

            $output .= $indent . '
                        <li class="color'.$this->color_idx.' active">
                        <a href="#day'. $advent_slug .'">
                            <span class="day">
                                <strong>'. $advent_slug .'</strong>
                                <span>&nbsp;</span>
                            </span>
                            <span class="content">
                                <small class="'. $advent_color .'">'. $advent_title .'</small>
                                <img src="'. $advent_thumbnail .'" width="126" height="91" alt="advent" />
                                <strong>'. $advent_oneliner .'</strong>
                            </span>
                        </a>
                    ';
            $this->color_idx++;
            if ($this->color_idx > 4) {
                $this->color_idx = 1;
            }
        } // ends function
    } // ends class
    
pregunta Amanda 09.03.2012 - 09:59

1 respuesta

3

AFAIK hay un parámetro orderby no documentado, que se puede establecer en menu_order .

Editar: Directamente desde el núcleo, dentro de /wp-includes/nav-menu-template.php Line # 195 (WP 3.3.1):

$sorted_menu_items = array();
foreach ( (array) $menu_items as $key => $menu_item )
    $sorted_menu_items[$menu_item->menu_order] = $menu_item;

Son las líneas inmediatamente antes de que el Walker se ejecute. Así que el conjunto menu_order debería afectar la orden. Solo tendrás que configurarlo dentro de tu página desde el meta box.

En resumen: no deberías necesitar un Walker personalizado en absoluto.

Notas laterales:

  • No tienes que usar ese $indent . Realmente no tiene sentido ya que es solo para el código fuente.
  • No tiene que hacer que sea tan difícil guardar sus metadatos en vars individuales. También agregaría muchas consultas si actualmente no están en caché. Hazlo de la siguiente manera:

    extract( get_post_custom( $item->object_id ), EXTR_SKIP );
    

Editar: extract simplemente crea variables individuales de sus metadatos personalizados. El key es entonces el nuevo nombre de su variable. A EXTR_SKIP le importa que las variables sean únicas, ya que omite las teclas dobles.

// Example: Structure of your post custom/meta data
Array( 
    [0] => array( 'example_key_name' => array( 'example_value' ) )
    [1] => array( 'another_key_name' => 'another_value' )
)
// Becomes:
$example_key_name = array( 0 => 'example_value' );
// Value can now be called as:
$example_key_name[0];
// Becomes:
$another_key_name = 'another_value';
// Value can be called as:
$another_key_name

El último ejemplo no es realmente posible, ya que normalmente tiene matrices serializadas como valores personalizados (incluso para valores individuales). Así que siempre tendrás que agregar [0] a tu variable. Pero esta técnica def. acorta el código. Especialmente si tienes grandes conjuntos de metadatos por publicación / CPT.

    
respondido por el kaiser 09.03.2012 - 14:45

Lea otras preguntas en las etiquetas