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 onAdminRefresh → populateFast 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