>  Q&A  >  본문

메뉴를 특정 사용자로 제한: 특정 필드의 값을 기준으로 필터링하는 방법

내 메인 wp navbar에는 WordPress의 연구자에게만 표시하고 싶은 'Research'라는 메뉴 항목이 있습니다.

연구원은 연구원, 학생, 직원 등에 대한 옵션을 포함하는 다중 선택 필드인 wpum_relationship_to_lib라는 사용자 메타데이터 필드로 정의됩니다.

researcher는 사용자가 이 메뉴에 액세스하기 위해 선택하는 옵션 중 하나여야 하며 researcher必须是用户选择访问该菜单的选项之一,并且wpum_relationship_to_libWordPress 역할을 정의하지 않는 것이 중요합니다.

모든 메뉴가 메인메뉴입니다. 그리고 로그인할 때까지 메뉴를 숨겨야 합니다. 메뉴를 올바르게 제한하지 않는 내 코드를 참조하십시오.

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粉563831052380일 전437

모든 응답(2)나는 대답할 것이다

  • P粉578680675

    P粉5786806752023-09-08 13:32:38

    제공된 코드는 대부분 정확합니다. 그런데 사용자 관계 값을 확인할 때 조건문에 작은 문제가 있습니다. wpum_relationship_to_lib 메타 필드에서 관계 값 중 하나로 "researcher"를 선택한 사용자에게만 "Research" 메뉴 항목이 표시되도록 코드를 업데이트했습니다. 또한 로그인하지 않은 사용자를 위해 조사 메뉴를 숨깁니다. 아직 코드를 테스트하지 않았으므로 어떤 의견이라도 환영합니다. #joshmoto의 코드는 유효하지만 foreach 루프에서 !in_array($menu_object->title, $relationship_array) 조건은 메뉴 개체 제목이 관계 배열에 없는지 확인합니다. 질문에서 제가 이해한 바에 따르면 "researcher"라는 값이 관계형 배열에 있는지 확인하고 싶습니다. 따라서 조건을 in_array('researcher', $relationship_array)로 업데이트해야 합니다.

    으아악

    회신하다
    0
  • P粉799885311

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

    답을 얻었습니다. 흥미로운 점은 대소문자를 구분한다는 것입니다. 다음 코드를 사용해야합니다. 그러나 테스트 플랫폼에서는 이 코드 줄 없이도 작동합니다. 저는 이것이 소문자일지도 몰랐습니다:

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

    도움과 시간을 내주신 모든 분들께 감사드립니다. –

    회신하다
    0
  • 취소회신하다