# Yapışko — Blog, üyelik ve havale siparişleri

Bu paket PHP 8.1+ ve MySQL 5.7+ / MariaDB 10.4+ kullanan Apache cPanel hosting içindir. HTTPS, PDO MySQL, mod_rewrite ve .htaccess izni gereklidir. Sites bağlantısı yalnızca statik tasarım önizlemesidir; gerçek üyelik bu paketin hostinginize kurulmasıyla çalışır.

## Kurulum

1. Mevcut sitenizi ve veritabanınızı yedekleyin. Önce bir test alanında kurun.
2. ZIP içindeki `public_html` dosyalarını alan adınızın kök dizinine yükleyin; gizli `.htaccess` dosyasını dahil edin. Klasörü iç içe yüklemeyin.
3. `yapisko-private` klasörünü **public_html ile aynı seviyeye**, yani web kökünün dışına yükleyin. SQL, ayarlar ve PHP uygulaması internete doğrudan açılmamalı. Alan adınızın kök dizini farklı ad taşıyorsa `app.php` sonundaki `../public_html` yolunu gerçek dizin adıyla değiştirin. `index.php` de private klasöre işaret etmelidir.
4. cPanel → MySQL Veritabanları: yeni veritabanı ve kullanıcı oluşturun, kullanıcıya bu veritabanı için yetki verin.
5. `yapisko-private/config.example.php` dosyasını `config.php` adıyla kopyalayın. Veritabanı adı, kullanıcı, şifre, HTTPS alan adı ve aynı alan adındaki gönderici e-postasını girin. Dosyayı 600 veya hosting PHP kullanıcısının okuyabileceği en dar izinle saklayın.
6. cPanel Terminal'de `php ~/yapisko-private/install.php` çalıştırın. Yönetici e-postasını ve en az 12 karakterli şifreyi girin. Script yalnızca komut satırında çalışır; ortak veya varsayılan yönetici şifresi yoktur. Terminal yoksa hosting desteğinden bu komutu çalıştırmasını isteyin. Tablolar oluşturulur ve üç başlangıç blog yazısı eklenir.
7. `/giris/` üzerinden giriş yapıp `/admin/ayarlar/` adresinde IBAN, hesap sahibi, banka ve sabit kargo ücretini girin. Sipariş alımı başlangıçta **kapalıdır**.
8. Gerçek ürünleri, fiyatları, görselleri, iletişim ve satış koşullarını hazırlayın. `yapisko-private/catalog.json` sunucunun fiyat kaynağıdır; `public_html/assets/catalog.json` ve ürün HTML sayfaları ile aynı tutulmalıdır. Örnek ürün/ödeme uyarılarını ancak gerçek katalogla güncelledikten sonra kaldırın. Kod kaynağında katalog `build.py` ile üretilir; `python3 extend.py` statik önizlemeyi ve cPanel paketini yeniden oluşturur. Bu komutu canlı sunucuda çalıştırmayın; yerel ayar/veri dosyalarını paket üzerine yazmayın.
9. HTTPS, gerçek sipariş akışı ve e-posta teslimatını test ettikten sonra panelde “Sipariş alımını aç”ı işaretleyin.

## Blog

`/admin/blog/`: başlık, URL (küçük ASCII harfler ve tire), SEO açıklaması, metin ve önerilen ürünler. Bir veya daha fazla ürün seçmek zorunludur. Taslak olarak saklanabilir, yayın kutusuyla açılabilir ve mevcut yazı düzenlenebilir. Boş satır yeni paragraf, `## ` yeni alt başlıktır. HTML metin olarak gösterilir. Başlık/meta açıklaması, canonical, BlogPosting verisi ve dinamik `/sitemap.xml` vardır. Menüde Blog, sayfaların footer öncesinde son üç yayımlanmış yazı bulunur. Yayındaki URL'yi değiştirirseniz eski bağlantı için ayrıca 301 yönlendirme ekleyin.

## Sipariş akışı

Müşteri üye olur → sepet/adres → sunucuda hesaplanan toplam ve sipariş numarası → havale → “Ücreti gönderdim” → “Ödeme kontrol ediliyor”. Yönetici banka hareketini kontrol eder, ödeme doğrulama kutusunu işaretleyip “Hazırlanıyor” yapar. Kargoya verirken firma ve takip numarası zorunludur. Müşteri hesabında sipariş geçmişi, teslimat bilgisi, durum geçmişi ve kargo bilgisi görünür. Aynı sipariş oluşturma isteği tekrar gönderilirse ikinci sipariş yaratılmaz. Sipariş fiyatları ve banka bilgileri oluşturulduğu andaki haliyle saklanır.

Durumlar: ödeme bekleniyor, ödeme kontrol ediliyor, hazırlanıyor, kargoya verildi, iptal edildi. İptal işlemi banka iadesi yapmaz; gerekiyorsa iade manuel yürütülür. Kargo bilgileri manuel girilir, kargo API'sine bağlanmaz. Kartla ödeme ve otomatik banka doğrulaması yoktur.

## Güvenlik ve işletim

Şifreler password_hash ile saklanır. PDO parametreli sorgular, CSRF doğrulama, HTTPS/HttpOnly/SameSite oturum çerezleri, giriş denemesi sınırı, yönetici rol kontrolü ve sipariş sahipliği kontrolü vardır. Fiyatlar tarayıcıdan kabul edilmez. Kullanıcı girdileri HTML olarak çalıştırılmaz. Şifre sıfırlama bağlantıları tek kullanımlık, 30 dakika süreli, veritabanında hash olarak saklanır. Şifre sıfırlama PHP mail kullanır; cPanel e-posta gönderimi/DKIM/SPF ayarları ve teslimatı hostingde doğrulanmalıdır. Sipariş e-posta bildirimi eklenmemiştir; durumlar hesap ekranında görülür.

Stok yönetimi, ürün yönetim paneli, varyant düzenleyici ve otomatik kargo entegrasyonu bu kapsamda yoktur. Ürün kataloğu dosyalardan yönetilir. Veritabanını ve private klasörü düzenli yedekleyin.

## Yayın öncesi doğrulama

- İki farklı müşteri oluşturun. Bir müşterinin sipariş URL'sini diğeriyle açınca 404 alınmalı; müşteri /admin/ alanına girememeli.
- CSRF tokeni eksik isteğin reddedildiğini; tarayıcıda fiyat değiştirmenin toplamı değiştirmediğini kontrol edin.
- Sepette IBAN/kargo, kayıt/giriş, adres, sipariş numarası, tekrar gönderimde tek kayıt ve ödeme bildirimini test edin.
- Admin ödeme kontrolü → hazırlanıyor → kargo firma/no akışını çalıştırın. Müşteri hesabından sonucu görün.
- Blog taslağının görünmediğini, yayına alınan yazının listede/footer öncesinde göründüğünü, detayın altında ürünler olduğunu doğrulayın.
- Şifre yenileme e-postasının ulaştığını ve linkin ikinci kullanımda çalışmadığını doğrulayın.

Bu ortamda PHP/MySQL ve tarayıcı üzerinden uçtan uca çalıştırma tamamlanamadı. JavaScript sözdizimi, oluşturulan sayfa bağlantıları ve paket yapısı kontrol edildi. Gerçek sipariş alımını açmadan önce yukarıdaki testleri hostinginizde tamamlayın.

## Blog kapak görseli

Blog yazılarının başında 2:1 oranlı kapak görseli bulunur. Önerilen ölçü 1200 × 600 px. Görselinizi cPanel Dosya Yöneticisi ile public_html/assets/ altına yükleyip Blog yönetimindeki kapak yoluna `/assets/dosya-adi.jpg` yazın. Boş bırakırsanız markaya uygun varsayılan kapak görünür. Mevcut kurulumlarda phpMyAdmin ile `migration-002-blog-cover.sql` dosyasını bir kez çalıştırın. Yeni kurulumlarda alan zaten oluşturulur.
