En popüler içerik yönetim sistemi/blog yazılımı olan WordPress’i bir çoğumuz kullanmıştır kullanmasına ama bazılarımız var ki WordPress’in nasıl çalıştığını merak edip, bazılarımız da eklenti/tema geliştirmeye merak salmışızdır. Tüm bunlardan doğru, karşımıza çıkan binlerce fonksiyon, yöntem, ıvır, zıvır vesaire derken kafamız çorba gibi oluyor. Bu çorbalaşmış kafayı netleştirmek için bu yazıda basit bir blog sistemi nasıl yazılır ondan bahsedeceğim. Elbette ki WordPress alternatifi olmayacak. Sadece işimizi görebilecek, basit ve kullanışlı bir sistem hakkında konuşacağız.
Veritabanı Yapısı
Veritabanı yapısından başlayalım ki sistemi kafamızda oturtmamız daha kolay olsun ve rahatça içselleştirebilelim. Bir blog sistemi aslında en minimal haliyle 2 tablo ile çalışıp güçlü hale getirilebilir. Birincisi içerik tablosu, diğeri ise kategorilerin bulunduğu tablo. Yorum tablosunu atlıyorum, yorum kısmını Disqus veya Facebook yorumlarıyla da çözebiliriz.
İçerikler Tablosu
İçerik tablosu, oluşturmak istediğimiz blog sisteminin kalp niteliğini taşıyan tablo olacaktır. Çünkü her türlü içeriği (blog gönderisi, sayfalar, video içerikleri vs.) burada tutacağız. Hemen nasıl göründüğüne bakalım:
contents tablosu
id | slug | type | title | body | tags | category_id | created_at |
---|---|---|---|---|---|---|---|
1 | merhaba-dunya | post | Merhaba Dünya | İlk Gönderi, . Lorem lipsum dolor sit amet. | Merhaba, Dünya | 1 | 2018-07-18 11:27:53 |
2 | hakkimda | page | Hakkımda | Hakkımda sayfası içeriği | 2018-07-18 11:37:12 | ||
3 | harika-bir-video-cektim | video | Harika Bir Video Çektim! | Youtube embed veya bağlantısı | Youtube, Video, Macera | 2 | 2018-07-18 12:42:19 |
Genel hatlarıyla içerik tablomuz bu şekle sahip olacak. Burada slug
sütunu, kalıcı bağlantıyı ifade ediyor. Kullanıcı içeriğe erişirken https://foo.com/kalici-baglanti
URL’ini kullanabilmemiz için, veritabanımızda slug sütununun olması şart. Eğer https://foo.com/content.php?id=5
şeklinde bir yapı tercih etmiş olsaydı, slug sütunu koymamıza gerek kalmazdı.
type
sütunu ise, içeriğin türünü belirlediğimiz tablo olacak. Ben üç tane içerik türü ekledim, siz hayal gücünüze göre bunu ayarlayabilirsiniz. post
blog gönderisini, page
blog içindeki bir sayfayı video
ise bir video gönderisini temsil ediyor. Mesela buna alternatif/ek olarak gallery
eklenip, bir fotoğraf galerisi türü oluşturabilirsiniz.
title
gönderinin başlığını, body
ise gönderinin içeriğini tutacak olan sütunlar olacak. tags
sütununda ise, virgülle ayrılmış biçimde etiketler tutacağız. Böylelikle bir etiket sistemimiz olmuş olacak.
created_at
sütunu ise oluşturma tarihini ifade ediyor.
category_id
ise kritik bir sütun. Burada mevcut gönderinin hangi kategoriye ait olduğunu belirteceğiz. Bunu yaparken kategorinin adını değilde, ID’sini vereceğiz. Peki vereceğimiz bu ID’yi nerede, nasıl kullanıp ne olduğunu nasıl anlayacağız?
MySQL, SQLite, PostgreSQL gibi veritabanları ilişkisel veritabanı türünde olduğu için, bir tablodaki satırı, başka tablodaki satır veya satırlarla bağlayabiliyor/ilişkilendirebiliyoruz. Şimdi bu blog/içerik yönetim sisteminde, her bir içerik bir adet kategoriye ait olmuş olacak (Sayfa türündeki içerikler herhangi bir kategoriye sahip olmasa da olur).
Kategoriler Tablosu
Kategorileri tuttuğumuz bu tabloda sistem içerisindeki temel taksonomiyi en basit haliyle gerçekleştirmiş olacağız. Daha karmaşık ve spesifik yöntemler var ama, bu yazının konusu basitlik olduğundan fazla detaya girmeyeceğiz. Evvela, tablomuzun yapısın görelim:
categories
tablosu
id | name | description | post_count |
---|---|---|---|
1 | Genel | Diğer kategorilere dahil olmayan içerikler | 1 |
2 | Eğlence | Eğlenceli içeriklerin bulunduğu muazzam bölüm! | 1 |
Şimdi önceki tasarladığımız tablo olan contents
tablosuna dönelim ve oradaki category_id
sütununa bakalım. Bu sütunda 1 değerini alanların bu tablodaki yani categories
tablosundaki ID’si 1 olan satıra ait olduğunu anlıyoruz. 2 değerini alanlar ise, Eğlence kategorisine dahilmiş.
İçerikler tablosundaki 100 tane satır/içerik 1 ID’li kategoriye ait olabilir. Aynı şekilde diğer 35 içerik de 2 ID’li kategoriye ait olabilir. Böylelikle her içerik bir kategoriye ait olmuş olur. Her içeriğin en fazla bir kategorisi olabilir. Birden fazla kategoriye sahip olamaz (buna One To Many ilişkilendirme deniyor). Bu yaptığımız sistemde bu mümkün değil. Çok daha farklı bir ilişkilendirme sisteminde bir içerik birden fazla kategoriye ait olacak şekilde ayarlayabilirdik (WordPress’te birden fazla kategori seçebiliyorsunuz mesela ve bu yöntemin adı Many To Many ilişkilendirme) ama yapmadık. İşleri karıştırmadık. 🙂
Temel olarak, veritabanı yapısı bu şekilde. Peki PHP ile oluşturacağımız rotalar/sayfalar hangi işleri yapacak? Hemen kısaca değinelim.
İçerik Sayfası
İçerik sayfasında, veritabanında slug
ile eşleşen veriyi alıp, sayfada işleleyeceğiz. Örnek SQL sorgusu şöyle olacak:
SELECT * FROM contents WHERE slug=?
Veritabanından alacağımı veri, göstereceğimiz içerik olacak. type
sütunundaki değere göre de gösterilecek içerik için farklı işlevler gerçekleştirebiliriz.
Kategori Sayfası
Kategori sayfasında, kategori ID’sine göre içerikleri alabiliriz. (Kategoriler için slug
da kullanabilirdik) Örnek SQL sorgusunu şöyle görelim:
SELECT * FROM contents WHERE category_id=?
Böylelikle kategoriye ait içerikleri de elde etmiş olduk. Şimdilik anlatacaklarım bundan ibaret. Herhangi bir sorunuz varsa severek cevaplarım. Bir sonraki yazıda görüşmek üzere.