web-dev-qa-db-fra.com

Pourquoi ma commande de menu ne fonctionne-t-elle pas avec wp_nav_menu?

J'ai un menu personnalisé utilisant le nouveau système de menus, mais il ne revient pas dans le bon ordre. Je n'ai aucune idée de l'ordre dans lequel il se trouve - ce n'est pas alphabétique, ni par date, ni par aucun motif que je ne peux voir.

Le lien est http://www.oia.co.za/ .

Les pages "sponsors", "archives" et "fewtchafests" sont supposées apparaître comme les 3 derniers éléments, après la série de chiffres et non avant eux. Si le premier élément n'était pas également un nombre, je pourrais penser qu'il restituait tous les nombres en dernier, mais que le premier élément ("8333") masquait en quelque sorte cette idée.

Capture d'écran de l'ordre attaché des menus correctement glissé-déposé, capture d'écran du site Web affichant un ordre incorrect attaché, et le code utilisé pour appeler le menu est présenté ci-dessous.

correct menu order

enter image description here

    <!-- 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: C'est certainement un problème avec mon lecteur personnalisé (code ci-dessous) - si je commente l'appel de la fonction de lecteur personnalisé, il génère dans le bon ordre:

    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
4
Amanda

AFAIKil existe un paramètre orderby non documenté, qui peut être défini sur menu_order.

Édition: Directement du noyau, à l'intérieur de /wp-includes/nav-menu-template.php Ligne # 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;

Ce sont les lignes juste avant la marche du Walker. Donc, l'ensemble menu_order devrait affecter l'ordre. Il vous suffira de le définir dans votre page à partir de la boîte méta.

En bref: vous ne devriez pas du tout avoir besoin d'un Walker personnalisé.

Notes latérales:

  • Vous n'êtes pas obligé d'utiliser ce $indent. Cela n'a vraiment aucun sens car c'est uniquement pour le code source.
  • Vous n'avez pas à rendre cela difficile pour enregistrer vos métadonnées dans des vars simples. Cela ajouterait-il également beaucoup de requêtes si elles ne sont pas actuellement mises en cache. Faites-le de la manière suivante:

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

Edit: extract crée simplement des variables uniques à partir de vos métadonnées personnalisées. La key est alors le nouveau nom de votre variable. EXTR_SKIP se soucie de rendre les variables uniques en sautant les doubles clés.

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

Le dernier exemple n'est pas vraiment possible, car vous obtenez généralement des tableaux sérialisés en tant que valeurs personnalisées (même pour des valeurs uniques). Vous devrez donc toujours ajouter [0] à votre variable. Mais cette technique def. raccourcit le code. Surtout si vous avez de très grands ensembles de métadonnées par poste/CPT.

3
kaiser