Un client partageait ses articles sur les réseaux sociaux et voyait systématiquement apparaître une image générique du thème, ou pire, aucune image du tout, à la place de la photo qu’il avait pourtant mise en avant sur chaque article. Le site n’avait aucune extension SEO installée, choix assumé pour limiter le nombre de dépendances, mais cette absence privait le contenu de balises Open Graph correctement renseignées.
Plutôt que d’installer une extension SEO complète pour ce seul besoin, quelques lignes dans le thème suffisent à générer ces balises à partir des données déjà présentes sur chaque article.
Générer les balises dans le head
Le hook wp_head permet d’injecter ces balises meta, en les limitant aux pages singulières pour ne pas polluer les pages d’archive ou la page d’accueil avec des données incohérentes :
add_action( 'wp_head', function () {
if ( ! is_singular() ) {
return;
}
$post = get_queried_object();
$titre = wp_strip_all_tags( get_the_title( $post ) );
$description = get_the_excerpt( $post ) ?: wp_trim_words( wp_strip_all_tags( $post->post_content ), 30 );
$url = get_permalink( $post );
printf( '<meta property="og:type" content="article" />' . "\n" );
printf( '<meta property="og:title" content="%s" />' . "\n", esc_attr( $titre ) );
printf( '<meta property="og:description" content="%s" />' . "\n", esc_attr( $description ) );
printf( '<meta property="og:url" content="%s" />' . "\n", esc_url( $url ) );
} );
Gérer l’image, avec repli
La priorité va à l’image mise en avant de l’article. En son absence, un repli vers une image par défaut du thème évite l’affichage d’une carte vide sur les réseaux sociaux :

add_action( 'wp_head', function () {
if ( ! is_singular() ) {
return;
}
$post = get_queried_object();
$image_id = get_post_thumbnail_id( $post );
if ( $image_id ) {
$image = wp_get_attachment_image_src( $image_id, 'large' );
} else {
$image = [ get_template_directory_uri() . '/assets/images/partage-defaut.jpg' ];
}
if ( ! empty( $image[0] ) ) {
printf( '<meta property="og:image" content="%s" />' . "\n", esc_url( $image[0] ) );
printf( '<meta property="twitter:card" content="summary_large_image" />' . "\n" );
}
} );
Éviter les doublons avec une extension SEO existante
Sur un projet où une extension SEO (Yoast, Rank Math ou autre) est déjà active, ces balises sont probablement déjà générées ailleurs. Injecter ce code sans vérification produirait des balises Open Graph en double, ce que les réseaux sociaux gèrent mal, en prenant parfois la première occurrence, parfois la dernière, de façon peu prévisible.
add_action( 'wp_head', function () {
if ( defined( 'WPSEO_VERSION' ) || class_exists( 'RankMath' ) ) {
return; // Une extension SEO gère déjà ces balises
}
// ... génération des balises
} );
Tester le résultat
- L’outil de débogage de partage de Facebook (« Sharing Debugger ») permet de visualiser les balises lues et de forcer un nouveau scan après correction.
- Un simple
curl -s https://exemple.fr/mon-article/ | grep "og:"en ligne de commande vérifie rapidement la présence des balises sans dépendre d’un outil tiers. - Vérifier que les guillemets et caractères spéciaux du titre sont bien échappés avec
esc_attr(), sous peine de casser la balise HTML générée.
Étendre aux pages d’archive si nécessaire
Pour un site où les pages de catégorie sont aussi partagées régulièrement, le même principe s’applique en testant is_category() ou is_tax() plutôt que is_singular(), avec un titre et une description tirés de la description de la taxonomie :
if ( is_category() ) {
$terme = get_queried_object();
$titre = $terme->name;
$description = wp_strip_all_tags( $terme->description ) ?: get_bloginfo( 'description' );
}
Trois balises bien renseignées, og:title, og:description et og:image, couvrent l’essentiel des besoins de partage social pour un blog qui n’a pas vocation à faire du SEO technique poussé.
Ce que cette approche ne couvre pas
Ce code ne génère ni sitemap XML, ni balises canoniques, ni données structurées Schema.org : ces besoins relèvent d’un travail SEO plus large, pour lequel une extension dédiée reste souvent plus adaptée qu’un développement maison au fil des demandes.
En résumé
Pour le seul besoin d’un partage social propre sur les réseaux, une vingtaine de lignes de PHP dans le thème suffisent, sans dépendance supplémentaire ni risque de conflit avec une extension SEO existante, à condition de vérifier son absence au préalable.