Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从PHP文件向Wordpress菜单添加项目?_Php_Wordpress - Fatal编程技术网

如何从PHP文件向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' ) ); 这将检查成员是否具有特定的成员级

我有一个基于Wordpress的会员网站,我想为所有用户创建一个相同的导航菜单,除了一个标签上写着“您的订阅”,该标签将有一个下拉菜单,显示用户拥有的订阅,每个用户的订阅都不同

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

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约束是这样。整个想法是检查数据库,看看用户可以拥有哪些菜单。我上次看这个已经有一段时间了,但我们尝试了该函数的所有变体,但似乎不可能。