Kategoriler
Teknik

PHP’de Blog veya İçerik Yönetim Sistemi Oluşturmak

En basit haliyle bir içerik yönetim sistemi veya blog sistemi nasıl tasarlanır, nelere dikkat edilmelidir ve yapısı nasıl olmalıdır bunları konuşacağız.

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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir