对于其他感兴趣的人,我一直在与 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 菜单系统根据其成员级别和其他成员级别动态显示子菜单项的无限可能性。