ACF propose de pouvoir rajouter des champs personnalisés à un élément de menu, mais il ne propose pas de pouvoir l’assigner uniquement à un niveau de profondeur, nous allons découvrir comment le mettre en place simplement.

Pour ce faire, nous allons rajouter un nouveau type de règle qui sera assigné au sous-niveau Formulaire, on lui assignera des valeurs, et l’on mettra en place la logique pour déterminer si l’élément de menu peut avoir nos champs ou non.

Pour rajouter un type de règle, nous n’avons pas besoin de la version Pro d’Advanced Custom Fields. C’est disponible dès la version gratuite d’ACF.

Tout le code que vous verrez ci-dessous devra être appelé par votre thème, un (mu-)plugin ou autre. Pour des raisons de simplicité, nous allons le faire au niveau du fichier functions.php de notre thème.

Ajout d’un type de règle

Dans un premier temps, nous allons rajouter un nouveau type de règle à ACF en se basant sur le hook acf/location/rule_types que propose ACF pour surcharger son menu :

add_filter('acf/location/rule_types', function ($choices) {
  $acfFormsGroup = __('Forms', 'acf');
  $choices[$acfFormsGroup]['menu_level'] = "Profondeur de l'élément du menu";

  return $choices;
});

Désormais, quand nous désirons rajouter un nouveau groupe de champ, on peut voir dans les règles notre nouveau type de champ :

Générer les valeurs de la règle

Maintenant que notre ACF comprend qu’il a une nouvelle règle de localisation, nous allons voir comment rajouter des valeurs à ce dernier.

Un menu possède des niveaux de profondeur de 0 (premier premier niveau) jusqu’à N. On va utiliser le hook acf/location/rule_values/menu_level pour le faire :

add_filter('acf/location/rule_values/menu_level', function () {
  $maxDepthMenu = 4;

  return array_combine(
    range(0, $maxDepthMenu),
    array_map('strval', range(0, $maxDepthMenu))
  );
});

Dans le code ci-dessus, nous allons générer les valeurs possibles de la règle en partant de 0 jusqu’à $maxDepthMenu qui est défini à 4 dans notre exemple. Mais vous n’avez pas de restriction pour mettre la valeur maximale que vous désirez.

Compilation de nos règles et de leurs valeurs

La dernière étape consiste à dire à Advanced Custom Fields que nous désirons ajouter nos champs ACF à nos éléments de menu.

add_filter('acf/location/rule_match/menu_level', function ($match, $rule, $options) {
  if (get_current_screen()->base === 'nav-menus' && $rule['operator'] === "==") {
    $match = ($options['nav_menu_item_depth'] === (int)$rule['value']);
  }

  return $match;
}, 10, 3);

Même si le code semble un peu fastidieux, il en reste très simple. Nous déterminons que si nous sommes sur la page des menus (nav-menus), nous comparons la profondeur du menu avec l’option que nous avons choisi dans le groupe de champs lors de sa configuration.

Conclusion

Désormais, vous savez comment restreindre un champ ACF à un élément de menu par rapport à sa profondeur.

<?php
// wp-content/themes/VOTRE_THEME/functions.php

add_filter('acf/location/rule_types', function ($choices) {
  $acfFormsGroup = __('Forms', 'acf');
  $choices[$acfFormsGroup]['menu_level'] = "Profondeur de l'élément du menu";

  return $choices;
});

add_filter('acf/location/rule_values/menu_level', function () {
  $maxDepthMenu = 4;

  return array_combine(
    range(0, $maxDepthMenu),
    array_map('strval', range(0, $maxDepthMenu))
  );
});

add_filter('acf/location/rule_match/menu_level', function ($match, $rule, $options) {
  if (get_current_screen()->base === 'nav-menus' && $rule['operator'] === "==") {
    $match = ($options['nav_menu_item_depth'] === (int)$rule['value']);
  }

  return $match;
}, 10, 3);

Commentaires

N'hésitez pas à me laisser un petit commentaire pour que l'on discute ensemble de cet article.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Articles reliés

Retrouvez ci-dessous quelques articles qui pourrait vous intéresser.

Maintenance WordPress sans plugin
11
Juil

Activer le mode maintenance de WordPress sans plugin

Nous allons voir comment mettre son site WordPress en maintenance directement depuis le FTP et sans utiliser des plugins. Je vois beaucoup de monde utiliser un plugin pour mettre en maintenance leur site, lors de leur mise à jour ou pendant les maintenances. Il n’y a pas forcément besoin d’utiliser un plugin pour faire ça,…

Voir plus
WordPress 5.5 - Environnement Type
15
Août

Types d’environnements sous WordPress 5.5

Introduction à la nouvelle fonction wp_get_environnement_type() sur WordPress 5.5 nous permettant de savoir sur quel type d’environnement on se trouve. Très pratique pour les développeurs de thèmes ou de plugins d’effectuer des tâches précises en fonction du type d’environnement.

Voir plus