Panduan Lengkap Pembangunan Plugin WordPress: Membina Plugin PHP Profesional Dari Kosong

Bacaan 3 minit
2026-03-13
2,022
Saya mendapat komisen apabila anda membeli-belah melalui pautan di bawah, tanpa sebarang kos tambahan kepada anda.

Struktur asas dan fail-fail plugin WordPress

Sebuah plugin WordPress standard memerlukan sekurang-kurangnya satu fail utama. Fail utama ini biasanya dinamakan sama dengan nama plugin tersebut, sebagai contoh… my-first-plugin.phpPada permulaan fail tersebut, mesti terdapat sebuah ulasan kepala fail (header comment) yang khusus, yang digunakan untuk menyatakan maklumat meta tentang plugin kepada sistem WordPress. Maklumat ini termasuk nama plugin, deskripsi, versi, pengarang, dan lain-lain, dan ia akan dipaparkan pada halaman pengurusan “plugin” di bahagian belakang (backend).

Selain fail utama, sebuah plugin yang lengkap dengan fungsi-fungsi yang diperlukan biasanya akan mengandungi direktori dan fail lain untuk mengatur kod dengan lebih teratur. Struktur direktori yang biasa digunakan termasuk direktori untuk menyimpan fail CSS dan JavaScript./assetsSenarai, yang mengandungi fail kelas PHP/includesSenarai, serta yang digunakan untuk templat antara muka pengguna/templatesSenarai. Struktur modular ini membantu dalam penyelenggaraan kod dan kerjasama pasukan.

Fail utama plugin merupakan titik masuk untuk keseluruhan fungsi plugin tersebut. Selain daripada menyatakan maklumat meta, tanggungjawab utamanya termasuk mendaftar dan mengaktifkan/menonaktifkan fungsi tambahan (hooks), memuatkan fail-fail yang diperlukan, serta memulakan fungsi asas plugin. Dengan pengurusan fail yang teratur, ia memastikan bahawa plugin tersebut, walaupun mempunyai fungsi yang kompleks, tetap mempunyai struktur yang jelas.

Diperoleh daripada WEB\nDisyorkan untuk membaca. Panduan Permulaan Pembangunan Plugin WordPress

Membuat plugin asas yang pertama anda

Mari kita mulakan dengan membuat plugin “Hello World” yang paling asas, untuk memahami proses pembuatan plugin dan kitaran hidup asasnya.

hosting.com Hosting Bersama
Prestasi tinggi, menampilkan CPU AMD EPYC, storan SSD NVMe dan LiteSpeed, dengan sokongan pakar dalaman 24/7, langkah keselamatan canggih termasuk SSL, perlindungan serangan paksa kata laluan, perisian hasad dan DDoS, menjimatkan sehingga 73%.

Mendefinisikan maklumat plugin dan fungsi utama

Pertama sekali, dalam direktori pemasangan WordPress anda yang berada di lokasi setempat…/wp-content/plugins/Dalam laluan tersebut, buat sebuah folder baru dengan nama “hello-world”. Di dalam folder tersebut, buat sebuah fail dengan nama…hello-world.phpFail tersebut.

Di awal fail ini, anda perlu menambahkan maklumat kepala plugin. Kepala plugin yang tipikal kelihatan seperti berikut:

<?php
/**
 * Plugin Name:       你好世界示例插件
 * Plugin URI:        https://yourwebsite.com/hello-world
 * Description:       这是一个用于演示的简单WordPress插件。
 * Version:           1.0.0
 * Author:            你的名字
 * Author URI:        https://yourwebsite.com
 * License:           GPL v2 or later
 * Text Domain:       hello-world
 * Domain Path:       /languages
 */

Seterusnya, kita akan menambahkan satu fungsi yang mudah kepada plugin ini: menambahkan segmen teks secara automatik di akhir kandungan artikel. Kita boleh melakukannya dengan…the_contentIa boleh dilakukan menggunakan penapis. Tambahkan kod berikut selepas maklumat di bahagian atas fail utama:

function hello_world_add_footer_text( $content ) {
    // 仅在单篇文章页面添加
    if ( is_single() ) {
        $footer_text = '<p><em>Artikel ini dihasilkan oleh plugin “Hello World”.</em></p>';
        $content .= $footer_text;
    }
    return $content;
}
add_filter( 'the_content', 'hello_world_add_footer_text' );

Menangani pengaktifan dan penonaktifan plugin

Plugin profesional perlu mengurus logik pengaktifan dan penonaktifan dengan betul. Sebagai contoh, semasa plugin diaktifkan, mungkin perlu membuat jadual dalam pangkalan data atau menetapkan pilihan lalai; semasa dinonaktifkan, mungkin perlu membersihkan data sementara. Kita menggunakan…register_activation_hookregister_deactivation_hookFungsi ini digunakan untuk mendaftarkan hook yang bersesuaian.

Diperoleh daripada WEB\nDisyorkan untuk membaca. Pembangunan Plugin WordPress dari Permulaan hingga Mahir: Membina Fungsi Kustom dan Perluasan Berkesan.

Tambahkan kod berikut ke dalam fail utama:

// 插件激活时执行的操作
function hello_world_activate() {
    // 例如:添加一个选项到数据库
    if ( ! get_option( 'hello_world_installed' ) ) {
        add_option( 'hello_world_installed', time() );
    }
    // 可以在这里刷新固定链接规则,以确保新注册的URL结构生效
    flush_rewrite_rules();
}
register_activation_hook( __FILE__, 'hello_world_activate' );

// 插件停用时执行的操作
function hello_world_deactivate() {
    // 例如:删除我们创建的临时选项(谨慎操作,用户数据通常不删除)
    // delete_option( 'hello_world_installed' );
    // 清理重写规则
    flush_rewrite_rules();
}
register_deactivation_hook( __FILE__, 'hello_world_deactivate' );

Setelah menyelesaikan langkah-langkah di atas, anda akan dapat melihat dan mengaktifkan “Hello World Example Plugin” pada halaman “Plugins” di panel pentadbiran WordPress. Setelah diaktifkan, apabila anda mengakses mana-mana artikel, anda akan melihat teks yang telah ditambahkan di bahagian bawah kandungan tersebut.

Meningkatkan fungsi menggunakan API teras WordPress

WordPress menyediakan API yang sangat lengkap, membolehkan pembangun plugin berinteraksi dengan sistem utama dengan cara yang selamat dan standard. Menguasai API-API ini adalah kunci untuk melakukan pembangunan yang profesional.

Hosting Bersama InterServer
Hosting kongsi: 1TB/bulan pada $2.50 USD, bulan pertama pada $0.10 USD dengan kod promo tryinterserver. 461 skrip aplikasi awan tersedia untuk pemasangan satu klik.

Menggunakan pengait tindakan (action hooks) dan penapis (filters)

Action Hooks membenarkan anda untuk “menyisipkan” dan menjalankan kod anda pada titik masa yang tertentu. Sebagai contoh, apabila sebuah artikel diterbitkan, WordPress akan memicu (trigger) Action Hooks yang telah ditetapkan.save_postTindakan. Anda boleh melakukannya melalui…add_action()Fungsi tersebut akan memuatkan fungsi sendiri ke pada “hook” yang berkenaan.

function hello_world_on_post_publish( $post_id, $post, $update ) {
    // 检查是否不是修订版本,并且是发布操作
    if ( wp_is_post_revision( $post_id ) || $post->post_status != 'publish' ) {
        return;
    }
    // 发送邮件通知或执行其他逻辑
    // wp_mail( '[email protected]', '新文章已发布', '文章标题:' . $post->post_title );
}
add_action( 'save_post', 'hello_world_on_post_publish', 10, 3 );

Filter Hooks membenarkan anda membuat pengubahsuaian pada data.the_contentSebuah contoh ialah aplikasi penapis yang biasa digunakan. Contoh lain yang sering berlaku ialah pengubahsuaian tajuk artikel.

function hello_world_modify_title( $title ) {
    return '【推荐】' . $title;
}
// add_filter( 'the_title', 'hello_world_modify_title' ); // 谨慎使用,这会修改所有标题

Create a management menu and options page.

Banyak plugin memerlukan antara muka belakang (backend) untuk mengkonfigurasi tetapan mereka. WordPress menyediakan fungsi-fungsi yang memudahkan penambahan menu utama atau sub-menu ke dalam panel pentadbiran (administration panel).

Diperoleh daripada WEB\nDisyorkan untuk membaca. Menguasai Pembangunan Plugin WordPress: Membina Modul Fungsi Khusus yang Cekap dari Kosong

Kod di bawah ini menunjukkan cara untuk menambahkan halaman pilihan yang mudah, dan menggunakan API tetapan WordPress untuk menyimpan pilihan tersebut dengan selamat.

// 步骤1:向管理后台添加一个菜单项
function hello_world_add_admin_menu() {
    add_menu_page(
        '你好世界设置',       // 页面标题
        '你好世界插件',       // 菜单标题
        'manage_options',     // 所需权限
        'hello-world-settings', // 菜单slug
        'hello_world_settings_page', // 用于渲染页面的回调函数
        'dashicons-admin-generic', // 图标(可选)
        80                    // 菜单位置
    );
}
add_action( ‘admin_menu‘, ‘hello_world_add_admin_menu’ );

// 步骤2:定义设置页面的HTML内容
function hello_world_settings_page() {
    ?&gt;
    <div class="”wrap”">
        <h1>Hello World Plugin Settings</h1>
        <form method="”post”" action="/ms/”options.php”/" data-trp-original-action="”options.php”">
            <?php
                settings_fields( ‘hello_world_settings_group’ ); // 输出设置字段和非ce字段
                do_settings_sections( ‘hello-world-settings’ ); // 输出设置部分
                submit_button(); // 输出提交按钮
            ?>
        <input type="hidden" name="trp-form-language" value="ms"/></form>
    </div>
    &lt;?php
}

// 步骤3:注册设置、字段和章节
function hello_world_settings_init() {
    // 注册一个新的设置项到“hello_world_settings_group”组
    register_setting( ‘hello_world_settings_group’, ‘hello_world_custom_message’ );

// 在页面中新增一个章节
    add_settings_section(
        ‘hello_world_settings_section’,
        ‘自定义消息设置’,
        ‘hello_world_settings_section_callback’,
        ‘hello-world-settings‘
    );

// 向章节中添加一个字段
    add_settings_field(
        ‘hello_world_message_field’,
        ‘前台显示的消息’,
        ‘hello_world_message_field_render’,
        ‘hello-world-settings’,
        ‘hello_world_settings_section’
    );
}
add_action( ‘admin_init’, ‘hello_world_settings_init’ );

// 章节描述的回调函数
function hello_world_settings_section_callback() {
    echo ‘<p>Di sini, anda boleh mengkonfigurasi kandungan mesej yang akan dipaparkan oleh plugin pada bahagian depan (frontend).</p>’;
}

// 字段渲染的回调函数
function hello_world_message_field_render() {
    $option = get_option( ‘hello_world_custom_message’, ‘这是默认消息’ );
    echo ‘<input type="”text”" name="”hello_world_custom_message”" value="”‘" . esc_attr( $option ) ‘“ size ="”40”" />’;
}

Dengan kod di atas, anda telah membuat halaman tetapan di belakang tabir yang memenuhi standard WordPress dan mampu menyimpan data dengan selamat.

Bluehost Hosting Bersama
Bluehost Hosting Bersama
Alat penciptaan laman web AI, SLA ketersediaan 99.991%, domain percuma selama setahun, CDN percuma,
Jaminan pulangan wang 30 hari
Lawati Bluehost Shared Hosting →
HostArmada Hosting Bersama
HostArmada Hosting Bersama
SSL percuma untuk semua laman web, pemindahan laman web percuma, penimbalan pelayan web percuma, papan kawalan cPanel percuma
Jaminan pulangan wang 45 hari
Lawati HostArmada Shared Hosting →

Keamanan plugin, prestasi, dan persiapan untuk penerbitan

Sebelum berkongsi plugin dengan orang lain atau menghantarinya ke direktori rasmi, sangat penting untuk memastikan bahawa plugin tersebut adalah selamat, berkesan, dan mudah untuk digunakan.

Patuhi amalan terbaik keselamatan

Keselamatan adalah keutamaan tertinggi dalam pembangunan plugin. Prinsip utama adalah: Jangan pernah percaya pada input pengguna. Semua data yang datang dari pengguna atau sumber luar harus disemak dan diproses dengan berhati-hati.$_GET$_POST$_COOKIESebelum digunakan untuk pertanyaan pangkalan data, dipaparkan pada halaman web, atau melaksanakan arahan sistem, semua data mesti disahkan, dibersihkan, atau di-escape.

Untuk kandungan yang dihasilkan dan disimpan dalam format HTML, gunakan…esc_html()esc_attr()wp_kses_post()Fungsi seperti ini digunakan untuk melakukan proses “escape” (pengelakkan kesilapan atau penggunaan simbol yang tidak dijangka dalam kod).

echo ‘<div class="”“‘" . esc_attr( $user_provided_class ) ‘“>’. esc_html($user_provided_content)‘.‘</div>’;

Untuk pertanyaan pangkalan data, jangan sekali-kali menyatukan pemboleh ubah secara langsung ke dalam ayat SQL. Anda mesti menggunakan kaedah yang sesuai untuk menggabungkan nilai pemboleh ubah ke dalam ayat SQL.$wpdb->prepare()Proses pra-pemprosesan dilakukan menggunakan kaedah tertentu.

global $wpdb;
$user_id = 123;
$query = $wpdb->prepare(
    “SELECT * FROM {$wpdb->prefix}my_table WHERE user_id = %d”,
    $user_id
);
$results = $wpdb->get_results( $query );

Selain itu, semua fungsi panggilan balik (callback functions) yang boleh diakses oleh pengguna, sama ada melalui AJAX pada bahagian hadapan (frontend) atau operasi pada bahagian belakang (backend), mesti menggunakan…current_user_can()check_ajax_referer()Fungsi-fungsi seperti ini digunakan untuk melakukan pengesahan hak akses dan keselamatan.

Optimizing the performance of plugins

Penambahan (plugin) yang mempunyai prestasi yang rendah boleh mempengaruhi pengalaman pengguna keseluruhan laman web. Pengoptimuman boleh dilakukan dari beberapa aspek: penggunaan cache yang sesuai, serta mengelakkan daripada melakukan pertanyaan pangkalan data yang kompleks atau panggilan API jauh setiap kali halaman dimuat. WordPress menyediakan API sementara (instant API) untuk membantu meningkatkan prestasi laman web.(Transients API)Ia membolehkan penyimpanan data sementara dengan mudah.

// 尝试从缓存获取数据
$data = get_transient( ‘my_plugin_expensive_data’ );
if ( false === $data ) {
    // 缓存中没有,执行昂贵操作
    $data = expensive_database_query();
    // 将结果缓存12小时
    set_transient( ‘my_plugin_expensive_data’, $data, 12 * HOUR_IN_SECONDS );
}

Kedua, pastikan fail CSS dan JavaScript hanya dimuat turun pada halaman-halaman yang memerlukannya.wp_enqueue_script()wp_enqueue_style()Fungsi tersebut dapat mengawal proses pemuatannya dan hubungan kebergantungan sumber daya dengan tepat. Bagi sumber daya latar belakang (backend resources), ia boleh disambungkan (dihangatkan/mount) ke sistem.admin_enqueue_scriptsHook; untuk sumber frontend, ia akan dipasang (mounted) ke…wp_enqueue_scriptsKuku.

(Making preparations for internationalization and release.)

Untuk membolehkan plugin digunakan oleh pengguna di seluruh dunia, proses internasionalisasi (i18n) adalah langkah yang penting. Ini bermakna anda perlu membungkus semua teks yang ditujukan untuk pengguna menggunakan fungsi-fungsi khusus.

Mengubah rentetan dalam plugin daripada:

echo “Hello World!”;

Ubah menjadi:

echo __( ‘Hello World!’, ‘hello-world’ );

Di antaranya‘hello-world’Ia adalah apa yang anda definisikan dalam bahagian kepala plugin (plugin header).Text DomainKemudian, anda boleh menggunakan alat seperti Poedit untuk menghasilkannya..potFile-file templat, yang mana penterjemah boleh menggunakannya untuk mencipta teks dalam pelbagai bahasa..po.moFail. Letakkan fail terjemahan ini di dalam bahagian kepala (header) plugin.Domain PathDirektori yang ditentukan (seperti…)/languagesCukup klik di bawah.

Sebelum menerbitkan, pastikan anda menulis dokumen yang terperinci.readme.txtFail tersebut perlu mematuhi format yang ditetapkan oleh WordPress secara rasmi, dan harus mengandungi deskripsi tentang plugin, langkah-langkah pemasangan, serta jawapan kepada soalan-soalan yang sering diajukan. Ini merupakan syarat wajib untuk menghantar plugin ke direktori plugin WordPress. Selain itu, tambahkan ulasan dokumen PHP yang terperinci dalam kod plugin; ini bukan sahaja akan membantu orang lain memahami kod anda, tetapi juga menunjukkan tahap profesionalisme anda.

RINGKASAN

Artikel ini memperkenalkan secara sistematik proses penuh untuk membangunkan sebuah plugin WordPress profesional bermula dari kosong. Kita bermula dengan memahami struktur asas sebuah plugin, kemudian mencipta plugin pertama yang mempunyai logik untuk mengaktifkan/menonaktifkannya. Selepas itu, kita mengkaji lebih mendalam sistem hook aksi (actions) dan filter yang kuat dalam WordPress, serta cara menggunakannya untuk integrasi yang mendalam dengan kod asas WordPress, dan juga mencipta halaman tetapan pengurusan yang standard. Akhirnya, kita menekankan keperluan untuk mematuhi garis panduan keselamatan yang tidak boleh diabaikan dalam pembangunan plugin, kaedah-kaedah untuk mengoptimumkan prestasi, dan persiapan untuk penyebaran plugin ke seluruh dunia (internationalization). Dengan menguasai pengetahuan dan kemahiran asas ini, anda akan dapat membina plugin WordPress yang selamat, berkesan, dan mudah diselenggara, yang bukan sahaja dapat memenuhi keperluan peribadi, tetapi juga dapat melayani khalayak pengguna yang lebih luas.

FAQ - Soalan Lazim

Apa pengetahuan asas yang perlu dikuasai untuk mengembangkan plugin WordPress?

Untuk mengembangkan plugin WordPress, anda perlu memiliki asas pengaturcaraan PHP yang kukuh, kerana kod plugin kebanyakannya ditulis dalam PHP. Pada masa yang sama, anda juga perlu memahami konsep asas HTML, CSS, dan JavaScript untuk mengurus penampilan dan interaksi pada bahagian hadapan (front end) aplikasi. Yang paling penting, anda harus biasa dengan konsep-konsep teras WordPress, seperti Hook, Shortcode, Custom Post Types (CPT), dan kelas operasi pangkalan data.$wpdbPenggunaan…

Bagaimana untuk membaiki (debug) plugin WordPress yang sedang dibangunkan?

Satu kaedah yang berkesan untuk melakukan penyelesaian masalah (debugging) adalah dengan mengaktifkan ciri-ciri khusus dalam WordPress.WP_DEBUG“Mode. In your…”wp-config.phpDalam fail tersebut, akan…define( ‘WP_DEBUG’, false );Ubah kepadadefine( ‘WP_DEBUG’, true );Anda juga boleh mengaktifkannya pada masa yang sama.WP_DEBUG_LOGCatatkan ralat ke dalam fail log, atau aktifkan ciri tersebut.WP_DEBUG_DISPLAYRalat akan dipaparkan pada halaman (hanya untuk persekitaran pembangunan). Selain itu, menggunakan alat pembangun pelayar (tab Console, Network) adalah cara yang penting untuk membaiki masalah JavaScript dan permintaan AJAX pada bahagian hadapan (frontend).

Bagaimanakah plugin saya boleh bersambung (berkompatibiliti) dengan plugin lain?

Kunci untuk memastikan keserasian yang baik adalah dengan mengikuti standard pengkodan WordPress, serta menggunakan pemboleh ubah global dan nama fungsi dengan berhati-hati. Amalan terbaik untuk mengelakkan konflik nama adalah dengan menambahkan awalan yang unik kepada fungsi, kelas, dan konstanta dalam plugin anda, seperti yang ditunjukkan di atas.myplugin_Atau gunakan singkatan pembangun sebagai awalan. Semasa membuat perubahan pada kandungan yang mungkin berkaitan dengan plugin lain (seperti kandungan artikel, tajuk), pastikan fungsi panggilan balik penapis (filter callback function) anda mempunyai keutamaan yang sesuai.add_filterParameter ketiga tersebut, dan perhatikan format nilai yang dikembalikannya. Selain itu, gunakan parameter tersebut dengan bijak.class_exists()function_exists()Untuk memeriksa sama ada sesuatu kelas atau fungsi telah didefinisikan, kita boleh melaksanakan pengunduhan berdasarkan syarat (conditional loading) atau menyediakan alternatif.

Adakah perlu menguasai pengaturcaraan berorientasikan objek (Object-Oriented Programming/OOP) untuk membangunkan plugin?

虽然使用传统的面向过程编程方式也可以开发功能完整的插件,但强烈推荐学习和使用面向对象编程(OOP)。OOP能够更好地组织代码,通过类(Class)来封装功能,提高代码的可复用性和可维护性。对于中大型插件项目,使用OOP结合命名空间(Namespaces)和自动加载(Autoloading)是行业内的标准做法,它能让你更清晰地区分不同模块,并显著降低代码的耦合度。