Özel alan değerlerini yalnızca wp_postmeta içinde saklamış olsaydınız, hiç sütun türü seçmek zorunda kalmazdınız; çünkü tek bir tür vardır: LONGTEXT. Her şey (bir fiyat, bir tarih, bir onay kutusu, bir paragraf) metin olarak saklanır ve okurken tekrar kullanılabilir bir türe dönüştürülür. Bu işe yarar, ancak doğruluk sorumluluğunu değeri okuyan her kod parçasına, sonsuza dek yükler.
Alan değerleri gerçek bir tabloda durmaya başladığında her alanın bir türü olur ve bu tür; depolama boyutunu, sıralama davranışını ve veritabanının sizin için neleri doğrulayabileceğini etkiler. Bu yazı, WordPress'e hâkim olan ama daha önce bir veritabanı şeması tasarlamamış kişiler için yazılmış, seçimi ele alan pratik bir rehberdir.
Sayılar: INT ve DECIMAL
Tam sayılar (stok adedi, yaş, miktar) bir tamsayı türüne aittir. Boyut dışında karar verilecek bir şey yoktur: beklediğiniz değerlere yetecek kadar geniş bir aralık kullanın, "ne olur ne olmaz" diye gereksiz yere büyük seçmeyin.
Para ve sabit sayıda ondalık basamağı olan her şey farklı bir durumdur ve yalnızca WordPress'te değil, genel olarak veritabanı tasarımında en sık yapılan hatalardan biridir. Kayan noktalı türler (FLOAT, DOUBLE) bir ondalık sayının yaklaşık değerini saklar ve bu yaklaşıklık, değerleri toplarken veya karşılaştırırken küçük yuvarlama hatalarına yol açabilir. DECIMAL(10,2) ise ondalık noktadan önce ve sonra sabit sayıda basamağı olan kesin bir değer saklar; bu örnekte toplam on basamak, noktadan sonra iki basamak vardır. Fiyatlar, toplamlar ve "yaklaşık" olmasının kabul edilemeyeceği her şey için doğru türdür.
Mass Custom Fields'ta Number alanı varsayılan olarak DECIMAL(20,6) kullanır: ondalık noktadan önce en fazla 14, sonra 6 basamak. Alanın SQL column options bölümünde INT, BIGINT, TINYINT, SMALLINT, MEDIUMINT, FLOAT, DOUBLE veya fiyat için DECIMAL(p,s) gibi başka bir tür, örneğin DECIMAL(10,2) seçebilirsiniz. Sütunun aralığı dışındaki bir değer veritabanı hatasına yol açmak yerine izin verilen en yakın değere sabitlenir; tam sayı sütunu ise 12.7 değerini 13 olarak yuvarlar. Ayrıntılar sayı ve aralık başvurusunda yer alır.
SELECT p.post_title, d.price
FROM wp_posts p
JOIN wp_wpmcf_fg_product d ON d.mid = p.ID AND d.mtype = 'posts'
WHERE d.price < 100
ORDER BY d.price;Tarihler: DATE, DATETIME veya metin değeri
Saat bileşeni olmayan bir değer için (yayın tarihi, doğum tarihi, son kullanma tarihi) DATE sütunu doğrudur. Randevu aralığı gibi saatin önemli olduğu durumlarda DATETIME sütunu doğrudur. İkisini de metin olarak ("2026-08-28") saklamak görüntüleme için teknik olarak çalışır, ancak dönüştürme yapmadan kronolojik sıralama yeteneğini ve bir dizin kullanarak tarih aritmetiği (önce/sonra karşılaştırmaları, tarih aralıkları) yapma yeteneğini kaybedersiniz.
Date, Date and time ve Time alanları yerel DATE, DATETIME ve TIME değerlerini saklar ve girdiyi sıkı biçimde ayrıştırır; dolayısıyla 2026-02-30 gibi bir değer saklanmak yerine reddedilir. Tarihler sitenizin saat dilimindeki duvar saati değerleridir; kaydederken veya okurken dönüşüm yapılmaz. Kabul edilen biçimler için tarih ve saat sayfasına bakın.
Metnin hâlâ pratik bir seçim olduğu tek durum, tarihe benzeyen ama uygulamanızın tarih olarak doğrulamaması gereken bir değerdir; örneğin kaynak verinin kendisi tutarsız olan tarihî bir sayfadaki serbest metin "kuruluş yılı" alanı. Bu durumda Text alanı uygundur. Değer filtrelemede veya sıralamada kullanılan gerçek bir tarihse, gerçek bir tarih türü kullanın.
Metin: bir uzunluk seçin, sınırsızı varsayılan yapmayın
WordPress çekirdeği, metin biçimindeki her şey için alışkanlıkla LONGTEXT kullanır; çünkü uzunluk sınırını önceden tahmin etmek zorunda kalmaz. Alanın sahibi sizseniz sınırı genellikle bilirsiniz: bir ürün adı dört kilobayt uzunluğunda olmayacaktır. Text alanı varsayılan olarak VARCHAR(255), Email alanı VARCHAR(254) olur ve SQL column options bölümünde VARCHAR(100) gibi daha kısa bir uzunluk belirleyebilirsiniz. Sınırlı uzunluk satırları küçük tutar ve o sütundaki bir dizini daha ucuz hâle getirir.
Serbest biçimli içerik (bir açıklama, zengin metin gövdesi) daha büyük bir metin türünün meşru kullanım alanıdır. Text area ve WYSIWYG alanları LONGTEXT kullanır; çünkü uzunluğu önceden bilemezsiniz ve tüm içeriğe göre sıralama veya dizinleme yapmanız gerekmez.
Boolean değerler: "evet"/"hayır" metinleri değil, gerçek bir doğru/yanlış türü
Yalnızca iki durumu olan bir alan, her okunduğunda eşitlikle karşılaştırılan "yes" veya "1" gibi bir metin değil, gerçek bir boolean türü olmalıdır. True / false alanı TINYINT(1) olarak saklanır; böylece WHERE featured = 1 ile filtreleyebilirsiniz. Üç yıl önce bir form bir kez değiştiği için eski satırlara dağılmış, "doğru" değerinin birbirinden biraz farklı üç metin gösterimiyle karşılaşana kadar bu küçük bir ayrıntı gibi görünür.
Hiç karar vermeniz gerekmediğinde
Çoğu zaman bu kararı elle vermeniz gerekmez. Mass Custom Fields, düzenleyicide seçtiğiniz alan türüne göre uygun bir sütun türü seçer: Number alanı ondalık bir sütun, Date alanı bir tarih sütunu olur. Böylece yaygın durumlar hiç SQL bilgisi gerektirmez. Alan türlerine genel bakış sayfası her türün varsayılan sütununu listeler.
Dizinler türleri izler, tersi geçerli değildir
Bir dizin, altındaki tür kadar yararlıdır. Sayıları metin olarak saklayan bir metin sütununu dizinlemek, karşılaştırmalar çalışmadan önce sorgu anında yine bir dönüştürme gerektirir; bu da dizine sahip olmanın yararının büyük bölümünü ortadan kaldırır. Önce türü seçin (fiyatlar DECIMAL, tarihler DATE, boolean değerler gerçek bir boolean türüne) ve üzerindeki dizin beklediğiniz işi yapsın.
Alanın kısıtlamalarında düzenli bir dizin için Add index seçeneğini, tekrar etmemesi gereken değerler için Unique seçeneğini açabilirsiniz. Onay kutuları, ilişkiler, gruplar ve tekrarlayıcılar gibi JSON olarak saklanan alanlar tek başına dizinlenemez. Yalnızca gerçekten filtrelediğiniz veya sıraladığınız alanları dizinleyin; çünkü her dizin yazma işlemlerini biraz yavaşlatır ve düzenleyici, bir gruptaki sekiz dizinli alandan itibaren uyarı verir. Ortak alan seçenekleri sayfası bu ayarları kapsar.
Sonradan fikir değiştirmek
Bugün seçilen bir tür kesin olmak zorunda değildir. Bir alanı uyumlu bir türe değiştirirseniz sütun değiştirilir ve değerler korunur. Değişiklik veri kaybına yol açabilecekse (örneğin Text türünden Number türüne), dönüştürmeden önce eski değerler bir yedek sütuna kopyalanır. Bir alan grubunu güvenle değiştirme sayfası her durumu açıklar.
Özet
Evrensel bir "en iyi" tür yoktur; değerin gerçekte nasıl kullanıldığına uyan bir tür vardır. Karşılaştırdığınız veya sıraladığınız sayılar sayısal türlere, tarihler tarih türlerine, kısa ve sınırlı metinler sınırlı sütunlara gider. Bunu alan düzeyinde doğru yapmak, o veriye yönelik her sorguyu hızlandırır ve her karşılaştırmayı doğru kılar; wp_postmeta ise tam olarak bu kararı vermenize hiçbir zaman izin vermez.



