WordPress 作為一款基于 PHP 的流行建站平臺(tái),其強(qiáng)大的擴(kuò)展性是其核心優(yōu)勢。雖然只需在wp-content/plugins目錄放置單個(gè) PHP 文件即可創(chuàng)建插件,但多年來 WordPress 插件開發(fā)范式卻停滯不前——盡管 PHP 語言本身已實(shí)現(xiàn)跨越式發(fā)展。
PHP 近年來新增了諸多現(xiàn)代化特性,包括更完善的面向?qū)ο缶幊蹋∣OP)支持和自動(dòng)加載機(jī)制。然而,WordPress 生態(tài)仍以傳統(tǒng)的過程式編程為主流,在插件中實(shí)現(xiàn)自動(dòng)加載等功能仍存在障礙。
今天,WordPress大學(xué)和大家分享一個(gè)致力于簡化現(xiàn)代 PHP 開發(fā)流程的 WordPress 插件框架:Howdy。
插件庫:https://github.com/syntatis/howdy
設(shè)計(jì)理念

Howdy專注于提高生產(chǎn)力而不會(huì)使工作流程過于復(fù)雜的基本工具。它不會(huì)強(qiáng)迫所有現(xiàn)代 PHP 實(shí)踐都采用它,而是優(yōu)先考慮兩個(gè)基本功能:
- 命名空間
- 自動(dòng)加載(使用Composer)
命名空間
PHP 中的命名空間將類、函數(shù)和常量組織成邏輯組,類似于文件夾結(jié)構(gòu)文件的方式,以防止命名沖突。例如,如果兩個(gè)插件定義一個(gè)Security類,則每個(gè)插件都使用唯一的命名空間,則不會(huì)發(fā)生沖突。
傳統(tǒng)上,WordPress 依靠前綴進(jìn)行隔離。假設(shè)您的插件名為“Simple Security by Acme”。您通常會(huì)在函數(shù)和類前加上組織名稱Acme_或acme_:
// 函數(shù)名稱中的前綴。
function acme_check_security () {
// 在此處添加安全檢查邏輯
}
// 類名中的前綴。
class Acme_Security {
public function check () {
// 在此處添加特定于類的邏輯。
}
}
雖然命名空間可用于 WordPress 插件,但采用率仍然很低。這是因?yàn)槿绻麤]有自動(dòng)加載,就無法充分利用命名空間。
自動(dòng)加載
WordPress 中的自動(dòng)加載類有兩個(gè)主要限制。
首先,如果不給第三方庫(如openai-php/client)的命名空間添加前綴,則無法自動(dòng)加載它們。如果兩個(gè)插件加載同一個(gè)庫,沖突的定義會(huì)導(dǎo)致網(wǎng)站崩潰。
此外,如果不使用 Composer,所有函數(shù)、常量或靜態(tài)文件都必須手動(dòng)加載require_once,從而增加樣板。
這是Howdy想要解決的兩個(gè)主要問題。
一旦我們正確設(shè)置了這兩個(gè)功能,采用其他高級(jí) PHP 模式(例如依賴注入或外觀)就會(huì)變得更加容易。
那么讓我們安裝 Howdy并觀察它的運(yùn)行。
安裝
我們可以使用 Composercreate-project命令安裝 Howdy:
composer create-project syntatis/howdy -s dev
此命令將創(chuàng)建一個(gè)新目錄,howdy提取所有項(xiàng)目文件,并從Packagist安裝依賴項(xiàng)。
如果要在不同的文件夾中創(chuàng)建項(xiàng)目,可以在命令末尾添加目錄名稱,如下所示:
composer create-project syntatis/howdy -s dev acme-plugin
然后它會(huì)要求您輸入插件 slug。插件 slug 是必需的,并且應(yīng)該是唯一的。如果您計(jì)劃在 WordPress.org 上發(fā)布您的插件,則此 slug 將用于插件 URL,例如https://wordpress.org/plugins/{slug}/。在本例中,我們將使用acme-plugin。

插件 slug 還將用于確定默認(rèn)插件名稱、命名空間前綴等。如下所示,它足夠智能,可以將 slug 轉(zhuǎn)換為適當(dāng)?shù)母袷健T诒纠校覀儗⒈A裟J(rèn)插件名稱,同時(shí)將命名空間更改為 而Acme不是AcmePlugin。

輸入完成后,將對(duì)項(xiàng)目文件進(jìn)行必要的更新。例如,文件中將app/Plugin.php包含命名空間和依賴項(xiàng)命名空間的前綴。

預(yù)置工具
Howdy 預(yù)先配置了這些工具以簡化開發(fā):
- PHP-Scoper:它允許我們?yōu)槭褂?Composer 安裝的依賴項(xiàng)添加前綴,以防止在使用相同庫時(shí)發(fā)生沖突。
- PHPCS:它包含 PHPCS,但該庫不使用WordPress 編碼標(biāo)準(zhǔn),而是應(yīng)用 PHP 生態(tài)系統(tǒng)中已建立的現(xiàn)代編碼標(biāo)準(zhǔn),例如PSR-12、 Doctrine和Slevomat。
- Kubrick:React.js 組件的集合,用于構(gòu)建類似 WordPress 管理員中的設(shè)置頁面的應(yīng)用程序。
- @wordpress/scripts:編譯 JavaScript 和樣式表。您可以運(yùn)行以下命令開始監(jiān)視文件并自動(dòng)編譯更改:
npm run start
目錄結(jié)構(gòu)
Howdy使用了稍微不尋常的 WordPress 插件結(jié)構(gòu)。但是,如果您熟悉Laravel或Symfony等框架,那么您很快就會(huì)適應(yīng)。
主要有三個(gè)目錄:
- app:此目錄應(yīng)包含插件的核心類和業(yè)務(wù)邏輯。如果此目錄中的類符合PSR-4 標(biāo)準(zhǔn),則會(huì)自動(dòng)加載。
- inc:此目錄包含配置文件、實(shí)用程序和 HTML 模板。
- src:此目錄包含 JavaScript 和樣式表文件的未編譯源代碼。
安裝外部依賴項(xiàng)
現(xiàn)在我們已經(jīng)設(shè)置了插件樣板,我們可以輕松地使用 Composer 安裝其他軟件包。例如,如果我們想構(gòu)建一個(gè)帶有 OpenAI 集成的插件,我們可以openai-php/client使用以下命令包含該軟件包:
composer require openai-php/client
安裝后,Howdy 將自動(dòng)為該包中所有類的命名空間添加前綴。
您還可以安裝專門用于開發(fā)的軟件包。例如,要安裝symfony/var-dumper(一個(gè)流行的用于調(diào)試的 PHP 軟件包),您可以運(yùn)行:
composer require symfony/var-dumper --dev
與 PHP 的原生函數(shù)相比,該包提供了更加用戶友好的調(diào)試體驗(yàn)var_dump。

生產(chǎn)準(zhǔn)備
最后,Howdy 提供了幾個(gè)命令來準(zhǔn)備發(fā)布你的插件:
npm run build:構(gòu)建目錄中的所有資產(chǎn)文件,包括 JavaScript 和樣式表src。這些文件已針對(duì)生產(chǎn)進(jìn)行了優(yōu)化和壓縮。
composer run build:重新編譯項(xiàng)目并刪除為開發(fā)而安裝的軟件包。
composer run plugin:zip:為插件創(chuàng)建可安裝的 ZIP 文件。不需要的文件(如點(diǎn)文件、src目錄等)node_modules將從最終存檔中排除。
總結(jié)
在本文中,我們探討了 Howdy 及其對(duì) WordPress 插件開發(fā)的好處。
Howdy 旨在實(shí)現(xiàn)插件開發(fā)的現(xiàn)代化,而不會(huì)讓您感到不知所措。它避免使用各種流行工具(例如,默認(rèn)情況下不包含 PHPUnit、PHPStan 或 TypeScript)來使您的工作流程變得臃腫,但您可以根據(jù)需要稍后添加它們。
通過解決依賴沖突并啟用 Composer,Howdy 將 WordPress 開發(fā)與更廣泛的 PHP 生態(tài)系統(tǒng)連接起來,為構(gòu)建可維護(hù)和可擴(kuò)展的插件開啟了無數(shù)可能性。
注:本文來自 https://www.hongkiat.com/blog/howdy-modern-wordpress-plugin-boilerplate-guide/,由 WordPress大學(xué) 翻譯整理。




