$wpdb Class
Merhaba değerli arkadaşlar. Bu yazımda sizlere wordpressde veritabanı işlemlerini nasıl yapacağınızı anlatacağım. WordPressde veri tabanı ile etkileşime girmek için $wpdb sınıfı kullanılmaktadır. Ayrıca kendinizde pdo veya mysqli ile bir veri tabanı bağlantısı kurup yönetebilirsiniz. Örnek bir pdo bağlantıs kurmak için buraya tıklayabilirsiniz. Yine mysqli ile ilgili bir bağlantı kurmak istiyorsanızda bu linke tıklayabilirsiniz.
Ben bu yazıda sizlere $wpdb sınıfı anlatacağım ve bir çok örnek kullanacağız. wpdb() sınıfını kullanmak için direk dosyayı çağırmamalısıznız bunun yerine
1 | global $wpdb; |
şeklinde sayfada istediğiniz gibi kullanabilirsiniz. Bu sınıf wordpressin /wp-includes/wp-db.php dizininde bulunmaktadır. Ayrıca bu sınıfı kendi editörünüzde açarak tek tek inceleyebilirsiniz. Ama sayfa include(“wp-includes/wp-db.php”); şeklinde çağırmanıza gerek yok çünkü wordpress kendi ilgili sınıfları sayfaya yüklerken çağırmaktadır.
İlk olarak $wpdb sınıf ile veri tabanından bir veri çekelim.
$wpdb->get_results Kullanımı
1 2 3 | /* ÖRNEK -1*/ global $wpdb; //wpdb sınıfımızı çağırılmış olduğu değişkeni global olarak tanımladı ve istediğimiz gibi kullanabiliriz. $wp_gelenVeri=$wpdb->get_results("select * from {$wpdb->prefix}options where option_id=1",OBJECT); |
Bu sql de options sayfasından option_id sutununda bulunan 1 numaralı satırı çektik. Ayrıca sql içerisinde geçen $wpdb->prefix methodu ise wordpress kurulumnda vermiş olduğunuz tablo ön ekini getirmektedir. İkinci parametre olana OBJECT ise veritabanından gelecek olan verileri bir nesne olarak almamızı sağlamaktadır. Peki gelen verileri ekrana nasıl basacağız?
1 2 3 4 5 6 7 8 9 | /* ÖRNEK -2*/ global $wpdb; $wp_gelenVeri=$wpdb->get_results("select * from {$wpdb->prefix}options where option_id=1",OBJECT); if(count($wp_gelenVeri)): //burada veri tabanından gelen değişken sayısını aldık 0 > büyük olduğunda if çalışcak gelen veri 0 ise else: kısmı çalışcak //print_r($wp_gelenVeri); isterseniz gelen dizi tam olarak ekrana basarak nasıl ulaşmanız geretiğini öğrenen bilirsiniz echo $wp_gelenVeri[0]->option_value; else: echo "Üzgünüm bir veri bulunamadı."; endif; |
SELECT a Column
Yukardaki örnek veri tabanından sadece tek satırlık veri alındığında uygulanmaktadır. Eğer Option tablosunu komple verileri çekmek istiyorsanız aşağıdaki gibi kullanmanız gerekmektedir.
1 2 3 4 5 6 7 8 9 10 11 12 | /* ÖRNEK -3*/ global $wpdb; $wp_gelenVeri=$wpdb->get_results("select * from {$wpdb->prefix}options",OBJECT); if(count($wp_gelenVeri)): foreach($wp_gelenVeri as $wp_gelenSatir): //foreach ile diziyi döngüye koyup bütün içeriği yazdırmış olduk //print_r($wp_gelenSatir); //isterseniz gelen dizi tam olarak ekrana basarak nasıl ulaşmanız geretiğini öğrenen bilirsiniz echo "option id : ".$wp_gelenSatir->option_id." option name : ".$wp_gelenSatir->option_name; //options tablosundan option_id ile option_name sutununu yazdırdık echo "<br />";//her döngünün sonunda bir alt satıra geçmesini istedik. endforeach; else: echo "Üzgünüm bir veri bulunamadı."; endif; |
Bu örneklerde kullanmış olduğumuz wordpressin kendi tabloları içindi. Aşağıdaki örneklem ise wordpressin dışındaki tablolarınız içinde kullanabilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 | /* ÖRNEK -4*/ global $wpdb; $wp_gelenVeri=$wpdb->get_results("select * from denemTab",OBJECT); if(count($wp_gelenVeri)): foreach($wp_gelenVeri as $wp_gelenSatir): //foreach ile diziyi döngüye koyup bütün içeriği yazdırmış olduk //print_r($wp_gelenSatir); //isterseniz gelen dizi tam olarak ekrana basarak nasıl ulaşmanız geretiğini öğrenen bilirsiniz echo "option id : ".$wp_gelenSatir->denemeid." option name : ".$wp_gelenSatir->userName; //options tablosundan option_id ile option_name sutununu yazdırdık echo "<br />";//her döngünün sonunda bir alt satıra geçmesini istedik. endforeach; else: echo "Üzgünüm bir veri bulunamadı."; endif; |
!ÖNEMLİ UYARI: $wpdb->get_result(“sql”,diziTipi) kullanımı sql injection saldırılarına karşı açıktır dışardan gelen verilerde bu yöntemi kullanmayın. Bu yöntem veri hızlılığı nedeniyle veritabanından hızlı veri okumaları için kullanabilirsiniz.
$wpdb->get_var Kullanımı
WordPress wpdb sınıfında bulunan get_var method u sadece bir değer dönderir direk veri okumalarında aşağıdaki gibi kullanılır.
1 2 3 4 | /* ÖRNEK -5*/ global $wpdb; $wp_gelenDeger=$wpdb->get_var("select count(*) from $wpdb->options"); echo $wp_gelenDeger; |
Eğer dışarıdan gelen verilerde bu methodu kullanmak istiyorsanız aşağıdaki gibi kullanmanız gerekmektedir.
1 2 3 4 5 6 | /* ÖRNEK -6*/ global $wpdb; $userId=1; $wp_gelenDeger=$wpdb->get_var($wpdb->prepare("select count(*) from $wpdb->posts where post_author=%s",$userId)); echo $wp_gelenDeger; //Dış verilerde prepare methodu güvenlidir. |
$wpdb->get_row Kullanımı
Wordpress de tek satırlık ve birden çok satırlık verileri kullanmak istiyorsanız bu methodu kullanabilirsiniz. Aşağıdaki örnekte tek satır veri alabilmek için kullanılan script verilmiştir.
1 2 3 4 5 | /*ÖRNEK -6*/ global $wpdb; $wp_tekSatirVeri=$wpdb->get_row("select * from $wpdb->posts where ID=1"); //print_r($wp_tekSatirVeri); gelen tek satrıdaki bütün verileri yazdırabilirsiniz. echo $wp_tekSatirVeri->post_title;//posts tablosundan idsi 1 olan verinin başlığını aldık. |
Veri tabanından gelen satırlarında hangi dizi ve index tipinde gelmesini ise üç tipde belirliye biliyoruz. Bu kullanım PDO sınıfında PDO:FETCH_OBJ-PDO::FETCH_ASSOC-PDO::FETCH_NUM şeklinde kullanılırken. $wpdb klasında ise OBJECT-ARRAY_A-ARRAY_N şeklinde kullanılmaktadır. Varsayılan olarak OBJECT kullanılmaktadır.
1 2 3 4 5 | /*ÖRNEK -7*/ global $wpdb; $wp_tekSatirVeri=$wpdb->get_row("select * from $wpdb->posts where ID=1",ARRAY_A); //print_r($wp_tekSatirVeri); gelen tek satrıdaki bütün verileri yazdırabilirsiniz. echo $wp_tekSatirVeri["post_title"];//posts tablosundan idsi 1 olan verinin başlığını aldık. |
veri transferinde ARRAY_N ile ilgili örnek ise aşağıdaki gibidir.
1 2 3 4 5 | /*ÖRNEK -8*/ global $wpdb; $wp_tekSatirVeri=$wpdb->get_row("select * from $wpdb->posts where ID=1",ARRAY_N); //print_r($wp_tekSatirVeri); gelen tek satrıdaki bütün verileri yazdırabilirsiniz. echo $wp_tekSatirVeri[5];//posts tablosundan idsi 1 olan verinin başlığını aldık |
ÇOK SATIRLI VERİLERDE
1 2 3 4 5 6 7 8 9 10 11 12 13 | //ÖRNEK 9 $veriCek=$wpdb->get_results("select * from {$wpdb->prefix}posts where post_type='page'"); // veritabnındaki posts tablosundan post tipi page olanları okumak için seçiyoruz if($veriCek): //Gelen verileri gösterir //print_r($veriCek); //gelen verileri istersenizde benim gibi kafanıza göre bir döngüye sokup nesene mantığı ile yazdırabilirsiniz. foreach($veriCek as $gelenVeri): echo $gelenVeri->post_title; endforeach; endif; |
TEK SATIRLI VERİLERDE
1 2 3 4 5 6 7 8 9 | //ÖRNEK 10 $veriCek=$wpdb->get_results("select * from $wpdb->posts where ID={$posts[0]->ID}"); if($veriCek): setup_postdata($veriCek[0]); ?><h4> <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a> </h4> <?php endif; |
1 2 3 4 5 6 7 8 9 10 11 | //ÖRNEK 11 $veriCek=$wpdb->get_results("select * from $wpdb->posts where ID={$posts[0]->ID}"); if($veriCek): foreach($veriCek as $gelenSatir): setup_postdata($gelenSatir); ?><h4> <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"> <?php the_title(); ?></a> </h4> <?php endforeach; endif; |
$wpdb->insert() ile Veritabanına Veri Ekleme
Bu method da öncelikli olarak veri girilecek tablo seçiliyor. İkinci parametrede veri girilecek sütunlar belirleniyor ve son parametrede ise veri tabanına girilecek verilerin tipleri belirleniyor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | //ÖRNEK 12 global $wpdb; $verGir=$wpdb->insert( "{$wpdb->prefix}postmeta", array( "meta_id" => "NULL", "post_id" => 43, "meta_key" => "_caglarbostanci", "meta_value" => "Çağlar Bostancı ile php dersleri", ), array( '%d', '%d', '%s', '%s' ) ); if($wpdb->insert_id): echo "Eklenen veri id : ".$wpdb->insert_id; else: echo "Üzgünüm veri ekelenemedi."; endif; |
$wpdb->replace() Kullanımı
1 | $wpdb->replace( $table, $data, $format ); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | global $wpdb; $verGir=$wpdb->replace( "{$wpdb->prefix}postmeta", array( "meta_id" => 183, "post_id" => 46, "meta_key" => "_caglarhocailephpdersleri", "meta_value" => "https://caglarbostanci.com.tr", ), array( '%d', '%d', '%s', '%s' ) ); if($wpdb->insert_id): echo "Eklen veri id'si : ".$wpdb->insert_id; else: echo "Üzgünüm veri değiştirlemedi."; endif; |
$wpdb->update() Kullanımı.
WordPress’de verileri güncellenmek için kullanılmaktadır.
1 | $wpdb->update( $table, $data, $where, $format = null, $where_format = null ); |
Bu method beş parametreden oluşmaktadır. Birinci parametrede veritabanından güncellenecek tablo seçilir. İkinci parametrede güncellencek sütunlar ve veriler belirlenir. Üçüncü parametrede sql in şartı verilir. Dördüncü parametrede veri girişi yapılacak sütünların veri türleri dizi olarak verilir. Son parametrede ise where şartında kullanılan verilerin data tipi dizi olaraka belirtilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | //ÖRNEK 14 global $wpdb; $veriGuncelle=$wpdb->update( "{$wpdb->prefix}postmeta", array( "post_id" => 555, "meta_key" => "_monnarosa", ), array( "meta_id" => 183 ), array( '%d', '%s', ), array( '%d' ) ); //geriye true vey false değeri dönderir if($veriGuncelle): echo "Veri Güncellendi"; else: echo "Veri Güncellenemedi"; endif; |
$wpdb->delete() Kullanımı
1 | $wpdb->delete( $table, $where, $where_format = null ); |
Bu method üç parametreden oluşmaktadır. Birinci parametrede veritabanından tablo seçilir. İkinci parametrede where şartı belirlenir ve son parametrede ise where şartındaki parametre tipi belirtilir.
1 2 3 4 5 6 7 8 9 10 11 12 | //ÖRNEK 15 global $wpdb; $veriSil=$wpdb->delete( "{$wpdb->prefix}postmeta", array( "meta_id" => 183 ), array( '%d' ) ); if($veriSil): echo "Veri silindi"; else: echo "Veri silinemedi"; endif; |
$wbdp->query() Kullanımı
1 | $wpdb->query($wpdb->prepare(sql,parametre)); |
$wpdb sınıfında bana göre dışarıdan gelen verilerde kesinlikle bu kullanılmalıdır. Hatta bazı ataklar için de ben kendime özel önlemler alıyorum. Sizlerde bu gibi önlemler alabilirsiniz. Tabi bu sizin kanaatinize kalmış bir durum ama kesinlikle dışadan gelen verilerde $wpdb->prepare() kullanılmalıdır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //ÖRNEK 16 try { global $wpdb; //global olarak sınıfı tanımladık $meta_id=333; //veri $meta_key="_beklenen"; // veri $meta_value="Ne hasta bekler sabahı,Ne taze ölüyü mezar,ne şeytan bir günahı seni beklediğim kadar.NFK"; // veri $veriGir=$wpdb->query($wpdb->prepare("INSERT INTO {$wpdb->prefix}postmeta (meta_id,post_id,meta_key,meta_value) VALUES (%d,%d,%s,%s)",null,$meta_id,$meta_key,$meta_value));// ilk önce query ile başlayıp içene prepare metodunu kullaındak sql verilen tiplerine göre girilecek değerleri yerine yazdık %d int %s string sql'den sonra gelen parametrelerde values de girilen veritiplerine göre gelecek değerler if($veriGir): //veri girildiyse true değilse false echo "veri girildi. id :".$wpdb->insert_id ; //Girilen verinin id numarasını alıyoruz else: throw new Exception("Üzgünüm veri girişi sağlanamadı");//Bunu kendim belirledim istersenin direk echo ile de basabilirsiniz. endif; }catch(Exception $a){ echo "Hata :".$a->getMessage(); } |
1 2 3 4 5 6 7 8 9 10 11 | try { global $wpdb; //global olarak sınıfı tanımladık $girilecekVeriler=array(333,"_beklenen","Ne hasta bekler sabahı,Ne taze ölüyü mezar,ne şeytan bir günahı seni beklediğim kadar.NFK"); // veri dizisi $veriSql=$wpdb->prepare("INSERT INTO {$wpdb->prefix}postmeta (meta_id,post_id,meta_key,meta_value) VALUES (%d,%d,%s,%s)"); //Önce sqli hazırladık. $veriGir=$wpdb->query($veriSql,$girilecekVeriler); //Sonra verigirişini sağladık. if($veriGir): //veri girildiyse true değilse false echo "veri girildi. id :".$wpdb->insert_id ; //Girilen verinin id numarasını alıyoruz else: throw new Exception("Üzgünüm veri girişi sağlanamadı");//Bunu kendim belirledim istersenin direk echo ile de basabilirsiniz. endif; }catch(Exception $a){ echo "Hata :".$a->getMessage(); } |
$wpdb->show_errors(), echo $wpdb->print_error(),$wpdb->hide_errors() Kullanımı
SQL sorgularında hataları görebelmemiz içine $wpdb->show_errors() fonsiyonunu kullanırken gizlemek içinse $wpdb->hide_errors(); kullanmaktayız. Hataları ekrana basmak içinse
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | try { global $wpdb; //global olarak sınıfı tanımladık $wpdb->show_errors();//hataların görünmesine izinverdik $id=185;//silencek veri id $veriSql=$wpdb->prepare("delete from {$wpdb->prefix}postmeta where meta_id=%d",$id); //Önce sqli hazırladık. $veriGir=$wpdb->query($veriSql); //Sorguyu çalıştırdık. if($veriGir): //veri girildiyse true değilse false echo "Veri silindi."; //Girilen verinin id numarasını alıyoruz else: throw new Exception("Üzgünüm veri silinemedi");//Bunu kendim belirledim istersenin direk echo ile de basabilirsiniz. endif; }catch(Exception $a){ echo "Hata :".$a->getMessage(); echo $wpdb->print_error();// ilgili hatayı ekrana bastık. (daha önce 185 id'li veri silmiştik.) } |
1 |
1 |
Biraz uzun soluklu oldu ama Wordpres Veritabanı işlemlerinde çoğu sorununuza yanıt verecek şekilde oldu. Faydalı olması dileğiyle. BAŞARILAR.