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.
Funzione di supporto
Aggiungila una sola volta, in un include condiviso:
<?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;
}
?>
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:
- Lo script di ridimensionamento — prima dell’iframe
- L’iframe vero e proprio, con un
idfisso - 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.
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>
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().
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.
&dark=1 all’URL dell’iframe.&opts_open=1.lng=gb con lng=es, lng=fr, ecc.&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 che il tracciamento funzioni
- Apri una qualsiasi pagina con
?gclid=test123alla fine dell’URL. - Apri la console del browser (F12) → digita
document.cookie. - Dovresti trovare
fb_gclid=test123. - 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.