Ön Hazırlık ve Gereksinimler
Özel sorgular yazmaya başlamadan önce, çalışma ortamınızın WordPress standartlarına uygun olduğundan emin olmalısınız. WordPress 2026 standartlarına göre, veritabanı işlemlerinde mutlaka $wpdb nesnesi kullanılmalıdır. Doğrudan mysqli_connect veya PDO kullanmak, WordPress'in sunduğu güvenlik katmanlarını ve veritabanı öneki (prefix) desteğini devre dışı bırakır.
- PHP Sürümü: 8.2 veya üzeri önerilir.
- WordPress Sürümü: 6.5 ve üzeri.
- Araçlar: IDE (VS Code önerilir), veritabanı yönetimi için phpMyAdmin veya Adminer.
- Bilgi: SQL temel komutları (SELECT, INSERT, UPDATE, DELETE) hakkında bilgi sahibi olmanız gerekir.
$wpdb Sınıfını Tanıma ve Kullanım Mantığı
WordPress, veritabanı işlemlerini yönetmek için global bir $wpdb nesnesi sağlar. Bu nesne, veritabanı bağlantısını yönetir ve SQL enjeksiyon saldırılarına karşı korunmanıza yardımcı olan metodlar içerir. Özel sorgularınızda her zaman bu nesneyi çağırmalısınız.
global $wpdb;
// Veritabanı ön ekini dinamik olarak almak için:
$table_name = $wpdb->prefix . 'ozel_tablom';
Yukarıdaki kod bloğu, WordPress'in veritabanı öneki ile kendi tablonuzu birleştirerek hata payını ortadan kaldırır. $wpdb->prefix kullanımı, veritabanı taşıma işlemlerinde veya multisite (çoklu site) kurulumlarında sorgularınızın bozulmamasını sağlar.
Adım Adım Özel Veritabanı Sorgusu Yazma
Özel bir sorgu yazarken en kritik nokta, verilerin güvenli bir şekilde işlenmesidir. Kullanıcıdan gelen verileri asla doğrudan sorguya dahil etmemelisiniz. Bunun yerine $wpdb->prepare() metodunu kullanmak zorunludur.
global $wpdb;
$user_id = 15; // Güvenli olması gereken değişken
$query = $wpdb->prepare(
"SELECT * FROM {$wpdb->prefix}users WHERE ID = %d",
$user_id
);
$results = $wpdb->get_results($query);
Burada %d (integer), %s (string) ve %f (float) yer tutucuları (placeholder) kullanılır. Bu yöntem, SQL enjeksiyonunu engellemek için kullanılan en temel güvenlik önlemidir.
Veri Getirme Yöntemleri: get_results, get_row, get_var
İhtiyacınıza göre veriyi farklı formatlarda çekebilirsiniz. Hangi metodun kullanılacağı, sorgudan dönecek veri miktarına bağlıdır.
| Metod | Kullanım Amacı | Dönüş Tipi |
|---|---|---|
| get_results | Birden fazla satır çekmek için | Array (Nesne veya dizi) |
| get_row | Tek bir satır çekmek için | Object |
| get_var | Tek bir değer (örn: count) için | String/Int |
Örneğin, toplam kullanıcı sayısını almak için şu yöntemi kullanabilirsiniz:
global $wpdb;
$count = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->prefix}users");
echo "Toplam kullanıcı sayısı: " . $count;
Veri Ekleme ve Güncelleme İşlemleri
Veri eklemek için $wpdb->insert(), güncellemek için ise $wpdb->update() metodlarını tercih etmelisiniz. Bu metodlar, sorguyu kendileri yapılandırarak güvenlik risklerini minimize eder.
global $wpdb;
$wpdb->insert(
$wpdb->prefix . 'ozel_tablom',
array(
'isim' => 'Ahmet',
'email' => 'ahmet@example.com'
),
array('%s', '%s') // Veri tipleri
);
Bu yöntem, SQL sorgusunu elle yazmanıza gerek kalmadan veritabanı işlemlerini gerçekleştirmenizi sağlar. Hata ayıklama (debug) için $wpdb->last_error özelliğini kontrol edebilirsiniz.
Kritik Uyarı: Üretim ortamında (production) hata mesajlarını kullanıcıya göstermeyin.$wpdb->show_errors()veya$wpdb->print_error()gibi fonksiyonları sadece geliştirme aşamasında kullanın. Canlı sitede veritabanı hataları, site yapısını ele verebilecek güvenlik açıklarına yol açabilir.
Sıkça Sorulan Sorular
$wpdb->prepare() neden zorunludur?
SQL enjeksiyonu saldırılarını engellemek için zorunludur. Kullanıcıdan gelen verileri temizler ve sorgunun yapısını korur.
Özel tablo oluşturduğumda WordPress bunu nasıl tanır?
WordPress özel tabloları otomatik tanımaz. Veritabanı işlemlerini $wpdb ile yapmanız, WordPress'in veritabanı bağlantı havuzunu kullanmanızı sağlar.
Sorgu sonuçlarını nasıl önbelleğe alırım?
wp_cache_set ve wp_cache_get fonksiyonlarını kullanarak, veritabanı sorgularını geçici belleğe alıp performansı artırabilirsiniz.
Büyük verilerde performans sorunu yaşar mıyım?
Evet, gereksiz kolonları seçmekten kaçının. SELECT * yerine sadece ihtiyacınız olan kolonları (örn: SELECT ID, post_title) yazın.
Sorgu hatası alırsam ne yapmalıyım?
$wpdb->last_query ile çalıştırılan son sorguyu kontrol edin ve $wpdb->last_error ile hatanın ne olduğunu inceleyin.
İleri Düzey Senaryo: Dinamik Filtreleme ve Veri Birleştirme (JOIN)
WordPress veritabanında sadece tek bir tablodan veri çekmek nadiren yeterlidir. Genellikle wp_posts ve wp_postmeta tablolarını veya kendi oluşturduğunuz özel tabloları birleştirmeniz (JOIN) gerekir. Aşağıdaki örnekte, özel bir "projeler" tablosunu WordPress'in standart "kullanıcılar" tablosuyla birleştirerek, belirli bir kullanıcıya ait projeleri listeleyen dinamik bir sorgu yapısını inceleyelim.
global $wpdb;
$user_id = 15;
$status = 'tamamlandi';
// JOIN ve prepare kullanımı ile güvenli sorgu
$query = $wpdb->prepare("
SELECT p.proje_adi, u.display_name
FROM {$wpdb->prefix}projeler AS p
INNER JOIN {$wpdb->users} AS u ON p.user_id = u.ID
WHERE p.user_id = %d AND p.durum = %s
", $user_id, $status);
$results = $wpdb->get_results($query);
if ($results) {
foreach ($results as $row) {
echo 'Proje: ' . esc_html($row->proje_adi) . ' - Sahibi: ' . esc_html($row->display_name) . '
';
}
} else {
echo 'Bu kriterlere uygun proje bulunamadı.';
}
Veritabanı Sorgularında Performans Optimizasyonu ve İndeksleme
Özel tablolarla çalışırken, veri setiniz büyüdükçe sorgularınız yavaşlamaya başlayabilir. WordPress veritabanı sorgularını hızlandırmak için sadece kod tarafında değil, veritabanı yapısında da bazı stratejiler izlemelisiniz.
1. İndeks Kullanımı (Indexing)
Eğer WHERE koşulunda sürekli aynı sütunları kullanıyorsanız (örneğin user_id veya created_at), bu sütunlara mutlaka veritabanı seviyesinde INDEX ekleyin. İndeksler, veritabanının tüm tabloyu taramak yerine doğrudan ilgili satıra gitmesini sağlar.
2. SELECT * Kullanımından Kaçının
Sadece ihtiyacınız olan sütunları seçin. SELECT * ifadesi, gereksiz veri transferine ve bellek kullanımının artmasına neden olur. Örneğin, sadece isim listesi alacaksanız SELECT isim FROM ... kullanmak, SELECT * FROM ... kullanmaktan çok daha hızlıdır.
3. Sorgu Analizi (EXPLAIN)
Sorgularınızın ne kadar sürede çalıştığını ve veritabanının nasıl bir yol izlediğini anlamak için EXPLAIN komutunu kullanabilirsiniz. Geliştirme ortamınızda şu yapıyı deneyin:
global $wpdb;
$query = "EXPLAIN SELECT * FROM {$wpdb->prefix}projeler WHERE durum = 'aktif'";
$analysis = $wpdb->get_results($query);
// Sorgu planını incelemek için
echo '';
print_r($analysis);
echo '
';
Profesyonel İpucu: Eğer sorgunuz çok karmaşıksa ve veriler anlık değişmiyorsa, sonuçları set_transient() fonksiyonu ile belirli bir süre (örneğin 1 saat) önbelleğe alarak veritabanı yükünü %90 oranında azaltabilirsiniz.
Hata Ayıklama (Debugging) Stratejileri
Sorgularınız çalışmadığında veya boş sonuç döndürdüğünde, sorunun nerede olduğunu anlamak için WordPress'in hata ayıklama modunu aktif etmelisiniz. wp-config.php dosyanızda şu ayarların yapılı olduğundan emin olun:
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'SAVEQUERIES', true ); // Sorguları kaydeder
SAVEQUERIES aktif edildiğinde, $wpdb->queries değişkeni üzerinden o sayfada çalışan tüm sorguları, çalışma süreleri ile birlikte görebilirsiniz. Bu, yavaş sorguları tespit etmek için en etkili yöntemdir.
Sonuç
WordPress'te özel veritabanı sorguları yapmak, doğru metodları kullandığınızda oldukça güvenli ve güçlü bir yöntemdir. $wpdb sınıfını, özellikle prepare() metodu ile birlikte kullanmak, profesyonel bir geliştiricinin olmazsa olmazıdır. Bu rehberde öğrendiğiniz yöntemleri, kendi projelerinizde uygulayarak veritabanı işlemlerinizi optimize edebilirsiniz.
Bir sonraki adım olarak, veritabanı sorgularını Transient API ile önbelleğe almayı veya Custom Post Types ile özel veritabanı tablolarını nasıl entegre edebileceğinizi araştırmanızı öneririm. Kod güvenliği konusunda, veritabanına giren ve çıkan her veriyi mutlaka filtrelemeyi (sanitize) ve çıkışta kaçış (escape) yapmayı alışkanlık haline getirin.
Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Veritabanı üzerinde işlem yapmadan önce mutlaka veritabanı yedeğinizi alın. Yanlış SQL sorguları veri kaybına neden olabilir.


Yorumlar (0)
Yorum Yaz