"review": {
"@type": "Review",
"reviewBody": "",
"author": ""
}
Ce fragment JSON-LD, extrait du code source d’une page produit, illustre un problème fréquent sur les sites qui combinent Advanced Custom Fields avec une extension SEO capable de générer du balisage structuré à partir des champs personnalisés : quand un champ ACF n’est pas renseigné, sa valeur vide est tout de même injectée dans le balisage, au lieu d’être simplement omise.
Symptôme : des propriétés vides qui invalident le balisage
Le symptôme se repère facilement dans l’outil de test de résultats enrichis de Google : des propriétés comme reviewBody, author ou ratingValue apparaissent bien dans le JSON-LD extrait, mais avec une valeur vide ou à zéro, ce qui déclenche un avertissement, voire une erreur bloquante selon le type de résultat enrichi visé. Sur un site avec plusieurs centaines de fiches produit, certaines alimentées entièrement par ACF et d’autres partiellement, le taux d’erreur peut grimper rapidement sans qu’aucune ligne de code ne semble en cause à première vue.
Diagnostic : la génération ne filtre pas les champs vides

Le diagnostic passe par l’inspection du code responsable de la génération du balisage, souvent une fonction qui boucle sur un tableau de correspondance entre champs ACF et propriétés Schema.org, sans jamais vérifier si le champ source contient réellement une valeur :
foreach ( $correspondances as $champ_acf => $propriete_schema ) {
$donnees[ $propriete_schema ] = get_field( $champ_acf );
}
Tant que get_field() retourne une chaîne vide ou false pour un champ non renseigné, cette valeur est injectée telle quelle dans le tableau final, puis encodée en JSON sans contrôle. Le résultat est un balisage syntaxiquement valide, mais sémantiquement incohérent : une note moyenne à zéro n’est pas la même chose que l’absence de note.
Correctif : un filtre unique avant l’encodage JSON
Plutôt que de corriger chaque appel get_field() individuellement, la solution la plus robuste consiste à passer le tableau de données complet dans une fonction de nettoyage récursive juste avant l’encodage en JSON, qui retire toute clé dont la valeur est vide, nulle ou fausse :
function nettoyer_donnees_schema( array $donnees ) {
foreach ( $donnees as $cle => $valeur ) {
if ( is_array( $valeur ) ) {
$donnees[ $cle ] = nettoyer_donnees_schema( $valeur );
}
if ( empty( $donnees[ $cle ] ) ) {
unset( $donnees[ $cle ] );
}
}
return $donnees;
}
$balisage = nettoyer_donnees_schema( $donnees );
echo wp_json_encode( $balisage );
Cette fonction s’applique récursivement, ce qui couvre aussi les cas où un champ ACF de type groupe ou répéteur contient lui-même des sous-champs vides — un scénario fréquent sur les fiches produit qui utilisent un champ répéteur pour lister des caractéristiques techniques optionnelles.
Un cas particulier : les propriétés obligatoires du type Schema
Attention toutefois : certains types Schema.org imposent des propriétés obligatoires pour être éligibles aux résultats enrichis. Le type Review, par exemple, exige à la fois author et reviewRating. Si le nettoyage retire l’un de ces champs obligatoires faute de valeur, il faut alors supprimer le bloc Review dans son ensemble plutôt que de le laisser incomplet, sous peine de continuer à générer des erreurs de validation :
- Vérifier après nettoyage que les propriétés obligatoires du type concerné sont bien présentes.
- Si l’une manque, ne pas générer le bloc, plutôt que d’espérer que Google l’ignore silencieusement.
- Documenter, pour chaque type Schema.org utilisé sur le site, la liste de ses propriétés requises.
Un balisage structuré incomplet, mais cohérent, vaut toujours mieux qu’un balisage complet en apparence mais truffé de valeurs vides : Google tolère l’absence, rarement l’incohérence.
Prévention : tester avec des fiches volontairement incomplètes
Lors de la recette d’un nouveau générateur de balisage structuré, il est utile de créer volontairement une fiche produit avec seulement la moitié des champs ACF renseignés, et de vérifier que le JSON-LD généré reste valide dans l’outil de test de résultats enrichis de Google. Ce test, rarement fait par réflexe, révèle en quelques minutes ce type de bug qui ne se manifeste sinon qu’au fil des mois, à mesure que des fiches incomplètes sont publiées.
En résumé
Un champ ACF non renseigné ne doit jamais se traduire par une propriété Schema.org vide dans le balisage généré : la correction passe par un filtre de nettoyage récursif appliqué juste avant l’encodage JSON, complété par une vérification des propriétés obligatoires propres à chaque type utilisé. Un test systématique sur des fiches incomplètes, dès la recette, évite que ce bug ne se propage silencieusement sur tout un catalogue.