# Advanced Custom Fields et le Schema.org généré automatiquement

> Une extension SEO génère un balisage structuré avec des champs ACF non renseignés exposés comme vides. Comment filtrer ces champs avant génération, sans y toucher un par un.

- Auteur : WordPress Développement
- Publié le : 2023-03-21
- Mis à jour le : 2023-03-21
- Catégorie : SEO &amp; GEO
- URL : https://www.wpmoderne.fr/seo/acf-schema-org-genere-champs-vides/

## L’essentiel

- Un champ vide génère une propriété vide dans le JSON-LD
- Google Rich Results Test signale ces champs comme invalides
- Un seul filtre corrige tous les cas

```
"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

> L'essentiel à retenir : Un champ vide génère une propriété vide dans le JSON-LD ; Google Rich Results Test signale ces champs comme invalides ; Un seul filtre corrige tous les cas

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.
