参数fallback_cb
当用户没有为您的theme_location
. 它应该是一个返回字符串的函数,但您可以使用__return_false()
要抑制任何输出,请执行以下操作:
wp_nav_menu(
array(
\'theme_location\' => \'primary\',
// No menu available: no output.
\'fallback_cb\' => \'__return_false\'
)
);
你应该
always declare the fallback explicitly 保持代码可读性。
以TwentyEleven为例:
<?php
/* Our navigation menu. If one isn\'t filled out, wp_nav_menu
falls back to wp_page_menu. The menu assigned to the primary
location is the one used. If one isn\'t assigned, the menu with
the lowest ID is used. */
?>
<?php wp_nav_menu( array( \'theme_location\' => \'primary\' ) ); ?>
这很令人困惑。人们可能会认为,如果没有为该主题位置分配菜单,则该主题现在将使用第一个可用的自定义菜单。
Wrong. 将使用页面列表。声明回调会更容易理解。
回退将获取所有菜单参数。你必须inspect the echo
parameter, 因为WordPress不会为你处理这些。并确保也尊重其他参数,以获得正确样式的输出。
一个高级示例:如果没有为主题位置指定菜单,它将不返回任何内容,如果当前用户确实可以创建菜单,它将返回指向菜单编辑器的链接:
/**
* Menu fallback. Link to the menu editor if that is useful.
*
* @param array $args
* @return string
*/
function link_to_menu_editor( $args )
{
if ( ! current_user_can( \'manage_options\' ) )
{
return;
}
// see wp-includes/nav-menu-template.php for available arguments
extract( $args );
$link = $link_before
. \'<a href="\' .admin_url( \'nav-menus.php\' ) . \'">\' . $before . \'Add a menu\' . $after . \'</a>\'
. $link_after;
// We have a list
if ( FALSE !== stripos( $items_wrap, \'<ul\' )
or FALSE !== stripos( $items_wrap, \'<ol\' )
)
{
$link = "<li>$link</li>";
}
$output = sprintf( $items_wrap, $menu_id, $menu_class, $link );
if ( ! empty ( $container ) )
{
$output = "<$container class=\'$container_class\' id=\'$container_id\'>$output</$container>";
}
if ( $echo )
{
echo $output;
}
return $output;
}
现在我们可以这样叫这个菜单…
$menu = wp_nav_menu(
array(
\'theme_location\' => \'primary\',
\'fallback_cb\' => \'link_to_menu_editor\',
\'echo\' => FALSE
)
);
echo $menu;
…管理员将在主题样式表所需的所有标记中获得有用的链接:
常客一无所获。