Restreindre le menu à certains utilisateurs : un moyen de filtrer en fonction de la valeur d'un champ spécifique
P粉563831052
P粉563831052 2023-09-07 15:58:31
0
2
474

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粉563831052
P粉563831052

répondre à tous(2)
P粉578680675

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);
P粉799885311

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. –

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!