如何从PHP文件向Wordpress菜单添加项目?
我有一个基于Wordpress的会员网站,我想为所有用户创建一个相同的导航菜单,除了一个标签上写着“您的订阅”,该标签将有一个下拉菜单,显示用户拥有的订阅,每个用户的订阅都不同 这是我现在拥有的一个小样本:如何从PHP文件向Wordpress菜单添加项目?,php,wordpress,Php,Wordpress,我有一个基于Wordpress的会员网站,我想为所有用户创建一个相同的导航菜单,除了一个标签上写着“您的订阅”,该标签将有一个下拉菜单,显示用户拥有的订阅,每个用户的订阅都不同 这是我现在拥有的一个小样本: if ( wp_emember_is_member_logged_in('19') ) { wp_nav_menu( array( 'menu' => 'example1', 'menu_class' => 'sf-menu' ) ); 这将检查成员是否具有特定的成员级
if ( wp_emember_is_member_logged_in('19') ) {
wp_nav_menu( array( 'menu' => 'example1', 'menu_class' => 'sf-menu' ) );
这将检查成员是否具有特定的成员级别,然后输入特定于该成员级别的菜单。唯一的问题是我有20个elseif语句和20个菜单,这根本没有效率
基本上,我想在一个菜单中添加单个选项卡,而不是创建大量不同的菜单。我只是不知道怎么做。谢谢
编辑用于提问。您好,我对您的目标有点困惑。确切地说,您是说您希望为所有用户提供一个菜单,并根据特定的访问级别更改菜单中的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这是未经测试的]好的,最好的解决方案是使用自定义菜单,我希望这能满足您的需要…
您可以像这样创建两个菜单 在您的函数中。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' ) );
}
然后…在当前菜单的位置-替换此菜单:
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' ) );
}
使用此选项:
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' ) );
}
完成此操作后,您可以创建菜单,并为登录用户和未登录用户创建不同的菜单
您可以使用
wp\u nav\u menu\u 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);
}
对于其他感兴趣的人,我一直在与emagdnim合作,以获得一个简单的解决方案 最好的方法是在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' ) );
}
。。。。。。。。
如果您只需要在列表的末尾添加一个菜单项,那么您可以按照所述连接到过滤器(wp_nav_menu_items)。然后,您可以在订阅下拉列表中附加一个菜单项。不使用if语句,只需打印级别
使用此方法,您可以对菜单项的内容进行更精细的控制,如果不同的成员级别相似,则可以进行更精细的控制。另外,语句比无尽(if-else)语句更可取
<>希望帮助订阅标签是最后一个标签,还是在菜单中间?你能在你的问题中张贴菜单(HTML)的结果代码吗?订阅选项卡会在菜单中间。我不知道你所说的菜单的HTML代码是什么意思?是PHP。。。如果我错了,请纠正我。谢谢我指的是php的输出。。。意思是加载页面后使用“查看源代码”的菜单html代码。这样我就可以基于用户检查构建一个javascript str_replace脚本来完成这项工作。我只是添加了URL,因为html没有正确显示。我真的很感谢你花这么多时间来做。这就是我现在正在做的,但是现在有20个不同的会员级别,我有20个不同的自定义菜单和20个不同的if语句。我只需要一次在菜单上添加一个项目。嗯,这有点正确,但我现在所拥有的基本上就是你所说的。唯一的问题是我有20个if语句和20个不同的自定义菜单。这不可能是有效的,所以我要寻找的是一种基于不同条件(例如if语句)向一个菜单添加项目的方法。谢谢@emagdnim,老实说,如果你有20个不同的自定义菜单,你将不得不做一些类似于你已经在做的事情。。。我能想到的唯一替代方法是将菜单的代码存储在一个DB或单独的PHP文件中,该文件具有用户组的名称(我将在1秒钟内更新我的答案)。这看起来是可行的,但我只是对如何使其工作有点困惑。没有wp_nav_菜单对象的代码,是吗?没有,但是你可以阅读相关的代码,它在wp includes/nav菜单模板中的wp_nav_菜单
函数中。php
:这不能在wp_nav_菜单项过滤器中完成,而不是在输出缓冲中完成吗?我对wp不是专家,但我不相信对OPs约束是这样。整个想法是检查数据库,看看用户可以拥有哪些菜单。我上次看这个已经有一段时间了,但我们尝试了该函数的所有变体,但似乎不可能。