Por que minha ordem de menu não funciona com wp_nav_menu?

4

Eu tenho um menu personalizado usando o novo Sistema de Menu, mas ele não está retornando na ordem correta. Não faço ideia de que ordem é a sua - não é alfabética, nem por data, nem por qualquer padrão que eu possa ver.

O link é enlace .

As páginas "sponsors", "archives" e "fewtchafests" devem aparecer como os 3 últimos itens, após a série de números, não antes deles. Se o primeiro item não fosse também um número, eu poderia pensar que estava renderizando todos os números, mas esse primeiro item ("8333") meio que embaraça essa ideia.

Captura de tela da ordem do menu arrastada e solta corretamente anexada, captura de tela do site exibindo o pedido incorreto anexado e o código usado para chamar o menu está abaixo.

    <!-- 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 -->

EDIT: É definitivamente um problema com o meu walker personalizado (código abaixo) - se eu comentar a chamada para a função de walker personalizado, ele gera na ordem correta:

    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
    
por Amanda 09.03.2012 / 09:59

1 resposta

3

AFAIK há um parâmetro orderby não documentado, que pode ser definido como menu_order .

Editar: Direto do núcleo, dentro de /wp-includes/nav-menu-template.php Linha # 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;

São as linhas imediatamente antes de o Walker correr. Portanto, o conjunto menu_order deve afetar o pedido. Você só precisa configurá-lo na sua página a partir da caixa meta.

Resumindo: você não deve precisar de um Walker personalizado.

Notas:

  • Você não precisa usar esse $indent . Não faz sentido, pois é apenas para o código-fonte.
  • Você não precisa fazer isso para salvar seus metadados em vars simples. Isso também adicionaria muitas consultas se elas não estiverem armazenadas no cache. Faça do seguinte modo:

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

Editar: extract simplesmente torna variáveis únicas fora de seus metadados personalizados. O key é então o novo nome da sua variável. EXTR_SKIP se preocupa em tornar as variáveis únicas, pois ignora as chaves duplas.

// 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

O último exemplo não é realmente possível, pois normalmente você tem matrizes serializadas como valores personalizados (mesmo para valores únicos). Então você sempre terá que acrescentar [0] à sua variável. Mas essa técnica def. encurta o código. Especialmente se você tiver conjuntos muito grandes de metadados por postagem / CPT.

    
por kaiser 09.03.2012 / 14:45

Tags