">
function cdn_url(string $url): string {
if (empty($url)) return $url;
static $cdnAktif = null;
static $cdnPullZone = null;
if ($cdnAktif === null) {
$s = getSiteSettings();
$cdnAktif = !empty($s['cdn_aktif']);
$cdnPullZone = $s['cdn_pull_zone'] ?? '';
// https:// prefix garantile
if ($cdnPullZone && strpos($cdnPullZone, 'http') !== 0) {
$cdnPullZone = 'https://' . $cdnPullZone;
}
$cdnPullZone = rtrim($cdnPullZone, '/');
}
if (!$cdnAktif || empty($cdnPullZone)) return $url;
// Sadece /uploads/ ile başlayan veya site URL'ini içeren resimleri çevir
if (strpos($url, '/uploads/') !== false) {
// Mutlak URL → CDN URL
return preg_replace('#^(https?://[^/]+)#', $cdnPullZone, $url);
}
return $url;
}
// Reklamı HTML olarak render et
function renderAd(string $konum, string $class = ''): string {
$ad = getAd($konum);
if (!$ad) return '';
$cls = 'site-ad' . ($class ? ' ' . $class : '');
if ($ad['reklam_tipi'] === 'kod' && !empty($ad['kod'])) {
return '
' . $ad['kod'] . '
';
}
if (!empty($ad['resim_url'])) {
$img = '
';
if (!empty($ad['hedef_url'])) {
$img = '' . $img . '';
}
return '' . $img . '
';
}
return '';
}
// Sidebar için yazarları getir
function getSidebarAuthors($limit = 5): array {
static $authors = null;
if ($authors !== null) return $authors;
$authors = cache_remember('sidebar_authors_' . (int)$limit, 600, function() use ($limit) {
$db = getDB();
return $db->query("
SELECT y.id, y.ad_soyad, y.slug, y.resim,
(SELECT kw.baslik FROM kose_yazilari kw WHERE kw.yazar_id=y.id ORDER BY kw.yayinlanma_tarihi DESC LIMIT 1) AS son_yazi
FROM yazarlar y
WHERE y.durum IS NULL OR y.durum = 'aktif'
ORDER BY y.id ASC LIMIT " . (int)$limit . "
")->fetchAll() ?: [];
});
return $authors ?: [];
}
// Logo URL’su (ayarlardan dinamik)
function logoUrl(): string {
$logo = setting('logo_header');
if (empty($logo)) return BASE_PATH . '/uploads/logo.png';
if (strpos($logo, 'http') === 0) return $logo;
return BASE_PATH . $logo;
}
// Footer logo URL’su
function footerLogoUrl(): string {
$logo = setting('logo_footer');
if (empty($logo)) return BASE_PATH . '/uploads/logo.png';
if (strpos($logo, 'http') === 0) return $logo;
return BASE_PATH . $logo;
}
// Favicon URL’su
function faviconUrl(): string {
$fav = setting('favicon');
if (empty($fav)) return BASE_PATH . '/uploads/fvc.png';
if (strpos($fav, 'http') === 0) return $fav;
return BASE_PATH . $fav;
}
// Protokolü al (http veya https)
function proto(): string {
return ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || (int)($_SERVER['SERVER_PORT'] ?? 80) === 443) ? 'https' : 'http';
}
// Mevcut URL'yi al
function currentUrl(): string {
return proto() . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
}
// Sayfalama
function paginate(int $total, int $perPage, int $current): array {
$totalPages = (int)ceil($total / $perPage);
return [
'total' => $total,
'per_page' => $perPage,
'current' => $current,
'total_pages' => $totalPages,
'has_prev' => $current > 1,
'has_next' => $current < $totalPages,
'prev' => $current - 1,
'next' => $current + 1,
];
}
// Türkçe karakterleri sınıflandıran regex deseni oluşturucu
function make_turkish_regex_pattern(string $str): string {
$chars = mb_str_split($str, 1, 'UTF-8');
$pattern = '';
foreach ($chars as $char) {
$lower = mb_strtolower($char, 'UTF-8');
if ($lower === 'i' || $lower === 'ı' || $char === 'İ' || $char === 'I') {
$pattern .= '[iİıI]';
} elseif ($lower === 'ş') {
$pattern .= '[şŞ]';
} elseif ($lower === 'ğ') {
$pattern .= '[ğĞ]';
} elseif ($lower === 'ü') {
$pattern .= '[üÜ]';
} elseif ($lower === 'ö') {
$pattern .= '[öÖ]';
} elseif ($lower === 'ç') {
$pattern .= '[çÇ]';
} else {
$pattern .= preg_quote($char, '/');
}
}
return $pattern;
}
// Haber içeriğindeki etiketleri otomatik linke dönüştüren fonksiyon
function autolink_tags(string $html, ?string $tags_string): string {
if (empty($tags_string)) return $html;
$tags = array_map('trim', explode(',', $tags_string));
$tags = array_filter($tags);
// Uzun etiketlerin önce eşleşmesi için uzunluğa göre azalan sırala
usort($tags, function($a, $b) {
return mb_strlen($b, 'UTF-8') - mb_strlen($a, 'UTF-8');
});
if (empty($tags)) return $html;
$escaped_tags = [];
foreach ($tags as $tag) {
$escaped_tags[] = make_turkish_regex_pattern($tag);
}
// Tek geçişte (single-pass) tüm etiketleri kapsayan alternatifli regex deseni
$pattern = '/(?]+>)/', $html, -1, PREG_SPLIT_DELIM_CAPTURE);
$in_anchor = 0;
$linked_tags = [];
foreach ($parts as $i => $part) {
if ($i % 2 === 0) {
// Düz metin düğümü (HTML etiketi değil)
if ($in_anchor > 0 || empty($part)) {
continue;
}
// Etiketleri bul ve linke dönüştür (callback ile)
$parts[$i] = preg_replace_callback($pattern, function($matches) use (&$linked_tags) {
$matched_text = $matches[1];
$tag_slug = slugify($matched_text);
// Aynı etiket yazı içinde sadece 1 kez linklenir (SEO Spam önleme)
if (in_array($tag_slug, $linked_tags)) {
return $matched_text;
}
$linked_tags[] = $tag_slug;
$tag_url = BASE_PATH . '/tag/' . $tag_slug . '/';
return '' . $matched_text . '';
}, $part);
} else {
// HTML Etiketi
if (preg_match('/^/i', $part)) {
$in_anchor = max(0, $in_anchor - 1);
}
}
}
return implode('', $parts);
}
// Session başlat
if (session_status() === PHP_SESSION_NONE) {
session_start();
}