4

我有一个基于 Wordpress 构建的会员网站,我想创建一个对所有用户都相同的导航菜单,除了一个显示“您的订阅”的选项卡,并且该选项卡将有一个下拉菜单,显示用户有哪些订阅,对于每个用户来说都是不同的。

这是我现在拥有的一个小样本:

if ( wp_emember_is_member_logged_in('19') ) {
    wp_nav_menu( array( 'menu' => 'example1', 'menu_class' => 'sf-menu' ) );

这将检查成员是否具有特定的会员级别,然后输入特定于该会员级别的菜单。唯一的问题是我有 20 个 elseif 语句和 20 个菜单,这根本没有效率。

基本上,我想向一个菜单添加单个选项卡,而不是创建大量不同的菜单。我只是不知道该怎么做。谢谢!

编辑提问。

4

5 回答 5

1

您好,我对您的确切内容有点困惑,您基本上是说您想为所有用户提供一个菜单,并根据某个访问级别更改菜单中的 1 个元素吗?

如果是这种情况,您似乎需要一个“if”语句来确定(正如您所做的那样)我们是否处于正确的访问级别并相应地自定义菜单。基本上看起来你需要两个不同的数组来构建你的菜单:

if ( wp_emember_is_member_logged_in('19') )
{//this will be show for users with an access level of 19
    $menu = array( 'menu' => 'example1', 'menu_class' => 'sf-menu' )
}
else
{//this will be show for all users except with an access level of 19
    $menu = array( 'menu' => 'example2', 'menu_class' => 'sf-menu-2' );
}

wp_nav_menu($menu);

您需要在 WP 的这一部分中自己配置/设置菜单:

http://YOUR-DOMAIN/wp-admin/nav-menus.php

编辑

看起来您想编写更好的代码并且可能没有 20 种不同的 if/else 语句......我会做的是:

有一个文件夹,其中包含所有自定义菜单作为单独的 PHP 文件,这些文件与用户的组级别共享名称......即

custommenus/19.php
custommenus/20.php
custommenus/21.php
custommenus/22.php

然后为访问级别加载正确的菜单,例如:

//there must be a way for you to grab the user access level
//for now I will hard code it
$current_user_access_level = 19;

$custom_menu_path = 'custommenus/'.$current_user_access_level.'.php';
$default_menu_path = 'custommenus/default.php';

//check to see if the custom menu file exists first
if(file_exists($custom_menu_path))
{
    include $custom_menu_path;
}
else
{//then the file exists, load some sort of default file
    include $default_menu_path;
}

然后,每当您创建新的访问级别时,您只需将与访问级别同名的新文件添加到“custommenus”文件夹,如果尚未创建该文件,它将加载默认菜单!

希望这会有所帮助:) [PS 这是未经测试的]

于 2012-09-12T11:51:16.780 回答
0

对于其他感兴趣的人,我一直在与 emagdim 合作以获得简单的解决方案。

找到的最好的方法是在 header.php 文件中使用输出缓冲。通过这种方式,我们可以使用 wp_nav_menu() 渲染多个菜单,但是使用输出缓冲我们可以将其分解成片段,然后移动这些片段。

下面是 bottom-menu.php 的重要代码(即更新部分):

........
<?php /* Our navigation menu. */ ?>
<?php

if(wp_emember_is_member_logged_in()){
    wp_nav_menu( array( 'menu' => 'normal-menu', 'menu_class' => 'sf-menu' ) );



/** CUSTOM CODE ADDITION **/
//connect to database
$link = mysql_connect("localhost", "[USERNAME]", "[PASSWORD]") or die("Oops! Please wait a few seconds and try again");
//connect to table
mysql_select_db("[TABLE NAME]") or die(mysql_error());
//search table
$result = mysql_query("SELECT * FROM `wp_wp_eMember_membership_tbl` ORDER BY `alias` ASC");
$array = array();
//while there are still rows in the table we haven't been to...
while ($row = mysql_fetch_array($result)){
    //clean up the "alias" so it becomes the name of the menu
    $alias = strtolower(str_replace(' ','-',$row['alias']));
    //now this can be accessed as "$array[X]" to get the name of the menu.
    if ($alias == 'admin'){
        $alias = 'admin-menu';
        }
    $array[$row['id']] = $alias;
    }
//done is a way to check if anything is found, if not a default menu is loaded
echo '{BREAK}';
$done = 0;
$ids = array_keys($array);
$info2 =  wp_eMember_get_user_details("more_membership_levels");
if (strstr($info2,',')){
    $moreMemberLevels = explode(',',$info2);
    }elseif ($info2 != ''){
    $moreMemberLevels[0] = $info2;
    }
//go through each ID/menu possibility
for ($i = 0; $i < count($ids); $i++){
    if ((wp_emember_is_member_logged_in($ids[$i])) || ((is_array($moreMemberLevels)) && ((in_array($ids[$i],$moreMemberLevels))))){
        $done++;
        //add the mneu to wp
        /** UNCOMMENT THIS TO IMPLEMENT LOOKUP VERIFICATION BEFORE ADDING A MENU **/
        /*
        echo 'Searching for '.$array[$ids[$i]].'...';
        $res = mysql_query("SELECT * FROM `wp_posts` WHERE `post_type`='nav_menu_item' AND `post_name`='{$array[$ids[$i]]}' LIMIT 1");
        if (mysql_num_rows($res) == 1){*/
        if ($array[$ids[$i]] != 'free'){
            /** UNCOMMENT THIS TO DEBUG **/
            //echo 'Adding '.$array[$ids[$i]].' to menu...<br />';
            wp_nav_menu(array('menu'=>$array[$ids[$i]], 'menu_class'=>'sf-menu'));
            }
        }
    }

echo ' {BREAK}';

/** END CUSTOM CODE ADDITION **/



    }else{
    wp_nav_menu( array( 'menu' => 'normal-visitor-menu', 'menu_class' => 'sf-menu' ) );
    }

以及 header.php 的更新代码(加载 bottom-menu.php)

....

<div id="page" class="hfeed">
<?php /* ======== BOTTOM MENU ======== */
    ob_start();
    get_template_part('bottom','menu');
    $bm = ob_get_clean();

    $bm_array = explode('{BREAK}',$bm);
    $bm_Top = $bm_array[0];
    $bm_Move = strip_tags($bm_array[1],'<li><br /><br><font><b><i><u><em><strong><a>');
    $bm_End = $bm_array[2];

    $bottomMenu = str_replace('My Menu Item</a></li>', 'My New Menu Item</a>
<ul class="sub-menu">'.$bm_Move.'</ul>
</li>',$bm_Top).$bm_End;
    ob_end_clean();
    echo $bottomMenu;
//echo '*****'.$bm_Move.'*****';
    ?>
    <div id="main">

附加信息/技术总结

此方法采用两个常规菜单之一,并根据每个成员样式应加载的内容向其中添加元素。“元素”是由 wp_nav_manu() 创建的完整菜单,但只有一项。菜单的名称也是会员级别的名称,但使用连字符而不是空格并且全部小写。通过这样做,我们不需要另一个表将看似任意的会员级别 ID 与菜单名称联系起来 - 您只需根据该系统命名菜单/会员资格,以便它知道要查找的内容。

此外,每个添加的“菜单”实际上是一个只有一个菜单项的菜单,其中的<ul></ul>标签被移除,以便将它们嵌套到<ul>所需父元素下方的子菜单中。

说了这么多,我们就可以使用 wp 菜单系统根据其成员级别和其他成员级别动态显示子菜单项的无限可能性。

于 2012-09-14T18:08:17.353 回答
0

如果您需要添加的只是列表末尾的一个菜单项,那么您可以连接到一个过滤器 (wp_nav_menu_items),如此所述。然后,您可以在订阅下拉菜单中附加一个菜单项。您可以简单地打印级别,而不是使用 if 语句。

使用此方法,您可以更精细地控制菜单项的内容,以及不同级别的成员资格是否相似。此外,switch语句优于无限(if else)语句。

-希望有帮助

于 2012-09-18T15:43:21.903 回答
0

wp_nav_menu_objects您可以使用过滤器将一个菜单中的项目合并到另一个菜单中。

您需要知道要合并的菜单的 ID,以及您希望合并项成为其子项的菜单项的 ID。然后你可以获取菜单项,设置它们的父菜单项并将它们与父菜单合并。例如

add_filter('wp_nav_menu_objects', 'my_wp_nav_menu_objects_filter', 10, 2);

function my_wp_nav_menu_objects_filter($menu_items, $args) {
  $sub_menu_id = 123;
  $sub_menu_parent_item_id = 456;

  $sub_menu_items = wp_get_nav_menu_items($sub_menu_id);

  foreach ($sub_menu_items as $item) {
    if (!$item->menu_item_parent) {
      $item->menu_item_parent = $sub_menu_parent_item_id;
    }
  }

  return array_merge($menu_items, $sub_menu_items);
}
于 2012-09-12T14:18:15.477 回答
0

好的,对你来说最好的解决方案是使用自定义菜单我希望这能满足你的需要......
你可以像这样创建两个菜单

在你的functions.php中:

add_action( 'init', 'my_custom_menus' );
function my_custom_menus() {
    register_nav_menus(
        array(
            'loggedin-menu' => __( 'logged in users' ),
            'newmembers-menu' => __( 'new members' )
        )
    );
}

然后......你有当前菜单的地方 - 替换这个:

if ( wp_emember_is_member_logged_in('19') ) {
    wp_nav_menu( array( 'menu' => 'example1', 'menu_class' => 'sf-menu' ) );

有了这个:

// check if user is logged in
if ( is_user_logged_in() ) {
    // Logged in.
    wp_nav_menu( array( 'theme_location' => 'loggedin-menu' ) );
} else {
    // Not logged in.
    wp_nav_menu( array( 'theme_location' => 'newmembers-menu' ) );
}

完成此操作后,您可以创建菜单并为已登录的用户和未登录的用户提供不同的菜单。

在此处输入图像描述

于 2012-09-12T12:00:46.960 回答