"> 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 = '' . htmlspecialchars($ad['ad_adi']) . ''; 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(); }