为什么我的菜单顺序不能与wp_NAV_MENU一起使用?

时间:2012-03-09 作者:gillespieza

我有一个使用新菜单系统的自定义菜单,但它没有以正确的顺序返回。我不知道它的顺序是什么——不是按字母顺序,也不是按日期,也不是按我能看到的任何模式。

链接是http://www.oia.co.za/.

“赞助商”、“档案”和“fewtchafests”页面应显示为最后3项,在数字序列之后,而不是之前。如果第一个项目不是一个数字,我可能会认为它是在最后呈现所有数字,但第一个项目(“8333”)有点妨碍了这个想法。

下面是正确拖放菜单顺序的截图,显示错误顺序的网站截图,以及用于调用菜单的代码。

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 -->
编辑:我的自定义walker肯定有问题(下面的代码)-如果我注释掉对自定义walker函数的调用,它将按正确的顺序生成:

    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

1 个回复
最合适的回答,由SO网友:kaiser 整理而成

AFAIK有一个未记录的orderby 参数,可以设置为menu_order.

Edit: 直接从核心开始,内部/wp-includes/nav-menu-template.php 第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;
这是步行者跑步前的路线。因此,设置menu_order 应影响订单。您只需在页面内的元框中设置它。

简言之:你根本不需要定制助行器。

Sidnotes:

你不必用这个$indent. 这真的毫无意义,因为它只针对源代码

extract( get_post_custom( $item->object_id ), EXTR_SKIP );
Edit: extract 只需从自定义元数据中生成单个变量。这个key 然后是变量的新名称。EXTR_SKIP 在跳过双键时关心使变量唯一。

// 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
最后一个示例实际上是不可能的,因为您通常将序列化数组作为自定义值(甚至对于单个值)。所以您必须始终附加[0] 到您的变量。但这项技术定义了。缩短代码。尤其是如果您在每个post/CPT中获得了非常大的元数据集。

结束