WordPress插件開發終極指南:從零到一構建你嘅首個插件

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

準備工作同環境搭建

喺開始寫程式碼之前,你需要一個合適嘅開發環境。呢個包括一個本地嘅WordPress安裝、程式碼編輯器同埋基礎嘅PHP知識。推薦使用XAMPP、MAMP或者Local by Flywheel嚟快速搭建本地WordPress環境。確保你嘅PHP版本符合WordPress官方要求,通常係PHP 7.4或者更高版本。

一個插件本質上係一個或者多個PHP檔案,放喺WordPress嘅wp-content/plugins目錄入面。每個插件必須有一個獨一無二嘅名,而且佢嘅主檔案頭部需要包含標準嘅插件資訊註解,呢個係WordPress識別插件嘅基礎。

創建你嘅第一個插件檔案

首先,喺wp-content/plugins目錄下創建一個新嘅資料夾,例如my-first-plugin。然之後喺嗰個資料夾入面建立主PHP檔案,通常同資料夾同名:my-first-plugin.php。喺呢個檔案入面,你需要寫入插件頭部資訊。

推薦閱讀 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
 */

保存檔案之後,進入WordPress後台嘅「插件」頁面,你應該會睇到「我嘅第一個插件」出現喺插件列表度。呢個時候啟動佢,雖然佢暫時仲未有乜嘢功能,但呢個標誌住你嘅插件已經成功俾WordPress載入。

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

理解WordPress核心機制:掛鈎同過濾器

WordPress強大嘅擴展性嚟自佢事件驅動嘅架構,核心就係「掛鈎」(Hooks)。掛鈎分為兩種:動作(Action)同過濾器(Filter)。理解佢哋係你進行有效插件開發嘅關鍵。

动作钩子容许你喺特定時間點(例如發佈文章、加載頁面等)插入同執行自己嘅代碼。例如,喺文章發佈時寄出一封電郵。你可以用add_action()函數將你自訂嘅函數掛載到指定嘅動作鈎上。

過濾器鈎就容許你修改數據。喺數據被使用(例如存入數據庫或者顯示喺瀏覽器)之前,你可以截住同修改佢。例如,改文章標題或者評論內容。你可以用add_filter()函數嚟應用過濾器。

使用動作鈎子添加功能

假設我哋想喺網站嘅管理後台頁尾加一行自訂文字。WordPress提供咗一個叫admin_footer嘅動作掛鈎。我哋可以喺插件主檔案入面加入以下代碼:

推薦閱讀 WordPress插件開發新手入門指南:從零開始構建你嘅第一個功能插件

// 定义一个在管理后台页脚显示信息的函数
function myplugin_display_admin_footer_text() {
    echo '<p>多謝你使用「我嘅第一個插件」!</p>';
}
// 将函数挂载到 admin_footer 动作钩子
add_action( 'admin_footer', 'myplugin_display_admin_footer_text' );

儲存檔案並重新整理WordPress後台頁面,捲到頁尾,你應該會睇到加入嘅文字。呢個就係動作掛鈎嘅基本應用:喺特定位置執行代碼。

使用過濾器修改內容

而家,等我哋試下修改所有文章標題,喺標題尾統一加個商標符號。我哋可以用the_title過濾器。

// 定义一个修改文章标题的函数
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 );

呢段代碼會檢查當前環境係咪喺前台文章主循環入面,如果係嘅話,就會喺標題後面加個「™」符號。10係優先級(數字愈細愈優先執行),2表示我哋個函數接受兩個參數(原本嘅$title同埋$post_id)。

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

構建插件功能:創建管理選單同設定頁面

一個成熟嘅插件通常需要喺WordPress後台提供配置選項。呢個涉及為插件創建專屬嘅管理菜單頁面。WordPress提供咗豐富嘅API函數嚟實現呢個功能,例如add_menu_page()同埋add_options_page()

添加頂級管理選單

我哋會為插件加一個獨立嘅頂級菜單。呢個通常喺admin_menu動作鈎子入面完成。我哋創建一個函數嚟定義菜單同頁面。

// 定义添加管理菜单的函数
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’ );

跟住,我哋需要定義回調函數myplugin_display_settings_page()用嚟渲染設定頁面嘅HTML內容。

推薦閱讀 WordPress插件開發從入門到精通:構建自訂功能嘅完整指南

// 定义设置页面的显示内容
function myplugin_display_settings_page() {
    ?&gt;
    <div class="wrap">
        <h1>我嘅插件設定</h1>
        <form method="post" action="/yue/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="yue"/></form>
    </div>
    &lt;?php
}

註冊設定、欄位同分區

為咗安全噉處理表單數據,我哋需要用WordPress嘅設定API。呢個包括註冊設定、加設定分區同欄位。

// 初始化插件设置
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>設定插件嘅基本資料。</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”" />‘;
}

而家,你個插件就有咗一個完整、符合WordPress標準嘅管理設定頁面,可以安全噉保存同讀取配置選項。

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

插件國際化同安全最佳實踐

為咗令你嘅插件可以俾全球用戶使用,國際化(i18n)係必不可少嘅步驟。同時,跟從安全規範係保護你同用戶網站唔受攻擊嘅基石。

實現文本國際化

WordPress 使用__()_e()等函數嚟實現翻譯。首先,你需要確保喺插件頭部正確設定咗Text Domain(例如:my-first-plugin)。然後,將所有面向用戶嘅字串用翻譯函數包住。

// 在插件代码中,将硬编码的文本替换
// 修改前:echo ‘<p>多謝你使用「我嘅第一個插件」!</p>’;
// 修改后:
function myplugin_display_admin_footer_text() {
    echo ‘<p>‘ . esc_html__( ‘感谢使用“我的第一个插件”!’, ‘my-first-plugin’ ) . ‘</p>’;
}

跟住,你需要用好似Poedit呢類工具嚟生成.pot(模板)檔案,擺喺插件嘅languages資料夾入面。翻譯者可以創建對應嘅.po同埋編譯好嘅.mo文件。最後,喺插件初始化時使用load_plugin_textdomain()函數加載翻譯。

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

遵循安全編碼規範

安全係重中之重。首先,千祈唔好信用戶輸入。所有嚟自用戶或外部源嘅數據(如$_GET$_POST$_COOKIE)都必須經過驗證、清理同轉義。

  • 轉義輸出:當將數據輸出到HTML、JavaScript或URL時,使用相應嘅轉義函數。
    // 输出到HTML属性
    echo ‘<input value="“‘" . esc_attr( $value ) ‘“ />‘;
    // 输出到HTML内容
    echo ‘<p>‘ . esc_html( $text ) . ‘</p>’;
    // 输出到JavaScript变量
    echo ‘<script>var msg = “‘ . esc_js( $message ) . ‘“;</script>’;
    // 输出到URL
    echo ‘<a href="/yue/“‘/" . esc_url( $url ) ‘“>連結</a>’;
  • 驗證輸入:檢查數據係咪符合預期格式(例如係咪係電郵、數字等)。
    if ( ! filter_var( $email, FILTER_VALIDATE_EMAIL ) ) {
        // 不是有效的邮箱地址
        wp_die( ‘无效的邮箱格式。’ );
    }
  • 權限檢查:執行管理操作之前,檢查當前用戶係咪有相應嘅權限。
    if ( ! current_user_can( ‘manage_options’ ) ) {
        wp_die( ‘你没有执行此操作的权限。’ );
    }
  • Nonce驗證:對於涉及狀態更改嘅操作(例如表單提交、AJAX請求),使用Nonce(一次性數字)來防止跨站請求偽造(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( ‘安全校验失败。’ );
    }

摘要

透過本指南,你完成咗由創建基礎插件檔案、理解同運用WordPress核心嘅掛鈎系統、構建後台管理介面,到實現國際化同應用基礎安全實踐嘅全過程。你已經掌握咗開發一個功能完整、結構清晰、安全可靠嘅WordPress插件所需嘅核心技能。插件開發嘅精髓在於利用好動作同過濾器掛鈎嚟擴展WordPress功能,同時始終將安全性同可維護性擺喺首位。跟住落嚟,你可以嘗試探索更複雜嘅API,例如自訂數據庫表、AJAX交互或者REST API端點,嚟構建更強大嘅工具。

常見問題

### 開發WordPress插件需要啲乜嘢先決知識?
你需要具備基礎嘅PHP編程知識,了解HTML、CSS同JavaScript(尤其係jQuery)都會好有幫助。最緊要嘅係,要對WordPress嘅基本架構,例如主題、插件、文章類型、用戶角色等概念有初步了解。本指南假設你已經具備呢啲基礎知識。

點樣調試我嘅WordPress插件?

首先,確保你嘅wp-config.php檔案入面嘅WP_DEBUG常數設定為true,呢樣會喺頁面上顯示PHP錯誤、警告同通知。其次,可以用error_log()個函數會將除錯資訊寫入伺服器嘅錯誤日誌。對於更複雜嘅除錯,可以考慮用專門嘅除錯插件,例如Query Monitor,佢可以睇到資料庫查詢、掛鉤執行、腳本載入等詳細資訊。

我應該點樣分發我開發嘅插件?

對於個人使用或者小範圍分享,可以直接打包ZIP檔案。如果你想公開發布,有兩個主要途徑:一係提交到官方嘅WordPress插件目錄(WordPress.org),呢個需要跟從佢嘅提交指引同代碼標準,但係可以獲得最大嘅曝光度;二係透過自己嘅網站或者第三方市場(例如CodeCanyon)進行分發。提交到官方目錄前,請務必確保代碼質素同安全性。

點樣為我嘅插件添加自定義文章類型或者分類法?

你可以用register_post_type()函數嚟創建自訂文章類型(CPT),使用register_taxonomy()函數嚟創建自定義分類法。呢啲操作最好喺init動作鉤子入面執行。WordPress Codex同Developer Handbook上面有關於呢兩個函數嘅詳細參數說明,呢個係擴展WordPress內容管理能力嘅強大方式。

插件入面嘅函數名點樣避免同其他插件撞名?

為咗防止函數名、類名或者常量名衝突,最佳實踐係使用命名空間(PHP 5.3+)。如果你嘅插件需要支援更舊嘅PHP環境,或者你想保持最大兼容性,可以採用為所有標識符加上唯一前綴嘅方法。例如,使用插件名稱或者縮寫作為前綴,例如myplugin_function_nameMyPlugin_ClassNameMYPLUGIN_CONSTANT。本指南中嘅示例代碼都採用咗前綴方法。