Utilisation d'OpenGraph, ajouter les métas APRÈS les headers envoyés

Par Genki, il y a 10 ans


Bonjour,

Je viens ici pour poser une petite question qui semble bête mais qui me pourrie ces derniers jours ^^
Je souhaite utiliser les metadata d'OpenGraph (l'API de Facebook).

En gros je souhaite pouvoir me servir des meta pour forcer le partage facebook à avoir les informations de l'article à partager (photo de couverture, texte, auteur etc..)

Cependant, mon site est ainsi :
Je charge la page index.php en premier lieu, et je charge les articles dans une div "content" avec un include PHP.

<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> <head> <title>Mon super site</title> <!-- Injecter des metadata ici provenant de la page article plus bas --> </head> <body> <div id="content"> <?php switch($_GET['page']) { case 'contact': include('./inc/contact.php'); break; case 'article': include('./inc/article.php'); break; default: include('./inc/default.php'); break; } ?> </div> </body> </html>

Ce qui fait que j'ignore comment "ré-injecter" des metadata de CES articles vu que les headers dont déjà envoyés avec index.php
Si vous avez une idée, je suis preneur

Merci !

9 réponses

Gold weavers, il y a 10 ans

Content d'avoir pu t'aider ;)

Gold weavers, il y a 10 ans

Je ne connais pas Opengraph mais peut-être insérer tes meta via le selecteur head, en te servant de jquery.
par ex avec la méthode append().

Genki, il y a 10 ans

Le problème est qu'elle est générée du coup après. Si on regarde le devtool, ça fonctionne, mais si on regarde le code source, c'est inexistant. Et j'ai bien peur que OpenGraph se sert de ce qu'il trouve dans le code source :/

Gold weavers, il y a 10 ans

et si tu utilise un moteur de template (ex : blade).
Par exemple en blade:
Dans ton template.blade.php (qui serait ton parent) :

<html> <head> @yield('meta') </head> <body> @yield('content') </body> </html>

Dans ton contact.blade.php

@extends('template') @section('meta') <meta charset="UTF-8"> @endsection @section('content') <p>Du blabla</p> @endsection

Et pour les autres le meme système.

Genki, il y a 10 ans

Oulà, trop compliqué et long à mettre en place, c'est pour un petit site d'une association bénévole, je vais pas rentrer dans le compliqué

Gold weavers, il y a 10 ans

Ahah, excuse moi. J'ai pas d'autre solution en tête pour le moment, désolé.

Genki, il y a 10 ans

C'est pas grave, je te remercie de t'être arrêter sur mon problème au moins :)

Alexandre #lbac, il y a 10 ans

Ca n'a pourtant rien de long et compliqué, tu peux utiliser le template uniquement pour les balises mêtas ;)

Genki, il y a 10 ans

Bon cette histoire de template, m'a fait essayer quelque chose dans le même genre.

En gros, voilà comment je procède, c'est pas très élégant, mais c'est tout ce que j'ai trouvé :

La page article type:

<meta property="og:locale" content="fr_FR" /> <meta property="og:type" content="article" /> etc... <?php // Oui c'est pas très beau, mais dans le fond ça fonctionne $head = ob_get_contents(); ob_end_clean(); ob_start(); ?> ..Et ici le contenu de l'article.. <?php ob_start(); switch($_GET['page']) { case 'contact': include('./inc/contact.php'); break; case 'article': include('./inc/article.php'); break; default: include('./inc/default.php'); break; } $content = ob_get_contents(); ob_end_clean(); ?> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> <head> <title>Mon super site</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <?php echo $head; // Mes metas OpenGraph chargé dans le ob_start plus haut ?> </head> <body> <div id="content"> <?= $content; ?> </div> </body> </html>

Les metas apparaissent bien maintenant dans le code source, tout fonctionne, c'est pas très beau, mais ça fera l'affaire ;)