Membuat Custom Database Table
Gambaran Umum
Video ini mengajarkan cara membuat custom database table menggunakan dbDelta(), register_activation_hook, dan $wpdb->insert() untuk menambah data ke tabel.
Struktur Plugin
new-database-table/
├── inc/
│ ├── generate-pet.php ← Random pet generator
│ └── template-pets.php ← Template HTML
├── new-database-table.php ← File utama
└── new-database-table.cssMembuat Tabel Saat Plugin Diaktifkan
register_activation_hook
php
class NewDatabaseTable {
function __construct() {
global $wpdb;
$this->charset = $wpdb->get_charset_collate();
$this->tableName = $wpdb->prefix . 'pets';
// Hanya jalan sekali saat plugin diaktifkan
register_activation_hook(__FILE__, [$this, 'onActivate']);
add_action('admin_head', [$this, 'onAdminRefresh']);
add_filter('template_include', [$this, 'loadTemplate'], 99);
}
}Penting:
register_activation_hookberbeda dariadd_action('init')— hanya dijalankan sekali saat plugin di-activate, bukan setiap page load.
Method onActivate dengan dbDelta()
php
function onActivate() {
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta("CREATE TABLE {$this->tableName} (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
birthyear smallint(5) NOT NULL DEFAULT 0,
petweight smallint(5) NOT NULL DEFAULT 0,
favefood varchar(60) NOT NULL DEFAULT '',
favehobby varchar(60) NOT NULL DEFAULT '',
favecolor varchar(60) NOT NULL DEFAULT '',
petname varchar(60) NOT NULL DEFAULT '',
species varchar(60) NOT NULL DEFAULT '',
PRIMARY KEY (id)
) {$this->charset};");
}Aturan Ketat dbDelta()
Dari WordPress Codex:
- Setiap field/kolom harus di baris sendiri
- Dua spasi antara
PRIMARY KEYdan definisi(id) - Gunakan kata
KEY, bukan sinonimINDEX - Tidak boleh ada koma setelah item terakhir (sebelum closing parentheses)
Kenapa dbDelta bukan CREATE TABLE Langsung?
dbDeltaaman untuk dijalankan ulang — tidak menghapus tabel yang sudah ada- Menghitung delta (perbedaan) antara tabel saat ini vs yang diminta
- Jika tabel sudah ada → tidak ada perubahan
- Jika ada kolom baru → ditambahkan tanpa kehilangan data
Dynamic Table Name & Charset
Mengapa Dynamic?
- Prefix tabel: Default
wp_, tapi bisa custom (mis.wp2_,mysite_) - Charset: Berbeda tergantung konfigurasi database
Mengambil dari $wpdb
php
global $wpdb;
$this->charset = $wpdb->get_charset_collate();
$this->tableName = $wpdb->prefix . 'pets'; // "wp_pets"Menambah Data dengan $wpdb->insert()
Insert Satu Record
php
function onAdminRefresh() {
global $wpdb;
$wpdb->insert($this->tableName, $this->generatePet());
}$wpdb->insert()menerima 2 argumen:- Nama tabel
- Array associative (column_name => value)
Populate Massal (100.000 Records)
php
function populateFast() {
// Custom SQL INSERT dengan banyak VALUES sekaligus
// Jauh lebih cepat dari 100.000 x $wpdb->insert()
// Bukan untuk dipelajari sekarang — hanya untuk testing
}Untuk testing: ubah
onAdminRefresh→populateFastdiadd_action('admin_head'), refresh admin sekali, lalu comment out.
Load Custom Template
php
function loadTemplate($template) {
if (is_page('pet-adoption')) {
return plugin_dir_path(__FILE__) . 'inc/template-pets.php';
}
return $template;
}- Menggunakan filter
template_include - Hanya mengganti template jika slug halaman =
pet-adoption - Jika tidak → return template default