Entwicklung:
'Click & Bounce Counter'

In Reihe von unten nach oben zum Plug-in.

Aktuelle Version ist im Beitrag: Click & Bounce Counter.

Entwicklung:

<?php
/*
* Plugin Name: Click & Bounce Counter
* Description: Zählt die Gesamtzahl der Klicks und speichert die Absprünge innerhalb von 30 Sekunden. 
  Ein Dashboard-Widget zeigt die Statistik und in einem Balken-Diagramm an.
  Administrator(In) ist automatisch ausgeschlossen.
* Version: 1.0.0
* Autor: Team WP Wegerl
* Author URI: https://wegerl.at/click-und-bounce-counter/
* Text Domain: click-bounce-counter

Die Funktion 'is_bot_or_spider' prüft anhand des User-Agents, ob es sich bei einem Besucher um einen Bot handelt. 
Diese Funktion nutzt Caching, um wiederholte Anfragen zu vermeiden und verbessert so die Performance.
*/

if ( ! defined( 'ABSPATH' ) ) {
    exit; // Exit if accessed directly
}

// Am Anfang der Datei, um die Bot-Erkennungsfunktion zu laden
if ( file_exists( plugin_dir_path( __FILE__ ) . 'bot-functions.php' ) ) {
    require_once plugin_dir_path( __FILE__ ) . 'bot-functions.php';
} else {
    error_log('bot-functions.php wurde nicht gefunden.');
}

if (is_bot_or_spider()) {
    // Bot erkannt – keine Zählung der Klicks oder Absprünge
    return;
}

// Fügt das Chart.js-Skript für das Dashboard hinzu
function enqueue_chartjs_script() {
    if (is_admin()) {
        wp_enqueue_script('chart-js', 'https://cdn.jsdelivr.net/npm/chart.js', array(), null, true);
    }
}
add_action('admin_enqueue_scripts', 'enqueue_chartjs_script');

// Initialisiert die Zähler, falls sie nicht existieren.
function initialize_click_bounce_counters() {
    if (false === wp_cache_get('click_counter', 'options')) {
        add_option('click_counter', 0, '', 'no');
    }
    if (false === wp_cache_get('bounce_counter', 'options')) {
        add_option('bounce_counter', 0, '', 'no');
    }
}
add_action('init', 'initialize_click_bounce_counters');

// Fügt das Dashboard-Widget hinzu.
function add_click_bounce_widget() {
    wp_add_dashboard_widget(
        'click_bounce_widget',
        'Click & Bounce Counter: Klickzähler und Absprungrate',
        'display_click_bounce_count'
    );
}
add_action('wp_dashboard_setup', 'add_click_bounce_widget');

// Zeigt die aktuellen Zählerstände im Widget an und fügt die Buttons hinzu.
function display_click_bounce_count() {
    $click_count = get_option('click_counter');
    $bounce_count = get_option('bounce_counter');
    ?>
    <p>Anzahl der insgesamt gezählten Klicks: <strong id="click-count"><?php echo $click_count; ?></strong></p>
    <p>Anzahl der Absprünge innerhalb von 30 Sekunden: <strong id="bounce-count"><?php echo $bounce_count; ?></strong></p>
    <canvas id="click-bounce-chart" width="400" height="207"></canvas>
    
    <form method="post" id="reset-form" style="margin-top: 25px;">
        <input type="hidden" name="reset_click_bounce" value="1">
        <button type="button" id="reset-button">Zähler zurücksetzen</button>
        <button type="button" id="refresh-button" style="margin-left: 15px;">Aktualisieren</button>
    </form>
    
    <script>
        let clickBounceChart;
        let resetTimeout;

        document.addEventListener("DOMContentLoaded", function() {
            const ctx = document.getElementById('click-bounce-chart').getContext('2d');
            clickBounceChart = new Chart(ctx, {
                type: 'bar',
                data: {
                    labels: ['Gesamt Klicks', 'Absprünge innerhalb 30 Sekunden'],
                    datasets: [{
                        label: 'Zähler',
                        data: [<?php echo $click_count; ?>, <?php echo $bounce_count; ?>],
                        backgroundColor: [
                            'rgba(75, 192, 192, 0.2)', 
                            'rgba(255, 99, 132, 0.2)'
                        ],
                        borderColor: [
                            'rgba(75, 192, 192, 1)', 
                            'rgba(255, 99, 132, 1)'
                        ],
                        borderWidth: 1
                    }]
                },
                options: {
                    scales: {
                        y: {
                            beginAtZero: true,
                            ticks: {
                                stepSize: 1,
                                callback: function(value) {
                                    return Number.isInteger(value) ? value : '';
                                }
                            },
                            title: {
                                display: true,
                                text: 'Anzahl'
                            }
                        }
                    }
                }
            });
        });

        document.getElementById("refresh-button").addEventListener("click", function(event) {
            event.preventDefault();
            fetch("<?php echo admin_url('admin-ajax.php'); ?>?action=update_click_bounce_counts", {
                method: 'GET',
            })
            .then(response => response.json())
            .then(data => {
                document.getElementById('click-count').textContent = data.click_count;
                document.getElementById('bounce-count').textContent = data.bounce_count;
                clickBounceChart.data.datasets[0].data = [data.click_count, data.bounce_count];
                clickBounceChart.update();
            });
        });

        document.getElementById("reset-button").addEventListener("click", function(event) {
            event.preventDefault();
            
            if (this.dataset.clickedOnce === "true") {
                fetch("<?php echo admin_url('admin-ajax.php'); ?>?action=reset_click_bounce_counters", {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/x-www-form-urlencoded',
                    },
                    body: 'reset_click_bounce=1'
                })
                .then(response => response.text())
                .then(data => {
                    document.getElementById('click-count').textContent = 0;
                    document.getElementById('bounce-count').textContent = 0;
                    clickBounceChart.data.datasets[0].data = [0, 0];
                    clickBounceChart.update();
                });
            } else {
                this.dataset.clickedOnce = "true";
                this.innerText = "Zum Bestätigen erneut klicken";

                resetTimeout = setTimeout(() => {
                    this.dataset.clickedOnce = "false";
                    this.innerText = "Zähler zurücksetzen";
                }, 1500);
            }
        });
    </script>
    <?php
}

// Überprüft, ob der Reset-Button geklickt wurde, und setzt die Zähler zurück.
function reset_click_bounce_counters() {
    update_option('click_counter', 0);
    update_option('bounce_counter', 0);
    wp_cache_delete('click_counter', 'options');
    wp_cache_delete('bounce_counter', 'options');
}
add_action('wp_ajax_reset_click_bounce_counters', 'reset_click_bounce_counters');

// Liefert die aktuellen Zählerwerte für den Aktualisieren-Button.
function update_click_bounce_counts() {
    $click_count = get_option('click_counter');
    $bounce_count = get_option('bounce_counter');
    wp_send_json(array(
        'click_count' => $click_count,
        'bounce_count' => $bounce_count
    ));
}
add_action('wp_ajax_update_click_bounce_counts', 'update_click_bounce_counts');

// Ajax-Handler zum Erhöhen der Zähler
function increase_click_counter() {
    if (!current_user_can('administrator') && !is_bot_or_spider()) {
        $click_count = get_option('click_counter', 0);
        $click_count++;
        update_option('click_counter', $click_count);
        wp_cache_set('click_counter', $click_count, 'options');
    }
    wp_die();
}
add_action('wp_ajax_nopriv_increase_click_counter', 'increase_click_counter');
add_action('wp_ajax_increase_click_counter', 'increase_click_counter');

// Ähnlich für den Bounce-Zähler
function increase_bounce_counter() {
    if (!current_user_can('administrator') && !is_bot_or_spider()) {
        $bounce_count = get_option('bounce_counter', 0);
        $bounce_count++;
        update_option('bounce_counter', $bounce_count);
        wp_cache_set('bounce_counter', $bounce_count, 'options');
    }
    wp_die();
}
add_action('wp_ajax_nopriv_increase_bounce_counter', 'increase_bounce_counter');
add_action('wp_ajax_increase_bounce_counter', 'increase_bounce_counter');

// Fügt das JavaScript für Klicks und Bounces im Frontend hinzu
function enqueue_click_bounce_counter_script() {
    if ( !current_user_can('administrator') ) { // Nur für nicht-Admins
        ?>
	<script>
        document.addEventListener("DOMContentLoaded", function() {
            let countAllowed = true; 
            let bounceCounted = false; 

            // Sende eine Klick-Anfrage immer, wenn die Seite geladen wird
            navigator.sendBeacon("<?php echo admin_url('admin-ajax.php'); ?>?action=increase_click_counter");

            // Blockiert das Zählen der Absprünge nach 30 Sekunden
            setTimeout(function() {
                countAllowed = false;
            }, 30000);

            // Funktion zum Senden der Absprungs-Anfrage
            function countBounce() {
                if (countAllowed && !bounceCounted) {
                    navigator.sendBeacon("<?php echo admin_url('admin-ajax.php'); ?>?action=increase_bounce_counter");
                    bounceCounted = true;
                }
            }

            // Überwacht das Verlassen der Seite
            window.addEventListener('beforeunload', function(event) {
                // Verzögert das Absprungzählen um 100ms, um sicherzustellen, dass der Klick gezählt wird
                setTimeout(function() {
                    countBounce(); // Absprung zählt nur nach Timeout
                }, 100);
            });

            // Überwacht, wenn die Seite sichtbar wird oder nicht und zählt den Absprung
            document.addEventListener('visibilitychange', function() {
                if (document.visibilityState === 'hidden' && !bounceCounted) {
                    // Bei 'hidden' wird der Absprung nur gezählt, wenn er noch nicht gezählt wurde
                    countBounce();
                }
            });
        });
    </script>
    <?php
}
}
add_action('wp_footer', 'enqueue_click_bounce_counter_script');

Entwicklung:

<?php
/*
* Plugin Name: Click & Bounce Counter
* Description: Zählt die Gesamtzahl der Klicks und speichert die Absprünge innerhalb von 30 Sekunden. 
  Ein Dashboard-Widget zeigt die Statistik und in einem Balken-Diagramm an.
  Administrator(In) ist automatisch ausgeschlossen.
* Version: Entwicklung
* Autor: Team WP Wegerl
* Author URI: https://wegerl.at
* Text Domain: click-bounce-counter

!!! Hinweis: Die Bot-Erkennung wird in einer separaten Datei (mu-plugin) verwaltet, diese Datei ist zur Funktion bedingend !!!
Die Funktion 'is_bot_or_spider' prüft anhand des User-Agents, ob es sich bei einem Besucher um einen Bot handelt. 
Diese Funktion nutzt Caching, um wiederholte Anfragen zu vermeiden und verbessert so die Performance.
*/
// Fügt das Chart.js-Skript für das Dashboard hinzu
function enqueue_chartjs_script() {
    if (is_admin()) {
        wp_enqueue_script('chart-js', 'https://cdn.jsdelivr.net/npm/chart.js', array(), null, true);
    }
}
add_action('admin_enqueue_scripts', 'enqueue_chartjs_script');

// Initialisiert die Zähler, falls sie nicht existieren.
function initialize_click_bounce_counters() {
    if (get_option('click_counter') === false) {
        add_option('click_counter', 0);
    }
    if (get_option('bounce_counter') === false) {
        add_option('bounce_counter', 0);
    }
}
add_action('init', 'initialize_click_bounce_counters');

// Fügt das Dashboard-Widget hinzu.
function add_click_bounce_widget() {
    wp_add_dashboard_widget(
        'click_bounce_widget',
        'Click & Bounce Counter: Klickzähler und Absprungrate',
        'display_click_bounce_count'
    );
}
add_action('wp_dashboard_setup', 'add_click_bounce_widget');

// Zeigt die aktuellen Zählerstände im Widget an und fügt die Buttons hinzu.
function display_click_bounce_count() {
    $click_count = get_option('click_counter');
    $bounce_count = get_option('bounce_counter');
    ?>
    <p>Anzahl der insgesamt gezählten Klicks: <strong id="click-count"><?php echo $click_count; ?></strong></p>
    <p>Anzahl der Absprünge innerhalb von 30 Sekunden: <strong id="bounce-count"><?php echo $bounce_count; ?></strong></p>
    <canvas id="click-bounce-chart" width="400" height="200"></canvas>
    
    <form method="post" id="reset-form" style="margin-top: 25px;">
        <input type="hidden" name="reset_click_bounce" value="1">
        <button type="button" id="reset-button">Zähler zurücksetzen</button>
        <button type="button" id="refresh-button" style="margin-left: 15px;">Aktualisieren</button>
    </form>
    
    <script>
        let clickBounceChart;
        let resetTimeout;

        document.addEventListener("DOMContentLoaded", function() {
            const ctx = document.getElementById('click-bounce-chart').getContext('2d');
            clickBounceChart = new Chart(ctx, {
                type: 'bar',
                data: {
                    labels: ['Gesamt Klicks', 'Absprünge innerhalb 30 Sekunden'],
                    datasets: [{
                        label: 'Zähler',
                        data: [<?php echo $click_count; ?>, <?php echo $bounce_count; ?>],
                        backgroundColor: [
                            'rgba(75, 192, 192, 0.2)', 
                            'rgba(255, 99, 132, 0.2)'
                        ],
                        borderColor: [
                            'rgba(75, 192, 192, 1)', 
                            'rgba(255, 99, 132, 1)'
                        ],
                        borderWidth: 1
                    }]
                },
                options: {
                    scales: {
                        y: {
                            beginAtZero: true,
                            ticks: {
                                stepSize: 1,
                                callback: function(value) {
                                    return Number.isInteger(value) ? value : '';
                                }
                            },
                            title: {
                                display: true,
                                text: 'Anzahl'
                            }
                        }
                    }
                }
            });
        });

        document.getElementById("refresh-button").addEventListener("click", function(event) {
    event.preventDefault();
    fetch("<?php echo admin_url('admin-ajax.php'); ?>?action=update_click_bounce_counts", {
        method: 'GET',
    })
    .then(response => response.json())
    .then(data => {
        document.getElementById('click-count').textContent = data.click_count;
        document.getElementById('bounce-count').textContent = data.bounce_count;
        clickBounceChart.data.datasets[0].data = [data.click_count, data.bounce_count];
        clickBounceChart.update();
    });
});

        document.getElementById("reset-button").addEventListener("click", function(event) {
            event.preventDefault();
            
            if (this.dataset.clickedOnce === "true") {
                fetch("<?php echo admin_url('admin-ajax.php'); ?>?action=reset_click_bounce_counters", {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/x-www-form-urlencoded',
                    },
                    body: 'reset_click_bounce=1'
                })
                .then(response => response.text())
                .then(data => {
                    document.getElementById('click-count').textContent = 0;
                    document.getElementById('bounce-count').textContent = 0;
                    clickBounceChart.data.datasets[0].data = [0, 0];
                    clickBounceChart.update();
                });
            } else {
                this.dataset.clickedOnce = "true";
                this.innerText = "Zum Bestätigen erneut klicken";

                resetTimeout = setTimeout(() => {
                    this.dataset.clickedOnce = "false";
                    this.innerText = "Zähler zurücksetzen";
                }, 1500);
            }
        });
    </script>
    <?php
}

// Überprüft, ob der Reset-Button geklickt wurde, und setzt die Zähler zurück.
function reset_click_bounce_counters() {
    if (isset($_POST['reset_click_bounce']) && $_POST['reset_click_bounce'] == '1') {
        update_option('click_counter', 0);
        update_option('bounce_counter', 0);
    }
}
add_action('wp_ajax_reset_click_bounce_counters', 'reset_click_bounce_counters');

// Liefert die aktuellen Zählerwerte für den Aktualisieren-Button.
function update_click_bounce_counts() {
    $click_count = get_option('click_counter');
    $bounce_count = get_option('bounce_counter');
    wp_send_json(array(
        'click_count' => $click_count,
        'bounce_count' => $bounce_count
    ));
}
add_action('wp_ajax_update_click_bounce_counts', 'update_click_bounce_counts');

// Funktion zur Erkennung von Bots
if (is_bot_or_spider()) {
    // Bot erkannt
}

// Ajax-Handler zum Erhöhen der Zähler
function increase_click_counter() {
    // Nur für nicht-Admins und keine Bots
    if (!current_user_can('administrator') && !is_bot_or_spider()) {
        $click_count = get_option('click_counter', 0);
        update_option('click_counter', $click_count + 1);
    }
    wp_die();
}
add_action('wp_ajax_nopriv_increase_click_counter', 'increase_click_counter');
add_action('wp_ajax_increase_click_counter', 'increase_click_counter');

// Ajax-Handler zum Erhöhen des Bounce-Zählers
function increase_bounce_counter() {
    // Nur für nicht-Admins und keine Bots
    if (!current_user_can('administrator') && !is_bot_or_spider()) {
        $bounce_count = get_option('bounce_counter', 0);
        update_option('bounce_counter', $bounce_count + 1);
    }
    wp_die();
}
add_action('wp_ajax_nopriv_increase_bounce_counter', 'increase_bounce_counter');
add_action('wp_ajax_increase_bounce_counter', 'increase_bounce_counter');


// Fügt das JavaScript für die Klicküberwachung im Frontend hinzu
function enqueue_click_bounce_counter_script() {
    ?>
    <script>
        document.addEventListener("DOMContentLoaded", function() {
            let countAllowed = true; 
            let bounceCounted = false; 

            // Sende eine allgemeine Klick-Anfrage
            navigator.sendBeacon("<?php echo admin_url('admin-ajax.php'); ?>?action=increase_click_counter");

            // Blockiert das Zählen der Absprünge nach 30 Sekunden
            setTimeout(function() {
                countAllowed = false;
            }, 30000);

            // Funktion zum Senden der Absprungs-Anfrage
            function countBounce() {
                if (countAllowed && !bounceCounted) {
                    navigator.sendBeacon("<?php echo admin_url('admin-ajax.php'); ?>?action=increase_bounce_counter");
                    bounceCounted = true; 
                }
            }

            // Überwacht das Verlassen der Seite
            document.addEventListener('visibilitychange', function() {
                if (document.visibilityState === 'hidden') {
                    countBounce();
                }
            });

            // Zusätzlich zum beforeunload-Event
            window.addEventListener('beforeunload', function() {
                countBounce();
            });
        });
    </script>
    <?php
}
add_action('wp_footer', 'enqueue_click_bounce_counter_script');

Entwicklung:

<?php
/*
* Plugin Name: Bounce Counter +
* Description: Zählt die Gesamtzahl der Klicks und speichert die Absprünge innerhalb von 30 Sekunden. 
* Ein Dashboard-Widget zeigt die Statistik und in einem Balken-Diagramm an.
* Die Admin-IP ist zs. IP-Ausschlusslogik für Statify
* Version: Entwicklung
* Autor: Team WP Wegerl.at
*/

// Fügt das Chart.js-Skript für das Dashboard hinzu
function enqueue_chartjs_script() {
    if (is_admin()) {
        wp_enqueue_script('chart-js', 'https://cdn.jsdelivr.net/npm/chart.js', array(), null, true);
    }
}
add_action('admin_enqueue_scripts', 'enqueue_chartjs_script');

// Initialisiert die Zähler, falls sie nicht existieren.
function initialize_bounce_counters() {
    if (get_option('bounce_counter') === false) {
        add_option('bounce_counter', 0);
    }
    if (get_option('short_bounce_counter') === false) {
        add_option('short_bounce_counter', 0);
    }
}
add_action('init', 'initialize_bounce_counters');

// Fügt das Dashboard-Widget hinzu.
function add_bounce_widget() {
    wp_add_dashboard_widget(
        'bounce_widget',
        'Bounce Counter: Klickzähler und Absprungrate',
        'display_bounce_count'
    );
}
add_action('wp_dashboard_setup', 'add_bounce_widget');

// Zeigt die aktuellen Zählerstände im Widget an und fügt den Reset- und Aktualisieren-Button hinzu.
function display_bounce_count() {
    $bounce_count = get_option('bounce_counter');
    $short_bounce_count = get_option('short_bounce_counter');
    ?>
    <p>Anzahl der insgesamt gezählten Klicks: <strong id="bounce-count"><?php echo $bounce_count; ?></strong></p>
    <p>Anzahl der Absprünge innerhalb von 30 Sekunden: <strong id="short-bounce-count"><?php echo $short_bounce_count; ?></strong></p>
    <canvas id="bounce-chart" width="400" height="200"></canvas>
    
    <form method="post" id="reset-form" style="margin-top: 25px;">
        <input type="hidden" name="reset_bounce" value="1">
        <button type="button" id="reset-button">Zähler zurücksetzen</button>
        <button type="button" id="refresh-button" style="margin-left: 15px;">Aktualisieren</button>
    </form>
    
    <script>
        let bounceChart;
        let resetTimeout;

        document.addEventListener("DOMContentLoaded", function() {
            const ctx = document.getElementById('bounce-chart').getContext('2d');
            bounceChart = new Chart(ctx, {
                type: 'bar',
                data: {
                    labels: ['Gesamt Klicks', 'Absprünge innerhalb 30 Sekunden'],
                    datasets: [{
                        label: 'Zähler',
                        data: [<?php echo $bounce_count; ?>, <?php echo $short_bounce_count; ?>],
                        backgroundColor: [
                            'rgba(75, 192, 192, 0.2)', 
                            'rgba(255, 99, 132, 0.2)'
                        ],
                        borderColor: [
                            'rgba(75, 192, 192, 1)', 
                            'rgba(255, 99, 132, 1)'
                        ],
                        borderWidth: 1
                    }]
                },
                options: {
                    scales: {
                        y: {
                            beginAtZero: true,
                            ticks: {
                                stepSize: 1, // Schritte auf ganze Zahlen festlegen
                                callback: function(value) {
                                    return Number.isInteger(value) ? value : ''; // Nur ganze Zahlen anzeigen
                                }
                            },
                            title: {
                                display: true,
                                text: 'Anzahl'
                            }
                        }
                    }
                }
            });
        });

        document.getElementById("reset-button").addEventListener("click", function(event) {
            event.preventDefault(); // Verhindert das sofortige Zurücksetzen beim ersten Klick
            
            if (this.dataset.clickedOnce === "true") {
                // Zweiter Klick innerhalb des Zeitfensters: Ajax-Anfrage senden
                fetch("<?php echo admin_url('admin-ajax.php'); ?>?action=reset_bounce_counters", {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/x-www-form-urlencoded',
                    },
                    body: 'reset_bounce=1'
                })
                .then(response => response.text())
                .then(data => {
                    // Zähler zurücksetzen und Dashboard aktualisieren
                    document.getElementById('bounce-count').textContent = 0;
                    document.getElementById('short-bounce-count').textContent = 0;
                    bounceChart.data.datasets[0].data = [0, 0];
                    bounceChart.update();
                });
            } else {
                // Erster Klick: Buttontext ändern und clickedOnce auf true setzen
                this.dataset.clickedOnce = "true";
                this.innerText = "Zum Bestätigen erneut klicken";

                // Timeout setzen, um den Button nach 1,5 Sekunden zurückzusetzen
                resetTimeout = setTimeout(() => {
                    this.dataset.clickedOnce = "false"; // Status zurücksetzen
                    this.innerText = "Zähler zurücksetzen"; // Buttontext zurücksetzen
                }, 1500);
            }
        });
    </script>
    <?php
}

// Überprüft, ob der Reset-Button geklickt wurde, und setzt die Zähler zurück.
function reset_bounce_counters() {
    if (isset($_POST['reset_bounce']) && $_POST['reset_bounce'] == '1') {
        update_option('bounce_counter', 0);
        update_option('short_bounce_counter', 0);
    }
}
add_action('wp_ajax_reset_bounce_counters', 'reset_bounce_counters'); // Ajax-Handler für das Zurücksetzen der Zähler

// Funktion zum Ausschließen von IPs
function is_ip_excluded($user_ip) {
    $excluded_ips = get_option('excluded_ips', array());
    return in_array($user_ip, $excluded_ips);
}

// Funktion zur Erkennung von Bots
function is_bot_or_spider() {
    // Wenn ein Cache existiert, den zwischengespeicherten Wert verwenden
    $cached_result = get_transient('is_bot_' . $_SERVER['REMOTE_ADDR']);
    if ($cached_result !== false) {
        return $cached_result;
    }

    // Bot-Erkennung durchführen
    $user_agent = strtolower($_SERVER['HTTP_USER_AGENT']);
    $bots = [
        'googlebot', 'bingbot', 'slurp', 'duckduckbot', 'baidu', 'yandex',
        'sogou', 'exabot', 'facebook', 'twitter', 'linkedin', 'pinterest',
        'msnbot', 'bot', 'crawl', 'spider', 'ia_archiver'
    ];
    
	foreach ($bots as $bot) {
        // Caching für 12 Stunden
		if (strpos($user_agent, $bot) !== false) {
            set_transient('is_bot_' . $_SERVER['REMOTE_ADDR'], true, 12 * HOUR_IN_SECONDS); // Caching für 12 Stunden
            return true;
        }
    }

    // Caching für 12 Stunden
	set_transient('is_bot_' . $_SERVER['REMOTE_ADDR'], false, 12 * HOUR_IN_SECONDS);
    return false;
}

// Ajax-Handler zum Erhöhen der Zähler
function increase_bounce_counter() {
    $user_ip = sanitize_text_field($_SERVER['REMOTE_ADDR']);
    if (!is_ip_excluded($user_ip) && !current_user_can('administrator') && !is_bot_or_spider()) {
        $bounce_count = get_option('bounce_counter', 0);
        update_option('bounce_counter', $bounce_count + 1);
    }
    wp_die();
}
add_action('wp_ajax_nopriv_increase_bounce_counter', 'increase_bounce_counter');
add_action('wp_ajax_increase_bounce_counter', 'increase_bounce_counter');

// Ajax-Handler zum Erhöhen des Kurzzeit-Absprungzählers
function increase_short_bounce_counter() {
    $user_ip = sanitize_text_field($_SERVER['REMOTE_ADDR']);
    if (!is_ip_excluded($user_ip) && !current_user_can('administrator') && !is_bot_or_spider()) {
        $short_bounce_count = get_option('short_bounce_counter', 0);
        update_option('short_bounce_counter', $short_bounce_count + 1);
    }
    wp_die();
}
add_action('wp_ajax_nopriv_increase_short_bounce_counter', 'increase_short_bounce_counter');
add_action('wp_ajax_increase_short_bounce_counter', 'increase_short_bounce_counter');

// Fügt das JavaScript für die Klicküberwachung im Frontend hinzu
function enqueue_bounce_counter_script() {
    ?>
    <script>
        document.addEventListener("DOMContentLoaded", function() {
            let countAllowed = true; 
            let bounceCounted = false; 

            // Sende eine allgemeine Klick-Anfrage
            navigator.sendBeacon("<?php echo admin_url('admin-ajax.php'); ?>?action=increase_bounce_counter");

            // Blockiert das Zählen der Kurzzeit-Absprünge nach 30 Sekunden
            setTimeout(function() {
                countAllowed = false;
            }, 30000);

            // Funktion zum Senden der Absprungs-Anfrage
            function countShortBounce() {
                if (countAllowed && !bounceCounted) {
                    navigator.sendBeacon("<?php echo admin_url('admin-ajax.php'); ?>?action=increase_short_bounce_counter");
                    bounceCounted = true; 
                }
            }

            // Überwacht das Verlassen der Seite
            document.addEventListener('visibilitychange', function() {
                if (document.visibilityState === 'hidden') {
                    countShortBounce();
                }
            });

            // Zusätzlich zum `beforeunload`-Event
            window.addEventListener('beforeunload', function() {
                countShortBounce();
            });
        });
    </script>
    <?php
}
add_action('wp_footer', 'enqueue_bounce_counter_script');

// Fügt das JavaScript für den Aktualisieren-Button im Dashboard hinzu
function bounce_counter_dashboard_script() {
    ?>
    <script>
        document.addEventListener("DOMContentLoaded", function() {
            document.getElementById('refresh-button').addEventListener('click', function() {
                fetch("<?php echo admin_url('admin-ajax.php'); ?>?action=get_bounce_counts")
                    .then(response => response.json())
                    .then(data => {
                        document.getElementById('bounce-count').textContent = data.bounce_count;
                        document.getElementById('short-bounce-count').textContent = data.short_bounce_count;
                        bounceChart.data.datasets[0].data = [data.bounce_count, data.short_bounce_count];
                        bounceChart.update();
                    });
            });
        });
    </script>
    <?php
}
add_action('admin_footer', 'bounce_counter_dashboard_script');

// API-Endpoint für die Abfrage der aktuellen Zählerstände
function get_bounce_counts() {
    $bounce_count = get_option('bounce_counter', 0);
    $short_bounce_count = get_option('short_bounce_counter', 0);
    wp_send_json(array('bounce_count' => $bounce_count, 'short_bounce_count' => $short_bounce_count));
}
add_action('wp_ajax_get_bounce_counts', 'get_bounce_counts');

Entwicklung:

// Aktiviert den täglichen Cron-Job zur Rücksetzung der Zähler
function activate_bounce_counter_cron() {
    // Überprüft, ob der Cron-Job bereits geplant ist
    if (!wp_next_scheduled('reset_bounce_counters_daily')) {
        // Plant den Cron-Job, um täglich um Mitternacht auszuführen
        wp_schedule_event(strtotime('00:00:00'), 'daily', 'reset_bounce_counters_daily');
    }
}
add_action('wp', 'activate_bounce_counter_cron');

// Funktion, die beim Cron-Job ausgeführt wird
function daily_reset_bounce_counters() {
    // Setzt die Zähler für den Bounce-Counter auf Null zurück
    update_option('bounce_counter', 0);
    update_option('short_bounce_counter', 0);
}
add_action('reset_bounce_counters_daily', 'daily_reset_bounce_counters');

// Deaktiviert den Cron-Job bei Plugin-Deaktivierung
function deactivate_bounce_counter_cron() {
    // Holt den Zeitstempel des geplanten Cron-Jobs
    $timestamp = wp_next_scheduled('reset_bounce_counters_daily');
    // Wenn der Job geplant ist, wird er entfernt
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'reset_bounce_counters_daily');
    }
}
register_deactivation_hook(__FILE__, 'deactivate_bounce_counter_cron');

Entwicklung:

<?php
/*
* Plugin Name: Bounce Counter
* Description: Zählt die Gesamtzahl der Klicks und speichert die Absprünge innerhalb von 30 Sekunden.
* Ein Dashboard-Widget zeigt die Statistik an.
* Version: 1.0.0
* Autor: Team WP Wegerl.at
*/

// Initialisiert die Zähler, falls sie nicht existieren.
function initialize_bounce_counters() {
    if (get_option('bounce_counter') === false) {
        add_option('bounce_counter', 0);
    }
    if (get_option('short_bounce_counter') === false) {
        add_option('short_bounce_counter', 0);
    }
}
add_action('init', 'initialize_bounce_counters');

// Fügt das Dashboard-Widget hinzu.
function add_bounce_widget() {
    wp_add_dashboard_widget(
        'bounce_widget',
        'Klickzähler und Absprungrate',
        'display_bounce_count'
    );
}
add_action('wp_dashboard_setup', 'add_bounce_widget');

// Zeigt die aktuellen Zählerstände im Widget an und fügt den Reset- und Aktualisieren-Button hinzu.
function display_bounce_count() {
    $bounce_count = get_option('bounce_counter');
    $short_bounce_count = get_option('short_bounce_counter');
    ?>
    <p>Anzahl der insgesamt gezählten Klicks: <strong id="bounce-count"><?php echo $bounce_count; ?></strong></p>
    <p>Anzahl der Absprünge innerhalb von 30 Sekunden: <strong id="short-bounce-count"><?php echo $short_bounce_count; ?></strong></p>
    <form method="post" id="reset-form">
        <input type="hidden" name="reset_bounce" value="1">
        <button type="submit">Zähler zurücksetzen</button>
        <button type="button" id="refresh-button">Aktualisieren</button>
    </form>
    <?php
}

// Überprüft, ob der Reset-Button geklickt wurde, und setzt die Zähler zurück.
function reset_bounce_counters() {
    if (isset($_POST['reset_bounce']) && $_POST['reset_bounce'] == '1') {
        update_option('bounce_counter', 0);
        update_option('short_bounce_counter', 0);
    }
}
add_action('admin_init', 'reset_bounce_counters');

// Ajax-Handler zum Erhöhen der Zähler
function increase_bounce_counter() {
    if (!current_user_can('administrator')) { // Zählt keine Klicks von Administratoren
        $bounce_count = get_option('bounce_counter', 0);
        update_option('bounce_counter', $bounce_count + 1);
    }
    wp_die();
}
add_action('wp_ajax_nopriv_increase_bounce_counter', 'increase_bounce_counter');
add_action('wp_ajax_increase_bounce_counter', 'increase_bounce_counter');

// Ajax-Handler zum Erhöhen des Kurzzeit-Absprungzählers
function increase_short_bounce_counter() {
    if (!current_user_can('administrator')) { // Zählt keine Klicks von Administratoren
        $short_bounce_count = get_option('short_bounce_counter', 0);
        update_option('short_bounce_counter', $short_bounce_count + 1);
    }
    wp_die();
}
add_action('wp_ajax_nopriv_increase_short_bounce_counter', 'increase_short_bounce_counter');
add_action('wp_ajax_increase_short_bounce_counter', 'increase_short_bounce_counter');

// Fügt das JavaScript für die Klicküberwachung im Frontend hinzu
function enqueue_bounce_counter_script() {
    ?>
    <script>
        document.addEventListener("DOMContentLoaded", function() {
            let countAllowed = true; // Variable zur Steuerung für Absprünge innerhalb von 30 Sekunden
            let bounceCounted = false; // Sperre für das Zählen eines einzigen Kurzzeit-Absprungs

            // Sende eine allgemeine Klick-Anfrage
            navigator.sendBeacon("<?php echo admin_url('admin-ajax.php'); ?>?action=increase_bounce_counter");

            // Blockiert das Zählen der Kurzzeit-Absprünge nach 30 Sekunden
            setTimeout(function() {
                countAllowed = false;
            }, 30000);

            // Funktion zum Senden der Absprungs-Anfrage
            function countShortBounce() {
                if (countAllowed && !bounceCounted) {
                    navigator.sendBeacon("<?php echo admin_url('admin-ajax.php'); ?>?action=increase_short_bounce_counter");
                    bounceCounted = true; // Sperre wird gesetzt, damit nur einmal gezählt wird
                }
            }

            // Überwacht das Verlassen der Seite (Tab-Wechsel oder Schließen des Browsers)
            document.addEventListener('visibilitychange', function() {
                if (document.visibilityState === 'hidden') {
                    countShortBounce();
                }
            });

            // Zusätzlich zum `beforeunload`-Event
            window.addEventListener('beforeunload', function() {
                countShortBounce();
            });
        });
    </script>
    <?php
}
add_action('wp_footer', 'enqueue_bounce_counter_script');

// Fügt das JavaScript für den Aktualisieren-Button im Dashboard hinzu
function bounce_counter_dashboard_script() {
    ?>
    <script>
        document.addEventListener("DOMContentLoaded", function() {
            // Aktualisieren-Button im Dashboard
            document.getElementById('refresh-button').addEventListener('click', function() {
                fetch("<?php echo admin_url('admin-ajax.php'); ?>?action=get_bounce_counts")
                    .then(response => response.json())
                    .then(data => {
                        document.getElementById('bounce-count').textContent = data.total_count;
                        document.getElementById('short-bounce-count').textContent = data.short_count;
                    });
            });
        });
    </script>
    <?php
}
add_action('admin_footer', 'bounce_counter_dashboard_script');

// Ajax-Handler, um die aktuellen Bounce-Zahlen für das Dashboard abzurufen
function get_bounce_counts() {
    $bounce_count = get_option('bounce_counter', 0);
    $short_bounce_count = get_option('short_bounce_counter', 0);
    echo json_encode(['total_count' => $bounce_count, 'short_count' => $short_bounce_count]);
    wp_die();
}
add_action('wp_ajax_get_bounce_counts', 'get_bounce_counts');

Entwicklung:

<?php
/*
* Plugin Name: Bounce Counter +
* Description: Zählt die Gesamtzahl der Klicks und speichert die Absprünge innerhalb von 30 Sekunden.
* Ein Dashboard-Widget zeigt die Statistik und in einem Balken-Diagramm an.
* Version: Entwicklung
* Autor: Team WP Wegerl.at
*/

// Fügt das Chart.js-Skript für das Dashboard hinzu
function enqueue_chartjs_script() {
    if (is_admin()) { // Überprüft, ob es sich um das Dashboard handelt
        wp_enqueue_script('chart-js', 'https://cdn.jsdelivr.net/npm/chart.js', array(), null, true);
    }
}
add_action('admin_enqueue_scripts', 'enqueue_chartjs_script');

// Initialisiert die Zähler, falls sie nicht existieren.
function initialize_bounce_counters() {
    if (get_option('bounce_counter') === false) {
        add_option('bounce_counter', 0);
    }
    if (get_option('short_bounce_counter') === false) {
        add_option('short_bounce_counter', 0);
    }
}
add_action('init', 'initialize_bounce_counters');

// Fügt das Dashboard-Widget hinzu.
function add_bounce_widget() {
    wp_add_dashboard_widget(
        'bounce_widget',
        'Klickzähler und Absprungrate',
        'display_bounce_count'
    );
}
add_action('wp_dashboard_setup', 'add_bounce_widget');

// Zeigt die aktuellen Zählerstände im Widget an und fügt den Reset- und Aktualisieren-Button hinzu.
function display_bounce_count() {
    $bounce_count = get_option('bounce_counter');
    $short_bounce_count = get_option('short_bounce_counter');
    ?>
    <p>Anzahl der insgesamt gezählten Klicks: <strong id="bounce-count"><?php echo $bounce_count; ?></strong></p>
    <p>Anzahl der Absprünge innerhalb von 30 Sekunden: <strong id="short-bounce-count"><?php echo $short_bounce_count; ?></strong></p>
    <canvas id="bounce-chart" width="400" height="200"></canvas> <!-- Canvas für das Diagramm -->
    <form method="post" id="reset-form">
        <input type="hidden" name="reset_bounce" value="1">
        <button type="submit">Zähler zurücksetzen</button>
        <button type="button" id="refresh-button">Aktualisieren</button>
    </form>
    <script>
        let bounceChart;

        document.addEventListener("DOMContentLoaded", function() {
            const ctx = document.getElementById('bounce-chart').getContext('2d');
            bounceChart = new Chart(ctx, {
                type: 'bar', // Diagrammtyp
                data: {
                    labels: ['Gesamt Klicks', 'Absprünge innerhalb 30 Sekunden'],
                    datasets: [{
                        label: 'Zähler',
                        data: [<?php echo $bounce_count; ?>, <?php echo $short_bounce_count; ?>],
                        backgroundColor: [
                            'rgba(75, 192, 192, 0.2)', 
                            'rgba(255, 99, 132, 0.2)'
                        ],
                        borderColor: [
                            'rgba(75, 192, 192, 1)', 
                            'rgba(255, 99, 132, 1)'
                        ],
                        borderWidth: 1
                    }]
                },
                options: {
                    scales: {
                        y: {
                            beginAtZero: true,
                            title: {
                                display: true,
                                text: 'Anzahl'
                            }
                        }
                    }
                }
            });
        });
    </script>
    <?php
}

// Überprüft, ob der Reset-Button geklickt wurde, und setzt die Zähler zurück.
function reset_bounce_counters() {
    if (isset($_POST['reset_bounce']) && $_POST['reset_bounce'] == '1') {
        update_option('bounce_counter', 0);
        update_option('short_bounce_counter', 0);
    }
}
add_action('admin_init', 'reset_bounce_counters');

// Ajax-Handler zum Erhöhen der Zähler
function increase_bounce_counter() {
    if (!current_user_can('administrator')) { // Zählt keine Klicks von Administratoren
        $bounce_count = get_option('bounce_counter', 0);
        update_option('bounce_counter', $bounce_count + 1);
    }
    wp_die();
}
add_action('wp_ajax_nopriv_increase_bounce_counter', 'increase_bounce_counter');
add_action('wp_ajax_increase_bounce_counter', 'increase_bounce_counter');

// Ajax-Handler zum Erhöhen des Kurzzeit-Absprungzählers
function increase_short_bounce_counter() {
    if (!current_user_can('administrator')) { // Zählt keine Klicks von Administratoren
        $short_bounce_count = get_option('short_bounce_counter', 0);
        update_option('short_bounce_counter', $short_bounce_count + 1);
    }
    wp_die();
}
add_action('wp_ajax_nopriv_increase_short_bounce_counter', 'increase_short_bounce_counter');
add_action('wp_ajax_increase_short_bounce_counter', 'increase_short_bounce_counter');

// Fügt das JavaScript für die Klicküberwachung im Frontend hinzu
function enqueue_bounce_counter_script() {
    ?>
    <script>
        document.addEventListener("DOMContentLoaded", function() {
            let countAllowed = true; // Variable zur Steuerung für Absprünge innerhalb von 30 Sekunden
            let bounceCounted = false; // Sperre für das Zählen eines einzigen Kurzzeit-Absprungs

            // Sende eine allgemeine Klick-Anfrage
            navigator.sendBeacon("<?php echo admin_url('admin-ajax.php'); ?>?action=increase_bounce_counter");

            // Blockiert das Zählen der Kurzzeit-Absprünge nach 30 Sekunden
            setTimeout(function() {
                countAllowed = false;
            }, 30000);

            // Funktion zum Senden der Absprungs-Anfrage
            function countShortBounce() {
                if (countAllowed && !bounceCounted) {
                    navigator.sendBeacon("<?php echo admin_url('admin-ajax.php'); ?>?action=increase_short_bounce_counter");
                    bounceCounted = true; // Sperre wird gesetzt, damit nur einmal gezählt wird
                }
            }

            // Überwacht das Verlassen der Seite (Tab-Wechsel oder Schließen des Browsers)
            document.addEventListener('visibilitychange', function() {
                if (document.visibilityState === 'hidden') {
                    countShortBounce();
                }
            });

            // Zusätzlich zum `beforeunload`-Event
            window.addEventListener('beforeunload', function() {
                countShortBounce();
            });
        });
    </script>
    <?php
}
add_action('wp_footer', 'enqueue_bounce_counter_script');

// Fügt das JavaScript für den Aktualisieren-Button im Dashboard hinzu
function bounce_counter_dashboard_script() {
    ?>
    <script>
        document.addEventListener("DOMContentLoaded", function() {
            // Aktualisieren-Button im Dashboard
            document.getElementById('refresh-button').addEventListener('click', function() {
                fetch("<?php echo admin_url('admin-ajax.php'); ?>?action=get_bounce_counts")
                    .then(response => response.json())
                    .then(data => {
                        document.getElementById('bounce-count').textContent = data.total_count;
                        document.getElementById('short-bounce-count').textContent = data.short_count;

                        // Aktualisiere die Daten des bestehenden Diagramms
                        bounceChart.data.datasets[0].data = [data.total_count, data.short_count];
                        bounceChart.update(); // Aktualisiert das Diagramm
                    });
            });
        });
    </script>
    <?php
}
add_action('admin_footer', 'bounce_counter_dashboard_script');

// Ajax-Handler, um die aktuellen Bounce-Zahlen für das Dashboard abzurufen
function get_bounce_counts() {
    $bounce_count = get_option('bounce_counter', 0);
    $short_bounce_count = get_option('short_bounce_counter', 0);
    echo json_encode(['total_count' => $bounce_count, 'short_count' => $short_bounce_count]);
    wp_die();
}
add_action('wp_ajax_get_bounce_counts', 'get_bounce_counts');

Entwicklung:

<?php
/*
* Plugin Name: Bounce Counter +
* Description: Zählt die Gesamtzahl der Klicks und speichert die Absprünge innerhalb von 30 Sekunden. 
* Ein Dashboard-Widget zeigt die Statistik und in einem Balken-Diagramm an.
* Die Admin-IP ist zs. IP-Ausschlusslogik für Statify
* Version: 1.2.0
* Autor: Team WP Wegerl.at
*/

// Fügt das Chart.js-Skript für das Dashboard hinzu
function enqueue_chartjs_script() {
    if (is_admin()) {
        wp_enqueue_script('chart-js', 'https://cdn.jsdelivr.net/npm/chart.js', array(), null, true);
    }
}
add_action('admin_enqueue_scripts', 'enqueue_chartjs_script');

// Initialisiert die Zähler, falls sie nicht existieren.
function initialize_bounce_counters() {
    if (get_option('bounce_counter') === false) {
        add_option('bounce_counter', 0);
    }
    if (get_option('short_bounce_counter') === false) {
        add_option('short_bounce_counter', 0);
    }
}
add_action('init', 'initialize_bounce_counters');

// Fügt das Dashboard-Widget hinzu.
function add_bounce_widget() {
    wp_add_dashboard_widget(
        'bounce_widget',
        'Bounce Counter: Klickzähler und Absprungrate',
        'display_bounce_count'
    );
}
add_action('wp_dashboard_setup', 'add_bounce_widget');

// Zeigt die aktuellen Zählerstände im Widget an und fügt den Reset- und Aktualisieren-Button hinzu.
function display_bounce_count() {
    $bounce_count = get_option('bounce_counter');
    $short_bounce_count = get_option('short_bounce_counter');
    ?>
    <p>Anzahl der insgesamt gezählten Klicks: <strong id="bounce-count"><?php echo $bounce_count; ?></strong></p>
    <p>Anzahl der Absprünge innerhalb von 30 Sekunden: <strong id="short-bounce-count"><?php echo $short_bounce_count; ?></strong></p>
    <canvas id="bounce-chart" width="400" height="200"></canvas>
    
    <form method="post" id="reset-form" style="margin-top: 25px;">
        <input type="hidden" name="reset_bounce" value="1">
        <button type="button" id="reset-button">Zähler zurücksetzen</button>
        <button type="button" id="refresh-button" style="margin-left: 15px;">Aktualisieren</button>
    </form>
    
    <script>
        let bounceChart;
        let resetTimeout;

        document.addEventListener("DOMContentLoaded", function() {
            const ctx = document.getElementById('bounce-chart').getContext('2d');
            bounceChart = new Chart(ctx, {
                type: 'bar',
                data: {
                    labels: ['Gesamt Klicks', 'Absprünge innerhalb 30 Sekunden'],
                    datasets: [{
                        label: 'Zähler',
                        data: [<?php echo $bounce_count; ?>, <?php echo $short_bounce_count; ?>],
                        backgroundColor: [
                            'rgba(75, 192, 192, 0.2)', 
                            'rgba(255, 99, 132, 0.2)'
                        ],
                        borderColor: [
                            'rgba(75, 192, 192, 1)', 
                            'rgba(255, 99, 132, 1)'
                        ],
                        borderWidth: 1
                    }]
                },
                options: {
                    scales: {
                        y: {
                            beginAtZero: true,
                            ticks: {
                                stepSize: 1, // Schritte auf ganze Zahlen festlegen
                                callback: function(value) {
                                    return Number.isInteger(value) ? value : ''; // Nur ganze Zahlen anzeigen
                                }
                            },
                            title: {
                                display: true,
                                text: 'Anzahl'
                            }
                        }
                    }
                }
            });
        });

        document.getElementById("reset-button").addEventListener("click", function(event) {
            event.preventDefault(); // Verhindert das sofortige Zurücksetzen beim ersten Klick
            
            if (this.dataset.clickedOnce === "true") {
                // Zweiter Klick innerhalb des Zeitfensters: Ajax-Anfrage senden
                fetch("<?php echo admin_url('admin-ajax.php'); ?>?action=reset_bounce_counters", {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/x-www-form-urlencoded',
                    },
                    body: 'reset_bounce=1'
                })
                .then(response => response.text())
                .then(data => {
                    // Zähler zurücksetzen und Dashboard aktualisieren
                    document.getElementById('bounce-count').textContent = 0;
                    document.getElementById('short-bounce-count').textContent = 0;
                    bounceChart.data.datasets[0].data = [0, 0];
                    bounceChart.update();
                });
            } else {
                // Erster Klick: Buttontext ändern und clickedOnce auf true setzen
                this.dataset.clickedOnce = "true";
                this.innerText = "Zum Bestätigen erneut klicken";

                // Timeout setzen, um den Button nach 1,5 Sekunden zurückzusetzen
                resetTimeout = setTimeout(() => {
                    this.dataset.clickedOnce = "false"; // Status zurücksetzen
                    this.innerText = "Zähler zurücksetzen"; // Buttontext zurücksetzen
                }, 1500);
            }
        });
    </script>
    <?php
}

// Überprüft, ob der Reset-Button geklickt wurde, und setzt die Zähler zurück.
function reset_bounce_counters() {
    if (isset($_POST['reset_bounce']) && $_POST['reset_bounce'] == '1') {
        update_option('bounce_counter', 0);
        update_option('short_bounce_counter', 0);
    }
}
add_action('wp_ajax_reset_bounce_counters', 'reset_bounce_counters'); // Ajax-Handler für das Zurücksetzen der Zähler

// Funktion zum Ausschließen von IPs
function is_ip_excluded($user_ip) {
    $excluded_ips = get_option('excluded_ips', array());
    return in_array($user_ip, $excluded_ips);
}

// Ajax-Handler zum Erhöhen der Zähler
function increase_bounce_counter() {
    $user_ip = sanitize_text_field($_SERVER['REMOTE_ADDR']);
    if (!is_ip_excluded($user_ip) && !current_user_can('administrator')) {
        $bounce_count = get_option('bounce_counter', 0);
        update_option('bounce_counter', $bounce_count + 1);
    }
    wp_die();
}
add_action('wp_ajax_nopriv_increase_bounce_counter', 'increase_bounce_counter');
add_action('wp_ajax_increase_bounce_counter', 'increase_bounce_counter');

// Ajax-Handler zum Erhöhen des Kurzzeit-Absprungzählers
function increase_short_bounce_counter() {
    $user_ip = sanitize_text_field($_SERVER['REMOTE_ADDR']);
    if (!is_ip_excluded($user_ip) && !current_user_can('administrator')) {
        $short_bounce_count = get_option('short_bounce_counter', 0);
        update_option('short_bounce_counter', $short_bounce_count + 1);
    }
    wp_die();
}
add_action('wp_ajax_nopriv_increase_short_bounce_counter', 'increase_short_bounce_counter');
add_action('wp_ajax_increase_short_bounce_counter', 'increase_short_bounce_counter');

// Fügt das JavaScript für die Klicküberwachung im Frontend hinzu
function enqueue_bounce_counter_script() {
    ?>
    <script>
        document.addEventListener("DOMContentLoaded", function() {
            let countAllowed = true; 
            let bounceCounted = false; 

            // Sende eine allgemeine Klick-Anfrage
            navigator.sendBeacon("<?php echo admin_url('admin-ajax.php'); ?>?action=increase_bounce_counter");

            // Blockiert das Zählen der Kurzzeit-Absprünge nach 30 Sekunden
            setTimeout(function() {
                countAllowed = false;
            }, 30000);

            // Funktion zum Senden der Absprungs-Anfrage
            function countShortBounce() {
                if (countAllowed && !bounceCounted) {
                    navigator.sendBeacon("<?php echo admin_url('admin-ajax.php'); ?>?action=increase_short_bounce_counter");
                    bounceCounted = true; 
                }
            }

            // Überwacht das Verlassen der Seite
            document.addEventListener('visibilitychange', function() {
                if (document.visibilityState === 'hidden') {
                    countShortBounce();
                }
            });

            // Zusätzlich zum `beforeunload`-Event
            window.addEventListener('beforeunload', function() {
                countShortBounce();
            });
        });
    </script>
    <?php
}
add_action('wp_footer', 'enqueue_bounce_counter_script');

// Fügt das JavaScript für den Aktualisieren-Button im Dashboard hinzu
function bounce_counter_dashboard_script() {
    ?>
    <script>
        document.addEventListener("DOMContentLoaded", function() {
            document.getElementById('refresh-button').addEventListener('click', function() {
                fetch("<?php echo admin_url('admin-ajax.php'); ?>?action=get_bounce_counts")
                    .then(response => response.json())
                    .then(data => {
                        document.getElementById('bounce-count').textContent = data.bounce_count;
                        document.getElementById('short-bounce-count').textContent = data.short_bounce_count;
                        bounceChart.data.datasets[0].data = [data.bounce_count, data.short_bounce_count];
                        bounceChart.update();
                    });
            });
        });
    </script>
    <?php
}
add_action('admin_footer', 'bounce_counter_dashboard_script');

// API-Endpoint für die Abfrage der aktuellen Zählerstände
function get_bounce_counts() {
    $bounce_count = get_option('bounce_counter', 0);
    $short_bounce_count = get_option('short_bounce_counter', 0);
    wp_send_json(array('bounce_count' => $bounce_count, 'short_bounce_count' => $short_bounce_count));
}
add_action('wp_ajax_get_bounce_counts', 'get_bounce_counts');

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 sollen, empfiehlt es sich, im Ausschlussverfahren festzustellen, auf welche am ehesten verzichtet werden kann, und dann das auszuwählen, was am wichtigsten erscheint.


Hinweis zur 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.

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

So in 8-Tage mag sein 138 Klick's

 

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

Danke sehr!

Zur Optimierung unserer Website nutzen wir Tools wie 'Statify' und 'Visit Duration', die anonymisierte Daten wie die Verweildauer erfassen.

Pop-up  

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

Lesen Sie die Inhalte nicht bequem?

Erhöhen Sie die Schriftgröße über die der Headerzeile oder gleich hier:

Möchten Sie das Licht an- oder ausschalten?

Sie können auch die Tastatur verwenden:
Fokus mit Tab, Auswahl mit Space und Schließen mit Esc.


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.


Erfolgreichen Besuch
wünscht Ihnen! – WP Wegerl.at
WP Wegerl.at
Leistungsmetriken im Blick
× -