如何根据用户语言在WordPress中正确加载不同版本的主菜单?这是一个好的解决方案吗?

时间:2014-03-03 作者:AndreaNobili

我在开发WordPress主题时遇到以下问题,我想问你这个解决方案是否是一个好的解决方案,或者是否存在更好的方法。

我有一个自定义的WP主题,在这个主题中有一个主菜单。该网站是多语言(意大利语和英语)的,因此如果访问者是意大利人,我必须加载意大利语主菜单(包含意大利语菜单项),如果用户不是意大利人,则必须加载英语版本的主菜单。

所以我找到了这个解决方案:

在WP后端,我创建了两个不同的菜单:Menu 1Menu 2 (第一个用意大利语发音,第二个用英语发音)

然后在我的主题内(进入header.php 文件)我声明类似的内容:

首先,我从$_SERVER[\'HTTP_ACCEPT_LANGUAGE\']

然后,如果$lang 值为it* or *Menu 2 if the *$lang 值为en

类似这样的:

<?php 
    $lang = substr($_SERVER[\'HTTP_ACCEPT_LANGUAGE\'], 0, 2);
    //echo "Language is $lang";  IT SEEMS TO WORK: MY LANGUAGE IS CORRECTLY RECOGNIZED AS it

    if($lang == it){      // If the user is Italian load Italian menu

        wp_nav_menu(array(
        \'menu\' => \'Menu 1\', 
        \'theme_location\' => \'primary\', 
        \'depth\' => 2,
        \'container\' => \'div\', 
        /*\'container_class\' => \'navbar navbar-default\',*/
        \'menu_class\' => \'nav navbar-nav\', 
        \'fallback_cb\' => \'wp_bootstrap_navwalker::fallback\', 
        \'walker\' => new wp_bootstrap_navwalker())
    );
     }
     else{            // If the user is not italian load English menu
        wp_nav_menu(array(
        \'menu\' => \'Menu 2\', 
        \'theme_location\' => \'primary\', 
        \'depth\' => 2,
        \'container\' => \'div\', 
        /*\'container_class\' => \'navbar navbar-default\',*/
        \'menu_class\' => \'nav navbar-nav\', 
        \'fallback_cb\' => \'wp_bootstrap_navwalker::fallback\', 
        \'walker\' => new wp_bootstrap_navwalker())
    );
     }
?>
我认为这种方式必须正确工作(我必须尝试),但这是一个好的解决方案,还是我可以用其他方式做得更好?

3 个回复
SO网友:Nicolae

我也有同样的问题。我使用了Polylang插件和3种语言。因此,我创建了如下3个菜单:https://www.diigo.com/item/image/4o9rz/opx5.之后,我检查了语言并显示了正确的菜单,如下所示:

<?php 
            if (get_locale() == \'en_US\') {
                wp_nav_menu(array(
                    \'menu\' => \'Primary Menu En\',
                    \'depth\' => 2,
                    \'container\' => false,
                    \'menu_class\' => \'nav navbar-nav\',
                    \'walker\' => new wp_bootstrap_navwalker()
                ));
            } else if (get_locale() == \'ro_RO\') {
                wp_nav_menu(array(
                    \'menu\' => \'Primary Menu Ro\',
                    \'depth\' => 2,
                    \'container\' => false,
                    \'menu_class\' => \'nav navbar-nav\',
                    \'walker\' => new wp_bootstrap_navwalker()
                ));
            } else if (get_locale() == \'ru_RU\') {
                wp_nav_menu(array(
                    \'menu\' => \'Primary Menu Ru\',
                    \'depth\' => 2,
                    \'container\' => false,
                    \'menu_class\' => \'nav navbar-nav\',
                    \'walker\' => new wp_bootstrap_navwalker()
                ));
            }
         ?>

SO网友:TalwinderSingh

大多数使用多语言WordPress的网站都使用WPML插件。它具有内置菜单同步功能,可为每种语言添加不同版本/翻译的菜单。就拥有多种语言的WordPress网站而言,这几乎是当今的标准。有关详细信息,请查看此链接:

https://wpml.org/documentation/getting-started-guide/translating-menus/

SO网友:David Salcer

我不确定这是否是正确的解决方案,但由于我也使用自定义主题等,我倾向于以这种方式创建菜单,我可以利用;后缀“;或“或”;鼻涕虫“;用于确定当前语言的语言插件。

所以创建后缀变量字符串

$lang_suffix = "_". pll_current_language(\'slug\');
然后再打电话就可以了。当然,您需要在自己的菜单上创建一些需要符合惯例的菜单”;Menu-EN“菜单”"E;菜单“;。。。等等此外,少量if()检查也有助于避免碰到不存在的值。但你说得对。

 $lang_suffix = "_". pll_current_language(\'slug\');
            wp_nav_menu( array(
                    \'menu\'              => \'Menu\'.$lang_suffix,
                    //\'theme_location\'    => \'primary-menu\',
                    \'depth\'             => 5,
                    \'container\'         => \'ul\',
                    \'container_class\'   => \'\',
                    \'menu_class\'        => \'text-uppercase navbar-nav ml-auto my-2 my-lg-0\',
                    \'fallback_cb\'       => \'wp_bootstrap_navwalker::fallback\',
                    \'walker\'            => new wp_bootstrap_navwalker())
            );
            ?>

结束