一步步構建你嘅第一個WordPress插件:從入門到實戰開發

3分鐘閱讀
2026-03-15
2026-06-04
2,336
當你透過以下連結購物,我會獲得佣金,對你嚟講冇額外成本。.

WordPress插件開發基礎同環境準備

WordPress插件本質上係一組PHP檔案,佢哋透過WordPress提供嘅API嚟擴展核心功能。一個插件可以細到只係加一個短代碼,大到可以建立一個完整嘅管理系統。喺開始寫程式之前,理解佢嘅基本結構好緊要。每個插件都必須有一個主檔案,通常用插件個名嚟命名,例如 my-first-plugin.php。呢個檔案頂部嘅註釋頭係WordPress識別插件嘅關鍵。

開發環境係高效工作嘅基石。你需要喺本地搭建一個同線上環境盡量一致嘅測試環境。推薦用本地伺服器整合包,例如XAMPP、MAMP或者Local by Flywheel。同時,確保你嘅程式碼編輯器或者整合開發環境(IDE)支援PHP語法高亮同除錯,例如VS Code、PhpStorm或者Sublime Text。開啟WordPress嘅WP_DEBUG模式對於開發階段排查錯誤好重要,你可以喺網站嘅wp-config.php文件入面通過定義define('WP_DEBUG', true);嚟啟用佢。

創建你嘅第一個插件檔案

等我哋由整一個最簡單嘅插件開始,呢個插件會喺網站嘅管理後台顯示一條自訂通知。

推薦閱讀 WordPress插件開發指南:由零到一打造你嘅專屬功能

編寫插件主檔案同註釋頭

首先,喺你嘅WordPress安裝目錄下嘅wp-content/plugins喺個資料夾入面,開一個新嘅資料夾,改名叫做my-first-plugin。喺呢個資料夾入面,開一個PHP檔案,同樣改名做my-first-plugin.php

UltaHost WordPress 主機
30日退款保證,無限頻寬同數據庫,免費DDoS防護,買3年優惠50%

打開呢個檔案,輸入以下標準嘅外掛資訊註解頭。呢啲資訊會喺WordPress後台嘅「外掛」管理頁面度顯示。

<?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
 * Domain Path:       /languages
 */

儲存檔案之後,去WordPress管理後台嘅「外掛」頁面,你會睇到「我嘅第一個外掛」出現喺外掛列表入面。而家啟動佢,個外掛雖然仲未執行任何功能,但已經成功俾WordPress載入咗。

實現一個基本嘅後台通知功能

而家,我哋會為呢個插件加第一個功能:喺管理後台頂部顯示一條歡迎訊息。我哋會用WordPress嘅admin_notices掛鉤。喺頭先嘅插件主檔案入面,註解頭下面,加以下代碼:

// 在管理后台显示自定义通知
function mfp_show_admin_notice() {
    ?&gt;
    <div class="notice notice-success is-dismissible">
        <p><?php _e( '欢迎使用“我的第一个插件”!', 'my-first-plugin' ); ?></p>
    </div>
    &lt;?php
}
add_action( &#039;admin_notices&#039;, &#039;mfp_show_admin_notice&#039; );

代碼解釋:我哋創建咗一個叫mfp_show_admin_notice嘅函數,佢會輸出一段符合WordPress後台樣式嘅HTML通知代碼。用_e()函數係為咗支援將來嘅國際化(i18n)。最後,透過add_action()函數將我哋嘅自訂函數掛載到WordPress嘅admin_notices呢個「掛鉤」上面。保存檔案之後,重新整理WordPress後台頁面,你就會睇到呢條綠色嘅成功提示訊息喇。

推薦閱讀 WordPress插件開發完整指南:從零基礎到高級實戰教程

深入插件核心功能開發

掌握咗基礎結構之後,我哋可以開發更實用嘅功能。一個常見嘅需求係喺文章內容最尾自動加一段自訂文字。

使用過濾器修改文章內容

WordPress提供咗大量嘅「過濾器(Filter)」嚟修改各種數據。為咗喺文章內容後面追加文字,我哋將會用the_content過濾器。喺插件主檔案入面加以下新函數:

// 在文章内容末尾添加自定义文本
function mfp_append_to_content( $content ) {
    // 确保只在主循环的单篇文章页面执行
    if ( is_single() &amp;&amp; in_the_loop() &amp;&amp; is_main_query() ) {
        $custom_text = '<div class="my-plugin-footer"><p>多謝你睇完!呢篇文係由「我嘅第一個插件」為你呈現㗎。</p></div>';
        $content .= $custom_text;
    }
    return $content;
}
add_filter( 'the_content', 'mfp_append_to_content' );

呢個函數接收原始嘅$content,透過條件判斷確保只係喺單獨嘅文章頁面同埋處於主查詢中先至會加入我哋自訂嘅HTML文本,最後將修改後嘅內容傳返出去。呢種方式唔會干擾到系統,亦都唔會改到數據庫入面嘅原始內容。

hosting.com 共享主機
高效能,配備 AMD EPYC 處理器、NVMe SSD 儲存同 LiteSpeed,提供全天候專業內部支援,採用先進安全措施,包括 SSL、暴力破解、惡意軟件同 DDoS 防護,可節省高達 73%。

整一個簡單嘅管理設定頁面

為咗等用戶可以自訂加到文章尾嘅文本,我哋需要為呢個插件整一個設定頁面。呢個過程涉及幾個步驟:註冊菜單、整頁面回調函數、處理表單數據。

首先,用admin_menu鉤子加一個子選單頁:

// 添加插件设置菜单到后台
function mfp_add_admin_menu() {
    add_options_page(
        '我的第一个插件设置', // 页面标题
        '我的插件设置',       // 菜单标题
        'manage_options',    // 权限要求
        'my-first-plugin',   // 菜单slug
        'mfp_options_page_html' // 显示页面内容的回调函数
    );
}
add_action( 'admin_menu', 'mfp_add_admin_menu' );

跟住,定義回調函數mfp_options_page_html嚟渲染設定頁面嘅HTML表單。同時,我哋需要用WordPress設定API嚟安全咁註冊、儲存同攞返啲選項。為咗簡潔,以下係一個簡化版嘅實現:

推薦閱讀 WordPress插件開發完整指南:從入門到構建專業級擴展

// 设置页面的HTML内容
function mfp_options_page_html() {
    // 检查用户权限
    if ( !current_user_can( 'manage_options' ) ) {
        return;
    }
    ?&gt;
    <div class="wrap">
        <h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
        <form action="/yue/options.php/" method="post" data-trp-original-action="options.php">
            <?php
            // 输出设置字段、非ce等安全字段
            settings_fields( 'mfp_options_group' );
            do_settings_sections( 'my-first-plugin' );
            submit_button( '保存设置' );
            ?>
        <input type="hidden" name="trp-form-language" value="yue"/></form>
    </div>
    <?php
}

// 初始化插件设置
function mfp_settings_init() {
    // 注册一个设置
    register_setting( 'mfp_options_group', 'mfp_footer_text' );

// 添加一个设置区域
    add_settings_section(
        'mfp_section',
        '自定义文本设置',
        null,
        'my-first-plugin'
    );

// 向区域中添加字段
    add_settings_field(
        'mfp_field_footer',
        '文章页脚文本',
        'mfp_field_footer_html',
        'my-first-plugin',
        'mfp_section'
    );
}
add_action( 'admin_init', 'mfp_settings_init' );

// 渲染文本输入字段
function mfp_field_footer_html() {
    $option = get_option( 'mfp_footer_text', '感谢阅读!本文由“我的第一个插件”为您呈现。' );
    ?>
    <input type='text' name='mfp_footer_text' value='<?php echo esc_attr( $option ); ?>' class='regular-text'>
    <p class="description">呢度輸入嘅內容會喺每篇文章嘅最尾顯示出嚟。</p>
    &lt;?php
}

最後,改返之前嘅嘢mfp_append_to_content函數,使其從數據庫選項mfp_footer_text中讀取文本,而唔係用硬編碼嘅文本。

插件安全、優化同發佈準備

開發嘅最後階段需要關注安全性、代碼質量同部署流程,確保插件穩陣可用。

InterServer 共享主機
共享主機:每月1TB,只需£2.50;首月只需£0.10,使用優惠碼 tryinterserver。461個雲端應用程式腳本,一鍵安裝。

跟從安全最佳實踐

所有用戶輸入喺輸出到瀏覽器或者存入數據庫之前都必須進行轉義或者驗證。喺輸出嘅時候,使用esc_html()esc_attr()esc_url()等函數。喺處理表單提交或者AJAX請求嘅時候,使用wp_verify_nonce()同埋check_admin_referer()嚟驗證請求嘅合法性,防止跨站請求偽造(CSRF)攻擊。千祈唔好直接信任$_GET$_POST$_REQUEST入面嘅數據。

實現國際化支援

為咗令插件可以畀全世界嘅用戶用,需要將代碼入面所有面向用戶嘅字串進行國際化處理。我哋已經喺前面嘅例子用咗_e()函數嚟輸出翻譯文本。另外,你需要喺插件註釋頭度聲明Text Domain同埋Domain Path
喺插件初始化嗰陣(例如透過plugins_loaded掛鉤),使用load_plugin_textdomain()函數嚟加載語言檔案:

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

跟住,你可以用好似Poedit咁嘅工具,從插件源代碼度提取字串(__()_e()等函數包住嘅字串),生成.pot模板檔案,供翻譯者創建.po同埋.mo檔案。

代碼組織同效能考量

隨著插件功能增長,唔應該將所有代碼都堆喺主檔案度。合理嘅做法係按照功能模組將代碼拆分到唔同.php檔案度,並透過主檔案有選擇地包含佢哋。例如,可以創建includes/admin/目錄存放後台相關代碼,includes/public/存放前端相關代碼,includes/class-*.php存放類定義。
對於資源密集型操作,考慮使用WordPress嘅瞬態緩存(Transients API)嚟儲存耗時查詢嘅結果,或者使用計劃任務(Cron API)喺後台處理非即時任務。確保插件停用時,能夠透過註冊嘅卸載掛鉤(透過register_uninstall_hook())清理佢創建嘅數據同選項,保持網站整潔。

摘要

透過本教程,我哋完成咗一個功能完整嘅WordPress插件由零到一嘅構建過程。我哋由了解插件嘅基本結構同搭建開發環境開始,創建咗包含標準註釋頭嘅主文件。跟住,我哋透過掛載到admin_notices同埋the_content呢兩個核心掛鉤,實現咗後台通知同文章頁腳文本功能。為咗提升插件嘅實用性,我哋進一步引入咗WordPress設置API,構建咗一個允許用戶自定義文本嘅管理頁面。最後,我哋探討咗插件開發中至關重要嘅安全實踐、國際化支援同代碼組織優化等高級主題。呢個過程清晰地展示咗WordPress插件開發嘅核心範式:利用豐富嘅動作掛鉤同過濾器嚟插入功能,遵循API規範嚟創建介面,並始終將安全性同可維護性擺喺首位。掌握咗呢啲基礎,你就已經擁有咗探索更複雜插件世界嘅能力。

常見問題

開發WordPress插件需要咩先決知識?

你需要有紮實嘅PHP編程基礎,因為插件程式碼主要係用PHP寫嘅。同時,要對HTML、CSS同JavaScript有基本認識,咁先可以處理前端展示同互動。熟悉WordPress嘅基本概念,例如主題、文章類型、分類法,特別係佢嘅掛鉤(Hooks)系統(包括動作同過濾器)係至關重要嘅。

###
一個WordPress插件最基礎一定要包含咩檔案?

最基本嘅情況下,一個插件可以只係包含一個PHP檔案。但係呢個檔案一定要喺頂部包含符合WordPress標準嘅插件資訊註釋頭(Plugin Headers),即係我哋示例中嘅Plugin NameDescription等欄位。呢個係WordPress識別同喺插件管理列表顯示佢嘅唯一依據。

###
我應該點樣為我嘅插件函數同變數命名?

為咗避免同WordPress核心、主題或者其他插件嘅代碼撞名,所有自訂函數、類、變數、常量都應該用獨一無二嘅前綴。通常建議用同插件縮寫或者簡稱相關嘅前綴,例如我哋嘅示例入面用mfp_(代表 My First Plugin)。類名都應該跟呢個規則,同埋盡量用有意思嘅全名。

###
插件入面創建嘅數據庫表或者選項,刪除插件之後會唔會清理埋?

默認情況下,唔會。如果你透過add_option()update_option()創建嘅選項,或者自訂創建嘅數據表,當用戶透過WordPress後台刪除插件檔案嗰陣,呢啲數據會殘留喺數據庫入面。為咗提供乾淨嘅卸載體驗,你應該用register_uninstall_hook()函數嚟註冊一個清理回調函數,喺呢個函數入面刪除所有插件相關嘅選項、數據表同瞬時緩存。

###
點樣可以令我嘅插件兼容更多嘅WordPress版本?

喺代碼入面避免用啲太新版本嘅PHP或者WordPress特有嘅函數。喺用某個函數、類或者鉤子之前,先查吓佢嘅官方文檔,了解佢係邊個WordPress版本開始引入嘅。你可以喺插件嘅主檔案註釋頭度透過Requires at least:字段聲明最低支援嘅WordPress版本。喺代碼入面,可以配合條件語句同function_exists()class_exists()檢查嚟提供降級方案或者友善提示。