限制某些用户的菜单:根据特定字段的值进行筛选的方法
P粉563831052
P粉563831052 2023-09-07 15:58:31
0
2
414

在我的主要的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粉563831052
P粉563831052

全部回复 (2)
P粉578680675

提供的代码大部分是正确的。然而,在检查用户关系值时的条件语句中存在一个小问题。我更新了代码,确保只有在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粉799885311

    我得到了答案。有趣的是它是区分大小写的。我只需要使用以下代码。但是在测试平台上,没有这行代码也可以运行。我什至不知道这可能是为了小写字母:

    (is_array($relationship_values) && in_array('researcher', array_map('strtolower', $relationship_values))) { ...

    感谢大家的帮助和时间。 –

      最新下载
      更多>
      网站特效
      网站源码
      网站素材
      前端模板
      关于我们 免责声明 Sitemap
      PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!