Panduan Utama Pengembangan Plugin WordPress: Membangun Plugin Pertama Anda dari Nol Hingga Selesai.

3 menit baca
2026-03-15
2026-06-04
2,385
Saya mendapatkan komisi ketika Anda berbelanja melalui tautan di bawah ini, tanpa biaya tambahan untuk Anda.

Preparasi dan pengaturan lingkungan.

Sebelum memulai menulis kode, Anda memerlukan lingkungan pengembangan yang sesuai. Ini mencakup instalasi WordPress lokal, editor kode, serta pengetahuan dasar tentang PHP. Kami merekomendasikan penggunaan XAMPP, MAMP, atau Local by Flywheel untuk dengan cepat membangun lingkungan WordPress lokal. Pastikan versi PHP yang Anda gunakan memenuhi persyaratan resmi WordPress, yaitu PHP 7.4 atau versi yang lebih baru.

Sebuah plugin pada dasarnya merupakan satu atau lebih file PHP yang ditempatkan di dalam struktur WordPress.wp-content/pluginsSetiap plugin harus memiliki nama yang unik, dan bagian awal (header) dari file utamanya perlu memuat komentar informasi plugin yang standar. Ini merupakan dasar bagi WordPress untuk mengenali sebuah plugin.

Buatlah file plugin pertamamu.

Pertama, diwp-content/pluginsBuatlah folder baru di dalam direktori tersebut, misalnya…my-first-pluginKemudian, buat file PHP utama di dalam folder tersebut; file tersebut biasanya memiliki nama yang sama dengan foldernya.my-first-plugin.phpDalam berkas ini, Anda perlu menulis informasi header untuk plugin tersebut.

推荐阅读 Panduan Lengkap Pengembangan Plugin WordPress: Membangun Plugin Pertama Anda dari Nol hingga Satu.

<?php
/**
 * Plugin Name:       我的第一个插件
 * Plugin URI:        https://example.com/my-first-plugin
 * Description:       这是一个学习WordPress插件开发的示例插件。
 * Version:           1.0.0
 * Author:            你的名字
 * Author URI:        https://example.com
 * License:           GPL v2 or later
 * Text Domain:       my-first-plugin
 */

Setelah menyimpan file tersebut, masuklah ke halaman “Plugins” di panel administrasi WordPress. Anda seharusnya dapat melihat “My First Plugin” muncul dalam daftar plugin. Aktifkan plugin tersebut. Meskipun plugin ini belum memiliki fungsi apa pun, hal ini menandakan bahwa plugin Anda telah berhasil diunduh dan diinstal oleh WordPress.

UltaHost – Hosting untuk WordPress
Jaminan pengembalian uang dalam 30 hari, bandwidth dan basis data yang tidak terbatas, perlindungan DDoS gratis, diskon 50% untuk pembelian selama 3 tahun (dari harga normal: 50%).

Memahami Mekanisme Inti WordPress: Hook dan Filter

Kekuatan ekstensibilitas WordPress berasal dari arsitekturnya yang berbasis event-driven, dengan inti utamanya adalah “Hook” (Pengait). Hook terbagi menjadi dua jenis: Action (Aksi) dan Filter (Filter). Memahami kedua jenis Hook ini sangat penting untuk mengembangkan plugin yang efektif.

Action hooks memungkinkan Anda untuk menyisipkan dan menjalankan kode Anda sendiri pada titik waktu tertentu, seperti saat artikel diterbitkan atau halaman dimuat. Misalnya, Anda dapat mengirim surel saat sebuah artikel diterbitkan. Anda dapat menggunakan action hooks untuk melakukan hal tersebut.add_action()Fungsi tersebut akan menghubungkan (meng-montek) fungsi kustom Anda ke hook aksi yang telah ditentukan.

Filter hooks memungkinkan Anda untuk memodifikasi data. Sebelum data digunakan (misalnya, disimpan ke dalam basis data atau ditampilkan di browser), Anda dapat mengintersep dan mengubahnya. Misalnya, Anda dapat mengubah judul artikel atau isi komentar. Anda dapat menggunakan…add_filter()Fungsi tersebut digunakan untuk menerapkan filter.

Menggunakan action hook untuk menambahkan fitur

Misalkan kita ingin menambahkan baris teks kustom di bagian kaki (footer) halaman administrasi situs web. WordPress menyediakan sebuah fitur yang bernama…admin_footerKita dapat menambahkan kode berikut ke dalam file utama plugin untuk mengaktifkan hook aksi tersebut:

推荐阅读 Panduan Memulai untuk Pengembang Plugin WordPress: Membangun Plugin Fungsional Pertama Anda dari Nol.

// 定义一个在管理后台页脚显示信息的函数
function myplugin_display_admin_footer_text() {
    echo '<p>Terima kasih telah menggunakan “My First Plugin”!</p>';
}
// 将函数挂载到 admin_footer 动作钩子
add_action( 'admin_footer', 'myplugin_display_admin_footer_text' );

Simpan file tersebut, lalu refresh halaman backend WordPress. Gulir ke bagian bawah halaman (footer), dan Anda seharusnya dapat melihat teks yang telah ditambahkan. Itulah aplikasi dasar dari action hook: menjalankan kode di posisi tertentu dalam aplikasi.

Menggunakan filter untuk memodifikasi konten.

Sekarang, mari kita coba mengubah semua judul artikel dengan menambahkan simbol merek di akhir judul tersebut secara seragam. Kita bisa menggunakan…the_titleFilter.

// 定义一个修改文章标题的函数
function myplugin_modify_post_title( $title, $post_id ) {
    // 确保只在主循环且非管理后台中修改
    if ( ! is_admin() && in_the_loop() ) {
        $title = $title . ' ™';
    }
    return $title;
}
// 将函数挂载到 the_title 过滤器钩子,参数2表示接受2个参数
add_filter( 'the_title', 'myplugin_modify_post_title', 10, 2 );

Kode ini akan memeriksa apakah lingkungan saat ini berada dalam siklus utama penulisan artikel di frontend (tampilan web). Jika iya, maka simbol “™” akan ditambahkan setelah judul artikel.10Ini merupakan urutan prioritas (semakin kecil angkanya, semakin dulu proses tersebut akan dieksekusi).2Ini menunjukkan bahwa fungsi kita menerima dua parameter (yang asli).$title$post_id)。

hosting.com hosting bersama
Kinerja tinggi, dilengkapi dengan CPU AMD EPYC, penyimpanan SSD NVMe, dan LiteSpeed, dukungan internal ahli 24 jam sehari, langkah-langkah keamanan canggih termasuk SSL, brute force, malware, dan perlindungan DDoS, menghemat hingga 731 TB/bulan.

Membangun fitur plugin: Membuat menu manajemen dan halaman pengaturan

Sebuah plugin yang matang biasanya perlu menyediakan opsi konfigurasi di panel administrasi WordPress. Hal ini melibatkan pembuatan halaman menu administrasi khusus untuk plugin tersebut. WordPress menyediakan berbagai fungsi API yang memungkinkan hal ini dilakukan.add_menu_page()add_options_page()

Tambahkan menu manajemen tingkat atas (top-level management menu).

Kami akan menambahkan menu utama yang terpisah untuk plugin tersebut. Hal ini biasanya dilakukan…admin_menuSemua tindakan dilakukan dalam “action hook” tersebut. Kita akan membuat sebuah fungsi untuk mendefinisikan menu dan halaman (page).

// 定义添加管理菜单的函数
function myplugin_add_admin_menu() {
    add_menu_page(
        '我的插件设置',           // 页面标题
        '我的插件',               // 菜单标题
        'manage_options',         // 所需权限(管理员)
        'myplugin-settings-page', // 菜单slug(唯一标识)
        'myplugin_display_settings_page', // 用于显示页面内容的回调函数
        'dashicons-admin-generic', // 菜单图标(Dashicons)
        30                        // 菜单位置
    );
}
// 将函数挂载到 admin_menu 钩子
add_action( ‘admin_menu’, ‘myplugin_add_admin_menu’ );

Selanjutnya, kita perlu mendefinisikan fungsi panggilan balik (callback function).myplugin_display_settings_page()Ini adalah kode HTML untuk merender halaman pengaturan:

推荐阅读 Pengembangan Plugin WordPress, Dari Pemula hingga Ahli: Panduan Lengkap untuk Membangun Fitur Kustom.

// 定义设置页面的显示内容
function myplugin_display_settings_page() {
    ?&gt;
    <div class="wrap">
        <h1>Pengaturan plugin saya</h1>
        <form method="post" action="/id/options.php/" data-trp-original-action="options.php">
            <?php
            // 输出设置字段、安全nonce等
            settings_fields( ‘myplugin_settings_group’ );
            do_settings_sections( ‘myplugin-settings-page’ );
            submit_button();
            ?>
        <input type="hidden" name="trp-form-language" value="id"/></form>
    </div>
    \n&lt;?php
}

Pengaturan Pendaftaran, Bidang (Fields), dan Partisi (Partitions)

Untuk memproses data formulir dengan aman, kita perlu menggunakan API pengaturan (settings API) dari WordPress. Hal ini mencakup proses pendaftaran pengaturan, penambahan bagian pengaturan (settings sections), serta penambahan field (kolom data).

// 初始化插件设置
function myplugin_settings_init() {
    // 1. 注册一个设置(存储在wp_options表中)
    register_setting(
        ‘myplugin_settings_group’, // 设置组名,与 settings_fields() 对应
        ‘myplugin_options’ // 存储在数据库中的选项名
    );

// 2. 添加一个设置分区
    add_settings_section(
        ‘myplugin_section_basic’, // 分区ID
        ‘基础设置’, // 分区标题
        ‘myplugin_section_basic_callback’, // 分区介绍的回调函数
        ‘myplugin-settings-page’ // 所属页面的slug
    );

// 3. 为分区添加一个字段
    add_settings_field(
        ‘myplugin_field_message’, // 字段ID
        ‘欢迎信息’, // 字段标签
        ‘myplugin_field_message_callback’, // 渲染字段HTML的回调函数
        ‘myplugin-settings-page’, // 所属页面的slug
        ‘myplugin_section_basic’ // 所属分区的ID
    );
}
add_action( ‘admin_init’, ‘myplugin_settings_init’ );

// 分区介绍的回调函数
function myplugin_section_basic_callback() {
    echo ‘<p>Konfigurasi informasi dasar dari plugin.</p>’;
}

// 字段渲染的回调函数
function myplugin_field_message_callback() {
    // 从数据库获取现有值
    $options = get_option( ‘myplugin_options’ );
    $value = $options[‘message’] ?? ‘’; // PHP 7.0+ 空合并运算符
    // 输出输入框
    echo ‘<input type="“text”" name="“myplugin_options[message]”" value="“‘" . esc_attr( $value ) ‘” class ="“regular-text”" />‘;
}

Sekarang, plugin Anda telah memiliki halaman pengaturan administrasi yang lengkap dan sesuai dengan standar WordPress, yang memungkinkan Anda untuk menyimpan dan membaca opsi konfigurasi dengan aman.

Hosting bersama InterServer.
Hosting bersama seharga $2,50 USD per bulan, diskon $0,1 USD untuk bulan pertama dengan kode promo tryinterserver, serta 461 skrip aplikasi cloud yang dapat diinstal dengan sekali klik.

Best Practices for Plugin Internationalization and Security

Agar plugin Anda dapat digunakan oleh pengguna di seluruh dunia, internasionalisasi (i18n) merupakan langkah yang sangat penting. Selain itu, mematuhi standar keamanan merupakan dasar untuk melindungi Anda dan situs web pengguna dari serangan.

Mengimplementasikan internasionalisasi teks

WordPress digunakan untuk membuat dan mengelola situs web.__()_e()Fungsi-fungsi seperti ini digunakan untuk melakukan penerjemahan. Pertama-tama, Anda perlu memastikan bahwa pengaturan yang diperlukan telah benar-benar dilakukan di bagian awal (header) plugin.Text Domain(Contohnya:my-first-pluginKemudian, bungkus semua string yang ditujukan untuk pengguna dengan fungsi penerjemahan.

// 在插件代码中,将硬编码的文本替换
// 修改前:echo ‘<p>Terima kasih telah menggunakan “My First Plugin”!</p>’;
// 修改后:
function myplugin_display_admin_footer_text() {
    echo ‘<p>‘ . esc_html__( ‘感谢使用“我的第一个插件”!’, ‘my-first-plugin’ ) . ‘</p>’;
}

Selanjutnya, Anda perlu menggunakan alat seperti Poedit untuk menghasilkan (generate) apa yang dimaksud..pot(Berkas template) diletakkan di dalam plugin.languagesDi dalam folder tersebut..poDan yang telah dikompilasi.moFile. Terakhir, gunakan file tersebut saat plugin diinisialisasi.load_plugin_textdomain()Memuat dan menerjemahkan fungsi.

function myplugin_load_textdomain() {
    load_plugin_textdomain( ‘my-first-plugin’, false, dirname( plugin_basename( __FILE__ ) ) . ‘/languages/’ );
}
add_action( ‘plugins_loaded’, ‘myplugin_load_textdomain’ );

Patuhi standar pengkodean yang aman.

Keamanan adalah hal yang paling penting. Pertama-tama, jangan pernah mempercayai data yang dimasukkan oleh pengguna. Semua data yang berasal dari pengguna atau sumber eksternal…$_GET$_POST$_COOKIESemuanya harus melalui proses verifikasi, pembersihan, dan pengkodean (escaping).

  • Output yang di-ekspos: Saat data dihasilkan untuk ditampilkan di HTML, JavaScript, atau URL, gunakan fungsi ekspresi (escape function) yang sesuai.
    // 输出到HTML属性
    echo ‘<input value="“‘" . esc_attr( $value ) ‘“ />‘;
    // 输出到HTML内容
    echo ‘<p>‘\n ‘ . esc_html( $text ) . '</p>’;
    // 输出到JavaScript变量
    echo ‘<script>var msg = “‘ . esc_js( $message ) . ‘“;</script>’;
    // 输出到URL
    echo ‘<a href="/id/“‘/" . esc_url( $url ) ‘“>tautan (di situs web)</a>’;
  • Verifikasi masukan: Periksa apakah data tersebut memenuhi format yang diharapkan (misalnya, apakah berupa alamat email atau angka).
    if ( ! filter_var( $email, FILTER_VALIDATE_EMAIL ) ) {
        // 不是有效的邮箱地址
        wp_die( ‘无效的邮箱格式。’ );
    }
  • Pemeriksaan Kemampuan: Sebelum melakukan operasi manajemen, periksa apakah pengguna saat ini memiliki hak akses yang diperlukan.
    if ( ! current_user_can( ‘manage_options’ ) ) {
        wp_die( ‘你没有执行此操作的权限。’ );
    }
  • Validasi Nonce: Untuk operasi yang mengubah status (seperti pengiriman formulir, permintaan AJAX), Nonce (angka satu kali pakai) digunakan untuk mencegah serangan penipuan permintaan lintas situs (Cross-Site Request Forgery/CSRF).
    // 在表单中输出nonce字段
    wp_nonce_field( ‘myplugin_action’, ‘myplugin_nonce’ );
    // 在处理请求时验证nonce
    if ( ! isset( $_POST[‘myplugin_nonce’] ) || ! wp_verify_nonce( $_POST[‘myplugin_nonce’], ‘myplugin_action’ ) ) {
        wp_die( ‘安全校验失败。’ );
    }

Menyimpulkan.

Dengan panduan ini, Anda telah menyelesaikan seluruh proses mulai dari membuat file plugin dasar, memahami dan menggunakan sistem hook dari WordPress core, membangun antarmuka administrasi, hingga menerapkan praktik keamanan dasar. Anda kini telah menguasai keterampilan inti yang diperlukan untuk mengembangkan plugin WordPress yang memiliki fungsi lengkap, struktur yang jelas, dan keamanan serta keandalan yang tinggi. Inti dari pengembangan plugin terletak pada penggunaan hook aksi (actions) dan filter dengan baik untuk memperluas fungsi WordPress, sambil selalu mengutamakan aspek keamanan dan kemudahan pemeliharaan. Selanjutnya, Anda dapat mencoba mengeksplorasi API yang lebih kompleks, seperti tabel basis data khusus, interaksi AJAX, atau endpoint REST API, untuk membuat alat yang lebih kuat.

FAQ - Pertanyaan yang Sering Diajukan.

Apa saja pengetahuan dasar yang diperlukan untuk mengembangkan plugin WordPress dengan kode ###?
Anda perlu memiliki pengetahuan dasar dalam pemrograman PHP, serta pemahaman tentang HTML, CSS, dan JavaScript (terutama jQuery) yang akan sangat membantu. Yang paling penting, Anda perlu memiliki pemahaman awal tentang arsitektur dasar WordPress, seperti tema, plugin, jenis artikel, peran pengguna, dan konsep-konsep terkait lainnya. Panduan ini mengasumsikan bahwa Anda telah mempunyai pengetahuan dasar tersebut.

Bagaimana cara men-debug plugin WordPress saya?

Pertama-tama, pastikan bahwa…wp-config.phpDi dalam file tersebut,WP_DEBUGKonstanta diatur ketrueIni akan menampilkan kesalahan PHP, peringatan, dan pemberitahuan di halaman web. Selanjutnya, Anda dapat menggunakan…error_log()Fungsi tersebut menulis informasi debug ke log kesalahan server. Untuk debugging yang lebih kompleks, Anda dapat mempertimbangkan untuk menggunakan plugin debug khusus, seperti Query Monitor, yang dapat memberikan akses ke detail seperti hasil kueri database, eksekusi fungsi hook (hook functions), proses pengambilan file skrip (script loading), dan lainnya.

Bagaimana saya sebaiknya mendistribusikan plugin yang saya kembangkan?

Untuk penggunaan pribadi atau pembagian dalam skala kecil, Anda dapat langsung mengompres file menjadi format ZIP. Jika Anda ingin mempublikasikannya secara umum, ada dua cara utama: pertama, mengirimkannya ke direktori plugin resmi WordPress (WordPress.org), yang memerlukan Anda untuk mengikuti panduan pengiriman dan standar kode yang ditetapkan oleh mereka; dengan cara ini, plugin Anda akan mendapatkan eksposur yang paling luas. Kedua, mendistribusikannya melalui situs web Anda sendiri atau platform pihak ketiga seperti CodeCanyon. Sebelum mengirimkan plugin ke direktori resmi, pastikan terlebih dahulu kualitas dan keamanan kode tersebut.

Bagaimana cara menambahkan jenis artikel atau kategori khusus untuk plugin saya?

Anda dapat menggunakannya.register_post_type()Fungsi untuk membuat jenis artikel kustom (Custom Post Type/CPT), gunakan…register_taxonomy()Fungsi tersebut digunakan untuk membuat klasifikasi (pengelompokan) yang disesuaikan dengan kebutuhan. Operasi-operasi ini sebaiknya dilakukan di…initEksekusi dilakukan dalam “action hook”. WordPress Codex dan Developer Handbook memberikan penjelasan rinci mengenai parameter kedua fungsi tersebut; ini merupakan cara yang sangat efektif untuk memperluas kemampuan manajemen konten WordPress.

Bagaimana cara menghindari konflik nama fungsi dalam sebuah plugin dengan plugin lain?

Untuk mencegah konflik antara nama fungsi, nama kelas, atau nama konstanta, praktik terbaik adalah dengan menggunakan namespace (PHP 5.3+). Jika plugin Anda perlu mendukung versi PHP yang lebih lama, atau Anda ingin menjaga tingkat kompatibilitas yang maksimal, Anda dapat menggunakan metode dengan menambahkan prefiks unik pada semua identifikasi. Misalnya, gunakan nama plugin atau singkatan sebagai prefiks.myplugin_function_nameMyPlugin_ClassNameMYPLUGIN_CONSTANTContoh kode dalam panduan ini semuanya menggunakan metode penamaan berbasis prefiks (prefix).