限制某些使用者的選單:根據特定欄位的值進行篩選的方法
P粉563831052
P粉563831052 2023-09-07 15:58:31
0
2
499

在我的主要的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))) { ...

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

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板