【Word Press進階】自定義區塊的行為與樣式

前兩篇

  • 【Word Press基礎】創建自定義區塊
  • 【Word Press基礎】創建一個動態的自定義區塊

說明白了怎么創建一個簡單的靜態區塊。但實在是太丑了。這里再進行一個優化,讓咱們的區塊好看又好用。

一個合格的區塊應當有著好看的外表,完整的功能,以及一定程度的自定義。我們這次就來完成這些功能

一、配置區塊的樣式

這應該是最簡單的過程了。打開文章的發布界面,F12檢查自定義的區塊,可以看到它的class:
請添加圖片描述

注意到,插件class的名稱是以下的規則

wp-block-[插件包名]-[插件名稱]

也就是我們block.json中配置的name字段:"name": "ht/ht-note"

打開插件根目錄,能夠看到兩個scss樣式表:editor.scss & style.scss。分別是編輯器展示樣式頁面展示樣式。另外需要提醒的是,這兩個樣式表并不是“或”的關系。不管是編輯器還是頁面,都使用了style.scss的樣式,只是編輯器還額外應用了editor.scss。所以如果沒有特殊的需求,只需要修改style.scss即可。

由于修改了name字段,也涉及到class和樣式,我們需要修改style.scss、edit.js、rander.php。修改之后的文件將如以下所示:

edit.js

...
export default function Edit({ attributes, setAttributes }) {return (<><div { ...useBlockProps() }><RichTexttagName='div'className='note-content' // 新增了classNameonChange={ (value) => setAttributes({ noteContent: value })}value={attributes.noteContent}placeholder='輸入你的內容...'></RichText>// 這里新增了class<div class='note-button'>自定義的按鈕</div> </div></>);
}
...

rander.php

<?php
$content = $attributes['noteContent'] ?? "默認投票";
?><div <?php echo get_block_wrapper_attributes(); ?>>// 同理新增了class<div class="note-content"><?php echo $content; ?></div><div class="note-button">自定義的按鈕</div>
</div>

style.scss

.wp-block-ht-ht-note {margin: 2rem;padding: 1rem;background-color: #f5f5f5;border-radius: 5px;border: 1px solid #ccc;font-size: 1.2rem;display: flex;align-content: center;justify-content: space-around;align-items: center;flex-direction: column;
}.wp-block-ht-ht-note .note-content {transition: all 0.5s ease-in-out;width: 75%;text-align: center;margin: 2rem auto;display: flex;flex-direction: column;justify-content: center;align-items: center;
}.wp-block-ht-ht-note .note-content:hover {background-color: #c5c5c5;
}.wp-block-ht-ht-note .note-button {transition: all 0.5s ease-in-out;background-color: #2a2a2a;color: white;height: 3rem;border-radius: 1.5rem;line-height: 3rem;padding: 0 1.5rem;cursor: pointer;
}.wp-block-ht-ht-note .note-button:hover {background-color: #c5c5c5;color: black;
}

隨便寫了寫樣式(為了方便調試,將背景設置成了粉紅色),一下子就好看起來了:
請添加圖片描述

二、配置區塊的功能

word press支持配置區塊的背景、文字顏色等基礎樣式。除此之外,也能配置區塊的對齊方式、間距大小等更復雜的樣式。總而言之能夠配置很多屬性。比較簡單,這里不再過多贅述。可看官方文檔。

注意:如果你的區塊沒有被Word Press托管(沒有{...useBlockProps()})則配置無效
另外,如果使用了動態區塊,部分屬性無效。

打開block.json,并配置supports字段。這里配置上了字體大小、背景顏色。

block.json

{"$schema": "https://schemas.wp.org/trunk/block.json","apiVersion": 3,"name": "ht/ht-note","version": "v1.0.0","title": "自定義投票","category": "widgets","icon": "smiley","description": "創建一個自定義投票區塊","example": {},"supports": {"html": false,// 允許配置字體大小"typography": {"fontSize": true},// 允許配置背景和字體顏色"color": {"text": true,"background": true}},"textdomain": "自定義投票區塊","editorScript": "file:./index.js","editorStyle": "file:./index.css","style": "file:./style-index.css","render": "file:./render.php","viewScript": "file:./view.js","attributes": {"noteContent": {"type": "string"}}
}

配置好之后,保存刷新,看效果:
請添加圖片描述

非常簡單

三、配置區塊的自定義功能

除此上面所說的外,Word Press也支持自定義的配置。比如,我們可以實現自定義下方按鈕是否啟用,以及自定義按鈕文本的功能。

實現方法有兩種

  1. 根據狀態,渲染不同的div。寫兩套樣式。(簡單粗暴,但不夠優雅美麗)
  2. 根據狀態,渲染不同的class。額外補充樣式。(推薦)

這里使用第二種方式進行說明。

創建變量

參照上一篇博客。創建兩個變量分別用于控制是否啟用按鈕按鈕顯示文字。其他內容不過多贅述。

//其他代碼
//...
"attributes": {"noteContent": {"type": "string"},// 是否顯示按鈕,默認顯示"isButton": {"type": "boolean","default": true},// 按鈕顯示文字"buttonText": {"type": "string","default": "關注"}
}
//...
//其他代碼

創建一個Inspector面板

Word Press為自定義的功能呢提供了非常完善的API。我們可以直接使用<InspectorControls>來實現我們的功能。

什么是<InspectorControls>?Inspector Controls 會出現在帖子設置側邊欄中。這些控件以 HTML 和可視化編輯模式顯示,因此應包含影響整個塊的設置。簡單來說,這是一個面板,用來告訴Word Press這個標簽內的標簽顯示在區塊側邊欄。

打開edit.js,編輯Edit方法:

export default function Edit({ attributes, setAttributes }) {return (<>// 這里新增了一個測試面板<InspectorControls>"測試面板"</InspectorControls><div { ...useBlockProps() }><RichTexttagName='div'className='note-content'onChange={ (value) => setAttributes({ noteContent: value })}value={attributes.noteContent}placeholder='輸入你的內容...'></RichText><div class='note-button'>自定義的按鈕</div></div></>);
}

保存刷新看效果:
請添加圖片描述

可以看到,上方多出來了一個齒輪。這里就是自定義的面板了。

創建開關、文本控件

標簽字段(<PanelBody> 可以簡單理解成一個標題。用戶可以點擊標題來展開/收起組中的控件。其他的控件都會放在這個標簽下,用來幫助用戶進行配置。

開關控件(<ToggleControl> 顧名思義,提供了一個能夠返回一個bool類型的值。

文本控件(<TextControl>) 提供了一個文本框,用戶能夠輸入字符。

編輯edit.js,最后的結果如下:

export default function Edit({ attributes, setAttributes }) {// 在這里定義類名let className = "note-button";if (!attributes.isButton) className += " note-button-disabled";// 在這里定義按鈕文本let buttonText = attributes.buttonText;return (<><InspectorControls>// 標題<PanelBody title="投票按鈕">// 開關控件<ToggleControl label="是否啟用投票"checked={ attributes.isButton}onChange={ ( isButton ) => setAttributes( { isButton } ) }/>{// 如果啟用了attributes.isButton && (// 則渲染文本控件<TextControllabel="按鈕文字"value={ attributes.buttonText || '' }onChange={ ( value ) =>setAttributes( { buttonText: value } )}></TextControl>)}</PanelBody></InspectorControls><div { ...useBlockProps() }><RichTexttagName='div'className='note-content'onChange={ (value) => setAttributes({ noteContent: value })}value={attributes.noteContent}placeholder='輸入你的內容...'></RichText><div class={className}>{buttonText}</div></div></>);
}

不要忘記引入相關依賴。

import { InspectorControls, RichText, useBlockProps} from '@wordpress/block-editor';
import { PanelBody, TextControl, ToggleControl } from '@wordpress/components';

最后隨便寫了寫樣式,保存刷新,效果如下:
請添加圖片描述

同步到rander.php

最后別忘了,要修改界面上的顯示效果需要修改rander.php中的內容。

<?php
$content = $attributes['noteContent'] ?? "默認投票";
$isButton = $attributes['isButton'] ?? true;
$buttonText = $attributes['buttonText'] ?? "關注";$className = "note-button";
if (!$isButton) $className .= " note-button-disabled";
?><div <?php echo get_block_wrapper_attributes(); ?>><div class="note-content"><?php echo $content; ?></div><div class="<?php echo $className ?>"><?php echo $buttonText; ?></div>
</div>

請添加圖片描述

四、總結

  1. 通過修改scss文件修改基礎樣式
  2. 通過修改block.json來啟用一些簡單的功能
  3. 通過修改edit.js來啟用自定義的功能
  4. 同步到rander.php

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90672.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90672.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90672.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Pygame模塊化實戰:火星救援游戲開發指南

Pygame模塊化實戰&#xff1a;火星救援游戲開發指南用Python打造太空探險游戲&#xff0c;掌握模塊化開發核心技巧一、火星救援&#xff1a;模塊化開發的完美場景??想象這樣的場景??&#xff1a; 你是一名宇航員&#xff0c;被困在火星表面&#xff0c;需要收集資源、修復飛…

三維圖像識別中OpenCV、PCL和Open3D結合的主要技術概念、部分示例

文章目錄1. 三維點云基礎概念點云(Point Cloud)深度圖像(Depth Image)體素(Voxel)2. 點云預處理技術去噪濾波(Noise Filtering)降采樣(Downsampling)3. 特征提取與描述法向量估計(Normal Estimation)關鍵點檢測(Keypoint Detection)特征描述子(Feature Descriptor)4. 點云配準(…

7.23數據結構——單鏈表

文章目錄一、思維導圖二、單鏈表代碼head.htext.cmain.c現象一、思維導圖 二、單鏈表代碼 head.h #ifndef __HEAD_H__ #define __HEAD_H__#include <stdlib.h> #include <stdio.h> #include <string.h>enum A {FAULSE-1,//失敗返回SUCCESS//成功返回};//給…

某種物聯網SIM卡流量查詢方法

說起流量卡,很多人可能還停留在營業廳辦理的常規套餐里。但其實在 2016 年,三大運營商就推出了一種資費更為劃算的正規流量卡 —— 物聯卡。當年,當不少人還在用 50 元 1G 的流量時,第一批體驗物聯卡的用戶已經享受到了 53 元 6G 的全國流量,徹底擺脫了流量焦慮。不過,至…

XTTS實現語音克隆:精確控制音頻格式與生成流程【TTS的實戰指南】

言簡意賅的講解XTTS解決的痛點 &#x1f4ce; 前置操作&#xff1a;如何使用 OBS Studio 錄制高質量 WAV 語音&#xff08;建議先閱讀并準備錄音樣本&#xff09; 本教程介紹如何使用 Coqui TTS 的 XTTS v2 模型 實現中文語音克隆&#xff0c;支持直接傳入 .wav 文件&#xff0…

C/C++中常量放置在比較操作符左側

目錄 介紹 原因詳解 避免誤用賦值運算符 示例對比 結論 介紹 在編程中&#xff0c;將常量放在比較操作符&#xff08;如 或 !&#xff09;的左側&#xff08;例如 if (42 value)&#xff09;&#xff0c;是一種被稱為 "Yoda 條件"&#xff08;Yoda Conditions…

Node.js 模擬 Linux 環境

&#x1f9e9; 項目介紹 該項目使用 Node.js 實現了一個模擬的 Linux 終端環境&#xff0c;支持多種常見的 Linux 命令&#xff08;如 ls, cd, cat, mkdir, rm 等&#xff09;&#xff0c;所有文件操作都在內存中進行&#xff0c;并持久化到本地文件系統中。適合用于學習 Shel…

HAProxy 實驗指南:從零開始搭建高可用負載均衡系統

引言HAProxy&#xff08;High Availability Proxy&#xff09;是一款高性能的TCP/HTTP負載均衡器和代理服務器&#xff0c;廣泛用于構建高可用、可擴展的Web架構。它由法國開發者Willy Tarreau于2000年開發&#xff0c;如今已成為開源社區和企業級應用中不可或缺的工具。HAProx…

2.10DOM和BOM插入/移除/克隆

1.DOM創建/插入/移除/克隆1.1創建元素前面我們使用過 document.write 方法寫入一個元素&#xff1a;這種方式寫起來非常便捷&#xff0c;但是對于復雜的內容、元素關系拼接并不方便&#xff1b;它是在早期沒有 DOM 的時候使用的方案&#xff0c;目前依然被保留了下來&#xff1…

華為倉頡編程語言的表達式及其特點

華為倉頡編程語言的表達式及其特點 倉頡&#xff08;Cangjie&#xff09;語言的表達式有一個明顯的特點&#xff0c;范圍不再局限于傳統算術運算&#xff0c;而是擴展到條件表達式、循環表達式等多種類型&#xff0c;每種表達式均有確定的類型和值。 傳統基本表達式&#xff0…

【linux】keepalived

一.高可用集群1.1 集群類型LB&#xff1a;Load Balance 負載均衡 LVS/HAProxy/nginx&#xff08;http/upstream, stream/upstream&#xff09; HA&#xff1a;High Availability 高可用集群 數據庫、Redis SPoF: Single Point of Failure&#xff0c;解決單點故障 HPC&#xff…

Webpack配置原理

一、Loader&#xff1a; 1、定義&#xff1a;將不同類型的文件轉換為 webpack 可識別的模塊2、分類&#xff1a; ① pre&#xff1a; 前置 loader &#xff08;1&#xff09;配置&#xff1a;在 webpack 配置文件中通過enforce進行指定 loader的優先級配置&#xff08;2&#x…

對比JS“上下文”與“作用域”

下面從定義、特性、示例&#xff0c;以及在代碼分析中何時側重“上下文”&#xff08;Execution Context/this&#xff09;和何時側重“作用域”&#xff08;Scope/變量查找&#xff09;&#xff0c;以及二者結合的場景來做對比和指導。一、概念對比 | 維度 | 上下文&#xff0…

如何做數據增強?

目錄 1、為什么要做數據增強&#xff1f; 2、圖像數據增強&#xff1f; 3、文本與音頻數據增強&#xff1f; 4、高級數據增強&#xff1f; 數據增強技術就像是一種“造數據”的魔法&#xff0c;通過對原始數據進行各種變換&#xff0c;生成新的樣本&#xff0c;從而提高模型…

Go by Example

網頁地址Go by Example 中文版 Github倉庫地址mmcgrana/gobyexample&#xff1a;按示例進行 HelloWorld package mainimport ("fmt" )func main() {fmt.Println("Hello World") } Hello World 值 package mainimport ("fmt" )func main() {…

ClickHouse高性能實時分析數據庫-消費實時數據流(消費kafka)

告別等待&#xff0c;秒級響應&#xff01;這不只是教程&#xff0c;這是你駕馭PB級數據的超能力&#xff01;我的ClickHouse視頻課&#xff0c;凝練十年實戰精華&#xff0c;從入門到精通&#xff0c;從單機到集群。點開它&#xff0c;讓數據處理速度快到飛起&#xff0c;讓你…

電子電氣架構 --- 車載軟件與樣件產品交付的方法

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 簡單,單純,喜歡獨處,獨來獨往,不易合同頻過著接地氣的生活,除了生存溫飽問題之外,沒有什么過多的欲望,表面看起來很高冷,內心熱情,如果你身…

C++:STL中vector的使用和模擬實現

在上一篇中講到了string類&#xff0c;string并不屬于STL中因為string出現的比STL早&#xff0c;但是在使用方法上兩者有相似之處&#xff0c;學習完string后再來看vector會容易的多&#xff0c;接著往下閱讀&#xff0c;一定會有收獲滴&#xff01; 目錄 vector的介紹 vect…

倉庫管理的流程、績效和解決方案?

什么是倉庫管理&#xff1f; 倉庫管理涉及對所有倉庫運營的日常監督。一個全面、集成的倉庫管理解決方案采用行業最佳實踐&#xff0c;并涵蓋使高效運營得以實現的所有基本要素。這些要素包括分銷和庫存管理、倉庫勞動力管理以及業務支持服務。此外&#xff0c;由內部提供或與服…

TIM 實現定時中斷【STM32L4】【實操】

使用定時器實現定時中斷的功能&#xff1a;比如每1ms進入中斷處理函數使用STM32CubeMX配置TIM初始化先了解每個參數的含義&#xff0c;在進行配置Counter Settings: 計數器基本設置Prescaler(PSC): 預分頻器&#xff0c;設置預分頻器系數Counter Mode: 技術模式&#xff0c;…