| Server IP : 188.114.96.3 / Your IP : 216.73.216.143 Web Server : Apache System : Linux sv058.home.net.pl 6.8.2 husak_dirty_pages_fix #1 SMP PREEMPT_DYNAMIC Tue Apr 2 22:06:51 CEST 2024 x86_64 User : ( 3194769) PHP Version : 8.5.12 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : OFF Directory : /polana/admin/ |
Upload File : |
<?php
declare(strict_types=1);
require_once dirname(__DIR__) . '/includes/functions.php';
require_admin_role();
$allowedModes = ['off', 'direct', 'gtm'];
$keys = ['polana_tracking_mode','polana_ga4_id','polana_gtm_id','polana_meta_pixel_id'];
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
verify_csrf();
$mode = strtolower(trim((string)($_POST['polana_tracking_mode'] ?? 'off')));
$ga4 = strtoupper(trim((string)($_POST['polana_ga4_id'] ?? '')));
$gtm = strtoupper(trim((string)($_POST['polana_gtm_id'] ?? '')));
$pixel = trim((string)($_POST['polana_meta_pixel_id'] ?? ''));
$errors = [];
if (!in_array($mode, $allowedModes, true)) $errors[] = 'Nieprawidłowy tryb analityki.';
if ($ga4 !== '' && !preg_match('/^G-[A-Z0-9]{5,20}$/', $ga4)) $errors[] = 'GA4 powinno mieć format G-XXXXXXXXXX.';
if ($gtm !== '' && !preg_match('/^GTM-[A-Z0-9]{4,20}$/', $gtm)) $errors[] = 'GTM powinno mieć format GTM-XXXXXXX.';
if ($pixel !== '' && !preg_match('/^[0-9]{5,25}$/', $pixel)) $errors[] = 'Meta Pixel ID musi zawierać wyłącznie cyfry.';
if ($mode === 'direct' && $ga4 === '' && $pixel === '') $errors[] = 'W trybie bezpośrednim podaj GA4 i/lub Meta Pixel.';
if ($mode === 'gtm' && $gtm === '') $errors[] = 'W trybie GTM podaj identyfikator kontenera.';
if ($errors) {
foreach ($errors as $err) flash('error', $err);
} else {
$stmt = db()->prepare('INSERT INTO settings (setting_key, setting_value) VALUES (?, ?) ON DUPLICATE KEY UPDATE setting_value = VALUES(setting_value)');
foreach (['polana_tracking_mode'=>$mode,'polana_ga4_id'=>$ga4,'polana_gtm_id'=>$gtm,'polana_meta_pixel_id'=>$pixel] as $key=>$value) {
$stmt->execute([$key, $value]);
}
admin_log('polana_tracking_settings', 'Zmieniono konfigurację analityki i pikseli.');
flash('success', 'Ustawienia analityki zapisane. Skrypty uruchamiają się dopiero po zgodzie odwiedzającego.');
redirect('/admin/polana-analityka.php');
}
}
$mode = setting('polana_tracking_mode','off');
$ga4 = setting('polana_ga4_id','');
$gtm = setting('polana_gtm_id','');
$pixel = setting('polana_meta_pixel_id','');
$core = @file_get_contents(dirname(__DIR__) . '/includes/functions.php');
$installed = is_string($core) && str_contains($core, 'POLANA_TRACKING_HEAD_V174') && str_contains($core, 'POLANA_TRACKING_FOOTER_V174');
render_admin_header('Analityka i piksele');
?>
<style>
.pa174-wrap{max-width:1120px;margin:auto}.pa174-grid{display:grid;grid-template-columns:1fr 1fr;gap:18px}.pa174-card{background:var(--panel,#fff);color:inherit;border:1px solid #7774;border-radius:16px;padding:22px;margin-bottom:18px}.pa174-card h2{margin:0 0 12px;font-size:21px}.pa174-card p{line-height:1.55}.pa174-card label{display:block;font-weight:700;margin:16px 0 6px}.pa174-card input,.pa174-card select{display:block;width:100%;max-width:100%;box-sizing:border-box;border:1px solid #7777;background:var(--input-bg,#fff);color:inherit;border-radius:9px;padding:12px;font-size:15px}.pa174-note{background:#5b793013;border-left:4px solid #879956;padding:12px 15px;border-radius:7px;font-size:14px}.pa174-badge{display:inline-block;border:1px solid #7787a6;padding:6px 10px;border-radius:99px;font-size:13px;font-weight:700}.pa174-links{display:flex;gap:9px;flex-wrap:wrap}.pa174-links a,.pa174-save{display:inline-block;text-decoration:none;background:#253b29;color:#fff;border-radius:9px;padding:11px 15px;font-weight:700;border:0;cursor:pointer}.pa174-save{background:#d5a758;color:#1d241d;font-size:15px;margin-top:20px}.pa174-small{font-size:13px;opacity:.82}.pa174-card ul{padding-left:21px;line-height:1.75}@media(max-width:780px){.pa174-grid{grid-template-columns:1fr}.pa174-card{padding:16px}}
</style>
<div class="pa174-wrap">
<div class="admin-title-row"><div><h1>Analityka i piksele</h1><p>Google Analytics 4 · Google Tag Manager · Meta Pixel · zgody cookie</p></div></div>
<div class="pa174-card">
<span class="pa174-badge"><?= $installed ? '✓ Integracja z szablonem zainstalowana' : '⚠ Wymagana instalacja hooków' ?></span>
<p>Nie wklejaj kodu Google ręcznie w kilka miejsc. Wybierz <strong>jeden tryb</strong>. W trybie GTM konfigurujesz GA4 i Meta Pixel w kontenerze Google Tag Manager, a strona nie dołącza ich ponownie.</p>
<?php if (!$installed): ?><p><a href="/admin/polana-v174-instalator.php">Uruchom instalator V17.4 →</a></p><?php endif; ?>
</div>
<form method="post" class="pa174-card">
<?= csrf_field() ?>
<h2>Konfiguracja pomiaru</h2>
<label for="pa174-mode">Sposób uruchamiania</label>
<select id="pa174-mode" name="polana_tracking_mode">
<option value="direct" <?= $mode === 'direct' ? 'selected' : '' ?>>GA4 / Meta Pixel bezpośrednio (prosty start)</option>
<option value="gtm" <?= $mode === 'gtm' ? 'selected' : '' ?>>Google Tag Manager (jeden kontener)</option>
<option value="off" <?= $mode === 'off' ? 'selected' : '' ?>>Wyłącz pomiar</option>
</select>
<div class="pa174-grid">
<div><label for="pa174-ga4">Google Analytics 4 — Measurement ID</label><input id="pa174-ga4" name="polana_ga4_id" value="<?= e($ga4) ?>" placeholder="G-H5C811DZHV" maxlength="24"><p class="pa174-small">W trybie bezpośrednim aktywuje GA4 po zgodzie na analitykę.</p></div>
<div><label for="pa174-gtm">Google Tag Manager — Container ID</label><input id="pa174-gtm" name="polana_gtm_id" value="<?= e($gtm) ?>" placeholder="GTM-XXXXXXX" maxlength="24"><p class="pa174-small">W trybie GTM strona uruchamia tylko kontener; tagi konfigurujesz w GTM.</p></div>
<div><label for="pa174-pixel">Meta Pixel — Pixel ID</label><input id="pa174-pixel" name="polana_meta_pixel_id" value="<?= e($pixel) ?>" placeholder="np. 123456789012345" maxlength="25"><p class="pa174-small">W trybie bezpośrednim aktywuje Meta Pixel po zgodzie marketingowej.</p></div>
</div>
<div class="pa174-note"><strong>RODO / prywatność:</strong> banner pozwala osobno zaakceptować analitykę i marketing, odrzucić je oraz później zmienić decyzję. Skrypty nie są pobierane przed zgodą. Uzupełnij też politykę prywatności i zweryfikuj inne narzędzia cookies działające na stronie.</div>
<button class="pa174-save" type="submit">Zapisz ustawienia analityki</button>
</form>
<div class="pa174-grid">
<div class="pa174-card"><h2>Google Analytics 4</h2><p>Twój identyfikator: <strong><?= e($ga4 ?: 'nie ustawiono') ?></strong></p><p>W raporcie <strong>Czas rzeczywisty</strong> sprawdzisz ruch po zaakceptowaniu analityki na stronie.</p><div class="pa174-links"><a target="_blank" rel="noopener" href="https://analytics.google.com/">Otwórz GA4 ↗</a><a target="_blank" rel="noopener" href="https://tagassistant.google.com/">Tag Assistant ↗</a></div></div>
<div class="pa174-card"><h2>Google Tag Manager</h2><p>Jeżeli wybierzesz GTM, dodaj w nim tag Google dla <strong><?= e($ga4 ?: 'identyfikatora GA4') ?></strong> oraz opcjonalnie Meta Pixel. Skonfiguruj w GTM wymaganą zgodę dla każdego tagu, aby nie uruchamiał się bez pozwolenia.</p><div class="pa174-links"><a target="_blank" rel="noopener" href="https://tagmanager.google.com/">Otwórz GTM ↗</a></div></div>
<div class="pa174-card"><h2>Meta Pixel</h2><p>Identyfikator jest edytowalny. Wybierz go z <strong>Menedżera zdarzeń Meta</strong>. Nie dodawaj równolegle drugiego piksela przez GTM.</p><div class="pa174-links"><a target="_blank" rel="noopener" href="https://business.facebook.com/events_manager2/">Menedżer zdarzeń ↗</a></div></div>
<div class="pa174-card"><h2>Co mierzymy?</h2><ul><li>Odsłony stron — po zgodzie na analitykę.</li><li>Kliknięcia w „Rezerwacja” i „Menu” — zdarzenia <code>polana_click_rezerwacja</code> i <code>polana_click_menu</code>.</li><li>Meta Pixel: <code>PageView</code> — po zgodzie marketingowej, w trybie bezpośrednim.</li></ul><p class="pa174-small">Nie wysyłamy danych osobowych z formularza. Potwierdzenie rezerwacji jako konwersję należy wdrożyć osobno, po sprawdzeniu aktualnego kodu formularza.</p></div>
</div>
</div>
<?php render_admin_footer(); ?>