在我的主要的wp导航栏中,我有一个名为'Research'的菜单项,我只想在WordPress中的研究人员中显示。
研究人员将由一个名为wpum_relationship_to_lib
的用户元数据字段定义,它是一个包括研究人员、学生、员工等选项的多选字段。
重要的是researcher
必须是用户选择访问该菜单的选项之一,并且wpum_relationship_to_lib
不定义WordPress角色。
所有菜单都是主要菜单。此外,我需要在登录之前隐藏菜单。请参见我的代码,该代码未正确限制菜单。
function restrict_menu_to_researchers($items, $args) { // 检查菜单是否分配给所需位置 if ($args->theme_location === 'primary') { // 检查用户是否已登录 if (is_user_logged_in()) { $user_id = get_current_user_id(); $relationship_values = get_user_meta($user_id, 'wpum_relationship_to_lib', true); // 检查用户是否为“researcher” if (is_array($relationship_values) && in_array('researcher', $relationship_values)) { // 允许研究人员访问菜单 return $items; } else { foreach ($items as $key => $item) { if ($item->title == 'Research') { // 隐藏非研究人员的“Research”菜单 unset($items[$key]); } } } } else { foreach ($items as $key => $item) { if ($item->title == 'Research') { // 隐藏未登录用户的“Research”菜单 unset($items[$key]); } } } } return $items; } add_filter('wp_nav_menu_objects', 'restrict_menu_to_researchers', 10, 2);
P粉5786806752023-09-08 13:32:38
提供的代码大部分是正确的。然而,在检查用户关系值时的条件语句中存在一个小问题。我更新了代码,确保只有在wpum_relationship_to_lib元字段中选择“researcher”作为其关系值之一的用户才会显示“Research”菜单项。它还会隐藏非登录用户的“Research”菜单。我没有测试过代码,所以欢迎任何评论。 #joshmoto的代码是有效的,但在foreach循环中,条件!in_array($menu_object->title, $relationship_array)检查菜单对象标题是否不在关系数组中。从问题中我所理解的,你想要检查值“researcher”是否在关系数组中。因此,你应该更新条件为in_array('researcher', $relationship_array)。
function restrict_menu_to_researchers($items, $args) { // 检查菜单是否分配给所需位置 if ($args->theme_location === 'primary') { // 检查用户是否已登录 if (is_user_logged_in()) { $user_id = get_current_user_id(); $relationship_values = get_user_meta($user_id, 'wpum_relationship_to_lib', true); // 检查用户是否选择了“researcher”作为其关系值之一 if (is_array($relationship_values) && in_array('researcher', $relationship_values, true)) { // 允许研究人员使用菜单 return $items; } else { // 隐藏非研究人员的“Research”菜单 foreach ($items as $key => $item) { if ($item->title === 'Research') { unset($items[$key]); } } } } else { // 隐藏非登录用户的“Research”菜单 foreach ($items as $key => $item) { if ($item->title === 'Research') { unset($items[$key]); } } } } return $items; } add_filter('wp_nav_menu_objects', 'restrict_menu_to_researchers', 10, 2);
P粉7998853112023-09-08 13:31:29
我得到了答案。有趣的是它是区分大小写的。我只需要使用以下代码。但是在测试平台上,没有这行代码也可以运行。我什至不知道这可能是为了小写字母:
(is_array($relationship_values) && in_array('researcher', array_map('strtolower', $relationship_values))) { ...
感谢大家的帮助和时间。 –