Sebagai pengguna WordPress yang sudah cukup mahir, Anda mungkin sudah terbiasa menginstal, mengonfigurasi, hingga mengutak-atik berbagai plugin untuk menyesuaikan fungsi website. Namun, ada kalanya plugin yang tersedia belum mampu memenuhi kebutuhan spesifik Anda. Pada kondisi seperti ini, membuat plugin WordPress sendiri bisa menjadi solusi agar fitur yang dibutuhkan dapat dibuat sesuai kebutuhan Anda.
Dalam artikel ini, kita akan memandu Anda membuat plugin WordPress pertama dari awal, mulai dari struktur folder, menulis kode, menambah keamanan dasar, sampai proses install plugin ke dashboard.
Ringkasan Cepat
- Semua kode fungsi di artikel ini ditulis berurutan di satu file yang sama, yaitu file utama plugin.
- Fungsi, shortcode, aset CSS/JS, dan halaman pengaturan ditambahkan bertahap, ditumpuk ke bawah di file yang sama.
- Keamanan dasar seperti escaping output, nonce, dan capability check wajib ada sejak awal, bukan ditambah belakangan.
- Setelah teruji di lingkungan staging, plugin bisa dikemas jadi ZIP dan diinstall seperti plugin pihak ketiga.
Apa itu Plugin pada WordPress?
Plugin adalah fitur tambahan yang dapat dipasang pada WordPress untuk menambahkan fungsi tertentu tanpa harus mengubah kode utama WordPress. Misalnya, Anda bisa menggunakan plugin untuk menambahkan formulir kontak, meningkatkan keamanan, membuat toko online, atau menambahkan fitur lain sesuai kebutuhan website.
Secara sederhana, plugin bekerja sebagai tambahan fitur yang terpisah dari sistem utama WordPress. Karena itu, Anda tidak perlu mengubah file inti WordPress atau tema untuk menambahkan fungsi baru. Plugin juga tetap dapat digunakan meskipun Anda mengganti tema website.
Jika membutuhkan fitur yang tidak tersedia pada plugin yang sudah ada, Anda juga bisa membuat plugin WordPress sendiri. Dengan cara ini, fungsi dan fitur plugin dapat dibuat sesuai kebutuhan website tanpa bergantung pada plugin dari pihak lain.
Plugin Sendiri vs Custom Code di functions.php Theme
Banyak pengguna WordPress yang sudah mahir justru terbiasa menaruh kode kustom langsung di functions.php tema aktif. Cara ini memang lebih cepat, tapi punya risiko yang sering baru terasa belakangan.
| Aspek | Kode di functions.php Tema | Plugin Terpisah |
|---|---|---|
| Saat ganti tema | Fungsi ikut hilang | Fungsi tetap aktif |
| Portabilitas | Sulit dipindahkan ke website lain | Tinggal salin folder plugin |
| Risiko error | Bisa merusak seluruh tampilan tema | Bisa dinonaktifkan sendiri tanpa mengganggu tema |
| Pengelolaan versi | Bercampur dengan kode tema | Terpisah dan lebih mudah dilacak |
Melihat perbandingan di atas, membuat plugin terpisah jelas lebih masuk akal untuk fungsi yang sifatnya jangka panjang atau ingin dipakai di beberapa website.
Apa Saja yang Dibutuhkan untuk Membuat Plugin WordPress?
Sebelum mulai menulis kode, pastikan Anda sudah menyiapkan beberapa hal berikut.
- Pemahaman dasar PHP, terutama fungsi, array, dan struktur kondisional.
- Text editor atau IDE, misalnya VS Code atau Sublime Text.
- Akses ke file manager cPanel atau FTP (misalnya FileZilla) untuk mengunggah plugin ke server.
- Website WordPress yang sebaiknya dijalankan di lingkungan uji coba terlebih dahulu, bukan langsung di website utama yang sudah live.
- Mode
WP_DEBUGaktif diwp-config.phpagar setiap error pada kode langsung terlihat saat pengujian.
Kalau website Anda menggunakan hosting cPanel, Anda bisa memanfaatkan fitur staging di WP Toolkit untuk membuat salinan uji coba tanpa mengganggu website utama, atau memakai WP-CLI kalau lebih terbiasa bekerja lewat command line.
Struktur Folder Plugin WordPress
Setiap plugin WordPress wajib berada dalam satu folder tersendiri di dalam direktori wp-content/plugins/. Untuk plugin sederhana, struktur berikut sudah cukup.

File utama harus memiliki nama yang sama dengan folder induknya, karena WordPress mengenali plugin dari file PHP yang memiliki header comment khusus, bukan dari nama foldernya saja. Folder languages/ akan berguna nanti saat plugin disiapkan untuk dibagikan ke pengguna lain.
Supaya tidak membingungkan, semua contoh fungsi PHP di artikel ini sengaja ditulis di satu file yang sama, yaitu plugin-pertama-anda.php. Setiap kode baru yang muncul di section berikutnya cukup Anda tambahkan di bagian paling bawah, di bawah kode sebelumnya, bukan dibuat sebagai file terpisah.
Cara Membuat File Utama Plugin WordPress
File utama inilah yang membuat WordPress mengenali folder Anda sebagai sebuah plugin. Buat file plugin-pertama-anda.php, lalu isi dengan kode berikut sebagai baris paling awal file.
<?php
/**
* Plugin Name: Plugin Pertama Anda
* Plugin URI: https://contoh.com
* Description: Plugin sederhana sebagai latihan pertama membuat plugin WordPress.
* Version: 1.0.0
* Author: Nama Anda
* License: GPL v2 or later
* Text Domain: plugin-pertama-anda
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Cegah akses langsung ke file.
}
Kode ini disebut header comment, isinya metadata plugin yang dibaca WordPress untuk ditampilkan di halaman Plugins. Baris if ( ! defined( 'ABSPATH' ) ) berfungsi mencegah file diakses langsung lewat URL, sehingga tidak jadi celah keamanan.
Semua kode fungsi di section-section berikutnya akan ditambahkan tepat di bawah blok ini, masih dalam file plugin-pertama-anda.php yang sama.
Step 1. Membuat Fungsi Sederhana pada Plugin
Sekarang tambahkan fungsi pertama Anda, masih di file plugin-pertama-anda.php, di bawah kode header comment tadi. Fungsi ini bernama pw_tambahkan_teks_penutup, tugasnya menambahkan kalimat penutup otomatis di setiap halaman artikel tunggal.
function pw_tambahkan_teks_penutup( $content ) {
if ( is_single() ) {
$content .= '<p>Terima kasih sudah membaca artikel ini.</p>';
}
return $content;
}
add_filter( 'the_content', 'pw_tambahkan_teks_penutup' );
Perhatikan penamaan fungsi pw_tambahkan_teks_penutup, di mana pw berperan sebagai prefix unik. Kebiasaan ini penting untuk menghindari bentrok nama fungsi dengan plugin atau tema lain yang mungkin memakai nama fungsi serupa. Baris add_filter(...) di bagian bawah adalah baris yang benar-benar “menyalakan” fungsi ini, jadi jangan sampai terlewat saat menyalin kode.
Step 2. Menambahkan Shortcode ke Plugin WordPress
Tambahkan lagi fungsi berikut di bawah function pw_tambahkan_teks_penutup tadi di file plugin-pertama-anda.php. Fungsi ini bernama pw_shortcode_sapaan, dan tugasnya membuat shortcode baru bernama sapaan yang bisa dipakai langsung di editor konten.
function pw_shortcode_sapaan( $atts ) {
$atts = shortcode_atts( array(
'nama' => 'Pembaca',
), $atts );
return 'Halo, ' . esc_html( $atts['nama'] ) . '! Selamat datang di website ini.';
}
add_shortcode( 'sapaan', 'pw_shortcode_sapaan' );
Setelah plugin aktif, Anda bisa menuliskan [sapaan nama="Lutfi"] di halaman atau artikel mana pun, dan WordPress akan otomatis menampilkan sapaan sesuai nama yang Anda tulis. Perhatikan penggunaan esc_html() yang membungkus nilai atribut, ini bukan langkah opsional karena berfungsi mencegah input berbahaya ditampilkan mentah di halaman.
Step 3. Memuat CSS dan JS dengan Benar
Tambahkan fungsi berikut di bawah fungsi shortcode tadi, masih di file plugin-pertama-anda.php yang sama. Fungsi ini bernama pw_muat_aset, tugasnya memuat file CSS dan JS yang sudah Anda siapkan di folder assets/css/style.css dan assets/js/script.js sesuai struktur folder di awal artikel.
function pw_muat_aset() {
wp_enqueue_style( 'pw-style', plugin_dir_url( __FILE__ ) . 'assets/css/style.css', array(), '1.0.0' );
wp_enqueue_script( 'pw-script', plugin_dir_url( __FILE__ ) . 'assets/js/script.js', array( 'jquery' ), '1.0.0', true );
}
add_action( 'wp_enqueue_scripts', 'pw_muat_aset' );
Menaruh <style> atau <script> langsung di dalam fungsi PHP sebaiknya dihindari, karena cara di atas membuat WordPress otomatis mengatur urutan pemuatan file, mencegah aset dimuat dua kali, dan menghindari konflik dengan plugin atau tema lain yang memuat pustaka yang sama, misalnya jQuery.
Step 4. Menambahkan Halaman Pengaturan di Plugin
Tambahkan dua fungsi berikut di bawah fungsi pw_muat_aset tadi, masih di file yang sama. Fungsi pertama, pw_tambah_menu_pengaturan, membuat menu baru di Dashboard. Fungsi kedua, pw_render_halaman_pengaturan, menampilkan isi halamannya.
function pw_tambah_menu_pengaturan() {
add_menu_page(
'Pengaturan Plugin Pertama',
'Plugin Pertama',
'manage_options',
'plugin-pertama-anda',
'pw_render_halaman_pengaturan',
'dashicons-admin-plugins',
80
);
}
add_action( 'admin_menu', 'pw_tambah_menu_pengaturan' );
Fungsi pw_render_halaman_pengaturan sengaja belum ditulis lengkap di sini, karena isi lengkapnya baru dibahas di section berikutnya, sekalian dengan pengecekan keamanannya. Kalau Anda ingin mencoba dulu tanpa fitur keamanan, isi sementara boleh sesederhana ini.
function pw_render_halaman_pengaturan() {
echo '<div class="wrap"><h1>Pengaturan Plugin Pertama</h1><p>Halaman ini bisa dikembangkan lebih lanjut sesuai kebutuhan.</p></div>';
}
Parameter 'manage_options' pada add_menu_page() menentukan siapa saja yang boleh mengakses halaman ini, dalam contoh ini hanya pengguna dengan peran administrator.
Step 5. Menambahkan Nonce dan Capability Check untuk Keamanan
Sekarang, ganti isi fungsi pw_render_halaman_pengaturan yang tadi sederhana dengan versi lengkap berikut, supaya halaman pengaturan Anda sudah punya form sekaligus pengecekan keamanannya. Fungsi lain di file yang sama tidak perlu diubah.
function pw_render_halaman_pengaturan() {
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
if ( isset( $_POST['pw_simpan'] ) ) {
if ( ! isset( $_POST['pw_nonce_field'] ) || ! wp_verify_nonce( $_POST['pw_nonce_field'], 'pw_simpan_pengaturan' ) ) {
wp_die( 'Permintaan tidak valid.' );
}
echo '<div class="notice notice-success"><p>Pengaturan berhasil disimpan.</p></div>';
}
?>
<div class="wrap">
<h1>Pengaturan Plugin Pertama</h1>
<form method="post">
<?php wp_nonce_field( 'pw_simpan_pengaturan', 'pw_nonce_field' ); ?>
<p>Halaman ini bisa dikembangkan dengan menambah field pengaturan sesuai kebutuhan.</p>
<button type="submit" name="pw_simpan" class="button button-primary">Simpan</button>
</form>
</div>
<?php
}
Ada tiga bagian penting di kode ini.
- Pertama,
current_user_can( 'manage_options' )di baris paling atas fungsi memastikan hanya administrator yang bisa membuka halaman ini. - Kedua,
wp_nonce_field( 'pw_simpan_pengaturan', 'pw_nonce_field' )diletakkan di dalam tag<form>, tugasnya menyisipkan token rahasia tersembunyi ke form. - Ketiga, saat form disubmit,
wp_verify_nonce()mencocokkan token tersebut untuk memastikan permintaan benar-benar berasal dari halaman Anda, bukan dari pihak luar. Dua lapis ini sering dilewatkan pemula, padahal jadi pertahanan dasar terhadap serangan seperti CSRF.
Step 6. Menambahkan CSS dan Javascript
Langkah selanjutnya, buatlah folder dengan nama assets. Dalam folder ini, buat juga 2 folder baru dengan nama css dan js. Lalu, tambahkan script berikut:
- buat file dengan nama
style.csspada directory /assets/css.
/*
* Stylesheet contoh untuk Plugin Pertama Anda.
* Dimuat lewat wp_enqueue_style() di plugin-pertama-anda.php.
* Silakan ganti isi file ini sesuai kebutuhan tampilan plugin Anda.
*/
.pw-sapaan {
font-weight: bold;
color: #2271b1;
}- buat file
script.jspada directory/assets/js.
/**
* Script contoh untuk Plugin Pertama Anda.
* Dimuat lewat wp_enqueue_script() di plugin-pertama-anda.php.
* Silakan ganti isi file ini sesuai kebutuhan fungsi plugin Anda.
*/
jQuery( document ).ready( function ( $ ) {
console.log( 'Plugin Pertama Anda: script berhasil dimuat.' );
} );
Step 7. Buat file readme.txt
Langkah terakhir, buatlah file readme.txt. File ini berisi informasi penting tentang sebuah folder, program, atau perangkat lunak. File ini biasanya digunakan sebagai panduan singkat untuk menjelaskan isi, cara penggunaan, atau informasi lain yang perlu diketahui pengguna.
=== Plugin Pertama Anda ===
Contributors: namaanda
Tags: latihan, plugin, wordpress
Requires at least: 6.0
Tested up to: 6.6
Requires PHP: 7.4
Stable tag: 1.0.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Plugin latihan sebagai contoh pada panduan "Cara Membuat Plugin WordPress Sendiri Sampai Bisa Di Install" di Rumahweb Journal.
== Description ==
Plugin ini berisi contoh implementasi:
* Filter the_content untuk menambah teks penutup
* Shortcode [sapaan]
* Enqueue CSS/JS
* Halaman pengaturan di Dashboard dengan nonce dan capability check
* Text domain untuk internasionalisasi
== Installation ==
1. Upload folder plugin ke direktori /wp-content/plugins/
2. Aktifkan plugin lewat menu Plugins di WordPress
3. Buka menu "Plugin Pertama" di sidebar Dashboard untuk mengakses halaman pengaturan
== Changelog ==
= 1.0.0 =
* Rilis pertama sebagai bahan latihan.
Unduh File Plugin Lengkap
Anda dapat mengunduh seluruh file script Plugin tutorial di atas melalui URL berikut.
Cara Mengaktifkan Plugin Melalui Dashboard
Setelah seluruh script selesai dibuat dan struktur folder plugin sudah sesuai dengan rancangan awal, langkah berikutnya adalah menginstal plugin melalui dashboard WordPress. Berikut langkah-langkah instalasinya.
- Login ke dashboard WordPress Anda.
- Klik menu Plugins > Add Plugins > Uploads Plugins.
- Klik Choose File, lalu unggah file plugin Anda yang telah dibuat .zip sebelumnya. Setelah itu, klik Install Now.

- Langkah terakhir, klik tombol Activate Plugin seperti gambar berikut.

Setelah plugin diaktifkan, Anda akan melihat menu baru di Dashboard WordPress Anda dengan nama ‘Plugin Pertama Anda’.

Bagaimana Cara Mengembangkan Plugin Ini?
Versi yang sudah Anda install ini baru fondasi dasarnya saja. Setelah plugin berjalan lancar, ada beberapa arah pengembangan yang dapat Anda lakukan selanjutnya, tergantung kebutuhan.
- Tambah lebih banyak shortcode atau fungsi, dengan pola penamaan prefix yang sama seperti
pw_shortcode_sapaan, supaya kode tetap konsisten dan mudah dilacak. - Ganti form pengaturan manual dengan Settings API, yaitu
register_setting(),add_settings_field(), dan sejenisnya. Form manual seperti di contoh ini cukup untuk latihan, tapi Settings API lebih aman dan lebih mudah dikembangkan kalau field pengaturannya sudah banyak. - Pisahkan kode ke beberapa file begitu
plugin-pertama-anda.phpmulai terasa panjang, misalnyaincludes/shortcodes.phpdanincludes/settings.php, lalu panggil lewatrequire_oncedi file utama. - Pakai plugin Query Monitor selama masa pengembangan untuk memantau hook mana saja yang berjalan, query database, dan potensi error, jauh lebih detail dibanding sekadar membaca
debug.log. - Terapkan WordPress Coding Standards (PHPCS) kalau plugin ini rencananya mau dipakai jangka panjang atau dikerjakan bareng orang lain, supaya gaya penulisan kode tetap seragam.
- Naikkan nomor versi di header comment setiap ada perubahan, dan catat perubahannya di
readme.txt, supaya riwayat pengembangan plugin ini tetap rapi dan mudah ditelusuri. - Simpan kode di sistem version control seperti Git, meski plugin ini sifatnya masih personal, karena akan sangat membantu kalau suatu saat perlu membalikkan perubahan yang ternyata bermasalah.
Kalau ke depannya plugin ini ingin dipublikasikan secara luas, langkah lanjutannya adalah menyesuaikan dengan pedoman resmi WordPress.org sebelum diajukan ke direktori plugin publik.
Cara Mengatasi White Screen of Death Saat Plugin Gagal Aktif
Layar putih kosong setelah mengaktifkan plugin hampir selalu berarti ada galat fatal pada kode PHP, misalnya ada fungsi yang tertulis dua kali atau tanda kurung kurawal yang tidak seimbang. Aktifkan WP_DEBUG dan WP_DEBUG_LOG di wp-config.php, lalu periksa file wp-content/debug.log untuk melihat baris kode mana yang bermasalah.
Kalau website sampai tidak bisa diakses sama sekali, Anda tetap bisa memulihkannya lewat FTP atau file manager cPanel dengan mengganti nama folder plugin tersebut, misalnya menjadi plugin-pertama-anda-nonaktif. Langkah ini otomatis menonaktifkan plugin dari sisi server tanpa perlu masuk ke Dashboard.
Menyiapkan Plugin untuk Dibagikan
Kalau plugin ini nantinya ingin dibagikan atau dijual, ada satu langkah tambahan yang perlu disiapkan sejak awal, yaitu internasionalisasi lewat text domain. Tambahkan fungsi berikut di bagian bawah file yang sama, setelah semua fungsi sebelumnya.
function pw_muat_textdomain() {
load_plugin_textdomain( 'plugin-pertama-anda', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
}
add_action( 'plugins_loaded', 'pw_muat_textdomain' );
Setelah itu, bungkus setiap teks yang tampil ke pengguna dengan fungsi seperti esc_html__( 'Teks Anda', 'plugin-pertama-anda' ), bukan menuliskannya langsung sebagai string biasa. Kebiasaan ini membuat plugin Anda lebih siap dipakai oleh pengguna dari berbagai negara.
Kesalahan yang Sering Terjadi Saat Membuat Plugin WordPress
Beberapa kesalahan berikut cukup umum terjadi, terutama saat baru pertama kali membuat plugin.
- Lupa menambahkan header comment, sehingga WordPress tidak mengenali file sebagai plugin.
- Tidak memberi prefix unik pada nama fungsi, yang berisiko bentrok dengan plugin lain.
- Menampilkan input pengguna tanpa proses escaping, yang membuka celah keamanan.
- Melewatkan nonce dan capability check pada form atau aksi yang mengubah data.
- Menguji langsung di website utama tanpa lingkungan staging, sehingga kesalahan kode berdampak ke pengunjung nyata.
- Struktur folder ZIP yang salah, misalnya folder bersarang ganda, sehingga proses install gagal.
Tips Membuat Plugin WordPress yang Aman dan Mudah Dikembangkan
Agar plugin buatan Anda tidak hanya berfungsi, tapi juga aman dan mudah dikembangkan di kemudian hari, terapkan beberapa kebiasaan berikut.
- Gunakan prefix yang konsisten untuk semua nama fungsi, kelas, dan variabel global.
- Selalu bungkus output dengan fungsi escaping seperti
esc_html(),esc_attr(), atauesc_url(). - Kalau kode sudah mulai banyak, pisahkan ke beberapa file lewat
require_once, jangan menumpuk semua logika di satu file utama selamanya. - Uji setiap perubahan kode di lingkungan staging sebelum diterapkan ke website utama.
- Tambahkan file
readme.txtsederhana agar Anda sendiri mudah mengingat fungsi plugin ini di masa depan.
FAQ
Berikut adalah beberapa pertanyaan umum tentang cara membuat plugin WordPress.
Apakah membuat plugin WordPress butuh keahlian coding tingkat lanjut?
Tidak selalu. Pemahaman dasar PHP dan struktur WordPress seperti hook sudah cukup untuk membuat plugin sederhana. Kompleksitas kode bisa ditingkatkan secara bertahap sesuai kebutuhan fitur Anda.
Apakah plugin buatan sendiri aman digunakan di website utama?
Aman, selama sudah diuji terlebih dahulu di lingkungan staging dan mengikuti praktik keamanan dasar seperti escaping output, nonce, dan validasi input. Menguji langsung di website live tanpa uji coba sebelumnya justru berisiko menyebabkan error yang berdampak ke pengunjung.
Apakah plugin harus di-upload dalam bentuk ZIP untuk bisa diinstall?
Tidak harus. Anda bisa langsung mengunggah folder plugin ke wp-content/plugins/ lewat FTP atau file manager cPanel saat masih dalam tahap pengembangan. Format ZIP lebih dibutuhkan saat plugin akan dibagikan atau diinstall lewat Dashboard WordPress.
Bagaimana cara memperbarui plugin yang sudah pernah diinstall?
Cukup ubah nomor versi di header comment, perbarui kodenya, lalu ganti file yang ada di server dengan versi terbaru lewat FTP atau file manager. Jika sudah dalam bentuk ZIP, Anda juga bisa menghapus plugin lama lalu menginstall ulang file ZIP versi terbaru.
Apakah plugin buatan sendiri bisa dijual atau dibagikan ke orang lain?
Bisa. Selama kode tersebut murni buatan Anda atau tidak melanggar lisensi kode pihak ketiga yang digunakan, plugin tersebut bebas dibagikan secara gratis maupun dijual, misalnya lewat marketplace plugin WordPress.
Penutup
Membuat plugin WordPress sendiri sebenarnya bukan hal yang rumit begitu Anda memahami struktur dasarnya, mulai dari header comment, hook, halaman pengaturan, sampai lapisan keamanan seperti nonce dan capability check. Dengan mengikuti langkah-langkah di atas, Anda sudah punya modal cukup untuk mempraktikkan cara membuat plugin WordPress sesuai kebutuhan spesifik website Anda sendiri.
Proses uji coba akan jauh lebih tenang jika Anda memiliki lingkungan staging dan akses server yang mudah dikelola. Layanan Shared Hosting Rumahweb menyediakan cPanel lengkap dengan file manager, WP Toolkit, dan dukungan WP-CLI, sehingga Anda bisa mengunggah, menguji, sampai mengaktifkan plugin buatan sendiri tanpa perlu khawatir mengganggu website utama.


