问题描述

我是 WordPress 的新手,我仍然试图从这个众所周知的 CMS 中学到内在和外在的东西。

我想知道,如果我应该或必须有主菜单的回退?

这是我正在使用的:

// This theme uses wp_nav_menu() in one location.
register_nav_menus( array(
    'primary' => __( 'Primary Navigation', 'xxxxxx' ),
) );

这里是我的 header.php 文件中的回调:

<nav>
    <?php wp_nav_menu(
    array(
        'theme_location' => 'Primary',
        'menu' =>  'Primary',
        'container' => '',
        'items_wrap' => '<ul class="main">%3$s</ul>'
    ));
?>
</nav>

就像我说的,我是新的。所以请任何帮助将是非常欢迎的。

如果可以的话,请回应一个例子。

最佳解决办法

当用户没有将菜单分配给 theme_location 时,将使用参数 fallback_cb 。它应该是一个返回一个字符串的函数,但是可以使用__return_false()来抑制任何输出:

wp_nav_menu(
    array(
        'theme_location' => 'primary',
        // No menu available: no output.
        'fallback_cb'    => '__return_false'
    )
);

您应该始终明确地声明回退,以保持代码的可读性。

以 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' ) ); ?>

这很混乱人们可以认为,如果没有分配给这个主题位置的菜单,主题现在将使用第一个可用的自定义菜单。错误。将使用页面列表。声明回调会更容易理解。

回退将获得所有菜单参数。您必须检查 echo 参数,因为 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="'%20.admin_url(%20'nav-menus.php'%20)%20.%20'">' . $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;

… 和管理员将在主题的样式表期望的所有标记中获得有用的链接:

一般的访客将无所事事。

次佳解决办法

见食典中的 wp_nav_menu()

wp_nav_menu 的默认 fall-back(fallback_cb 参数) 为'wp_page_menu',因此如果不分配主菜单,我认为您应该 auto-magically 有一个页面菜单 (每个静态页面的菜单,只有静态页面) 。

不是这样吗?

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。