Pourquoi une offre d’emploi correctement balisée en JobPosting n’obtient-elle parfois aucun résultat enrichi dans Google, alors que la validation du balisage ne remonte aucune erreur de syntaxe ? La réponse tient souvent à une distinction que beaucoup ignorent : Google impose, en plus des exigences de la spécification Schema.org elle-même, une liste de champs qu’il considère obligatoires pour son propre affichage enrichi, une liste plus stricte que le standard générique.
Ce tutoriel détaille les étapes pour baliser correctement une offre d’emploi sur un site de recrutement, en respectant ces exigences spécifiques à Google. Il ne traite pas l’outil de suivi des candidatures utilisé en interne, qui reste un sujet distinct.
Étape 1 : identifier les champs réellement obligatoires pour Google
La spécification Schema.org JobPosting définit de nombreuses propriétés, mais Google en exige un sous-ensemble précis pour afficher un résultat enrichi : title, description, datePosted et hiringOrganization. À cela s’ajoute une exigence particulière autour de la date d’expiration : si l’offre a une date de fin de validité, le champ validThrough doit être renseigné, et Google recommande fortement de retirer ou de marquer comme expirée toute offre dépassée, faute de quoi le résultat enrichi risque d’être supprimé pour l’ensemble du domaine, pas seulement pour l’offre concernée.
Étape 2 : construire le balisage JSON-LD

function recrut_generer_jobposting( $post_id ) {
$data = array(
'@context' => 'https://schema.org/',
'@type' => 'JobPosting',
'title' => get_the_title( $post_id ),
'description' => wp_strip_all_tags( get_post_field( 'post_content', $post_id ) ),
'datePosted' => get_the_date( 'c', $post_id ),
'validThrough' => get_post_meta( $post_id, 'date_expiration', true ),
'employmentType' => get_post_meta( $post_id, 'type_contrat', true ),
'hiringOrganization' => array(
'@type' => 'Organization',
'name' => get_bloginfo( 'name' ),
'sameAs'=> home_url(),
),
'jobLocation' => array(
'@type' => 'Place',
'address' => array(
'@type' => 'PostalAddress',
'addressLocality' => get_post_meta( $post_id, 'ville', true ),
'addressCountry' => 'FR',
),
),
'baseSalary' => array(
'@type' => 'MonetaryAmount',
'currency' => 'EUR',
'value' => array(
'@type' => 'QuantitativeValue',
'value' => get_post_meta( $post_id, 'salaire', true ),
'unitText' => 'MONTH',
),
),
);
echo '<script type="application/ld+json">' . wp_json_encode( $data ) . '</script>';
}
add_action( 'wp_head', function () {
if ( is_singular( 'offre_emploi' ) ) {
recrut_generer_jobposting( get_the_ID() );
}
} );
Étape 3 : gérer le salaire, un champ sensible
Google exige la présence d’un salaire, sous forme de valeur, de fourchette ou d’une mention explicite indiquant que le salaire n’est pas communiqué, via la propriété baseSalary. Une offre sans indication de rémunération, ni valeur ni mention explicite, ne remplit pas les conditions d’affichage enrichi, une exigence plus stricte que ce que suggère la lecture rapide de la documentation Schema.org générique.
- Si le salaire est fixe, renseigner
valueavec le montant précis. - Si le salaire est une fourchette, utiliser les propriétés
minValueetmaxValueà l’intérieur devalueplutôt qu’un montant unique. - Si l’employeur ne souhaite pas communiquer de montant, Google recommande malgré tout de fournir une fourchette réaliste plutôt que d’omettre entièrement le champ.
Étape 4 : gérer la date d’expiration et le retrait des offres pourvues
Le champ validThrough doit refléter la date réelle de fin de validité de l’offre. Une fois cette date dépassée, ou l’offre pourvue avant terme, la page doit soit disparaître (statut 404 ou 410), soit indiquer clairement que l’offre n’est plus disponible, faute de quoi Google peut, selon sa documentation, suspendre l’affichage enrichi pour l’ensemble du site, une sanction qui dépasse largement la seule offre en cause.
Étape 5 : valider avec l’outil de test officiel
Avant mise en production, chaque modèle d’offre doit être vérifié avec l’outil de test des résultats enrichis fourni par Google, qui distingue explicitement les erreurs bloquantes des avertissements facultatifs. Un balisage sans erreur bloquante mais avec des avertissements reste éligible à l’affichage enrichi, mais corriger ces avertissements, comme l’absence d’une adresse complète, améliore la qualité perçue du résultat affiché.
En résumé
Un balisage JobPosting techniquement valide selon Schema.org ne garantit pas un résultat enrichi chez Google : les exigences propres au moteur, en particulier sur le salaire, la date d’expiration et le retrait des offres pourvues, sont plus strictes que la spécification générique. Respecter ces règles dès la conception du modèle d’offre évite une suspension du résultat enrichi qui, une fois déclenchée, peut prendre du temps à se lever même après correction.