Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
WordPress 在進入第五版以後,預設的編輯器變成區塊編輯器。這項更新迄今已經過了兩年多,各種區塊的外掛也越臻完備,因此,許多撰寫文章會用到的區塊功能,幾乎不需要重新開發,只需要在既有功能上擴充即可。
譬如說:對話框。
不知道為什麼,日本人寫文章真的很喜歡對話框的功能⋯⋯
去年 Leo 請我在公司官網中,加入對話框的功能。當時參考了這篇文章的作法,在網站中加入了 CSS 的類別屬性,使用 [媒體及文字] 區塊,搭配上 [區塊] > [進階設定] > [附加的 CSS 類別] 來建立對話框。

然而,因為需要進到區塊設定的 [進階設定] 中做調整,因此對於其他同事來說,還是多了一點技術門檻。
為了想要可以讓他們可以在介面中更簡單的加入所需的 CSS 類別,因此透過擴充區塊編輯器的方式,將這項功能增加到當前的 [媒體及文字] 中。

順帶一提,WordPress 從區塊編輯器的時代開始,已經將部分的重心,從原本的 PHP 轉向 JavaScript,因此在開發區塊編輯器的相關功能時,也會需要開始多熟悉 JavaScript。
本篇文章適合對於 WordPress 開發略有概念 (懂得使用 wp_enqueue_scripts) 同時對 JavaScript 有初步認識的人。
內容目錄
根據 WordPress 的開發文件〈Extending the Block Editor〉,首先需要建立區塊用的 .js 檔案。如果你有使用中的子佈景主題,你也可以直接在子佈景主題的主要 .js 檔中進行編輯。
因為本次需要做的是擴充既有區塊的樣式,因此使用 wp.blocks.registerBlockStyle 這個方法。
我們實作的對象是 [媒體及文字] 區塊,需要呼叫的 API 是 core/media-text,你也可以針對想要擴充的區塊直接呼叫 API,例如段落的 core/paragraph。
wp.blocks.registerBlockStyle('core/media-text', {
name: 'balloon',
label: 'Balloon',
});透過上述方式註冊的區塊樣式,在切換成該樣式時,會產生 .is-style-{name} 的 CSS 類別,以上面的例子為例,就會是 .is-style-balloon。
在子佈景主的主目錄下建立 block.css 中,加入下列的樣式:
/* --------------
改變媒體及文字預設的配置
-------------- */
.wp-block-media-text.is-style-balloon {
grid-template-columns: 100px auto;
margin-bottom: 1.5em;
align-items: initial;
}
.wp-block-media-text.is-style-balloon.has-media-on-the-right {
grid-template-columns: auto 100px;
}
.wp-block-media-text.is-style-balloon.has-media-on-the-right .wp-block-media-text__content {
margin-right: 20px;
margin-left: 0;
grid-column: 1;
}
/* --------------
建立對話框的框線樣式
需要特別調整 left/right/width 與 margin 的數值
因為這些數值是針對 applemint 網站調校的,不一定適合你的網站。
-------------- */
.wp-block-media-text.is-style-balloon.has-media-on-the-right .wp-block-media-text__content::before {
content: "";
border-left: 10px solid #00c1d1;
border-right: none;
right: -20px;
left: 100%;
}
.wp-block-media-text.is-style-balloon.has-media-on-the-right .wp-block-media-text__content::after {
content: "";
border-left: 10px solid #fff;
border-right: none;
left: calc(100% - 3px);
}
.is-style-balloon .wp-block-media-text__content {
-ms-flex-item-align: center;
align-self: center;
border: 2px solid #00c1d1;
border-radius: 5px;
padding: 4%;
position: relative;
margin-left: 20px;
width: calc( 100% - 20px );
}
.is-style-balloon .wp-block-media-text__content p:last-child {
margin: 0;
}
.is-style-balloon .wp-block-media-text__content::before,
.is-style-balloon .wp-block-media-text__content::after {
position: absolute;
content: "";
border: 10px solid transparent;
top: calc( 50% - 10px );
}
.is-style-balloon .wp-block-media-text__content::before {
border-right: 10px solid #00c1d1;
left: -22px;
}
.is-style-balloon .wp-block-media-text__content::after {
border-right: 10px solid #fff;
left: -19px;
}
/* --------------
頭像想要呈現成圓形的
-------------- */
.is-style-balloon figure img {
border-radius: 50%;
border: 1px solid #ddd;
}
/* --------------
針對手行動裝置的樣式
-------------- */
@media screen and (max-width: 48em) {
.wp-block-media-text.is-style-balloon {
grid-template-columns: 50px auto !important;
}
.wp-block-media-text.is-style-balloon .wp-block-media-text__content {
width: calc( 100% - 15px );
margin-left: auto;
padding: 15px;
grid-row: 1;
grid-column: 2;
}
}為了能夠在編輯時使用區塊,因此需要透過 enqueue_block_editor_assets 這個勾點 (hook) 將區塊載入到編輯器中。
並透過 enqueue_block_assets 勾點,引用 block.css,便能使前後台都能顯示該樣式。
/**
* Enqueue Block Editor Scripts
* This is used to enqueue block editor styles.
*
*/
function hyc_blockeditor_scripts() {
wp_enqueue_script( 'hyc-balloon-be',
get_stylesheet_directory_uri() . '/js/balloon-be.js',
array( 'wp-blocks' ) );
}
add_action( 'enqueue_block_editor_assets', 'hyc_blockeditor_scripts' );
function hyc_block_scripts() {
wp_enqueue_style( 'hyc-block-style',
get_stylesheet_directory_uri() . '/block.css' );
}
add_action( 'enqueue_block_assets', 'hyc_block_scripts' );上述提供了自行擴充對話框功能的做法,但就如同一開始所說的,日本人非常喜歡這項功能,因此實際上已經有人將這項功能開發成專門的區塊,可以直接安裝使用。如果你希望網站中增加這個區塊,但沒有開發的相關背景,也可以試試看這款外掛。
說真的,隨著區塊編輯器的逐漸成熟,看起來已經有逐漸取代傳統 [短代碼] 與頁面編輯器的傾向了。如果接下來還想跟上 WordPress 社群的開發生態,強烈建議要好好理解一下怎麼樣選用適當的區塊,或是為既有區塊進行擴充。