掌握WordPress插件開發:由零到一建立你嘅第一個自訂插件

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

點解要選擇開發WordPress插件

WordPress作為全球最流行嘅內容管理系統,佢強大嘅可擴展性主要嚟自插件。透過開發自訂插件,你可以為核心平台添加獨一無二嘅功能,滿足特定業務需求,而唔使修改主題檔案。咁樣可以確保主題更新時,你嘅功能代碼唔會唔見咗,亦令功能模組化,方便喺唔同網站之間重用。

學習插件開發唔單止可以令你創造出俾其他人用嘅產品,仲可以令你更深入咁理解WordPress嘅運作原理,包括佢嘅掛鉤系統、數據庫互動同安全性最佳實踐。呢個係由普通用戶邁向高級開發者嘅關鍵一步。

構建你嘅第一個插件

喺開始寫代碼之前,你需要喺本地或者測試伺服器上面搭建一個標準嘅WordPress環境。呢個係所有開發工作嘅基礎。

推薦閱讀 由零開始學WordPress插件開發:整到你第一個自訂功能

建立插件主檔案

每個WordPress插件都必須有一個主檔案,通常以插件名稱命名。我哋會創建一個叫做my-first-plugin嘅插件。首先,喺你嘅WordPress安裝目錄下/wp-content/plugins/嘅文件夾入面,創建一個新文件夾,命名為my-first-plugin

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

喺呢個文件夾入面,創建一個叫做my-first-plugin.php嘅PHP檔案。呢個檔案就係插件嘅入口點。打開佢,並加入以下插件頭部註釋,呢啲資訊對WordPress識別你嘅插件好重要。

<?php
/**
 * Plugin Name:       我的第一个插件
 * Plugin URI:        https://yourwebsite.com/my-first-plugin
 * Description:       这是一个学习WordPress插件开发的示例插件,用于在文章底部添加自定义内容。
 * Version:           1.0.0
 * Author:            你的名字
 * Author URI:        https://yourwebsite.com
 * License:           GPL v2 or later
 * Text Domain:       my-first-plugin
 * Domain Path:       /languages
 */

實現第一個簡單功能

一個經典嘅新手功能係:喺網站嘅所有文章內容底部自動加一段文字。我哋會用WordPress嘅 the_content 過濾器鈎子嚟實現。喺你嘅主檔案嘅頭部註釋下面,加入以下函數:

// 防止直接访问文件
if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

/**
 * 在文章内容末尾添加自定义文本
 *
 * @param string $content 原始的文章内容。
 * @return string 修改后的文章内容。
 */
function mfp_add_footer_text( $content ) {
    // 判断是否是主循环且在单篇文章页面
    if ( is_single() &amp;&amp; in_the_loop() &amp;&amp; is_main_query() ) {
        $custom_text = '<div class="mfp-footer-note"><p><em>多謝你睇完!呢篇文係由「我嘅第一個插件」為你呈現㗎。</em></p></div>';
        return $content . $custom_text;
    }
    return $content;
}
// 将函数挂载到 `the_content` 过滤器上
add_filter( 'the_content', 'mfp_add_footer_text' );

呢段代碼定義咗一個函數 mfp_add_footer_text,佢接收文章內容 $content 作為參數。函數內部首先檢查當前環境係咪喺單篇文章頁面、主循環同主查詢中,呢個係為咗避免喺摘要、小工具或者其他地方都加文字。如果條件符合,佢會創建一段自訂嘅HTML文字,並將佢附加到原始內容後面。

深入插件架構與安全

隨住插件功能增多,良好嘅代碼組織至關重要。同時,安全性係所有WordPress開發嘅生命線。

推薦閱讀 掌握WordPress插件開發:由零到一構建你嘅第一個擴展功能模組

使用面向對象編程重構代碼

為咗提升代碼嘅可維護性同可擴展性,推薦使用面向對象(OOP)嘅方式嚟組織插件。我哋會將上面嘅功能重構成一個類。

// 防止直接访问文件
if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

class My_First_Plugin {
    /**
     * 构造函数,初始化插件钩子。
     */
    public function __construct() {
        // 在构造方法中将方法挂载到钩子上
        add_action( 'init', array( $this, 'load_textdomain' ) );
        add_filter( 'the_content', array( $this, 'add_footer_to_content' ) );
        add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_styles' ) );
    }

/**
     * 加载插件的文本翻译域。
     */
    public function load_textdomain() {
        load_plugin_textdomain( 'my-first-plugin', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
    }

/**
     * 在文章内容末尾添加自定义文本。
     */
    public function add_footer_to_content( $content ) {
        if ( is_single() &amp;&amp; in_the_loop() &amp;&amp; is_main_query() ) {
            $custom_text = '<div class="mfp-footer-note"><p><em>' . esc_html__( '感谢阅读!本文由“我的第一个插件”为您呈现。', 'my-first-plugin' ) . '</em></p></div>';
            return $content . $custom_text;
        }
        return $content;
    }

/**
     * 为插件添加样式。
     */
    public function enqueue_styles() {
        wp_enqueue_style( 'mfp-style', plugins_url( 'assets/css/style.css', __FILE__ ), array(), '1.0.0' );
    }
}

// 实例化插件类
$my_first_plugin_instance = new My_First_Plugin();

請注意,我哋喺 add_footer_to_content 方法入面用咗 esc_html__() 函數嚟包住啲文字。呢個係一個翻譯函數,同時佢亦都對輸出做咗適當嘅轉義,呢個係安全輸出文字嘅最佳做法。我哋仲加咗載入樣式表嘅方法,同埋引入咗文字域支援,為插件國際化(i18n)做好咗準備。

理解同實現數據驗證同轉義

永遠唔好相信用戶輸入或者任何外部數據。喺接收、處理、輸出數據嘅時候,一定要做驗證、清理同轉義。例如,如果你要整一個有輸入表格嘅管理頁面,務必用WordPress提供嘅nonce、權限檢查同數據驗證功能。

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

呢個插件功能相對簡單,但係我哋喺輸出HTML嘅時候,已經用咗 esc_html__() 做轉義。如果插件需要處理用戶提交嘅數據,例如透過表格,咁就一定要用 sanitize_text_field(), wp_kses_post() 呢啲功能做清理,同埋用 wp_verify_nonce() 嚟驗證請求嘅合法性。

創建插件管理頁面

一個成熟嘅插件通常需要一個後台配置頁面。我哋將會學識點樣用WordPress嘅設定API嚟創建一個簡單、標準嘅管理頁面。

加插件設定菜單

首先,我哋需要喺WordPress後台嘅「設定」菜單下面加一個子菜單頁。喺你嘅類度加一個新方法,同埋喺構造函數度透過 add_action('admin_menu', ...) 鉤子調用佢。

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

/**
 * 注册插件管理页面。
 */
public function register_admin_menu() {
    add_options_page(
        __( '我的插件设置', 'my-first-plugin' ), // 页面标题
        __( '我的第一个插件', 'my-first-plugin' ), // 菜单标题
        'manage_options', // 所需权限
        'mfp-settings', // 菜单slug
        array( $this, 'display_settings_page' ) // 显示页面的回调函数
    );
}

然後,喺構造函數入面加:add_action( 'admin_menu', array( $this, 'register_admin_menu' ) );

建立設定頁面同欄位

跟住,我哋要定義 display_settings_page 方法,用嚟渲染設定頁面嘅HTML內容,同埋用設定API嚟註冊一個設定欄位。

InterServer 共享主機
共享主機:每月1TB,只需£2.50;首月只需£0.10,使用優惠碼 tryinterserver。461個雲端應用程式腳本,一鍵安裝。
/**
 * 显示插件设置页面。
 */
public function display_settings_page() {
    ?&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_settings_group' );
            do_settings_sections( 'mfp-settings' );
            submit_button();
            ?>
        <input type="hidden" name="trp-form-language" value="yue"/></form>
    </div>
    <?php
}

/**
 * 初始化插件设置。
 */
public function initialize_settings() {
    // 注册一个设置
    register_setting(
        'mfp_settings_group', // 设置组名
        'mfp_footer_text', // 选项名
        array(
            'type' => 'string',
            'sanitize_callback' =&gt; 'sanitize_text_field', // 清理回调函数
            'default' =&gt; __( '感谢阅读!本文由“我的第一个插件”为您呈现。', 'my-first-plugin' ),
        )
    );

// 添加一个设置区域
    add_settings_section(
        'mfp_main_section',
        __( '主要设置', 'my-first-plugin' ),
        null, // 可选的区域描述回调函数
        'mfp-settings'
    );

// 向区域中添加字段
    add_settings_field(
        'mfp_footer_field',
        __( '页脚文本', 'my-first-plugin' ),
        array( $this, 'render_footer_field' ), // 渲染字段的回调函数
        'mfp-settings',
        'mfp_main_section',
        array( 'label_for' =&gt; 'mfp_footer_text' )
    );
}

你需要定義 render_footer_field 方法嚟渲染實際嘅輸入框,並更新之前嘅 add_footer_to_content 方法,使其從數據庫選項 get_option('mfp_footer_text') 中讀取文本,而唔係用硬編碼嘅字符串。最後,喺構造函數度加入:add_action( 'admin_init', array( $this, 'initialize_settings' ) );

摘要

透過本文嘅旅程,你由零開始構建咗一個功能完整嘅WordPress插件。你學識咗點樣創建插件嘅基本結構,使用動作同過濾器鈎嚟擴展WordPress功能,採用面向對象嘅方式組織代碼以提高質量,遵循安全最佳實踐嚟驗證同轉義數據,以及利用WordPress設置API創建專業嘅後台管理界面。

插件開發嘅核心在於理解WordPress嘅掛鉤系統同數據流。持續實踐,由簡單功能開始,逐步增加複雜度,並且始終將安全性、性能同可維護性擺喺首位。隨住經驗累積,你將能夠開發出強大、專業且受歡迎嘅WordPress插件。

常見問題

開發WordPress插件需要咩基礎知識

你需要具備紮實嘅PHP編程知識,因為插件主要由PHP編寫。同時,對HTML、CSS同JavaScript有基本了解亦係必要嘅,因為你需要處理前端展示同互動。最重要嘅係,你需要熟悉WordPress嘅核心概念,例如掛鉤(動作同過濾器)、循環、模板層級以及數據庫操作(透過WP_Query同WP_User_Query等類)。

點樣調試同測試我嘅插件

首先,強烈建議喺本地開發環境(例如Local by Flywheel, XAMPP)或者線上測試站點進行開發,避免影響生產網站。啟用WordPress嘅調試模式,喺你嘅wp-config.php檔案入面設定define( 'WP_DEBUG', true );,呢個會將PHP錯誤同警告顯示喺螢幕上。用error_log()函數將自訂嘅除錯資訊記錄到伺服器嘅錯誤日誌度。對於更複雜嘅除錯,可以考慮用Query Monitor、Debug Bar呢啲專業除錯插件。

我嘅插件點樣兼容唔同嘅WordPress版本

開發嗰陣,應該留意WordPress官方文件入面關於函數棄用嘅通知。避免用已經標示為「已棄用」嘅函數。喺插件嘅主檔案入面,可以透過Requires at least同埋Tested up to標頭資訊嚟聲明兼容嘅WordPress版本。定期喺較新版本嘅WordPress上面測試你嘅插件,同埋留意核心更新日誌,咁就可以及時調整程式碼。

點樣將我嘅插件發佈到WordPress官方插件目錄

首先,你需要確保你嘅插件完全符合官方嘅插件開發規範同提交指南。呢啲包括代碼質量、安全性、許可協議(必須係GPLv2或更高版本)等等。然後,喺WordPress.org上申請一個SVN倉庫。將你嘅插件代碼提交到呢個SVN倉庫嘅trunk目錄入面,並創建相應嘅readme.txt文件(用特定格式)。審核通過之後,你嘅插件就會出現喺官方目錄入面。