Upload via GUI (41 Dateien)

This commit is contained in:
2026-10-01 05:59:49 +00:00
parent db4863de16
commit 980ccb2cc1
+133 -60
View File
@@ -131,6 +131,10 @@ function statistik_manager_get_statistics() {
// Banner-Funktion
function statistik_manager_display_banner($position) {
static $rendered = false;
if ($rendered) {
return; // verhindert doppelte Ausgabe (wp_body_open + Footer-Fallback)
}
if (!get_option('statistik_manager_banner_enabled', 1)) {
return;
}
@@ -161,21 +165,31 @@ function statistik_manager_get_statistics() {
return;
}
// Standard-Styles für das Banner
$style = "background-color: " . esc_attr($banner_color) . ";
color: #fff;
text-align: center;
padding: 10px;
width: 100%;
height: 50px; /* Feste Höhe */
line-height: 30px; /* Zentrierte Schrift */
z-index: 9999;
position: fixed;
top: 0;
left: 0;";
$rendered = true;
$text_style = "font-size: " . esc_attr($font_size_css) . ";";
$icon_style = "font-size: 24px; margin-right: 8px;"; // Feste Größe für Icon
// Standard-Styles für das Banner (auto-Höhe, zentriert, umbruchfähig).
// !important, damit aktive Themes (z. B. Sueva) Farbe/Breite/Position
// nicht per eigener !important-Regel überschreiben können.
// top/bottom bewusst ohne !important: wird per Script unter fixe Leisten gesetzt.
$vertical_imp = ($position === 'bottom') ? 'bottom: 0;' : 'top: 0;';
$style = "background-color: " . esc_attr($banner_color) . " !important;
color: #fff !important;
text-align: center !important;
padding: 12px 16px !important;
margin: 0 !important;
width: 100% !important;
box-sizing: border-box !important;
z-index: 99990 !important;
position: fixed !important;
left: 0 !important;
$vertical_imp
display: flex !important;
align-items: center !important;
justify-content: center !important;
gap: 8px !important;";
$text_style = "font-size: " . esc_attr($font_size_css) . " !important; color: #fff !important; margin: 0 !important; line-height: 1.4 !important;";
$icon_style = "font-size: 24px !important; margin-right: 8px !important; color: #fff !important;"; // Feste Größe für Icon
echo '<div class="statistik-manager-banner" id="statistik-manager-banner" style="' . esc_attr($style) . '">';
@@ -188,54 +202,113 @@ function statistik_manager_get_statistics() {
echo '</div>';
}
// Funktion für das Banner im Header (nach <body>)
function statistik_manager_display_banner_header() {
add_action('wp_body_open', function() {
statistik_manager_display_banner('top');
});
}
// Falls `wp_body_open` nicht unterstützt wird, als Fallback `wp_footer` nutzen
function statistik_manager_display_banner_header_fallback() {
add_action('wp_footer', function() {
statistik_manager_display_banner('top');
}, 5);
}
// Funktion für das Banner im Footer
function statistik_manager_display_banner_footer() {
add_action('wp_footer', function() {
statistik_manager_display_banner('bottom');
}, 10);
}
// Banner laden (Header mit Fallback)
if (function_exists('wp_body_open')) {
statistik_manager_display_banner_header();
} else {
statistik_manager_display_banner_header_fallback();
}
// Fix: Admin-Leiste (Wenn Admin angemeldet ist, Banner nach unten verschieben)
function statistik_manager_admin_bar_fix() {
if (is_admin_bar_showing()) {
echo '<style>
#statistik-manager-banner {
top: 32px !important; /* Admin-Leiste ausgleichen */
}
body {
padding-top: 82px !important; /* Extra Platz für Admin-Leiste */
}
</style>';
} else {
echo '<style>
body {
padding-top: 70px !important; /* Standard Abstand */
}
</style>';
// Banner an der richtigen Stelle einhängen – abhängig von der konfigurierten
// Position. Nur wenn das Banner auch wirklich aktiviert ist.
function statistik_manager_register_banner() {
if (!get_option('statistik_manager_banner_enabled', 1)) {
return;
}
$pos = get_option('statistik_manager_banner_position', 'top');
if ($pos === 'bottom') {
// Unten: im Footer ausgeben
add_action('wp_footer', function() {
statistik_manager_display_banner('bottom');
}, 10);
} else {
// Oben: bevorzugt direkt nach <body>, plus Footer-Fallback für Themes
// ohne wp_body_open (die statische Sperre verhindert Doppelausgabe).
add_action('wp_body_open', function() {
statistik_manager_display_banner('top');
});
add_action('wp_footer', function() {
statistik_manager_display_banner('top');
}, 5);
}
// Abstand für den Seiteninhalt, damit das fixe Banner nichts verdeckt
add_action('wp_head', 'statistik_manager_banner_offset');
// Am Seitenende sofort nachrechnen – dann sind Banner und fixe Leisten
// (z. B. ShiftNav) garantiert im DOM, auch wenn DOMContentLoaded spät kommt.
add_action('wp_footer', function() {
echo '<script>window.statistikManagerBannerAdjust&&window.statistikManagerBannerAdjust();</script>';
}, 999);
}
add_action('wp', 'statistik_manager_register_banner');
// Fügt NUR bei aktivem Banner den passenden Abstand hinzu – auf der richtigen
// Seite (oben/unten) und mit Rücksicht auf die WordPress-Admin-Leiste.
function statistik_manager_banner_offset() {
if (!get_option('statistik_manager_banner_enabled', 1)) {
return;
}
$pos = get_option('statistik_manager_banner_position', 'top');
$h = 56; // ungefähre Bannerhöhe – nur für den No-JS-Fallback
// Fallback ohne JavaScript (WordPress verschiebt die Seite für die
// Admin-Leiste bereits selbst per html-margin, daher hier nicht addieren).
echo '<noscript><style>';
if ($pos === 'bottom') {
echo 'body { padding-bottom: ' . $h . 'px !important; }';
} else {
echo 'body { padding-top: ' . $h . 'px !important; }';
if (is_admin_bar_showing()) {
echo '#statistik-manager-banner { top: 32px !important; }';
echo '@media screen and (max-width: 782px) { #statistik-manager-banner { top: 46px !important; } }';
}
}
echo '</style></noscript>';
// Mit JavaScript: Banner exakt unter fixe Leisten oben setzen (WP-Admin-Leiste,
// ShiftNav-Menüleiste), sonst verdecken diese es. Der Inhalt wird nur um die
// tatsächliche Bannerhöhe verschoben – zusätzlich zum vorhandenen Abstand
// des Themes, damit das Layout ansonsten unverändert bleibt.
$is_bottom = ($pos === 'bottom') ? 'true' : 'false';
echo '<script>(function(){'
. 'var isBottom=' . $is_bottom . ';'
. 'var bars=["wpadminbar","shiftnav-toggle-main"];'
. 'function adjust(){'
. 'var b=document.getElementById("statistik-manager-banner");'
. 'if(!b){return;}'
. 'var s=document.body.style,prop=isBottom?"padding-bottom":"padding-top";'
. 's.removeProperty(prop);'
. 'var base=parseFloat(getComputedStyle(document.body)[isBottom?"paddingBottom":"paddingTop"])||0;'
. 'var extra=0;'
. 'if(!isBottom){'
. 'var off=0;'
. 'bars.forEach(function(id){'
. 'var e=document.getElementById(id);if(!e){return;}'
. 'var c=getComputedStyle(e);'
. 'if(c.position!=="fixed"||c.display==="none"||c.visibility==="hidden"){return;}'
. 'var r=e.getBoundingClientRect();'
. 'if(r.height>0&&r.bottom>off){off=r.bottom;}'
. '});'
. 'b.style.setProperty("top",off+"px","important");'
// Inhalt komplett unter Leisten + Banner beginnen lassen; die Admin-Leiste
// hat WordPress per html-margin bereits berücksichtigt.
. 'var hm=parseFloat(getComputedStyle(document.documentElement).marginTop)||0;'
. 'extra=Math.max(0,off-hm);'
. '}'
. 's.setProperty(prop,(base+extra+b.offsetHeight)+"px","important");'
. '}'
. 'window.statistikManagerBannerAdjust=adjust;'
. 'function watch(){'
. 'adjust();'
// Nachzügler abfangen (verzögert geladene CSS/JS anderer Plugins)
. '[300,1000,2500,5000].forEach(function(t){setTimeout(adjust,t);});'
. 'if(window.ResizeObserver){'
. 'var ro=new ResizeObserver(function(){adjust();});'
. '["statistik-manager-banner"].concat(bars).forEach(function(id){var e=document.getElementById(id);if(e){ro.observe(e);}});'
. '}'
. '}'
. 'if(document.readyState!=="loading"){watch();}else{document.addEventListener("DOMContentLoaded",watch);}'
. 'window.addEventListener("load",adjust);'
. 'window.addEventListener("resize",adjust);'
. '})();</script>';
}
add_action('wp_head', 'statistik_manager_admin_bar_fix');
// Shortcode für die Anzeige der Statistiken
function statistik_manager_shortcode() {