| 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 : /admin/ |
Upload File : |
<?php
declare(strict_types=1);
require_once dirname(__DIR__).'/includes/functions.php';
require_once dirname(__DIR__).'/includes/polana_v164_seo.php';
require_admin_role();
$error='';$success='';
if(($_SERVER['REQUEST_METHOD']??'GET')==='POST') {
verify_csrf();
try {
$action=(string)($_POST['action']??'');
if($action==='google') {
$value=trim((string)($_POST['google_verification']??''));
if($value!=='' && (!preg_match('/^[A-Za-z0-9_-]{5,200}$/',$value))) throw new RuntimeException('Podaj sam token HTML Google (bez tagu meta).');
$q=db()->prepare('INSERT INTO settings(setting_key,setting_value) VALUES (?,?) ON DUPLICATE KEY UPDATE setting_value=VALUES(setting_value)');
$q->execute(['google_verification',$value]);
admin_log('seo_google_v164','Zaktualizowano token weryfikacji Google.');
$success='Zapisano token Google. Umieść witrynę w Search Console i zweryfikuj własność.';
}elseif($action==='main_domain') {
if(($_POST['domain_confirm']??'')!=='yes')throw new RuntimeException('Zaznacz potwierdzenie zmiany domeny.');
$q=db()->prepare('INSERT INTO settings(setting_key,setting_value) VALUES (?,?) ON DUPLICATE KEY UPDATE setting_value=VALUES(setting_value)');
$q->execute(['site_url','https://mojapolanasmakow.pl']);
admin_log('seo_canonical_v164','Ustawiono główną domenę WWW na mojapolanasmakow.pl');
$success='Domena kanoniczna ustawiona. Pamiętaj o przekierowaniu 301 z drugiej domeny.';
}else throw new RuntimeException('Nieznana operacja.');
}catch(Throwable $e){$error=$e->getMessage();}
}
try{$report=p164_sitemap_data();}catch(Throwable $e){$error=$e->getMessage();$report=['urls'=>[],'skipped'=>[],'base'=>'','splash'=>false];}
$counts=['pl'=>0,'en'=>0,'de'=>0,'es'=>0];$blogCount=0;
foreach($report['urls'] as $entry) {
if(isset($counts[$entry['lang']]))$counts[$entry['lang']]++;
if(str_starts_with($entry['path'],'/blog/'))$blogCount++;
}
$last=setting('google_verification','');
$htaccess=dirname(__DIR__).'/.htaccess';
$ht=is_file($htaccess)?(string)file_get_contents($htaccess):'';
$rewriteXml=(bool)preg_match('~RewriteRule[^\r\n]*sitemap[^\r\n]*sitemap\.php~i',$ht);
$rewriteRobots=(bool)preg_match('~RewriteRule[^\r\n]*robots[^\r\n]*robots\.php~i',$ht);
$installed=is_file(dirname(__DIR__).'/sitemap.php') && str_contains((string)file_get_contents(dirname(__DIR__).'/sitemap.php'),'polana_v164_seo.php');
$robotsInstalled=is_file(dirname(__DIR__).'/robots.php') && str_contains((string)file_get_contents(dirname(__DIR__).'/robots.php'),'polana_v164_seo.php');
$staticSitemap=is_file(dirname(__DIR__).'/sitemap.xml');$staticRobots=is_file(dirname(__DIR__).'/robots.txt');
render_admin_header('SEO i mapa strony Google');
?>
<style>
.p164{max-width:1200px;margin:20px auto 80px;padding:14px;color:#233627}.p164 *{box-sizing:border-box}
.p164 h1{font-size:clamp(26px,3vw,36px)}.p164 .muted{color:#526b5a}
.p164 .tiles{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px}
.p164 .tile,.p164 .panel{background:white;border:1px solid #d9e5dc;border-radius:15px;padding:20px}
.p164 .num{font-weight:800;font-size:31px}.p164 .panels{display:grid;grid-template-columns:1fr 1fr;gap:15px;margin-top:15px}
.p164 .links{display:flex;gap:10px;flex-wrap:wrap;margin-top:13px}
.p164 .links a,.p164 button{display:inline-block;padding:10px 15px;background:#285035;color:white;border:0;border-radius:8px;text-decoration:none;cursor:pointer}
.p164 .links a.alt{background:#edf5ef;color:#285035}.p164 input[type=text]{width:100%;padding:11px;border:1px solid #b6c9bb;border-radius:8px;margin:6px 0 10px}
.p164 .ok{color:#18733c;font-weight:600}.p164 .bad{color:#aa4c16;font-weight:600}.p164 table{border-collapse:collapse;width:100%}.p164 td,.p164 th{padding:9px;border-bottom:1px solid #e5ece7;text-align:left}
.p164 code{overflow-wrap:anywhere}.p164 .alert{border-radius:9px;padding:13px;background:#f1f5ed;margin:15px 0}
@media(max-width:800px){.p164 .tiles{grid-template-columns:1fr 1fr}.p164 .panels{grid-template-columns:1fr}}
</style>
<main class="p164">
<h1>SEO i mapa strony Google</h1>
<p class="muted">Jedno miejsce do kontroli indeksowania Polany. Mapa XML odświeża się automatycznie po zmianie treści, zatwierdzeniu języka lub publikacji bloga — bez crona.</p>
<?php if($error):?><div class="alert bad"><?= e($error) ?></div><?php endif;?>
<?php if($success):?><div class="alert ok"><?= e($success) ?></div><?php endif;?>
<div class="tiles">
<?php foreach($counts as $code=>$n):?><div class="tile"><div><?= e(strtoupper($code)) ?></div><div class="num"><?= (int)$n ?></div><div class="muted">adresów w mapie</div></div><?php endforeach;?>
</div>
<div class="panels">
<section class="panel">
<h2>Mapa strony</h2>
<p>Adresy: <strong><?= count($report['urls']) ?></strong> · Wersje bloga: <strong><?= $blogCount ?></strong>.</p>
<p>Pomijane niezatwierdzone wersje językowe: <strong><?= (int)($report['skipped']['unapproved_language']??0) ?></strong>.</p>
<p class="<?= $installed&&$rewriteXml&&!$staticSitemap?'ok':'bad' ?>">Sitemap: <?= $installed&&$rewriteXml&&!$staticSitemap?'aktywny generator':'wymaga instalacji lub korekty trasy' ?></p>
<p class="<?= $robotsInstalled&&$rewriteRobots&&!$staticRobots?'ok':'bad' ?>">Robots.txt: <?= $robotsInstalled&&$rewriteRobots&&!$staticRobots?'prawidłowa trasa':'sprawdź konfigurację / plik statyczny' ?></p>
<?php if($report['splash']):?><p class="bad">Zaślepka jest aktywna: mapa nie zgłasza stron, które nie są publicznie dostępne.</p><?php endif;?>
<div class="links">
<a href="/sitemap.xml" target="_blank" rel="noopener">Otwórz sitemap.xml ↗</a>
<a class="alt" href="/robots.txt" target="_blank" rel="noopener">robots.txt ↗</a>
<a class="alt" href="/admin/polana-v164-seo-install.php">Instalacja / rollback</a>
</div>
</section>
<section class="panel">
<h2>Google Search Console</h2>
<p>Główna domena z konfiguracji: <code><?= e($report['base']?:site_url('')) ?></code></p>
<?php if($last===''):?><p class="bad">Nie ustawiono tokenu weryfikacji Google HTML.</p><?php else:?><p class="ok">Token weryfikacji jest zapisany.</p><?php endif;?>
<form method="post"><?= csrf_field() ?><input type="hidden" name="action" value="google">
<label for="p164verification">Token Google (wyłącznie zawartość parametru content)</label>
<input type="text" id="p164verification" name="google_verification" value="<?= e($last) ?>" maxlength="200" autocomplete="off">
<button type="submit">Zapisz weryfikację</button>
</form>
<div class="links"><a class="alt" href="https://search.google.com/search-console/welcome" target="_blank" rel="noopener noreferrer">Otwórz Search Console ↗</a></div>
<p class="muted">Po potwierdzeniu własności zgłoś sitemap: <code><?= e(($report['base']?:site_url('')).'/sitemap.xml') ?></code>. Potem Google pobiera aktualizacje samodzielnie.</p>
</section>
<section class="panel">
<h2>Domena kanoniczna</h2>
<p>Docelowa: <strong>https://mojapolanasmakow.pl</strong></p>
<p>Jeśli adres główny jest inny, XML i tagi canonical mogą wskazywać inną domenę. Wybierz jedną domenę i ustaw przekierowanie <strong>301</strong> z drugiej.</p>
<form method="post" onsubmit="return confirm('Ustawić domenę kanoniczną całej strony na mojapolanasmakow.pl?');">
<?= csrf_field() ?><input type="hidden" name="action" value="main_domain">
<label><input type="checkbox" name="domain_confirm" value="yes" required> Potwierdzam główną domenę</label><br><br>
<button type="submit">Ustaw główną domenę</button>
</form>
<p class="muted">Zmienia ustawienie site_url, nie wykonuje automatycznie przekierowania 301 ani konfiguracji Cloudflare.</p>
</section>
<section class="panel">
<h2>Kontrola treści i indeksowania</h2>
<table><tbody>
<tr><td>Artykuły już opublikowane</td><td><?= count(array_filter($report['urls'],static fn($x)=>$x['lang']==='pl'&&str_starts_with($x['path'],'/blog/'))) ?></td></tr>
<tr><td>Nieprzejrzane języki</td><td><?= (int)($report['skipped']['unapproved_language']??0) ?></td></tr>
<tr><td>Menu graficzne /menu</td><td>noindex (nie trafia do XML)</td></tr>
<tr><td>Menu tekstowe /menu-seo</td><td>zgłaszane, jeśli karta aktywna</td></tr>
</tbody></table>
<div class="links"><a class="alt" href="/admin/polana-v16-tlumaczenia.php">Centrum tłumaczeń</a><a class="alt" href="/admin/polana-v11-podstrony.php">Zatwierdź podstrony</a><a class="alt" href="/admin/blog.php">Blog</a><a class="alt" href="/admin/seo.php">Zaawansowane SEO / zaślepka</a></div>
</section>
</div>
<section class="panel" style="margin-top:15px"><h2>Adresy przekazywane do Google (pierwsze 80)</h2>
<div style="overflow:auto"><table><thead><tr><th>Język</th><th>Adres</th><th>Ostatnia zmiana</th></tr></thead><tbody>
<?php foreach(array_slice($report['urls'],0,80) as $entry):?><tr><td><?= e(strtoupper($entry['lang'])) ?></td><td><a href="<?= e($entry['loc']) ?>" target="_blank" rel="noopener"><?= e($entry['loc']) ?></a></td><td><?= e($entry['lastmod']??'—') ?></td></tr><?php endforeach;?>
</tbody></table></div></section>
</main>
<?php render_admin_footer(); ?>