wpdb Sınıfı Nasıl Özelleştirilir ve Yeni Yöntemler Eklenir
Yayınlanan: 2018-07-10Daha yaygın olarak wpdb olarak bilinen WordPress veritabanı soyutlama katmanı, veritabanı ile etkileşimden sorumlu ezSQL'e dayalı bir sınıftır. wpdb sınıfı aynı zamanda bir açılır listedir - benzer işlevselliğe sahip başka bir kod parçasıyla kolayca değiştirilebilen bir çekirdek WP kodu parçasıdır (güncel bir açılır liste listesi WP Kod Referansında mevcuttur).
Varsayılan #wpdb sınıfını değiştirmek karmaşık değildir. Yalnızca birkaç yöntemi kolayca ekleyebilir, kaldırabilir veya değiştirebilirsiniz. Tüm sınıfı değiştirmeye gerek yok. #wordpress
TWEET İÇİN TIKLAYINİşte burada büyük bir yanılgı devreye giriyor. İnsanlar "değiştirilmiş" ifadesini "kendi tam veritabanı sınıfımı yaz" gibi algılar. Neyse ki, tüm veritabanı sınıfını yazmak zorunda değilsiniz. Mevcut sınıfı alabilir ve yalnızca ihtiyacınız olan işlevleri ekleyebilir, kaldırabilir veya değiştirebilirsiniz. Ve yapacağımız şey bu.
Neden wpdb sınıfını değiştirmelisiniz?
Elbette, wpdb ihtiyacınız olan her şeye sahiptir!? Tüm WP bunun üzerine inşa edilmiştir. Teknik olarak bu doğru. $wpdb->query()
yöntemini kullanarak herhangi bir SQL komutunu çalıştırabilirsiniz. Ancak bu mantık uygulandığında, $wpdb->insert()
veya $wpdb->get_var()
gibi yöntemlere asla sahip olmayacak veya bunlara ihtiyacımız olmayacak. Ancak zaman kazandırdıkları, hataları azalttığı ve kötü sorguları uzak tuttuğu için yapıyoruz. Peki, hangi işlevler eksik? Bu, üzerinde çalıştığınız projeye bağlıdır. Bu iki sorgu için desteğe ihtiyacımız vardı:
INSERT IGNORE INTO tbl_name ...
INSERT INTO tbl_name ... ON DUPLICATE KEY UPDATE ...
Adım #1 – Açılır menüyü oluşturun
Bir DB eklentisi oluşturma süreci basittir ve sonuç, sorunsuz bir şekilde WP'ye karışır.
db.php
adında bir dosya oluşturun ve /wp-content/
klasörüne yerleştirin. Dosyaya standart bir eklenti başlığı verin ve wpdb'yi genişleten bir sınıf oluşturun. Bunun gibi bir şey:
<?php /* Plugin Name: Extended wpdb Description: A few extra functions for wpdb Version: 1.0 Author: WebFactory Ltd */ class wpdb_extended extends wpdb { public function __construct(){ parent::__construct( DB_USER, DB_PASSWORD, DB_NAME, DB_HOST ); } public function test() { echo 'Extended wpdb is running.'; } } global $wpdb; $wpdb = new wpdb_extended();
Başlık oldukça açıklayıcı. Yapı yöntemi, bir nesne oluşturulduktan sonra yeni bir DB bağlantısı oluşturmamızı sağlar ve bunun için orijinal wpdb yapıcısını kullanır. Bu DB sabitleri wp-config.php
içinde tanımlanır. Başta söylediğimiz gibi – sadece bazı işlevler ekliyoruz ve diğer her şeyi yeniden kullanıyoruz. İkinci yöntem test()
tamamen her şeyin doğru çalışıp çalışmadığını görmek içindir.
Son iki satır çok önemli. Bu özel bir sınıf olduğundan, WP bizim için $wpdb
nesnesini otomatik olarak oluşturmayacaktır. Bunu kendimiz yapmalıyız. global
anahtar sözcüğü kullanmayı unutmayın, aksi takdirde yerel bir değişken oluşturacaksınız.
Adım #2 – Daha derine inmeden önce test edin
WP Kontrol Panelinizi açın ve Eklentilere gidin. Her zamanki Tümü, Etkin ve Etkin Olmayan (eklentiler) sekmelerinin yanı sıra bir Açılanlar sekmesi ve onun içinde sihirli bir şekilde özel veritabanı sınıfımız göreceksiniz.
Yönetici düzgün çalıştığı için iyi bir iş çıkardığımızı biliyoruz. Yeni, özel, genişletilmiş sınıfımız geldi ve hiçbir şey değişmedi. Harika! Ancak, sadece iyi bir önlem için bu üç kod satırını temanın functions.php
dosyasına (veya hemen çalıştırılacağı bir eklentinin içinde bir yere) koyun:

global $wpdb; $wpdb->test(); die;
Herhangi bir yönetici veya ön uç sayfası çalıştırın ve ne görüyorsunuz? “ Genişletilmiş wpdb çalışıyor. " Mükemmel. Şimdi gerçek dünya işlevlerimiz için.
Adım #3 – İşlevler oluşturun, değiştirin veya değiştirin
INSERT IGNORE
sorgusunun yapılması oldukça kolay görünüyor. Zaten $wpdb->insert() var, bu yüzden sadece tek bir kelimeyi kaçırıyoruz. Ne yazık ki, doğru yerlerde filtrelerin olmaması nedeniyle, iki satır kod olmayacak.
wp-db.php dosyasını açar ve #2100 satırındaki insert()
yöntemine giderseniz, bunun 2151 satırından _insert_replace_helper()
yöntemini kullandığını görürsünüz. Ve bu işlevin tek bir filtresi veya eylemi yoktur. İşlevi de saramayız çünkü değiştirebileceğimiz sorgunun kendisini değil, hemen sorgu sonucunu döndürür. Serseri. Hem insert()
hem de _insert_replace_helper()
yöntemlerini geçersiz kılmamız gerekecek. Fazladan bir parametre ekleyeceğiz – $ignore
. false
varsayılan değerine sahip bir boole.
public function insert( $table, $data, $format = null, $ignore = false ) { return $this->_insert_replace_helper( $table, $data, $format, 'INSERT', $ignore = false ); }
Başka herhangi bir durumda, beş parametreye sahip bir fonksiyon, onları bir ilişkisel diziye dönüştürmek için iyi bir aday olacaktır. Ancak geriye dönük uyumluluk istiyoruz, bu yüzden bunu yapmıyoruz. Diğer işlevdeki değişiklikler de küçüktür:
function _insert_replace_helper( $table, $data, $format = null, $type = 'INSERT', $ignore = false ) { $this->insert_id = 0; if ( ! in_array( strtoupper( $type ), array( 'REPLACE', 'INSERT' ) ) ) { return false; } $data = $this->process_fields( $table, $data, $format ); if ( false === $data ) { return false; } $formats = $values = array(); foreach ( $data as $value ) { if ( is_null( $value['value'] ) ) { $formats[] = 'NULL'; continue; } $formats[] = $value['format']; $values[] = $value['value']; } $fields = '`' . implode( '`, `', array_keys( $data ) ) . '`'; $formats = implode( ', ', $formats ); // modification for IGNORE keyword if (true == $ignore && 'INSERT' == $type) { $type = 'INSERT IGNORE'; } $sql = "$type INTO `$table` ($fields) VALUES ($formats)"; $this->check_current_query = false; return $this->query( $this->prepare( $sql, $values ) ); }
Geliştiriciler neden bunu daha sık yapmıyor?
Yalnızca birkaç kez özel bir sorguya ihtiyacınız varsa, kolayca $wpdb->query()
kullanabilirsiniz. Varsayılan sınıfı değiştirmeye gerek yoktur. Ayrıca varsayılanı genişleten ancak wpdb nesnesini geçersiz kılmayan özel bir sınıf da yazabilirsiniz. Bu durumda $mycustomclass->method()
kullanırsınız ama bu dünyanın sonu değil.
Varsayılan wpdb sınıfını genişleten bariz havalılık faktörünün yanı sıra, WP'de yapılması gereken bir şeydir ve basit değildir, bu yüzden onunla oynamaktan çekinmeyin. İki şeyi aklınızda bulundurun:
- projenizi birine gönderirken
db.php
dosyasını eklemeyi unutmayın; herhangi bir tema veya eklenti klasöründe olmayacak - özel sınıfınızı etkileyebileceğinden
wp-db.php
değişikliklere göz atın (bu pek olası olmasa da)