Skip to content

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.css

Membuat 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_hook berbeda dari add_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:

  1. Setiap field/kolom harus di baris sendiri
  2. Dua spasi antara PRIMARY KEY dan definisi (id)
  3. Gunakan kata KEY, bukan sinonim INDEX
  4. Tidak boleh ada koma setelah item terakhir (sebelum closing parentheses)

Kenapa dbDelta bukan CREATE TABLE Langsung?

  • dbDelta aman 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:
    1. Nama tabel
    2. 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 onAdminRefreshpopulateFast di add_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