Heim  >  Fragen und Antworten  >  Hauptteil

Einschränken des Menüs auf bestimmte Benutzer: eine Möglichkeit, basierend auf dem Wert eines bestimmten Felds zu filtern

In meiner Hauptnavigationsleiste von wp habe ich einen Menüpunkt namens „Recherche“, den ich nur in Forschern in WordPress anzeigen möchte.

Forscher werden durch ein Benutzermetadatenfeld namens wpum_relationship_to_lib definiert, bei dem es sich um ein Mehrfachauswahlfeld handelt, das Optionen für Forscher, Studenten, Mitarbeiter usw. enthält.

Es ist wichtig, dass forscher eine der Optionen sein muss, die der Benutzer für den Zugriff auf dieses Menü auswählt und researcher必须是用户选择访问该菜单的选项之一,并且wpum_relationship_to_libkeine WordPress-Rolle definiert.

Alle Menüs sind Hauptmenüs. Außerdem muss ich das Menü ausblenden, bis ich mich anmelde. Sehen Sie sich meinen Code an, der das Menü nicht richtig einschränkt.

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 Tage vor477

Antworte allen(2)Ich werde antworten

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

    Antwort
    0
  • P粉799885311

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

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

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

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

    Antwort
    0
  • StornierenAntwort