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');