Dasar-Dasar Pengembangan Plugin WordPress
Sebelum mempelajari kode secara mendalam, sangat penting untuk memahami konsep dan struktur dasar plugin WordPress. Plugin WordPress pada dasarnya adalah skrip PHP tambahan yang berinteraksi dengan inti sistem WordPress melalui sistem hook yang disediakan oleh WordPress, sehingga dapat memperluas atau mengubah fungsi situs web. Plugin tersebut dapat berupa file tunggal, atau juga dapat berupa direktori lengkap yang berisi beberapa file, tabel gaya CSS (CSS stylesheets), dan skrip JavaScript.
Tugas utama dalam pengembangan plugin adalah membuat sebuah file utama yang memenuhi standar yang ditetapkan. File utama ini biasanya diberi nama sesuai dengan nama plugin tersebut, misalnya…my-custom-plugin.phpDi bagian awal file tersebut, harus terdapat blok komentar informasi plugin yang standar. Komentar ini tidak hanya berfungsi untuk menjelaskan plugin Anda kepada WordPress, tetapi juga akan ditampilkan di halaman manajemen plugin di backend.
/**
* Plugin Name: 我的自定义功能扩展
* Plugin URI: https://example.com/my-custom-plugin
* Description: 这是一个用于演示的WordPress插件,用于添加自定义功能。
* Version: 1.0.0
* Author: 开发者名称
* Author URI: https://example.com
* License: GPL v2 or later
* Text Domain: my-custom-plugin
*/ Yang terdapat dalam komentar (in the comments).Plugin NameIni merupakan kolom wajib (required); kolom lainnya bersifat opsional (optional), namun disarankan untuk diisi. Setelah file ini dibuat, letakkanlah file tersebut di…/wp-content/plugins/Sebuah folder independen di dalam direktori (misalnya…)my-custom-pluginDi sana, Anda dapat melihat dan mengaktifkannya di halaman “Plugin” di panel administrasi WordPress (WordPress backend).
Mekanisme inti dari plugin WordPress didasarkan pada konsep “hook” (pautan/ikatan). Ada dua jenis hook: action hook dan filter hook.(Action Hooks)And filter hooks(Filter Hooks)Action hooks memungkinkan Anda untuk menjalankan kode kustom pada titik waktu tertentu, seperti saat halaman dimuat atau saat artikel diterbitkan.add_action()Fungsi tersebut akan menghubungkan (meng-montek) fungsi Anda ke mekanisme tindakan (action hook) yang tersedia.
Hook filter memungkinkan Anda untuk memodifikasi data yang dihasilkan selama proses. Misalnya, isi artikel akan melewati serangkaian filter sebelum ditampilkan.add_filter()Fungsi dapat memodifikasi data tersebut.
Internasionalisasi dan lokalisasi merupakan bagian yang tidak terpisahkan dari plugin profesional. Dengan menggunakan…__( ‘文本’, ‘text-domain’ )或_e( ‘文本’, ‘text-domain’ )Fungsi tersebut membungkus semua string yang terlihat oleh pengguna, dan bersama dengan bidang teks yang diunduh, memungkinkan plugin untuk mendukung berbagai bahasa.Text DomainHarus sesuai dengan informasi yang didefinisikan dalam header plugin, biasanya berupa nama direktori plugin atau versi slug dari nama file utama plugin.
Buatlah plugin fungsional pertamamu.
Mari kita mulai dengan membuat sebuah plugin sederhana yang akan menambahkan kolom manajemen khusus ke daftar artikel di situs web, untuk menampilkan statistik jumlah kata dari setiap artikel. Contoh ini mencakup proses dasar dalam membuat plugin, penggunaan “hook” (fungsi khusus dalam kode plugin), dan cara menghasilkan output yang aman (aman dari segi keselamatan kode).
Pertama-tama, di dalam dokumen Anda…/wp-content/plugins/Buatlah sebuah folder baru di dalam direktori tersebut, dan beri nama folder tersebut…my-first-extensionDalam folder tersebut, buatlah file utama (main file).my-first-extension.phpDan tambahkan informasi header plugin yang telah dijelaskan pada bagian sebelumnya.
Selanjutnya, kita perlu menambahkan kolom baru ke daftar manajemen artikel. Hal ini melibatkan dua hook aksi (action hooks):manage_posts_columns和manage_posts_custom_columnYang pertama digunakan untuk mendefinisikan judul kolom baru, sedangkan yang kedua digunakan untuk mengisi isi setiap baris dalam kolom tersebut.
// 为文章列表添加“字数统计”列
function mfe_add_word_count_column( $columns ) {
$columns['word_count'] = __( '字数统计', 'my-first-extension' );
return $columns;
}
add_filter( 'manage_posts_columns', 'mfe_add_word_count_column' );
// 填充“字数统计”列的内容
function mfe_display_word_count_column( $column, $post_id ) {
if ( $column === 'word_count' ) {
$post_content = get_post_field( 'post_content', $post_id );
$word_count = str_word_count( strip_tags( $post_content ) );
echo esc_html( $word_count );
}
}
add_action( 'manage_posts_custom_column', 'mfe_display_word_count_column', 10, 2 ); Dalam potongan kode ini,mfe_add_word_count_columnFungsi tersebut menerima array kolom yang sudah ada, lalu menambahkan kolom baru ke dalamnya.word_countKirimkan kunci tersebut, dan kembalikan array yang telah diubah.add_filterHubungkanlah ke…manage_posts_columnsDi atas filter.mfe_display_word_count_columnFungsi tersebut pertama-tama memeriksa apakah kolom yang sedang diproses adalah “word_count” yang telah kita tambahkan, kemudian mengambil isi artikel tersebut, dan menggunakan…strip_tags()Silakan hapus tag HTML-nya, lalu gunakan kembali kontennya.str_word_count()Hitung jumlah kata (dalam kasus bahasa Cina, jumlah karakter), lalu gunakan hasilnya.esc_html()Setelah melakukan proses ekspansi keamanan (security escape), hasilnya akan dikeluarkan.
Plugin sederhana ini sudah memiliki fitur dasar, tetapi sebuah plugin yang lebih profesional seharusnya mempertimbangkan untuk melakukan beberapa tindakan saat plugin diaktifkan atau dinonaktifkan. Misalnya, kita dapat membuat tabel database khusus atau membersihkan opsi sementara. Hal ini dapat dicapai dengan mendaftarkan fungsi “hook” (fungsi yang dieksekusi pada saat tertentu) saat plugin diaktifkan atau dinonaktifkan.
// 插件激活时执行的操作
function mfe_plugin_activation() {
// 例如:添加一个版本号选项,用于后续升级判断
if ( ! get_option( 'mfe_plugin_version' ) ) {
add_option( 'mfe_plugin_version', '1.0.0' );
}
// 触发一个自定义动作,供其他开发者扩展
do_action( 'mfe_plugin_activated' );
}
register_activation_hook( __FILE__, 'mfe_plugin_activation' );
// 插件停用时执行的操作
function mfe_plugin_deactivation() {
// 例如:清除计划任务或临时数据
// 注意:通常不在停用时删除用户数据(如表)
}
register_deactivation_hook( __FILE__, 'mfe_plugin_deactivation' ); Harap perhatikan,register_activation_hook和register_deactivation_hookDiperlukan path lengkap dari file utama (main file).FILEKonstanta tersebut digunakan sebagai parameter pertama. Logika untuk mengaktifkan, menonaktifkan, dan menghapus plugin (penghapusan terjadi ketika pengguna menghapus plugin tersebut) harus diproses secara terpisah.
Membuat halaman pengaturan plugin
Sebuah plugin yang memiliki fitur yang lengkap biasanya perlu menyediakan opsi konfigurasi bagi pengguna. Cara yang paling standar adalah dengan membuat halaman pengaturan di backend WordPress. Hal ini dapat dilakukan dengan menggunakan…add_menu_page()或add_options_page()Fungsi-fungsi tersebut dapat diimplementasikan menggunakan berbagai metode atau algoritma tertentu.
Mari kita buat terlebih dahulu sebuah item menu tingkat atas (top-level menu item). Dalam contoh di bawah ini,mfe_create_admin_menuPenggunaan Fungsiadd_menu_page()Mari tambahkan sebuah halaman baru. Fungsi ini memerlukan judul halaman, judul menu, izin yang diperlukan, slug menu, fungsi callback untuk menghasilkan isi halaman, URL ikon, serta posisi menu dalam struktur menu.
推荐阅读 Mulai dari nol: Panduan lengkap untuk pengembangan plugin WordPress dan berbagi praktik terbaik.。
// 创建后台管理菜单
function mfe_create_admin_menu() {
add_menu_page(
__( '我的扩展设置', 'my-first-extension' ), // 页面标题
__( '我的扩展', 'my-first-extension' ), // 菜单标题
'manage_options', // 权限(管理员)
'mfe-settings', // 菜单slug
'mfe_settings_page_html', // 显示页面内容的函数
'dashicons-admin-generic', // 图标
80 // 位置
);
}
add_action( 'admin_menu', 'mfe_create_admin_menu' ); Selanjutnya, kita perlu mendefinisikan…mfe_settings_page_htmlFungsi tersebut digunakan untuk merender konten halaman. Sebuah halaman pengaturan yang profesional seharusnya menggunakan API pengaturan standar WordPress, yang bertanggung jawab untuk menangani proses pengiriman formulir, validasi data, serta berbagai tugas lainnya yang bersifat tidak aman (non-secure). Pertama-tama, kita perlu menggunakan…register_setting()Daftarkan sebuah grup pengaturan (setting group) dan beberapa bidang data (fields).
// 初始化设置
function mfe_settings_init() {
// 注册一个新的设置组 “mfe_settings_group” 到页面 “mfe-settings”
register_setting( 'mfe-settings', 'mfe_settings_options' );
// 在设置组内添加一个区域(Section)
add_settings_section(
'mfe_settings_section',
__( '基本设置', 'my-first-extension' ),
'mfe_settings_section_cb',
'mfe-settings'
);
// 在区域内添加一个字段
add_settings_field(
'mfe_field_api_key',
__( 'API密钥', 'my-first-extension' ),
'mfe_field_api_key_cb',
'mfe-settings',
'mfe_settings_section',
[ 'label_for' => 'mfe_field_api_key' ]
);
}
add_action( 'admin_init', 'mfe_settings_init' ); Kemudian, kita perlu mendefinisikan fungsi panggilan balik (callback) untuk area tertentu dan fungsi panggilan balik untuk setiap bidang (field) agar dapat menghasilkan kode HTML. Fungsi panggilan balik untuk bidang sangat penting, karena fungsi ini bertugas merender kotak masukan formulir dan memastikan bahwa nilai yang dimasukkan oleh pengguna sesuai dengan pengaturan yang telah disimpan sebelumnya.
// 设置区域的说明文本
function mfe_settings_section_cb( $args ) {
?>
<p id="<?php echo esc_attr( $args['id'] ); ?>"><?php esc_html_e( '请在此配置插件的基本参数。', 'my-first-extension' ); ?></p>
<?php
}
// API密钥字段的回调函数
function mfe_field_api_key_cb( $args ) {
// 从已注册的设置选项中获取值
$options = get_option( 'mfe_settings_options' );
$value = $options[ $args['label_for'] ] ?? '';
?>
<input type="text"
id="<?php echo esc_attr( $args['label_for'] ); ?>"
name="mfe_settings_options[<?php echo esc_attr( $args['label_for'] ); ?>]"
value="<?php echo esc_attr( $value ); ?>"
class="regular-text">
<p class="description"><?php esc_html_e( '请输入您的服务API密钥。', 'my-first-extension' ); ?></p>
\n<?php
} Terakhir, buat fungsi untuk halaman pengaturan utama, dan gunakan…settings_fields()和do_settings_sections()Keluarkan seluruh formulir dengan aman.
// 设置页面的HTML结构
function mfe_settings_page_html() {
// 检查用户权限
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
?>
<div class="wrap">
<h1>\n</h1>
<form action="/id/options.php/" method="post" data-trp-original-action="options.php">
<?php
// 输出安全字段、区域和字段
settings_fields( 'mfe-settings' );
do_settings_sections( 'mfe-settings' );
submit_button( __( '保存设置', 'my-first-extension' ) );
?>
<input type="hidden" name="trp-form-language" value="id"/></form>
</div>
\n<?php
} Dengan cara ini, halaman pengaturan dibuat, dan proses validasi, pembersihan, serta penyimpanan semua data formulir dilakukan secara otomatis oleh API pengaturan WordPress. Data tersebut kemudian disimpan di…wp_optionsNama dalam tabel adalah…mfe_settings_optionsDalam opsi tersebut, tingkat keamanan dan kenyamanan telah meningkat secara signifikan.
Keamanan Plugin dan Praktik Terbaik
Untuk mengembangkan sebuah plugin yang profesional, aman, dan mudah dikelola, penting untuk mengikuti serangkaian praktik terbaik. Prinsip utama yang harus dipegang adalah: Jangan pernah mempercayai input dari pengguna. Semua data yang berasal dari sumber eksternal (misalnya, data yang dikirim oleh pengguna melalui formulir atau permintaan API) harus diperiksa dan diproses dengan hati-hati untuk mencegah potensi ancaman terhadap sistem.$_GET、$_POST、$_COOKIEData dari berbagai sumber (termasuk basis data) harus melalui proses validasi, pembersihan, dan pengaturan karakter (escaping) yang sesuai sebelum dihasilkan, digunakan, atau disimpan.
Verifikasi dan pembersihan data: Sebelum menggunakan data untuk penilaian logis, perlu memverifikasi apakah data tersebut sesuai dengan format yang diharapkan. Misalnya, jika sebuah bidang mengharapkan angka, gunakanintval()或is_numeric()WordPress menyediakan banyak fungsi bantu (helper functions), seperti…sanitize_text_field()Digunakan untuk membersihkan string teks.sanitize_email()Digunakan untuk membersihkan alamat surel.
Data Escaping: Saat mengeluarkan data ke dalam HTML, JavaScript, atau URL, data tersebut harus disesuaikan (dielepasi) terlebih dahulu untuk mencegah serangan jenis Cross-Site Scripting (XSS).esc_html()Mengekspor teks murni ke HTML,esc_attr()\nOutput ke atribut HTML,esc_url()Silakan berikan URL yang ingin diterjemahkan.wp_json_encode()paduanwp_slash()Kirimkan ke JavaScript.
Salah satu kesalahan keamanan yang umum terjadi adalah penggunaan variabel yang belum diverifikasi secara langsung dalam kueri database, yang dapat menyebabkan serangan jenis SQL injection. Jangan pernah menyusun kalimat SQL secara manual; sebaiknya gunakan fitur yang disediakan oleh WordPress untuk melakukan hal tersebut.$wpdbKelas dan metode-metode yang digunakan untuk mempersiapkan kueri (query).
global $wpdb;
$user_input = $_POST['search_term'];
// 错误做法:直接拼接
// $sql = “SELECT * FROM {$wpdb->posts} WHERE post_title LIKE ‘%$user_input%’”;
// 正确做法:使用prepare方法
$sql = $wpdb->prepare(
“SELECT * FROM {$wpdb->posts} WHERE post_title LIKE %s”,
‘%’ . $wpdb->esc_like( $user_input ) . ‘%’
);
$results = $wpdb->get_results( $sql ); Pemeriksaan hak akses: Sebelum melakukan operasi manajemen, modifikasi data, atau pengeluaran informasi sensitif apa pun oleh plugin, harus selalu diperiksa terlebih dahulu apakah pengguna saat ini memiliki hak untuk melakukan operasi tersebut.current_user_can( $capability )或check_admin_referer()Dan lain-lain, untuk dilakukan pemeriksaan.
Memuat skrip dan tabel gaya secara berurutan: Jangan pernah langsung melakukannya di dalam plugin.<link>或<script>Menambahkan tag untuk file CSS dan JS. Harus menggunakanwp_enqueue_style()和wp_enqueue_script()Fungsi tersebut, dan pastikan untuk menggunakannya pada hook yang sesuai (seperti…).wp_enqueue_scriptsDigunakan untuk front end.admin_enqueue_scriptsDigunakan untuk dieksekusi di latar belakang (di backend). Hal ini dapat mencegah konflik dan memastikan bahwa ketergantungan (dependencies) terbaca dengan benar.
Aturan pengorganisasian dan penamaan kode: Gunakan prefiks unik untuk fungsi, kelas, variabel, dan nama opsi plugin Anda (sepertimfe_Hal tersebut dilakukan untuk mencegah terjadinya konflik dengan topik pembahasan, plugin lainnya, atau inti dari sistem WordPress (WordPress core). Dengan mengorganisir plugin yang kompleks menjadi beberapa file, penggunaan pendekatan pemrograman berorientasi objek (Object-Oriented Programming/OOP) dapat meningkatkan keterbacaan dan kemudahan penggunaan kembali kode tersebut.
Tersedia fitur penghapusan dan pembersihan: Jika sebuah plugin membuat tabel dalam basis data atau mengatur opsi khusus, sebaiknya disediakan fitur pembersihan saat pengguna “menghapus” plugin tersebut, bukan hanya “menonaktifkannya”. Fitur ini dapat diimplementasikan melalui sebuah file penghapusan yang terpisah. Dalam file utama plugin, hal tersebut dapat dilakukan dengan menggunakan…register_uninstall_hook( FILE, ‘mfe_plugin_uninstall’ )Untuk mendaftarkan fungsi pengunduhan (download function), namun cara yang lebih umum adalah dengan membuat sebuah file di dalam direktori plugin.uninstall.phpFile tersebut akan dieksekusi secara otomatis oleh WordPress saat plugin tersebut dihapus.
Menyimpulkan.
Pengembangan plugin WordPress merupakan proses yang menggabungkan pemikiran terstruktur dengan pemahaman yang mendalam tentang arsitektur inti WordPress. Mulai dari menulis informasi header plugin yang sesuai dengan standar, hingga memahami dan menguasai penggunaan action hooks dan filter hooks, semua hal tersebut merupakan fondasi penting dalam membuat ekstensi fungsional apa pun. Untuk membuat sebuah plugin yang praktis, tidak hanya diperlukan implementasi fungsi di sisi frontend, tetapi juga pembuatan antarmuka pengaturan di sisi backend yang jelas dan aman, yang dapat dilakukan dengan efisien melalui API pengaturan WordPress.
Keamanan merupakan aspek yang sangat penting dalam pengembangan plugin WordPress. Mulai dari validasi data yang dimasukkan, pengolahan data yang dihasilkan (output), pemeriksaan hak akses pengguna, hingga operasi terhadap basis data yang aman, setiap langkah tersebut tidak boleh diabaikan. Dengan mengikuti praktik terbaik, seperti mengatur urutan eksekusi skrip dengan benar, menggunakan prefiks unik, dan menyusun struktur kode yang teratur, plugin Anda akan menjadi lebih kuat, lebih mudah dikelola, dan dapat berintegrasi dengan baik dengan ekosistem WordPress yang luas. Melalui langkah-langkah dalam panduan ini, Anda telah memperoleh pengetahuan dan keterampilan dasar yang diperlukan untuk membuat plugin WordPress berkualitas tinggi dari nol.
FAQ - Pertanyaan yang Sering Diajukan.
Bagaimana cara menambahkan kode singkat (short code) untuk plugin saya?
Kode singkat memungkinkan pengguna untuk dengan mudah menambahkan fitur plugin ke dalam artikel atau halaman. Gunakan saja kode tersebut.add_shortcode()Fungsi ini digunakan untuk mendaftarkan kode singkat (short code) Anda.
Buatlah sebuah fungsi panggilan balik (callback function) yang memproses logika kode singkat (short code logic). Fungsi ini menerima sebuah properti sebagai parameter.$atts)dan isi ($content)参数,并返回处理后的HTML。记住,短码回调函数必须返回(return)内容,而不是直接输出(echo)。返回的内容也需要进行适当的转义以确保安全。
Di mana sebaiknya opsi-opsi plugin disimpan?
Untuk pengaturan pasangan kunci-nilai yang sederhana, sangat disarankan untuk menggunakan API Options dari WordPress.add_option()、get_option()和update_option()Fungsi tersebut. Data-data ini akan disimpan secara otomatis.wp_optionsDi dalam tabel basis data.
Jika plugin Anda perlu menyimpan sejumlah besar data terstruktur (misalnya entri formulir, log), maka Anda perlu mempertimbangkan untuk membuat tabel basis data khusus.dbDelta()Fungsi tersebut digunakan untuk memastikan bahwa proses pembuatan dan pembaruan struktur tabel dilakukan dengan aman dan kompatibel. Pembuatan tabel khusus (custom tables) biasanya dilakukan melalui mekanisme hook yang diaktifkan oleh plugin.
Bagaimana cara agar plugin saya kompatibel dengan plugin atau tema lainnya?
Kunci untuk meningkatkan kompatibilitas adalah dengan mengikuti standar pengkodean WordPress, menggunakan prefiks yang unik, dan memanfaatkan Hook untuk menyediakan titik ekspansi. Hindari langsung memodifikasi file inti atau variabel global.
Dalam plugin Anda, gunakan…do_action()或apply_filters()Ciptakan hook kustom yang memungkinkan pengembang lain untuk memodifikasi atau memperluas fungsi plugin Anda. Selain itu, sebelum melakukan operasi yang berpotensi menimbulkan konflik (seperti menambahkan gaya atau skrip), lakukan pemeriksaan kondisi atau sediakan opsi untuk mematikannya.
Bagaimana cara menambahkan mekanisme pembaruan untuk plugin?
Untuk plugin yang terdapat di direktori plugin resmi WordPress, proses pembaruan dilakukan secara otomatis. Namun, untuk plugin yang bersifat pribadi atau komersial, Anda perlu membuat alat pemeriksa pembaruan (update checker) yang khusus.
Ini biasanya melibatkan pembuatan sebuah kelas yang secara berkala memeriksa versi terbaru di server jarak jauh Anda, dan memungkinkan pengguna untuk melakukan pembaruan dengan satu klik. Anda dapat mengacu pada pustaka seperti “Plugin Update Checker”, atau mengimplementasikannya sendiri. Intinya adalah menggunakan mekanisme untuk mendeteksi dan mengunduh versi terbaru dari server, lalu memungkinkan pengguna untuk menggantinya dengan versi tersebut dengan mudah.set_site_transient()Hook (seperti…)pre_set_site_transient_update_pluginsGunakan metode tersebut untuk menyisipkan informasi pembaruan Anda. Pastikan bahwa server pembaruan tersebut aman dan dapat diandalkan.
Selanjutnya, apa yang harus kita lakukan selanjutnya?
Bacaan lanjutan dan pengetahuan praktis.
Konten-konten berikut terkait dengan topik artikel ini dan cocok untuk dibaca lebih lanjut. Lebih baik mulai dengan artikel yang paling dekat dengan pertanyaan Anda saat ini, lalu secara bertahap memperluas ke topik terkait, yang biasanya akan memberikan hasil yang lebih baik.
- Panduan Lengkap Proses Pembangunan Situs Web: Dari Analisis Kebutuhan Hingga Pembaruan dan Penyebaran (Deployment)
- Panduan Dasar Pembuatan Situs Web: Menguasai Seluruh Proses Pengembangan Situs Web Modern Dari Nol
- Panduan Pengembangan Plugin WordPress: Membuat Plugin Kustom Pertama Anda Dari Nol
- Apa itu Subtheme WordPress?
- Menjadi Pengembang Plugin WordPress: Panduan Lengkap Dari Nol Sampai Satu