首頁  >  問答  >  主體

限制某些使用者的選單:根據特定欄位的值進行篩選的方法

在我的主要的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 天前476

全部回覆(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
  • 取消回覆