Cara Menyesuaikan Kelas wpdb dan Menambahkan Metode Baru
Diterbitkan: 2018-07-10Lapisan abstraksi database WordPress, lebih dikenal sebagai wpdb adalah kelas berdasarkan ezSQL yang bertanggung jawab untuk berinteraksi dengan database. Kelas wpdb juga merupakan drop-in – sepotong kode WP inti yang dapat dengan mudah diganti dengan potongan kode lain dengan fungsi serupa (daftar drop-in terbaru tersedia di Referensi Kode WP).
Memodifikasi kelas #wpdb default tidak rumit. Anda dapat dengan mudah menambah, menghapus, atau memodifikasi hanya beberapa metode. Tidak perlu mengganti seluruh kelas. #wordpress
KLIK UNTUK TWEETDi sinilah kesalahpahaman besar berperan. Orang-orang menganggap "diganti" seperti dalam "tulis kelas database saya sendiri yang lengkap". Untungnya, Anda tidak perlu menulis seluruh kelas database. Anda dapat mengambil kelas yang ada dan menambahkan, menghapus atau memodifikasi hanya fungsi yang Anda butuhkan. Dan itulah yang akan kita lakukan.
Mengapa memodifikasi kelas wpdb?
Tentunya, wpdb memiliki semua yang Anda butuhkan!? Seluruh WP dibangun di atasnya. Secara teknis itu benar. Dengan menggunakan metode $wpdb->query()
Anda dapat menjalankan perintah SQL apa pun. Tetapi dengan penerapan logika itu, kita tidak akan pernah memiliki atau membutuhkan metode seperti $wpdb->insert()
atau $wpdb->get_var()
. Tapi kami melakukannya, karena mereka menghemat waktu, mengurangi bug, dan menjauhkan kueri buruk. Jadi, fungsi apa yang hilang? Itu tergantung pada proyek yang sedang Anda kerjakan. Kami membutuhkan dukungan untuk dua pertanyaan ini:
INSERT IGNORE INTO tbl_name ...
INSERT INTO tbl_name ... ON DUPLICATE KEY UPDATE ...
Langkah #1 – Buat drop-in
Proses pembuatan drop-in DB sederhana, dan hasil akhirnya menyatu dengan mulus ke dalam WP.
Buat file bernama db.php
dan letakkan di folder /wp-content/
. Berikan file header plugin standar dan buat kelas yang memperluas wpdb. Sesuatu seperti ini:
<?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();
Headernya cukup jelas. Metode konstruk memastikan kita membuat koneksi DB baru setelah objek dibangun dan menggunakan konstruktor wpdb asli untuk itu. Konstanta DB tersebut didefinisikan dalam wp-config.php
. Seperti yang kami katakan di awal – kami hanya menambahkan beberapa fungsi dan menggunakan kembali yang lainnya. Metode kedua test()
murni untuk melihat apakah semuanya berfungsi dengan benar.
Dua baris terakhir sangat penting. Karena ini adalah kelas khusus, WP tidak akan membuat objek $wpdb
untuk kita secara otomatis. Kita harus melakukannya sendiri. Ingatlah untuk menggunakan kata kunci global
karena jika tidak, Anda akan membuat variabel lokal.
Langkah #2 – Uji sebelum menggali lebih dalam
Buka Dasbor WP Anda dan buka Plugin. Selain tab All, Active, dan Inactive (plugin) yang biasa, Anda akan melihat tab Drop-in dan di dalamnya, secara ajaib, kelas database kustom kami.
Karena admin bekerja dengan baik, kami tahu kami melakukan pekerjaan dengan baik. Kelas baru kami, kustom, diperpanjang, dan tidak ada yang berubah. Besar! Tapi, hanya untuk ukuran yang baik, masukkan ketiga baris kode ini ke dalam functions.php
tema (atau di suatu tempat di dalam plugin yang akan segera dijalankan):

global $wpdb; $wpdb->test(); die;
Jalankan admin atau halaman front-end dan apa yang Anda lihat? “ Wpdb yang diperluas sedang berjalan. " Sempurna. Sekarang untuk fungsi dunia nyata kita.
Langkah #3 – Buat, ubah, atau ganti fungsi
Permintaan INSERT IGNORE
tampaknya cukup mudah dilakukan. Kami sudah memiliki $wpdb->insert() jadi kami hanya kehilangan satu kata. Sayangnya, karena kurangnya filter di tempat yang tepat, itu tidak akan menjadi dua baris kode.
Jika Anda membuka wp-db.php dan menuju ke metode insert()
pada baris #2100, Anda akan melihat bahwa metode tersebut menggunakan metode _insert_replace_helper()
dari baris #2151. Dan fungsi itu tidak memiliki satu filter atau tindakan. Kami juga tidak dapat membungkus fungsi karena itu segera mengembalikan hasil kueri dan bukan kueri itu sendiri yang dapat kami modifikasi. Kekecewaan. Kita harus mengganti metode insert()
dan _insert_replace_helper()
. Kami akan menambahkan parameter tambahan – $ignore
. Boolean dengan nilai default false
.
public function insert( $table, $data, $format = null, $ignore = false ) { return $this->_insert_replace_helper( $table, $data, $format, 'INSERT', $ignore = false ); }
Dalam keadaan lain, fungsi yang memiliki lima parameter akan menjadi kandidat yang baik untuk mengubahnya menjadi array asosiatif. Tapi kami ingin kompatibilitas mundur, jadi kami tidak melakukan itu. Perubahan pada fungsi lainnya juga kecil:
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 ) ); }
Mengapa pengembang tidak melakukan ini lebih sering?
Jika Anda memerlukan kueri khusus hanya beberapa kali, Anda dapat dengan mudah menggunakan $wpdb->query()
. Tidak perlu mengganti kelas default. Anda juga dapat menulis kelas khusus yang memperluas kelas default tetapi tidak menimpa objek wpdb. Dalam hal ini Anda akan menggunakan $mycustomclass->method()
tapi itu bukan akhir dari dunia.
Selain faktor kesejukan yang jelas, memperluas kelas wpdb default adalah sesuatu yang dimaksudkan untuk dilakukan di WP dan bukan peretasan, jadi silakan bermain dengannya. Ingatlah dua hal:
- ketika Anda mengirimkan proyek Anda kepada seseorang, jangan lupa untuk menyertakan file
db.php
; itu tidak akan ada di folder tema atau plugin apa pun - awasi perubahan di
wp-db.php
karena dapat memengaruhi kelas khusus Anda (walaupun itu sangat tidak mungkin)