2012-09-10 71 views
4

我建过的WordPress的会员网站,我想创建一个导航菜单是对所有用户都是相同的,只是一个标签,上面写着“您的订阅”,并且标签将有一个下拉菜单,显示什么的订阅用户拥有,这对每个用户都会有所不同。如何从PHP文件添加项目到Wordpress菜单?

这是什么,我现在有一个小样本:

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

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

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

编辑问题。

+0

将订阅选项卡是最后一个标签或者是它...你能在你的问题后所产生的菜单(HTML)的代码的菜单的中间.. –

+0

订阅选项卡将位于菜单的中间。我不确定菜单的HTML代码是什么意思?这是PHP ...如果我错了,请纠正我。谢谢! – emagdnim

+0

我的意思是php的输出...表示在页面加载后使用“查看源代码”菜单的html代码。这样我可以建立一个基于用户检查应该做这项工作的JavaScript str_replace脚本。 –

回答

1

您好,我用的是什么有点困惑你正好之后,你基本上是说,你想为所有的用户菜单,并根据在菜单中某个接入电平变化1元素?

如果是这样的话,它看起来像你需要一个“如果”语句来找出(你干得)如果我们在正确的访问级别,并相应地自定义菜单。基本上,它看起来像你需要两个不同的阵列来构建您的菜单:

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这是未经测试]

+0

嗯,这有点正确,但我现在所拥有的基本上就是你所说的。唯一的问题是我有20个if语句和20个不同的自定义菜单。这不是有效的,所以我正在寻找的是一种方法来添加项目到一个菜单基于不同的条件(即if语句)。谢谢! – emagdnim

+0

@emagdnim,老实说,如果你有20个不同的自定义菜单,你将不得不做类似于你已经在做的事情......唯一可以考虑的选择是将菜单的代码存储在一个数据库或具有用户组名称的DB或单独的PHP文件(我将在1秒内更新我的答案) – acSlater

0

OK,最适合您的解决方案是使用自定义菜单的我希望这会满足您的需求...
您可以创建两个菜单这样

到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')); 
} 

和未在登录的用户。

enter image description here

+0

这就是我现在正在做的事情,但现在有20个不同的会员级别,并且我有20个不同的自定义菜单和20个不同的if语句。我需要一次只添加一个项目到菜单中。 – emagdnim

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); 
} 
+0

这看起来好像会起作用,但我对如何让它工作感到困惑。那里没有wp_nav_menu_objects的代码? – emagdnim

+0

不,但您可以阅读相关代码,它位于'wp-includes/nav-menu-template.php'中的'wp_nav_menu'函数中:http://core.trac.wordpress.org/browser/trunk/ wp-includes/nav-menu-template.php#L200 –

0

对于其他感兴趣的人,我一直在使用emagdnim来获得简单的解决方案。

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

这里是显著代码用于底部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更新的代码(它加载底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菜单系统根据其成员级别和其他成员级别动态显示子菜单项的无限可能性。

+1

难道这不是在wp_nav_menu_items过滤器内完成的,而不是输出缓冲? – PlagueEditor

+0

我并不是WP的专家,但我不相信OPs的限制。 整个想法是检查一个数据库,看看用户可以拥有哪些菜单。自从我上次浏览这个版本以来,我们已经有一段时间了,但是我们尝试了该函数的所有变体,但似乎并不可行。 – tguillea

0

如果您需要添加的所有内容都是列表末尾的一个菜单项,则可以按here所述连接到过滤器(wp_nav_menu_items)。然后,您可以在订阅下拉菜单中追加一个菜单项。而不是使用if语句,您可以简单地打印关卡。

使用此方法,您可以对菜单项的说明进行更好的调整控制,如果不同级别的成员资格类似。同样,switch陈述优于无尽(如果其他)的。

-Hope,帮助

相关问题