我有一个使用新菜单系统的自定义菜单,但它没有以正确的顺序返回。我不知道它的顺序是什么——不是按字母顺序,也不是按日期,也不是按我能看到的任何模式。
链接是http://www.oia.co.za/.
“赞助商”、“档案”和“fewtchafests”页面应显示为最后3项,在数字序列之后,而不是之前。如果第一个项目不是一个数字,我可能会认为它是在最后呈现所有数字,但第一个项目(“8333”)有点妨碍了这个想法。
下面是正确拖放菜单顺序的截图,显示错误顺序的网站截图,以及用于调用菜单的代码。
<!-- 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> </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
最合适的回答,由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中获得了非常大的元数据集。