Home Funzionalità Come funziona Prezzi Integrazioni FAQ Contatti English (EN) Français (FR) Español (ES) Nederlands (NL) Deutsch (DE)
← Torna alle integrazioni Integrazioni · PHP

Un iframe da copiare e incollare, con un vero tracciamento.

Nessun plugin: bastano un iframe e una piccola funzione di supporto, così Google Ads e Meta continuano ad attribuire correttamente le prenotazioni.

// 01

Funzione di supporto

Aggiungila una sola volta, in un include condiviso:

includes/fb-tracking.php
<?php
function fb_tracking_query() {
    $keys = ['gclid','gbraid','wbraid','utm_source','utm_medium','utm_campaign','utm_term','utm_content','fbclid'];
    $qs = '';
    foreach ($keys as $k) {
        $val = '';
        if (!empty($_GET[$k])) {
            $val = $_GET[$k];                       // 1st: this page's own URL
        } elseif (!empty($_COOKIE['fb_' . $k])) {
            $val = $_COOKIE['fb_' . $k];             // 2nd: sitewide cookie (see below)
        }
        if ($val !== '') {
            $qs .= '&' . $k . '=' . rawurlencode($val);
        }
    }
    return $qs;
}
?>
// 02

Fai ridimensionare l’iframe in automatico

Un iframe non cresce da solo quando cresce il suo contenuto: se non glielo indichi, il modulo viene tagliato non appena il contenuto si espande (per esempio aprendo il pannello Options). Entrambi gli embed qui sotto lo prevedono già, ma lo schema è sempre fatto degli stessi tre elementi, in quest’ordine:

  1. Lo script di ridimensionamento — prima dell’iframe
  2. L’iframe vero e proprio, con un id fisso
  3. Un piccolo script che attiva il ridimensionamento — dopo l’iframe, riferito allo stesso id

Usa la copia dello script ospitata da FareBookings

app.farebookings.com/iframe-resizer/iframeResizer.min.js — non una CDN di terze parti. Ad blocker, firewall aziendali e plugin di ottimizzazione a volte bloccano le CDN esterne, ma non il dominio su cui vive già il widget.

// 03

Widget compatto

<script src="https://app.farebookings.com/iframe-resizer/iframeResizer.min.js"></script>

<iframe
  id="fb-booking-widget"
  src="https://app.farebookings.com/booking-widget.php?k=YOUR_COMPANY_KEY&lng=gb<?php echo fb_tracking_query(); ?>"
  width="100%" height="640" frameborder="0" scrolling="no" style="border:none">
</iframe>

<script>
  if (window.iFrameResize) {
    iFrameResize({checkOrigin: false, heightCalculationMethod: 'lowestElement'}, '#fb-booking-widget');
  }
</script>
// 04

Modulo di prenotazione completo

La correzione più importante di questa pagina

Se un widget compatto in un’altra parte del sito (la home page, per esempio) viene inviato e porta il visitatore su questa pagina, tutto ciò che ha già inserito — partenza, destinazione, data, passeggeri ed eventuali gclid/utm_* — arriva nell’URL di questa pagina. Se questa pagina non lo legge e non lo inoltra all’iframe, va tutto perso e il modulo si carica vuoto. Questo vale solo quando il widget manda i visitatori a una pagina del tuo sito con il modulo incorporato: se invece il widget rimanda direttamente a app.farebookings.com, costruisce da solo quell’URL e non serve nulla di tutto questo.

La soluzione: inoltra all’iframe l’intera query string di questa pagina, senza elencare a mano ogni parametro:

<script src="https://app.farebookings.com/iframe-resizer/iframeResizer.min.js"></script>

<?php
// Forward everything this page's own URL was given — this is what
// carries the widget's data through when it redirects here.
$ownParams = $_SERVER['QUERY_STRING'] ?? '';
?>

<iframe
  id="fb-booking-form"
  src="https://app.farebookings.com/step1sslv3.php?k=YOUR_COMPANY_KEY&d=pp&lng=gb<?php echo $ownParams ? '&' . $ownParams : ''; ?>"
  width="100%" scrolling="no" style="border:none;min-height:1400px">
</iframe>

<script>
  if (window.iFrameResize) {
    iFrameResize({checkOrigin: false, heightCalculationMethod: 'lowestElement'}, '#fb-booking-form');
  }
</script>

Sostituisci YOUR_COMPANY_KEY con la chiave reale che trovi nella scheda Frontend del tuo pannello. Inoltrando $_SERVER['QUERY_STRING'] per intero porti già con te tutto ciò che il widget ha inviato, compresi gclid/utm_*, quindi su questa pagina non serve usare di nuovo fb_tracking_query().

// 05 · Consigliato se fai campagne a pagamento

Tracciamento su tutto il sito

Aggiungilo al footer o al template condiviso di ogni pagina:

<script>
(function(){
  var keys = ['gclid','gbraid','wbraid','utm_source','utm_medium','utm_campaign','utm_term','utm_content','fbclid'];
  keys.forEach(function(k){
    var m = new RegExp('[?&]'+k+'=([^&#]*)').exec(window.location.href);
    if(m){
      document.cookie = 'fb_' + k + '=' + m[1] + ';max-age=7776000;path=/;SameSite=Lax';
    }
  });
})();
</script>

Salva i dati della campagna non appena compaiono in una qualsiasi pagina, così fb_tracking_query() può recuperarli anche se il visitatore ha navigato per alcune pagine prima di arrivare al widget.

// Opzioni comuni
Modalità scuraAggiungi &dark=1 all’URL dell’iframe.
Pannello Options apertoAggiungi &opts_open=1.
LinguaSostituisci lng=gb con lng=es, lng=fr, ecc.
Barra orizzontaleAggiungi &layout=inline all’URL dell’iframe del widget (solo widget, non il modulo completo). Richiede circa 1000px di larghezza e sotto i 900px si dispone da solo in colonna, senza markup separato per il mobile. Con questo layout imposta l’height iniziale dell’iframe a 200 invece di 640, altrimenti resta un vuoto visibile sotto la barra nei primi istanti prima che iframeResizer la misuri.
// Verifica del funzionamento

Verifica che il tracciamento funzioni

  1. Apri una qualsiasi pagina con ?gclid=test123 alla fine dell’URL.
  2. Apri la console del browser (F12) → digita document.cookie.
  3. Dovresti trovare fb_gclid=test123.
  4. Passa a un’altra pagina (senza il parametro) e controlla che il cookie sia ancora presente prima di arrivare al widget o al modulo.

Usi un’altra piattaforma?

Esistono guide dedicate a WordPress e ai siti senza alcun backend.