Maison  >  Questions et réponses  >  le corps du texte

Restreindre le menu à certains utilisateurs : un moyen de filtrer en fonction de la valeur d'un champ spécifique

Dans ma barre de navigation principale wp, j'ai un élément de menu appelé « Recherche » que je souhaite afficher uniquement dans les chercheurs de WordPress.

Les chercheurs seront définis par un champ de métadonnées utilisateur appelé wpum_relationship_to_lib, qui est un champ à sélection multiple qui comprend des options pour le chercheur, l'étudiant, l'employé, etc.

Il est important que chercheur soit l'une des options que l'utilisateur choisit pour accéder à ce menu et researcher必须是用户选择访问该菜单的选项之一,并且wpum_relationship_to_libne définisse pas de rôle WordPress.

Tous les menus sont des menus principaux. De plus, je dois masquer le menu jusqu'à ce que je me connecte. Voir mon code qui ne limite pas correctement le menu.

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 Il y a quelques jours438

répondre à tous(2)je répondrai

  • P粉578680675

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

    Le code fourni est généralement correct. Cependant, il y a un petit problème dans l'instruction conditionnelle lors de la vérification de la valeur de la relation utilisateur. J'ai mis à jour le code pour garantir que l'élément de menu "Recherche" n'apparaît que pour les utilisateurs qui ont sélectionné "chercheur" comme l'une de leurs valeurs de relation dans le champ méta wpum_relationship_to_lib. Il masque également le menu Recherche pour les utilisateurs non connectés. Je n'ai pas testé le code, donc tous les commentaires sont les bienvenus. Le code de #joshmoto est valide, mais dans la boucle foreach, la condition !in_array($menu_object->title, $relationship_array) vérifie si le titre de l'objet de menu n'est pas dans le tableau de relations. D'après ce que j'ai compris de la question, vous souhaitez vérifier si la valeur « chercheur » est dans le tableau relationnel. Par conséquent, vous devez mettre à jour la condition vers 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);

    répondre
    0
  • P粉799885311

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

    J'ai la réponse. Ce qui est intéressant, c'est qu'il est sensible à la casse. J'ai juste besoin d'utiliser le code suivant. Mais sur la plateforme de test, cela fonctionne sans cette ligne de code. Je ne savais même pas que cela pouvait être pour les lettres minuscules :

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

    Merci à tous pour votre aide et votre temps. –

    répondre
    0
  • Annulerrépondre