Afficher ses avis

Afficher les avis Google sur un site PHP ou HTML (code prêt à coller)

Intégrez vos avis Google en PHP avec un include serveur mis en cache, ou sur un site HTML statique : les options lisibles par les IA, et leurs limites.

Mis à jour le

Vous avez un site en PHP, un CMS maison, ou un simple site en HTML, et vous voulez y afficher vos avis Google de façon à ce que Google et les moteurs IA les lisent. Tout dépend d'une question : votre site exécute-t-il du code côté serveur ?

Quelle méthode pour quel site ?

Si votre serveur exécute du PHP (ou un autre langage), utilisez l'include serveur. Sinon, les options lisibles par les IA demandent une mise à jour manuelle ou un build.

Votre siteMéthodeAvis dans le HTMLLisible par les IAMise à jour
PHP, CMS en PHP (hors WordPress), Laravel, SymfonyInclude serveur /api/embed/ID/htmlOuiOuiAutomatique (cache 1 h)
Site derrière Cloudflare, quel que soit le CMSCloudflare WorkerOuiOuiAutomatique (cache 1 h)
HTML statique avec un build (générateur, CI)Fragment récupéré au buildOuiOuiÀ chaque build
HTML statique sans build, Squarespace, Webflow, ShopifyHTML à collerOuiOuiManuelle
Wix, ou tout autre casSnippet JavaScript (iframe)NonNonEn direct
WordPressPlugin WordPressOuiOuiChaque nuit

L'include serveur ne demande ni compte développeur ni clé API : l'URL du fragment est publique, et fonctionne dès le plan Free.

Comment intégrer les avis Google en PHP ?

L'include serveur renvoie le widget déjà rendu par Revys : le HTML des avis, un CSS limité au widget et le JSON-LD, sans aucun JavaScript. Votre serveur le récupère et l'insère dans la page avant de l'envoyer au visiteur.

  1. Récupérer le code dans Revys

    Dans le tableau de bord, ouvrez Mes établissements › votre établissement › Sur mon site, cliquez sur Mettre sur mon site et saisissez l'adresse de votre site. Revys le reconnaît comme site sur mesure (sinon, choisissez Autre ou sur mesure sous « Ce n'est pas ça ? ») : dans la méthode 1. Code serveur, si vous avez un développeur, choisissez PHP sous « Votre site est fait avec… ». Le code affiché contient déjà l'URL de votre widget.

  2. Coller le bloc dans votre fichier .php

    Collez-le exactement là où les avis doivent apparaître (un fichier .php, pas .html) :

    <?php
    // Revys : avis visibles par Google et les IA (cache 1 h, jamais bloquant)
    $revysUrl = 'https://revys.io/api/embed/VOTRE_ID_WIDGET/html';
    $revysCache = sys_get_temp_dir() . '/revys-' . md5($revysUrl) . '.html';
    if (!is_file($revysCache) || filemtime($revysCache) < time() - 3600) {
      $revysHtml = @file_get_contents($revysUrl, false, stream_context_create(['http' => ['timeout' => 2]]));
      if ($revysHtml !== false && $revysHtml !== '') { @file_put_contents($revysCache, $revysHtml); } else { @touch($revysCache); }
    }
    echo is_file($revysCache) ? file_get_contents($revysCache) : '';
    ?>
  3. Vérifier le code source

    Ouvrez la page, puis « Afficher le code source » : le texte de vos avis doit y figurer. Vous pouvez aussi tester l'adresse avec notre testeur de visibilité des avis par les IA.

Ce bloc respecte trois règles que tout include devrait suivre :

  • Délai de 2 secondes (timeout du contexte HTTP) : votre page n'attend jamais Revys plus longtemps.
  • Cache d'une heure dans le dossier temporaire du serveur. Revys récupère vos avis Google environ toutes les heures : inutile d'interroger plus souvent.
  • Repli sur la dernière version : en cas d'échec, touch repousse la prochaine tentative d'une heure et l'ancien fichier reste affiché.

file_get_contents sur une URL demande que l'option PHP allow_url_fopen soit active. C'est le cas par défaut, mais certains hébergeurs la coupent. Dans ce cas, utilisez la version cURL ci-dessous.

Variante cURL avec ETag (requêtes conditionnelles)

L'endpoint renvoie un en-tête ETag et répond 304 Not Modified quand le widget n'a pas changé. Cette variante en profite, et fonctionne même si allow_url_fopen est désactivé :

<?php
// Revys : include serveur avec cURL, cache fichier 1 h et ETag
function revys_reviews(string $url, int $ttl = 3600): string
{
    $cache = sys_get_temp_dir() . '/revys-' . md5($url);
    $html  = is_file("$cache.html") ? (string) file_get_contents("$cache.html") : '';
    $etag  = is_file("$cache.etag") ? trim((string) file_get_contents("$cache.etag")) : '';

    if ($html !== '' && filemtime("$cache.html") > time() - $ttl) {
        return $html; // cache encore frais
    }

    $newEtag = '';
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_CONNECTTIMEOUT => 2,
        CURLOPT_TIMEOUT        => 2,
        CURLOPT_HTTPHEADER     => $etag !== '' ? ["If-None-Match: $etag"] : [],
        CURLOPT_HEADERFUNCTION => function ($ch, $line) use (&$newEtag) {
            if (stripos($line, 'ETag:') === 0) {
                $newEtag = trim(substr($line, 5));
            }
            return strlen($line);
        },
    ]);
    $body   = curl_exec($ch);
    $status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);

    if ($status === 200 && is_string($body) && $body !== '') {
        @file_put_contents("$cache.html", $body);
        if ($newEtag !== '') {
            @file_put_contents("$cache.etag", $newEtag);
        }
        return $body;
    }

    // 304 (inchangé) ou erreur : on garde la dernière version, nouvel essai dans 1 h
    if (is_file("$cache.html")) {
        @touch("$cache.html");
    }
    return $html;
}

echo revys_reviews('https://revys.io/api/embed/VOTRE_ID_WIDGET/html');

Une réponse 304 n'est pas décomptée par Revys, et ne transfère pas le fragment.

Laravel et autres frameworks PHP

Le principe est le même avec les outils du framework. Exemple Laravel, dans un contrôleur ou un composant de vue :

use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Http;

$revys = Cache::remember('revys-reviews', 3600, function () {
    try {
        $res = Http::timeout(2)->get('https://revys.io/api/embed/VOTRE_ID_WIDGET/html');
        return $res->successful() ? $res->body() : '';
    } catch (\Throwable $e) {
        return '';
    }
});

Dans la vue Blade, affichez le HTML sans échappement : {!! $revys !!}. Avec Twig, utilisez le filtre raw. Le fragment ne contient aucun script exécutable, et Revys échappe le texte des avis.

Et sur un site HTML statique ?

Sans code serveur, il n'existe pas de méthode à la fois automatique et lisible par les IA, sauf à passer par un build ou par Cloudflare. Voici les options, de la plus simple à la plus robuste.

Option 1 : coller le HTML généré par Revys (mise à jour manuelle)

Dans Revys, page Sur mon site de votre établissement, cliquez sur Mettre sur mon site (choisissez Autre ou sur mesure si besoin) : dans « Choisissez comment ajouter vos avis », la méthode 2. HTML à coller donne ce HTML. Cliquez sur Générer le HTML. Copiez le résultat dans votre fichier .html, ou dans un bloc Code (Squarespace), Embed (Webflow) ou une section « Liquid personnalisé » (Shopify). Les avis sont alors dans le HTML de la page, mais ils ne se mettent pas à jour seuls : recopiez le HTML quand de nouveaux avis arrivent.

Option 2 : récupérer le fragment au moment du build

Si votre site passe par une étape de build (générateur de site statique, intégration continue), un script peut insérer le fragment à chaque build. Placez deux marqueurs dans votre page :

<!-- revys:start -->
<!-- revys:end -->

Puis lancez ce script avant le déploiement (Node.js 18 ou plus récent) :

// scripts/revys-inject.mjs : node scripts/revys-inject.mjs index.html
import { readFile, writeFile } from "node:fs/promises";

const REVYS_URL = "https://revys.io/api/embed/VOTRE_ID_WIDGET/html";
const file = process.argv[2] ?? "index.html";
const START = "<!-- revys:start -->";
const END = "<!-- revys:end -->";

const res = await fetch(REVYS_URL, { signal: AbortSignal.timeout(5000) });
if (!res.ok) {
  console.error(`Revys a répondu ${res.status} : ${file} n'est pas modifié.`);
  process.exit(0);
}
const fragment = await res.text();
const page = await readFile(file, "utf8");
const i = page.indexOf(START);
const j = page.indexOf(END);
if (i === -1 || j < i) throw new Error(`Marqueurs introuvables dans ${file}`);
await writeFile(file, page.slice(0, i + START.length) + "\n" + fragment + "\n" + page.slice(j));

Planifiez un build par jour (tâche planifiée de votre CI ou de votre hébergeur) et vos avis restent frais. Si Revys ne répond pas, la page garde la version du build précédent.

Option 3 : un Cloudflare Worker, si votre site passe par Cloudflare

Un Worker peut insérer les avis à la volée dans n'importe quelle page servie par Cloudflare, quel que soit l'hébergeur ou le CMS derrière. Ajoutez <div data-revys-include></div> dans la page, puis déployez ce Worker (fourni dans le tableau de bord, option « Cloudflare Worker ») sur la route du site :

// Worker : remplace <div data-revys-include></div> par les avis
const REVYS_URL = "https://revys.io/api/embed/VOTRE_ID_WIDGET/html";

export default {
  async fetch(request) {
    const page = await fetch(request);
    if (!(page.headers.get("content-type") || "").includes("text/html")) return page;
    let html = "";
    try {
      const res = await fetch(REVYS_URL, {
        cf: { cacheTtl: 3600, cacheEverything: true },
        signal: AbortSignal.timeout(2000),
      });
      if (res.ok) html = await res.text();
    } catch {}
    if (!html) return page;
    return new HTMLRewriter()
      .on("[data-revys-include]", {
        element(el) {
          el.setInnerContent(html, { html: true });
        },
      })
      .transform(page);
  },
};

Option 4 : le snippet JavaScript (sans visibilité IA)

La ligne <script src="https://revys.io/api/embed/VOTRE_ID_WIDGET" async></script> fonctionne partout, Wix compris. Mais elle insère une iframe qui pointe vers revys.io : vos visiteurs voient les avis, pas les robots IA, et Google attribue ce contenu à revys.io plutôt qu'à votre site.

Pourquoi ne pas se contenter du snippet JavaScript ?

Parce que les moteurs IA lisent le HTML brut de vos pages. L'analyse de Vercel publiée en décembre 2024 n'a trouvé aucun grand robot IA (GPTBot, ClaudeBot…) qui exécute le JavaScript. Google l'exécute, mais dans une seconde étape de rendu décrite dans sa documentation sur le SEO JavaScript. Avec un include serveur, la question ne se pose plus : les avis font partie de la page.

Pour aller plus loin

Le guide afficher les avis Google sur son site compare toutes les méthodes. Sur Next.js, suivez la page Next.js ; pour des avis rendus avec votre propre HTML, l'API JSON est incluse dans le plan Pro (voir les tarifs).

Questions fréquentes

Quel code HTML coller pour afficher ses avis Google ?

Sur un site PHP, collez le bloc PHP fourni par Revys à l'endroit où les avis doivent apparaître. Sur un site sans serveur, Revys peut générer le HTML complet du widget à coller dans la page, à recopier quand de nouveaux avis arrivent.

L'include serveur est-il payant ?

Non. L'URL /api/embed/ID/html est publique, sans clé API, et fonctionne dès le plan Free (une fiche, avec un lien « Widget gratuit par Revys »). Seule l'API JSON demande le plan Pro.

Que se passe-t-il si Revys est en panne ?

Avec le code fourni, rien de visible : l'appel est coupé au bout de 2 secondes et la dernière version en cache est réaffichée. Sans cache, la zone des avis reste simplement vide.

Le snippet JavaScript de Revys est-il lisible par ChatGPT ?

Non. Il affiche les avis dans une iframe hébergée sur revys.io : ils ne sont pas dans le HTML de votre page, et les grands robots IA n'exécutent pas le JavaScript.

Mon site est sur Wix : quelle méthode utiliser ?

Wix n'exécute pas de code serveur et isole le HTML collé dans une iframe : seul le snippet JavaScript fonctionne, sans visibilité IA.

L'include serveur donne-t-il des étoiles dans Google ?

Non. Google n'affiche pas d'étoiles pour les avis qu'une entreprise publie sur son propre site. Le fragment contient un balisage Organization ou LocalBusiness conforme, sans AggregateRating.

Sources

  1. file_get_contents (manuel PHP)
  2. Options de contexte HTTP (manuel PHP)
  3. cURL (manuel PHP)
  4. Notions de base du SEO JavaScript (Google Search Central)
  5. The rise of the AI crawler (Vercel, décembre 2024)

Dans le même thème

Vos avis méritent d'être lus.

Par vos clients, par Google, et par les IA.