首页  >  问答  >  正文

限制某些用户的菜单:根据特定字段的值进行筛选的方法

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

全部回复(2)我来回复

  • P粉578680675

    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);

    回复
    0
  • P粉799885311

    P粉7998853112023-09-08 13:31:29

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

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

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

    回复
    0
  • 取消回复