Enwicklung 'Visit Duration: Scenarien'

Entwicklung 'Visit Duration: Scenarien'

Folgend sind die unterschiedlichen Scenarien.

Vier Scenarios und zwei vereinfachte Scenario

Diese Vorlagen sind nicht 1:1 zum Übernehmen, und müssten der Logik entsprechend zum Original ergänzt und angepasst werden – ist also  Entwicklungssache.

1. Tracking und 5-Minuten-Inaktivitätstimer bei Scroll-Aktivität starten

Das mit nach 5 Minuten Inaktivität wird die Sitzung automatisch beendet, ist vor allem der Hinsicht entstanden, dass Sitzungen nicht abgeschlossen wurden. Das sollte der neuen Entwicklung verbessert sein und ist daher nicht mehr implementiert.

// 1) Tracking und 5-Minuten-Inaktivitätstimer bei Scroll-Aktivität starten
(function() {
    var ajaxUrl = '" . esc_url(admin_url('admin-ajax.php')) . "';
    if (!ajaxUrl) {
        console.error('AJAX-URL konnte nicht geladen werden.');
        return;
    }

    window.ajaxUrl = ajaxUrl;
    window.uniqueId = 'id-' + Math.random().toString(36).substr(2, 16);
    var isTabActive = true;
    var isUserInteracted = false;
    let inactivityTimeout;
    const inactivityDelay = 5 * 60 * 1000; // 5 Minuten Inaktivität

    // Funktion zum Starten des Besuchs
    function startVisitTracking() {
        if (!isUserInteracted) {
            isUserInteracted = true;

            console.log('Benutzer hat interagiert. Tracking beginnt in 3 Sekunden...');
            setTimeout(function() {
                console.log('3 Sekunden Verzögerung vorbei. Tracking beginnt jetzt.');
                fetch(window.ajaxUrl + '?action=start_visit', {
                    method: 'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify({ unique_id: window.uniqueId, page_title: document.title })
                }).catch(err => console.error('Fehler beim Start des Besuchs:', err));

                resetInactivityTimer(); // Timer zurücksetzen
            }, 3000);
        }
    }

    // Funktion zum Zurücksetzen des Inaktivitätstimers
    function resetInactivityTimer() {
        clearTimeout(inactivityTimeout);
        inactivityTimeout = setTimeout(endSessionDueToInactivity, inactivityDelay);
        console.log('Inaktivitätstimer zurückgesetzt.');
    }

    // Funktion zum Beenden des Besuchs wegen Inaktivität
    function endSessionDueToInactivity() {
        if (window.uniqueId && window.ajaxUrl) {
            const payload = JSON.stringify({
                unique_id: window.uniqueId,
                end_time: Date.now()
            });

            const beaconSuccess = navigator.sendBeacon(window.ajaxUrl + '?action=update_visit_duration', payload);
            if (!beaconSuccess) {
                const xhr = new XMLHttpRequest();
                xhr.open('POST', window.ajaxUrl + '?action=update_visit_duration', false);
                xhr.setRequestHeader('Content-Type', 'application/json');
                xhr.send(payload);
            }

            console.log('Besuch beendet wegen Inaktivität.');
        }
    }

    // Externe Links abfangen
    document.addEventListener('click', function(event) {
        const target = event.target.closest('a');
        if (target && target.target === '_blank') {
            console.log('Externer Link in neuem Tab geöffnet. Sitzung bleibt aktiv.');
            isTabActive = true;
        }
    });

    // Auf Scroll-Aktivität setzen inklusive Track-Start
    document.addEventListener('scroll', function() {
        startVisitTracking();
        resetInactivityTimer(); // Inaktivitätstimer bei jeder Benutzerinteraktion zurücksetzen
    });

    window.addEventListener('beforeunload', sendEndVisit);

    // Beenden des Besuchs, wenn die Seite verlassen wird
    function sendEndVisit() {
        if (window.uniqueId && window.ajaxUrl) {
            const payload = JSON.stringify({
                unique_id: window.uniqueId,
                end_time: Date.now()
            });

            const beaconSuccess = navigator.sendBeacon(window.ajaxUrl + '?action=update_visit_duration', payload);
            if (!beaconSuccess) {
                const xhr = new XMLHttpRequest();
                xhr.open('POST', window.ajaxUrl + '?action=update_visit_duration', false);
                xhr.setRequestHeader('Content-Type', 'application/json');
                xhr.send(payload);
            }
        }
    }
})();
  • Vorteile:
    • Weniger unnötige Tracking-Anfragen, da nur Benutzer mit tatsächlicher Interaktion (Scrollen) getrackt werden.
    • Reduziert die Belastung des Servers und Datenbankeinträge.
    • Gut geeignet für Inhalte, bei denen Benutzeraktivität (z. B. Lesen, Scrollen) erforderlich ist, um den Inhalt wahrzunehmen.
  • Nachteile:
    • Besucher, die nicht scrollen (z. B. wenn sie den Inhalt vollständig auf einem Bildschirm sehen), werden gar nicht erfasst.
    • Inaktivitätstimer läuft erst nach der ersten Interaktion, sodass Zeit davor unberücksichtigt bleibt.

2. Tracking-Start bei Scroll-Aktivität und 5-Minuten-Inaktivitätstimer sofort starten

Das ist welches dem Plug-in aktuell implementiert ist.

// 2) Tracking-Start bei Scroll-Aktivität und 5-Minuten-Inaktivitätstimer sofort starten
(function() {
    var ajaxUrl = '" . esc_url(admin_url('admin-ajax.php')) . "';
    if (!ajaxUrl) {
        console.error('AJAX-URL konnte nicht geladen werden.');
        return;
    }

    window.ajaxUrl = ajaxUrl;
    window.uniqueId = 'id-' + Math.random().toString(36).substr(2, 16);
    var isTabActive = true;
    var isUserInteracted = false;
    let inactivityTimeout;
    const inactivityDelay = 5 * 60 * 1000; // 5 Minuten Inaktivität

    // Funktion zum Starten des Besuchs
    function startVisitTracking() {
        if (!isUserInteracted) {
            isUserInteracted = true;

            console.log('Benutzer hat interagiert. Tracking beginnt in 3 Sekunden...');
            setTimeout(function() {
                console.log('3 Sekunden Verzögerung vorbei. Tracking beginnt jetzt.');
                fetch(window.ajaxUrl + '?action=start_visit', {
                    method: 'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify({ unique_id: window.uniqueId, page_title: document.title })
                }).catch(err => console.error('Fehler beim Start des Besuchs:', err));
            }, 3000);
        }
    }

    // Funktion zum Zurücksetzen des Inaktivitätstimers
    function resetInactivityTimer() {
        clearTimeout(inactivityTimeout);
        inactivityTimeout = setTimeout(endSessionDueToInactivity, inactivityDelay);
        console.log('Inaktivitätstimer zurückgesetzt.');
    }

    // Funktion zum Beenden des Besuchs wegen Inaktivität
    function endSessionDueToInactivity() {
        if (window.uniqueId && window.ajaxUrl) {
            const payload = JSON.stringify({
                unique_id: window.uniqueId,
                end_time: Date.now()
            });

            const beaconSuccess = navigator.sendBeacon(window.ajaxUrl + '?action=update_visit_duration', payload);
            if (!beaconSuccess) {
                const xhr = new XMLHttpRequest();
                xhr.open('POST', window.ajaxUrl + '?action=update_visit_duration', false);
                xhr.setRequestHeader('Content-Type', 'application/json');
                xhr.send(payload);
            }

            console.log('Besuch beendet wegen Inaktivität.');
        }
    }

    // Externe Links abfangen
    document.addEventListener('click', function(event) {
        const target = event.target.closest('a');
        if (target && target.target === '_blank') {
            console.log('Externer Link in neuem Tab geöffnet. Sitzung bleibt aktiv.');
            isTabActive = true;
        }
    });

    // Inaktivitätstimer direkt nach Seitenaufruf starten
    resetInactivityTimer();

    // Auf Scroll-Aktivität setzen, um Tracking zu starten
    document.addEventListener('scroll', function() {
        startVisitTracking();
    });

    // Besuch beenden, wenn die Seite verlassen wird
    window.addEventListener('beforeunload', sendEndVisit);

    function sendEndVisit() {
        if (window.uniqueId && window.ajaxUrl) {
            const payload = JSON.stringify({
                unique_id: window.uniqueId,
                end_time: Date.now()
            });

            const beaconSuccess = navigator.sendBeacon(window.ajaxUrl + '?action=update_visit_duration', payload);
            if (!beaconSuccess) {
                const xhr = new XMLHttpRequest();
                xhr.open('POST', window.ajaxUrl + '?action=update_visit_duration', false);
                xhr.setRequestHeader('Content-Type', 'application/json');
                xhr.send(payload);
            }
        }
    }
})();
  • Vorteile:
    • Der Inaktivitätstimer beginnt sofort, unabhängig davon, ob der Benutzer interagiert, wodurch das Zeitfenster bis zur ersten Interaktion berücksichtigt wird.
    • Tracking erfasst nur aktive Benutzer (ab Scrollen), was die Datenqualität bei Interaktionen erhöht.
    • Guter Kompromiss für Szenarien, bei denen die Inaktivitätszeit ab Seiteneintritt relevant ist.
  • Nachteile:
    • Benutzer, die die Seite nur passiv betrachten, ohne zu scrollen, werden nicht erfasst.
    • Kann etwas verwirrend sein, wenn der Timer unabhängig vom Tracking läuft.

3. Track-Start sofort (ohne Scrollen) und 5-Minuten-Timer mit Scrollen starten
// 3) Track-Start sofort (ohne Scrollen) und 5-Minuten-Timer mit Scrollen starten
(function() {
    var ajaxUrl = '" . esc_url(admin_url('admin-ajax.php')) . "';
    if (!ajaxUrl) {
        console.error('AJAX-URL konnte nicht geladen werden.');
        return;
    }

    window.ajaxUrl = ajaxUrl;
    window.uniqueId = 'id-' + Math.random().toString(36).substr(2, 16);
    var isTabActive = true;
    var isUserInteracted = false;
    let inactivityTimeout;
    const inactivityDelay = 5 * 60 * 1000; // 5 Minuten Inaktivität, individuell anpassbar

    // Funktion zum Starten des Besuchs
    function startVisitTracking() {
        if (!isUserInteracted) {
            isUserInteracted = true;

            console.log('Benutzer hat interagiert. Tracking beginnt in 3 Sekunden...');
            setTimeout(function() {
                console.log('3 Sekunden Verzögerung vorbei. Tracking beginnt jetzt.');
                fetch(window.ajaxUrl + '?action=start_visit', {
                    method: 'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify({ unique_id: window.uniqueId, page_title: document.title })
                }).catch(err => console.error('Fehler beim Start des Besuchs:', err));

                resetInactivityTimer(); // Timer zurücksetzen
            }, 3000);
        }
    }

    // Funktion zum Zurücksetzen des Inaktivitätstimers
    function resetInactivityTimer() {
        clearTimeout(inactivityTimeout);
        inactivityTimeout = setTimeout(endSessionDueToInactivity, inactivityDelay);
        console.log('Inaktivitätstimer zurückgesetzt.');
    }

    // Funktion zum Beenden des Besuchs wegen Inaktivität
    function endSessionDueToInactivity() {
        if (window.uniqueId && window.ajaxUrl) {
            const payload = JSON.stringify({
                unique_id: window.uniqueId,
                end_time: Date.now()
            });

            const beaconSuccess = navigator.sendBeacon(window.ajaxUrl + '?action=update_visit_duration', payload);
            if (!beaconSuccess) {
                const xhr = new XMLHttpRequest();
                xhr.open('POST', window.ajaxUrl + '?action=update_visit_duration', false);
                xhr.setRequestHeader('Content-Type', 'application/json');
                xhr.send(payload);
            }

            console.log('Besuch beendet wegen Inaktivität.');
        }
    }

    // Externe Links abfangen
    document.addEventListener('click', function(event) {
        const target = event.target.closest('a');
        if (target && target.target === '_blank') {
            console.log('Externer Link in neuem Tab geöffnet. Sitzung bleibt aktiv.');
            isTabActive = true;
        }
    });

    // Start des Besuchs sofort nach Seitenaufruf
    startVisitTracking();

    // Nur auf Scroll-Aktivität setzen
    document.addEventListener('scroll', function() {
        resetInactivityTimer(); // Inaktivitätstimer bei jeder Benutzerinteraktion zurücksetzen
    });

    window.addEventListener('beforeunload', sendEndVisit);

    // Beenden des Besuchs, wenn die Seite verlassen wird
    function sendEndVisit() {
        if (window.uniqueId && window.ajaxUrl) {
            const payload = JSON.stringify({
                unique_id: window.uniqueId,
                end_time: Date.now()
            });

            const beaconSuccess = navigator.sendBeacon(window.ajaxUrl + '?action=update_visit_duration', payload);
            if (!beaconSuccess) {
                const xhr = new XMLHttpRequest();
                xhr.open('POST', window.ajaxUrl + '?action=update_visit_duration', false);
                xhr.setRequestHeader('Content-Type', 'application/json');
                xhr.send(payload);
            }
        }
    }
})();
  • Vorteile:
    • Alle Besucher werden sofort erfasst, auch solche, die nur schauen und nicht scrollen.
    • Der Timer startet erst bei der ersten Interaktion, was die Relevanz der Inaktivitätszeit erhöht (fokussiert auf echte Nutzung).
    • Gut geeignet, wenn alle Besucher, unabhängig von Interaktionen, getrackt werden sollen.
  • Nachteile:
    • Erhöhte Serverlast durch sofortiges Tracking aller Benutzer.
    • Timer startet verspätet, was zu Lücken in der Sitzungsdauer führen kann.

4. Track-Start sofort (ohne Scrollen) und 5-Minuten-Timer sofort starten
// 4) Track-Start sofort (ohne Scrollen) und 5-Minuten-Timer sofort starten
(function() {
    var ajaxUrl = '" . esc_url(admin_url('admin-ajax.php')) . "';
    if (!ajaxUrl) {
        console.error('AJAX-URL konnte nicht geladen werden.');
        return;
    }

    window.ajaxUrl = ajaxUrl;
    window.uniqueId = 'id-' + Math.random().toString(36).substr(2, 16);
    var isTabActive = true;
    var isUserInteracted = false;
    let inactivityTimeout;
    const inactivityDelay = 5 * 60 * 1000; // 5 Minuten Inaktivität

    // Funktion zum Starten des Besuchs
    function startVisitTracking() {
        if (!isUserInteracted) {
            isUserInteracted = true;

            console.log('Benutzer hat interagiert. Tracking beginnt in 3 Sekunden...');
            setTimeout(function() {
                console.log('3 Sekunden Verzögerung vorbei. Tracking beginnt jetzt.');
                fetch(window.ajaxUrl + '?action=start_visit', {
                    method: 'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify({ unique_id: window.uniqueId, page_title: document.title })
                }).catch(err => console.error('Fehler beim Start des Besuchs:', err));

                resetInactivityTimer(); // Timer zurücksetzen
            }, 3000);
        }
    }

    // Funktion zum Zurücksetzen des Inaktivitätstimers
    function resetInactivityTimer() {
        clearTimeout(inactivityTimeout);
        inactivityTimeout = setTimeout(endSessionDueToInactivity, inactivityDelay);
        console.log('Inaktivitätstimer zurückgesetzt.');
    }

    // Funktion zum Beenden des Besuchs wegen Inaktivität
    function endSessionDueToInactivity() {
        if (window.uniqueId && window.ajaxUrl) {
            const payload = JSON.stringify({
                unique_id: window.uniqueId,
                end_time: Date.now()
            });

            const beaconSuccess = navigator.sendBeacon(window.ajaxUrl + '?action=update_visit_duration', payload);
            if (!beaconSuccess) {
                const xhr = new XMLHttpRequest();
                xhr.open('POST', window.ajaxUrl + '?action=update_visit_duration', false);
                xhr.setRequestHeader('Content-Type', 'application/json');
                xhr.send(payload);
            }

            console.log('Besuch beendet wegen Inaktivität.');
        }
    }

    // Externe Links abfangen
    document.addEventListener('click', function(event) {
        const target = event.target.closest('a');
        if (target && target.target === '_blank') {
            console.log('Externer Link in neuem Tab geöffnet. Sitzung bleibt aktiv.');
            isTabActive = true;
        }
    });

    // Start des Besuchs sofort nach Seitenaufruf und sofortiges Zurücksetzen des Inaktivitätstimers
    startVisitTracking();

    // Nur auf Scroll-Aktivität setzen (Inaktivitätstimer zurücksetzen)
    document.addEventListener('scroll', function() {
        resetInactivityTimer(); // Inaktivitätstimer bei jeder Benutzerinteraktion zurücksetzen
    });

    window.addEventListener('beforeunload', sendEndVisit);

    // Beenden des Besuchs, wenn die Seite verlassen wird
    function sendEndVisit() {
        if (window.uniqueId && window.ajaxUrl) {
            const payload = JSON.stringify({
                unique_id: window.uniqueId,
                end_time: Date.now()
            });

            const beaconSuccess = navigator.sendBeacon(window.ajaxUrl + '?action=update_visit_duration', payload);
            if (!beaconSuccess) {
                const xhr = new XMLHttpRequest();
                xhr.open('POST', window.ajaxUrl + '?action=update_visit_duration', false);
                xhr.setRequestHeader('Content-Type', 'application/json');
                xhr.send(payload);
            }
        }
    }
})();
  • Vorteile:
    • Maximale Erfassung aller Besucher und sofortige Messung der Inaktivität.
    • Einfachstes und klarstes Szenario ohne Abhängigkeit von Benutzerinteraktionen.
    • Ideal für Inhalte, bei denen alle Sitzungen getrackt werden sollen, unabhängig von der Interaktion (z. B. für Landing Pages, statische Seiten).
  • Nachteile:
    • Erhöhte Serverlast durch sofortiges Tracking aller Benutzer.
    • Kann zu ungenauen Daten führen, wenn Benutzer sofort die Seite verlassen, da keine Interaktion notwendig ist.
Emfpehlungen
Empfehlung: Szenario 4
  • Begründung:
    • Szenario 4 ist universell und deckt alle Besucher zuverlässig ab, unabhängig von Interaktionen. Es ist am besten geeignet, wenn eine vollständige Erfassung aller Sitzungen das Ziel ist und der Fokus auf der Zeit auf der Seite liegt.
    • Für spezifische Use Cases wie Blogposts oder Seiten, bei denen Benutzerinteraktion der Fokus ist, wäre Szenario 1 oder 2 besser.
Empfehlung: Szenario 2
  • Saubere Sitzungsbeendigung: Kein Tracking übermäßig langer, inaktiver Sitzungen.
  • Echte Interaktionen werden getrackt: Tracking startet nur bei Scrollen, was Bots und unbeteiligte Besucher herausfiltert.
  • Serverlast wird reduziert: Der Timer läuft unabhängig von Tracking-Interaktionen, sodass Sitzungen ohne echte Aktivität zeitnah enden.

Insgesamt bietet Szenario 2 eine solide Grundlage, um Besuche effektiv und ressourcenschonend zu tracken. Es ist besonders geeignet, wenn dir Sitzungsbeendigung bei Inaktivität wichtiger ist als das direkte Tracken aller Besuche.

Vereinfachtes Scenario

Die 5-Minuten-Inaktivitätstimer wird komplett weggelassen, somit fällt ein großer Teil des Codes weg, insbesondere die Timer-Funktionen (resetInactivityTimer, endSessionDueToInactivity) und die Logik, die diesen Timer verwaltet. Der Code wäre dann deutlich schlanker und fokussiert sich ausschließlich auf den Start des Trackings bei Interaktion (z. B. Scrollen) sowie die Beendigung der Sitzung beim Schließen der Seite:

// Vereinfachtes Scenario: Kein 5-Minuten-Inaktivitätstimer und Tracking nur bei Scroll-Aktivität
(function() {
    var ajaxUrl = '" . esc_url(admin_url('admin-ajax.php')) . "';
    if (!ajaxUrl) {
        console.error('AJAX-URL konnte nicht geladen werden.');
        return;
    }

    window.ajaxUrl = ajaxUrl;
    window.uniqueId = 'id-' + Math.random().toString(36).substr(2, 16);
    var isUserInteracted = false;

    // Funktion zum Starten des Besuchs
    function startVisitTracking() {
        if (!isUserInteracted) {
            isUserInteracted = true;

            console.log('Benutzer hat interagiert. Tracking beginnt in 3 Sekunden...');
            setTimeout(function() {
                console.log('3 Sekunden Verzögerung vorbei. Tracking beginnt jetzt.');
                fetch(window.ajaxUrl + '?action=start_visit', {
                    method: 'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify({ unique_id: window.uniqueId, page_title: document.title })
                }).catch(err => console.error('Fehler beim Start des Besuchs:', err));
            }, 3000);
        }
    }

    // Externe Links abfangen
    document.addEventListener('click', function(event) {
        const target = event.target.closest('a');
        if (target && target.target === '_blank') {
            console.log('Externer Link in neuem Tab geöffnet.');
        }
    });

    // Tracking bei Scroll-Aktivität starten
    document.addEventListener('scroll', function() {
        startVisitTracking();
    });

    window.addEventListener('beforeunload', sendEndVisit);

    // Beenden des Besuchs, wenn die Seite verlassen wird
    function sendEndVisit() {
        if (window.uniqueId && window.ajaxUrl) {
            const payload = JSON.stringify({
                unique_id: window.uniqueId,
                end_time: Date.now()
            });

            const beaconSuccess = navigator.sendBeacon(window.ajaxUrl + '?action=update_visit_duration', payload);
            if (!beaconSuccess) {
                const xhr = new XMLHttpRequest();
                xhr.open('POST', window.ajaxUrl + '?action=update_visit_duration', false);
                xhr.setRequestHeader('Content-Type', 'application/json');
                xhr.send(payload);
            }
        }
    }
})();
  1. 5-Minuten-Inaktivitätstimer entfernt:
    • Alle Timer-Funktionen (resetInactivityTimer, endSessionDueToInactivity) und die zugehörige Logik wurden entfernt.
  2. Tracking nur bei Scroll-Aktivität:
    • Das Tracking startet erst nach einer Scroll-Aktion (mit 3 Sekunden Verzögerung).
  3. Beibehaltung der Sitzungserfassung beim Verlassen der Seite:
    • Die Sitzung wird weiterhin beim Verlassen der Seite mit beforeunload beendet.
  4. Kürzerer, übersichtlicherer Code:
    • Der Code konzentriert sich rein auf die Interaktionsverfolgung und das Ende der Sitzung.
Vorteile dieser Version:
  • Einfachere Logik, da kein Timer mehr verwaltet werden muss.
  • Bots, die nicht scrollen, werden effektiv herausgefiltert.
  • Reduzierter Overhead durch den Wegfall von wiederholten Timer-Interaktionen.
Potenzieller Nachteil:
  • Ohne den Timer werden Sitzungen nicht automatisch beendet, wenn ein Benutzer nach dem Scrollen längere Zeit inaktiv bleibt.
Sehr vereinfachtes Scenario

Wenn das Tracking sofort nach dem Seitenaufruf beginnen soll, ohne dass eine Scroll-Interaktion notwendig ist, dann wird der Code noch schlanker. Die Logik für die Scroll-Aktivität entfällt vollständig:

// Sehr vereinfachtes Scenario: Tracking startet sofort nach Seitenaufruf und ohne Logik für die Scroll-Aktivität
(function() {
    var ajaxUrl = '" . esc_url(admin_url('admin-ajax.php')) . "';
    if (!ajaxUrl) {
        console.error('AJAX-URL konnte nicht geladen werden.');
        return;
    }

    window.ajaxUrl = ajaxUrl;
    window.uniqueId = 'id-' + Math.random().toString(36).substr(2, 16);

    // Funktion zum Starten des Besuchs
    function startVisitTracking() {
        console.log('Tracking beginnt in 3 Sekunden...');
        setTimeout(function() {
            console.log('3 Sekunden Verzögerung vorbei. Tracking beginnt jetzt.');
            fetch(window.ajaxUrl + '?action=start_visit', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({ unique_id: window.uniqueId, page_title: document.title })
            }).catch(err => console.error('Fehler beim Start des Besuchs:', err));
        }, 3000);
    }

    // Start des Besuchs sofort nach Seitenaufruf
    startVisitTracking();

    window.addEventListener('beforeunload', sendEndVisit);

    // Beenden des Besuchs, wenn die Seite verlassen wird
    function sendEndVisit() {
        if (window.uniqueId && window.ajaxUrl) {
            const payload = JSON.stringify({
                unique_id: window.uniqueId,
                end_time: Date.now()
            });

            const beaconSuccess = navigator.sendBeacon(window.ajaxUrl + '?action=update_visit_duration', payload);
            if (!beaconSuccess) {
                const xhr = new XMLHttpRequest();
                xhr.open('POST', window.ajaxUrl + '?action=update_visit_duration', false);
                xhr.setRequestHeader('Content-Type', 'application/json');
                xhr.send(payload);
            }
        }
    }
})();
  1. Tracking startet sofort nach Seitenaufruf:
    • Der Aufruf von startVisitTracking() erfolgt direkt beim Laden der Seite.
    • Die Scroll-Logik (document.addEventListener('scroll')) entfällt komplett.
  2. Beibehaltung der 3-Sekunden-Verzögerung:
    • Die 3-Sekunden-Verzögerung bleibt, um flüchtige oder Bot-ähnliche Aufrufe weiterhin zu ignorieren.
Vorteile dieser Variante:
  • Einfachheit: Das Tracking wird direkt nach dem Laden der Seite aktiviert, ohne zusätzliche Events wie Scrollen.
  • Keine Interaktionsabhängigkeit: Auch Nutzer, die nicht scrollen, werden erfasst.
  • Effektivität gegen Bots: Die 3-Sekunden-Verzögerung stellt sicher, dass viele Bots ignoriert werden und "Fluggäste" nicht aufscheinen.
Einschränkung:
  • Es werden auch Nutzer getrackt, die die Seite nur kurz betrachten, ohne aktiv zu interagieren. Wenn das Ziel jedoch ist, die maximale Anzahl an echten Besuchen zu erfassen, ist dies eine sinnvolle Lösung.

Schaffe mit WordPress und Advanced Editor schöne Websites. Hier ist für dich, euch eine leicht lesbare und freundliche Anleitung.

Katze
Die Website verwendet funktionelle Cookies. Sie verwendet keine Cookies von Drittanbietern.

Aber hallo! – zur Begrüßung eine Rundfrage?

🧡 … das so zum Zeit entschleunigen.

Die Erstellung von Website-Inhalten erfordert oft kreative Ideen. Es wäre interessant zu erfahren, wo Ideen für die Gestaltung der Website-Inhalte gefunden werden und wie diese gestaltet werden. Bitte mitteilen, wie typischerweise Inspiration für die Website-Inhalte gefunden wird.

Sie können die Tastaturnavigation nutzen: Tab zum Fokussieren, Leertaste zum Auswählen und Esc zum Schließen der Rundfrage.

Was sind die besten Quellen zur
Erstellung von Website-Inhalten?
Bis zu drei Antworten sind möglich!



Start der Umfrage im September 2024

ERGEBNISSE

Wird geladen ... Wird geladen ...

Falls alle Optionen ausgewählt werden sollten, sollte man im Ausschussverfahren herausfinden, welches die Hauptsächlichen sind.


Im Inhalt die Tastaturnavigation:

Sobald Sie die Website scrollen, können Sie die Enter-Taste drücken, um den Inhalt direkt zu fokussieren, ohne den Tabindex zu durchlaufen. Das zweite Enter aktiviert das Element.

  • Tabulator (Tab): Navigiert durch interaktive Elemente.
  • Shift + Tab: Gehe zurück zum vorherigen Element.
  • Enter: Erste Betätigung fokussiert, zweite aktiviert.
  • Pfeiltasten: Scrollen in Texten oder Menüs.
  • Leertaste: Aktiviert Header-Buttons und scrollt im Content.
  • Shift + Leertaste: Scrollt nach oben.
  • 7: Aktiviert die Suche; Esc zum Schließen.
  • Esc: Bricht Fokussierung und Dialoge ab.

Echte Besucher statt nur Klicks, siehe:
effektives Tracking mit Statify! (neuer Tab)

So in 8-Tage mag sein 88 Besucher

Zur Optimierung unserer Website nutzen wir Tools wie 'Statify' sowie 'Visit Duration', das anonymisierte Daten zur Verweildauer, erfasst.

Danke sehr!

 🎶  Während des Besuchs kann es neben informativen Ergebnissen auch zu Klangeffekten kommen, um bestimmte Elemente hervorzuheben. – Viel Spaß beim Erkunden!


Erfolgreichen Besuch
wünscht Ihnen! – WP Wegerl.at

Pop-up  

Das zur Umfrage ist von WP-Polls und
das Pop-up ist von Boxzilla.

WP Wegerl.at
Leistungsmetriken im Blick
× -
Index