WordPress開發目前正經歷轉型期,無論您是WordPress新手還是資深開發者,“全站編輯”(FSE)功能的引入,包括區塊編輯器(WordPress 5.0)和站點編輯器(WordPress 5.9),都顛覆了我們構建WordPress主題和插件的傳統方式。
儘管我們第一次接觸區塊編輯器已經五年了,但它的開發仍然充滿挑戰,因為文檔要么缺失,要么過時。這更多地反映了FSE功能快速迭代的現狀。
例如,2018年,CSS-tricks上曾發表過一個關於Gutenberg開發入門的系列文章。但時過境遷,雖然那種開發方式仍然有效,但已不再推薦(此外,它所基於的create-guten-block項目也不再維護)。
本文旨在幫助您開始WordPress區塊開發,並遵循當前的方法。當然,本文發布後,情況可能會發生變化。但我將嘗試關注其核心思想,因為即使工具會隨著時間推移而發展,核心概念很可能保持不變。
首先,讓我們澄清一些術語,例如“區塊”。在WordPress 5.0之前的這些功能的所有開發都使用代號“Gutenberg”(印刷術的發明者)。
從那時起,“Gutenberg”已被用來描述與區塊相關的一切,包括區塊編輯器和站點編輯器,因此它變得複雜到一些人討厭這個名字的程度。最重要的是,還有一個Gutenberg插件用於測試實驗性功能,以供將來可能包含。如果您認為將所有這些稱為“全站編輯”可以解決問題,那麼也存在一些擔憂。
因此,在本文中,當我們提到“區塊”時,指的是在WordPress區塊編輯器中創建內容的組件。區塊被插入頁面或文章中,並為特定類型的內容提供結構。 WordPress自帶了一些用於常見內容類型的“核心”區塊,例如段落、列表、圖像、視頻和音頻等等。
除了這些核心區塊外,我們還可以創建自定義區塊。這就是WordPress區塊開發的重點(還可以過濾核心區塊以修改其功能,但您可能暫時不需要)。
在我們深入創建區塊之前,我們必須首先了解區塊的內部工作原理。這絕對可以節省我們以後很多麻煩。
我喜歡將區塊抽像地理解為:一個具有某些屬性(稱為屬性)的實體,代表某些內容。我知道這聽起來很模糊,但請耐心聽我解釋。區塊基本上以兩種方式表現出來:作為區塊編輯器中的圖形界面,或作為數據庫中的數據塊。
當您打開WordPress區塊編輯器並插入一個區塊(例如,Pullquote區塊)時,您會得到一個不錯的界面。您可以點擊該界面並編輯引用的文本。區塊編輯器UI右側的“設置”面板提供用於調整文本和設置區塊外觀的選項。
當您完成創建精美的引用並點擊“發布”時,整篇文章都會存儲在數據庫的wp_posts表中。由於Gutenberg,這沒有什麼新意。這就是事情一直以來的工作方式——WordPress將文章內容存儲在數據庫中的指定表中。但新的是Pullquote區塊的表示是存儲在wp_posts表的post_content字段中的內容的一部分。
這種表示是什麼樣的?讓我們來看看:
<blockquote> <p>It is not an exaggeration to say that peas can be described as nothing less than perfect spheres of joy.</p> <cite>The Encyclopedia of world peas</cite> </blockquote>
看起來像普通的HTML,對吧? !用技術術語來說,這就是“序列化”的區塊。請注意HTML註釋中的JSON數據,“textAlign”:“right”。這是一個屬性——與區塊相關的屬性。
假設您關閉了區塊編輯器,然後一段時間後再次打開它。區塊編輯器將檢索相關post_content字段中的內容。然後,編輯器解析檢索到的內容,並在遇到以下內容時:
<code>...</code>
它會自言自語:
好吧,這看起來像一個Pullquote區塊。嗯……它也有一個屬性……我確實有一個JavaScript文件,它告訴我如何根據其屬性在編輯器中構造Pullquote區塊的圖形界面。我現在應該這樣做,以便以其全部榮耀呈現此區塊。
作為區塊開發者,您的工作是:
需要注意的是,所有這些從序列化數據到圖形界面的轉換——反之亦然——只發生在區塊編輯器中。在前端,內容的顯示方式與存儲方式完全相同。因此,從某種意義上說,區塊是一種將數據放入數據庫的巧妙方法。
希望這能使您更清楚地了解區塊的工作原理。
區塊只是插件。好吧,從技術上講,您可以將區塊放在主題中,也可以將多個區塊放在一個插件中。但是,通常情況下,如果您想製作一個區塊,您將要製作一個插件。因此,如果您曾經創建過WordPress插件,那麼您已經部分掌握了製作WordPress區塊的方法。
但是,讓我們假設您從未設置過WordPress插件,更不用說區塊了。你甚至從哪裡開始?
我們已經介紹了什麼是區塊。讓我們開始設置來製作一個。
這將使您可以訪問npm和npx命令,其中npm安裝區塊的依賴項並幫助編譯內容,而npx在不安裝軟件包的情況下運行軟件包上的命令。如果您使用的是macOS,您可能已經安裝了Node,並且可以使用nvm更新版本。如果您使用的是Windows,則需要下載並安裝Node。
現在,您可能會遇到其他教程,它們直接跳轉到命令行並指示您安裝名為@wordpress/create-block的軟件包。此軟件包非常棒,因為它會生成一個完整的項目文件夾,其中包含開始開發所需的所有依賴項和工具。
我個人在設置自己的區塊時會採用這種方法,但請暫時容忍我一下,因為我想消除它引入的主觀內容,並僅關注基本開發環境的必需部分,以便理解。
這些是我想特別指出的文件:
除了這些文件外,還有一個src目錄,它應該包含區塊的源代碼。
擁有這些文件和src目錄就足以開始了。在那組中,請注意我們實際上只需要一個文件(plugin.php)來製作插件。其餘的要么提供信息,要么用於管理開發環境。
前面提到的@wordpress/create-block軟件包為我們搭建了這些文件(以及更多)。您可以將其視為自動化工具,而不是必需品。無論如何,它確實使工作更容易,因此您可以通過運行以下命令來自由地使用它來搭建區塊:
<blockquote> <p>It is not an exaggeration to say that peas can be described as nothing less than perfect spheres of joy.</p> <cite>The Encyclopedia of world peas</cite> </blockquote>
假設您已準備好上一節中提到的三個文件,現在該安裝依賴項了。首先,我們需要指定我們將需要的依賴項。我們通過編輯package.json來做到這一點。使用@wordpress/create-block實用程序時,會為我們生成以下內容(添加了註釋;JSON不支持註釋,因此如果您複製代碼,請刪除註釋):
<blockquote> <p>It is not an exaggeration to say that peas can be described as nothing less than perfect spheres of joy.</p> <cite>The Encyclopedia of world peas</cite> </blockquote>
查看無註釋版本
```json
{
"name": "block-example",
"version": "0.1.0",
"description": "Example block scaffolded with Create Block tool.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
"main": "build/index.js",
"scripts": {
"build": "wp-scripts build",
"format": "wp-scripts format",
"lint:css": "wp-scripts lint-style",
"lint:js": "wp-scripts lint-js",
"packages-update": "wp-scripts packages-update",
"plugin-zip": "wp-scripts plugin-zip",
"start": "wp-scripts start"
},
"devDependencies": {
"@wordpress/scripts": "^24.1.0"
}
}
<code>...</code>
現在package.json已設置完畢,我們應該能夠通過在命令行中導航到項目文件夾並運行npm install來安裝所有這些依賴項。
如果您來自經典的WordPress插件開發,那麼您可能知道所有插件在主插件文件中都有一塊信息,這有助於WordPress識別插件並在WordPress管理面板的“插件”屏幕上顯示有關它的信息。
以下是@wordpress/create-block為我生成的,用於一個創造性地稱為“Hello World”的插件:
npx @wordpress/create-block
這在主插件文件中,您可以根據需要隨意命名。您可以將其命名為index.php或plugin.php之類的通用名稱。 create-block包會自動將其命名為您在安裝時提供的項目名稱。由於我將此示例稱為“Block Example”,因此該包為我們提供了一個block-example.php文件,其中包含所有這些內容。
您需要更改一些詳細信息,例如將自己設為作者等等。並非所有這些都是必要的。如果我從“頭”開始,那麼它可能更接近於此:
{ // 定义项目名称 "name": "block-example", // 使用语义版本控制设置项目版本号 "version": "0.1.0", // 项目的简短描述 "description": "Example block scaffolded with Create Block tool.", // 您可以将其替换为您自己 "author": "The WordPress Contributors", // 标准许可信息 "license": "GPL-2.0-or-later", // 定义主JavaScript文件 "main": "build/index.js", // 我们在开发过程中构建和编译插件所需的一切 "scripts": { "build": "wp-scripts build", "format": "wp-scripts format", "lint:css": "wp-scripts lint-style", "lint:js": "wp-scripts lint-js", "packages-update": "wp-scripts packages-update", "plugin-zip": "wp-scripts plugin-zip", "start": "wp-scripts start" }, // 定义使用脚本包的哪个版本(撰写本文时为24.1.0) // https://developer.wordpress.org/block-editor/reference-guides/packages/packages-scripts/ "devDependencies": { "@wordpress/scripts": "^24.1.0" } }
我不會詳細介紹每一行的確切用途,因為這在WordPress插件手冊中已經是一個完善的模式了。
我們已經查看了區塊所需的文件。但是,如果您使用的是@wordpress/create-block,您將在項目文件夾中看到許多其他文件。
以下是目前包含的內容:
<code> 这里的@wordpress/scripts包是主要的依赖项。如您所见,它是一个devDependency,这意味着它有助于开发。如何?它公开了wp-scripts二进制文件,我们可以使用它来编译我们的代码,从src目录到build目录,等等。 WordPress维护了许多其他软件包,用于各种目的。例如,@wordpress/components软件包为WordPress区块编辑器提供了一些预制UI组件,可用于为区块创建一致的用户体验,并符合WordPress设计标准。 您实际上*不需要*安装这些软件包,即使您想使用它们也是如此。这是因为这些@wordpress依赖项不会与您的区块代码捆绑在一起。相反,任何引用实用程序软件包代码的导入语句——例如@wordpress/components——都用于在编译期间构造“资产”文件。此外,这些导入语句被转换为将导入映射到全局对象的属性的语句。例如,import { \_\_ } from "@wordpress/i18n"被转换为const \_\_ = window.wp.i18n.\_\_的缩小版本。(window.wp.i18n是一个保证在全局范围内可用的对象,一旦相应的i18n软件包文件被排队)。 在插件文件中注册区块期间,隐式使用“资产”文件来告诉WordPress区块的软件包依赖项。这些依赖项会自动排队。所有这些都在幕后完成,前提是您使用的是scripts软件包。也就是说,您仍然可以选择在package.json文件中本地安装依赖项以进行代码完成和参数信息: ```json // etc. "devDependencies": { "@wordpress/scripts": "^24.1.0" }, "dependencies": { "@wordpress/components": "^19.17.0" }</code>
哇,好多!讓我們指出新的內容:
我想與您一起深入研究src目錄,但首先將重點放在其中的一個文件上:block.json。如果您使用的是create-block,它已經為您準備好了;如果沒有,請繼續創建它。 WordPress正在大力推動將其作為標準的規範方法來註冊區塊,方法是提供元數據,這些元數據為WordPress提供上下文,以便同時識別區塊並在區塊編輯器中呈現它。
以下是@wordpress/create-block為我生成的內容:
<blockquote> <p>It is not an exaggeration to say that peas can be described as nothing less than perfect spheres of joy.</p> <cite>The Encyclopedia of world peas</cite> </blockquote>
實際上,我們可以在此處包含許多不同的信息,但實際上只需要name和title。一個超級精簡的版本可能如下所示:
<blockquote> <p>It is not an exaggeration to say that peas can be described as nothing less than perfect spheres of joy.</p> <cite>The Encyclopedia of world peas</cite> </blockquote>
在我們進入實際代碼之前,還有一件事,那就是註冊插件。我們剛剛設置了所有這些元數據,我們需要一種方法讓WordPress使用它。這樣,WordPress就知道在哪裡可以找到所有插件資產,以便可以將它們排隊用於區塊編輯器。
註冊區塊是一個兩步過程。我們需要在PHP和JavaScript中註冊它。對於PHP方面,打開主插件文件(在本例中為block-example.php),並在插件標題之後添加以下內容:
<code>...</code>
這就是create-block實用程序為我生成的內容,這就是為什麼函數的命名方式如此的原因。我們可以使用不同的名稱。關鍵是避免與其他插件衝突,因此最好在此處使用您的命名空間以使其盡可能唯一:
npx @wordpress/create-block
如果包含所有區塊元數據的block.json位於src中,為什麼我們要指向build目錄?這是因為我們的代碼仍然需要編譯。 scripts軟件包處理src目錄中文件的代碼並將生產中使用的已編譯文件放置在build目錄中,同時複製block.json文件。
好了,讓我們轉到註冊區塊的JavaScript方面。打開src/index.js並確保它如下所示:
{ // 定义项目名称 "name": "block-example", // 使用语义版本控制设置项目版本号 "version": "0.1.0", // 项目的简短描述 "description": "Example block scaffolded with Create Block tool.", // 您可以将其替换为您自己 "author": "The WordPress Contributors", // 标准许可信息 "license": "GPL-2.0-or-later", // 定义主JavaScript文件 "main": "build/index.js", // 我们在开发过程中构建和编译插件所需的一切 "scripts": { "build": "wp-scripts build", "format": "wp-scripts format", "lint:css": "wp-scripts lint-style", "lint:js": "wp-scripts lint-js", "packages-update": "wp-scripts packages-update", "plugin-zip": "wp-scripts plugin-zip", "start": "wp-scripts start" }, // 定义使用脚本包的哪个版本(撰写本文时为24.1.0) // https://developer.wordpress.org/block-editor/reference-guides/packages/packages-scripts/ "devDependencies": { "@wordpress/scripts": "^24.1.0" } }
我們正在進入React和JSX領域!這告訴WordPress:
Edit和save函數是怎麼回事? WordPress區塊開發的細微之處之一是區分“後端”和“前端”,這些函數用於在這些上下文中呈現區塊的內容,其中edit處理後端呈現,save將內容從區塊編輯器寫入數據庫以在網站的前端呈現內容。
我們可以快速操作一下,看看我們的區塊是否在區塊編輯器中工作並在前端呈現。讓我們再次打開index.js,並使用edit和save函數返回一些基本內容,以說明它們的工作方式:
<blockquote> <p>It is not an exaggeration to say that peas can be described as nothing less than perfect spheres of joy.</p> <cite>The Encyclopedia of world peas</cite> </blockquote>
這基本上是我們之前代碼的精簡版本,只是我們直接指向block.json中的元數據來獲取區塊名稱,並且省略了Edit和Save組件,因為我們直接從此處運行函數。
我們可以通過在命令行中運行npm run build來編譯它。之後,我們可以在區塊編輯器中訪問名為“Block Example”的區塊:
如果我們將區塊放入內容區域,我們將獲得從edit函數返回的消息:
如果我們保存並發布文章,則在前端查看時,我們應該獲得從save函數返回的消息:
看起來一切正常!現在我們已經確認一切正常,我們可以恢復到測試之前的index.js中的內容:
<code>...</code>
請注意,edit和save函數與src目錄中@wordpress/create-block為我們生成的兩個現有文件相關聯,並且包含我們在每個文件中需要的其他導入。更重要的是,這些文件建立了包含區塊標記的Edit和Save組件。
npx @wordpress/create-block
看看我們做了什麼?我們正在從@wordpress/block-editor軟件包導入props,這允許我們生成稍後可以用於樣式的類。我們還導入了__國際化函數,用於處理翻譯。
這將創建一個Save組件,我們將使用與src/edit.js幾乎相同的內容,但文本略有不同:
{ // 定义项目名称 "name": "block-example", // 使用语义版本控制设置项目版本号 "version": "0.1.0", // 项目的简短描述 "description": "Example block scaffolded with Create Block tool.", // 您可以将其替换为您自己 "author": "The WordPress Contributors", // 标准许可信息 "license": "GPL-2.0-or-later", // 定义主JavaScript文件 "main": "build/index.js", // 我们在开发过程中构建和编译插件所需的一切 "scripts": { "build": "wp-scripts build", "format": "wp-scripts format", "lint:css": "wp-scripts lint-style", "lint:js": "wp-scripts lint-js", "packages-update": "wp-scripts packages-update", "plugin-zip": "wp-scripts plugin-zip", "start": "wp-scripts start" }, // 定义使用脚本包的哪个版本(撰写本文时为24.1.0) // https://developer.wordpress.org/block-editor/reference-guides/packages/packages-scripts/ "devDependencies": { "@wordpress/scripts": "^24.1.0" } }
同樣,我們得到了一個可以在CSS中使用的不錯的類:
我們剛剛介紹瞭如何使用區塊屬性來創建類。您正在CSS相關的網站上閱讀這篇文章,因此我覺得如果我們沒有特別介紹如何編寫區塊樣式,我會錯過一些東西。
如果您查看src目錄中的block.json,您會發現兩個與樣式相關的字段:
Kev Quirk有一篇詳細的文章展示了他使後端編輯器看起來像前端UI的方法。
回想一下,@wordpress/scripts軟件包在處理/src目錄中的代碼並將已編譯的資產放置在/build目錄中時,會復制block.json文件。用於註冊區塊的是build/block.json文件。 這意味著我們在src/block.json中提供的任何路徑都應相對於build/block.json編寫。
我們可以將幾個CSS文件放入build目錄中,在src/block.json中引用路徑,運行build,然後就完成了。但這並沒有充分利用@wordpress/scripts編譯過程的功能,該過程能夠將Sass編譯成CSS。相反,我們將樣式文件放在src目錄中,並在JavaScript中導入它們。
這樣做時,我們需要注意@wordpress/scripts如何處理樣式:
@wordpress/scripts軟件包使用webpack進行捆綁,並使用PostCSS插件進行樣式處理。 PostCSS可以使用其他插件進行擴展。 scripts軟件包使用Sass、SCSS和Autoprefixer的插件,所有這些插件都無需安裝其他軟件包即可使用。
事實上,當您使用@wordpress/create-block啟動初始區塊時,您可以很好地開始使用SCSS文件,您可以使用這些文件快速上手:
現在讓我們通過編寫一些我們將編譯成區塊CSS的Sass來實際操作一下。儘管這些示例不會非常Sass化,但我仍然將它們寫入SCSS文件以演示編譯過程。
好的,讓我們從應用於前端和後端的樣式開始。首先,我們需要創建src/style.scss(如果您使用的是@wordpress/create-block,它已經存在),並確保我們導入它,我們可以在index.js中執行此操作:
<blockquote> <p>It is not an exaggeration to say that peas can be described as nothing less than perfect spheres of joy.</p> <cite>The Encyclopedia of world peas</cite> </blockquote>
打開src/style.scss並在其中使用從區塊屬性為我們生成的類放入一些基本樣式:
<code>...</code>
現在就這些!當我們運行build時,這將編譯成build/style.css,並由區塊編輯器和前端引用。
您可能需要編寫特定於區塊編輯器的樣式。為此,請創建src/editor.scss(同樣,@wordpress/create-block為您執行此操作),並在其中放入一些樣式:
npx @wordpress/create-block
然後在edit.js中導入它,該文件包含我們的Edit組件(我們可以在任何地方導入它,但由於這些樣式是用於編輯器的,因此在此處導入組件更合乎邏輯):
<blockquote> <p>It is not an exaggeration to say that peas can be described as nothing less than perfect spheres of joy.</p> <cite>The Encyclopedia of world peas</cite> </blockquote>
現在,當我們運行npm run build時,樣式將應用於這兩種上下文中的區塊:
我們在edit.js和index.js中導入了樣式文件,但請記住,編譯步驟為我們在build目錄中生成了兩個CSS文件:index.css和style-index.css。我們需要在區塊元數據中引用這些生成的文件。
讓我們向block.json元數據添加幾個語句:
<code>...</code>
再次運行npm run build,在您的WordPress網站上安裝並激活插件,您就可以使用了!
您可以使用npm run start以監視模式運行您的構建,每次您更改代碼並保存時都會自動編譯您的代碼。
實際的區塊使用了區塊編輯器的“設置”側邊欄和WordPress提供的其他功能來創建豐富的用戶體驗。此外,由於區塊實際上有兩個版本——edit和save——您還需要考慮如何組織代碼以避免代碼重複。
但希望這有助於消除創建WordPress區塊的總體過程的神秘感。這確實是WordPress開發的新時代。學習新的做事方法很困難,但我期待著看到它的發展。像@wordpress/create-block這樣的工具有所幫助,但即使那樣,了解它到底在做什麼以及為什麼這樣做也很不錯。
我們在這裡介紹的內容會改變嗎?很可能!但至少您有一個基線可以作為參考,因為我們繼續關注WordPress區塊的成熟,包括製作它們的最佳實踐。
再次聲明,我的目標是規劃出一條高效的路徑,以便在這個快速發展的時代進入區塊開發,WordPress文檔有點難以跟上。以下是我用來整理這些內容的一些資源:
以上是開始使用WordPress塊開發的詳細內容。更多資訊請關注PHP中文網其他相關文章!