Bonjour,
Le souci vient d'un seul point : l'appel à getField. Quand on lui passe une clé (un field_namekey, donc une chaîne et pas un id numérique), getField a besoin du nom de la table du champ en 2e argument. Sans ce 2e argument, il fait sa requête avec field_table = '' (vide), ne trouve aucun champ, et renvoie false.
Du coup $this->badgeField vaut false, votre test if(!empty($this->badgeField) && ...) n'est jamais vrai, le bloc n'est pas exécuté, et $badgesHtml reste vide. C'est pour ça que vous ne récupérez rien (ni le libellé, ni même la valeur).
La correction est d'indiquer la table du champ (pour un champ produit, c'est "product", la table affichée dans Affichage > Champs personnalisés) :
$fieldClass = hikashop_get('class.field');
$this->badgeField = $fieldClass->getField('product_badges', 'product');
$this->sizeField = $fieldClass->getField('product_size_values', 'product');
Une fois le champ correctement chargé, votre show() renvoie directement le libellé, pas la valeur stockée. Pour un champ de type liste (dropdown, radio, case à cocher), show() convertit en interne la valeur stockée en libellé de l'option, et gère même le cas de plusieurs valeurs séparées par des virgules :
$badgesHtml = $this->fieldsClass->show($this->badgeField, $this->row->product_badges);
// renvoie "nouveauté"