Depuis un moment j’utilise le très bon plugin Caldera Forms dans sa version gratuite pour mes formulaires. Il est simple à utiliser, complet, personnalisable et extensible… En clair, tout ce qu’on attend d’un plugin WordPress !
Aujourd’hui j’ai eu un besoin particulier qui n’est pas prévu par Caldera Forms : un menu déroulant (select) avec des groupes (optgroup). En effet vous ne trouverez nulle part mention de cette possibilité pour ce type de champ. Google a beau être mon ami, sur ce coup là, il m’a lâchement abandonné. Il m’a donc fallu remonter les manches et trouver seul la solution. La voici, c’est cadeau !
Dans l’administration d’un menu déroulant, on peut très facilement gérer les valeurs (option). Pour gérer les groupes, deux possibilités : ajouter une gestion des groupes (aïe aïe) ou trouver une astuce. J’ai opté pour l’astuce ! Je suis donc parti du principe qu’une valeur commençant par le signe * serait à convertir en groupe.
Pour ce faire, il est nécessaire d’adapter le rendu final du menu déroulant. Le fichier idoine se trouve dans « caldera-forms/fields/dropdrown/field.php ». Bien évidemment, je ne vous conseillerai absolument pas de modifier ce dernier directement, vous en perdriez le bénéfice à la moindre mise à jour. Par contre, vous pouvez créer un plugin dédié, y copier et modifier le fichier en question puis expliquer à Caldera Forms qu’il doit désormais utiliser votre fichier au lieu du sien. Et tout cela grâce à un simple filtre :
add_filter( 'caldera_forms_get_field_types', function( $fields ){
$fields[ 'dropdown' ]['file'] = plugin_dir_path( __FILE__ ) . '/field.php';
return $fields;
});
Ensuite, faites preuve d’un peu de malice dans votre version de field.php en encerclant le foreach avec ceci :
$hasOptOpen = false;
foreach($field['config']['option'] as $option_key=>$option){
if(substr($option['label'], 0, 1) == '*'){
if($hasOptOpen){
echo '</optgroup>';
}
echo '<optgroup label="'.htmlspecialchars(substr($option['label'], 1)).'">';
$hasOptOpen = true;
continue;
}
Enfin adaptez la fermeture du select comme cela :
<?php if($hasOptOpen) echo '</optgroup>'; ?>
</select>
Néanmoins, attention : comme il nous a été nécessaire de copier un fichier du plugin Caldera Forms pour l’adapter, il faudra suivre les mises à jour pour vérifier que le fichier en question n’a pas été modifié. Auquel cas, vous devrez mettre à jour en conséquence votre plugin dédié.