Skapa anpassat Gutenberg-block – Del 4: Attribut
I den här delen ska vi titta på hur man definierar attribut, hämtar deras värden och uppdaterar dem. Med attribut kan vi acceptera input från editorn, spara den och mata ut den hur vi vill. I föregående steg tittade vi på WordPress-komponenter, var man hittar dem och hur man implementerar dem. I det här inlägget kommer vi att lägga till rekvisita för att göra kopplingen till attribut – den sparade informationen.
Definiera attribut
Attribut läggs till som objekt i en array till attributes
egenskapen i registerBlockType()
. Varje attributs nyckel är attributnamnet, och du måste ha egenskapen type
som ett minimum.
Fastigheten type
kan vara något av följande; null
, boolean
, object
, array
, number
, string
, eller integer
.
Du kan valfritt tillhandahålla egenskapen default
för att definiera startvärdet för ditt attribut. Om du inte anger en standard kommer attributet att vara som standard null
.
Ett annat attribut egenskap är source
som fungerar tillsammans med selector
egenskapen, men det här är knepiga saker som vi kommer att titta på i detalj längre ner nedan.
Till exempel att definiera två attribut; exampleText
som sträng och postIds
som en array skulle se ut så här:
Allt du behöver sparat för ditt block (indata från användaren/redigeraren) kräver ett attribut. Det är upp till dig hur du strukturerar dina data, genom att definiera separata attribut för varje eller samla ihop dem i ett objekt. Det kommer bara att vara en skillnad i hur du hämtar deras data och hur du uppdaterar dem.
Hämta attributvärden
Attribut finns som rekvisita till dina block edit
och save
funktioner. Om du har följt denna serie från föregående steg, kom ihåg att vi uppdaterade funktionerna för att skicka rekvisita som parameter.
Det är vanligt att destrukturera attribut från rekvisita eftersom du vanligtvis hänvisar till dem ofta. Att till exempel mata ut ett anropat attribut exampleText
skulle se ut så här:
Uppdaterar attributvärden
För att uppdatera attribut har vi en metod tillgänglig i rekvisita, kallad setAttributes()
. Denna funktion accepterar ett objekt där du kan lägga till alla attribut du vill uppdatera. Du kan bara uppdatera ett attribut, flera eller alla samtidigt. Om du har flera attribut definierade och kräver setAttributes()
att endast uppdatera ett av dem, berörs inte de andra.
Om du har erfarenhet av React kommer du förmodligen omedelbart att känna igen likheter mellan setAttributes()
och setState()
. De fungerar exakt likadant, men skillnaden är att tillståndet i React bara är något som lagras lokalt i den komponenten, och attribut sparas faktiskt som data utanför komponenten.
För att uppdatera ett attribut, skulle du vanligtvis förstöra funktionen från rekvisita, och kalla det så här: Nedan uppdaterar vi exampleText
attributet till "Hej".
const { setAttributes } = props;
setAttributes({ exampleText: 'Hi' });
Naturligtvis skulle du köra setAttributes()
inifrån någon handling. Ett vanligt exempel är inuti onChange
rekvisiten på något slags inmatningsfält som används för att lagra värdet på exampleText
attributet.
Se till att spara attribut i den typ du har definierat på attributet. Du kommer inte ha någon tur när du försöker spara objekt i ett strängattribut till exempel.
Låt oss prova det i praktiken! Initiera npm run start
om du inte redan har gjort det.
Visa ett attribut i en anpassad textinmatning och uppdatering av attributets värde
I föregående steg lade vi till några komponenter i edit
t.ex. en textinmatning, men ingenting lagrades. Låt oss lägga till ett attribut och en textinmatning för det i vårt block. Vi kommer både att se till att textinmatningen visar det aktuella värdet, och närhelst inmatningen ändras uppdaterar vi attributet.
Lägga till textinmatningen och dess onChange
rekvisita
Vi destrukturerar attributes
och setAttributes
kommer props
att använda båda. Sedan använder vi en TextControl
komponent från WordPress wp.components
paket. Vi skickar två rekvisita till den; value
kommer att ställa in ingångens värde (både initialt och medan vi skriver) och en åtgärd på ingångens händelse onChange
.
I value
ställer vi in det till värdet av vårt attribut; attributes.exampleText
. I onChange
händelse av att vi kör en funktion som skickar det inskrivna värdet på vår indata som parameter, newtext
(ingångsvärdet är en prop som returneras från komponenten). I den funktionen anropar setAttributes()
och uppdaterar vi attributet exampleText
till det som skrevs in i inmatningen.
Detta är grundläggande React – förutom att vi arbetar med attribut och inte stat. Om ovanstående förvirrade dig rekommenderar jag att du tittar på en snabb handledning i React, eftersom dessa förmodligen kommer att förklara detta bättre än mig!
Uppdatera din editor och se hur blocket fungerar! Du bör få en vanlig textinmatning för att skriva saker i, och den kommer att sparas när du trycker på Spara/Uppdatera i postredigering.
Resultatet i frontend och i databasen
Om du tittar på ditt inlägg i frontend bör det fortfarande eka en div med ":)" eftersom det är vad vi fortfarande har i vår save
funktion. Men något har hänt bakom kulisserna! Vårt blocks kommentarblock innehåller nu värdet av vårt attribut i JSON.
Du kan inte se kommentarsblocken i en mall som gör ett normalt the_content()
anrop. För att se kommentarsblocken har du två alternativ. Titta antingen på post_content
tabellen i postdatabasen. Eller lägg echo get_the_content()
till mallen och titta på den i Inspect/debugging tool.
Uppenbarligen har vi tillgång till attributen i save
också, från rekvisita.
Visar ingångens värde isave
Låt oss visa värdet på attributet inuti en div i vår save
funktion:
Obs: När du har gjort denna ändring kommer du att få ett brutet block i inlägget du redan har lagt till detta block till. Detta händer eftersom redaktören möter en annan utdata save
än vad vi har definierat nu. Ta bort blocket och lägg till det igen. Ange något i din textinmatning, uppdatera inlägget och visa det i frontend.
Och detta är faktiskt kärnan i det. Du bestämmer vilka attribut du behöver för att spara det du vill ha i ditt block. I edit
kommer du att återge sätt för användaren att mata in, se till att de aktuella värdena visas och uppdatera dem när de ändras. Och i save
extraherar du de sparade attributen och återger utdata som du vill.
Vi kommer att beröra många fler olika komponenter och attribut när vi går i denna handledningsserie. Men låt oss titta på en annan komponent i det här inlägget för att se vad attributet egenskap source
handlar om.
RichText och attributegenskapensource
WordPress- RichText
komponenten ger dig ett "kantfritt" textområde med stöd för textformatering. Du kanske föredrar att använda detta istället för en (ful?) standardtextinmatning eller textområde. Men tänk på att det RichText
måste hanteras lite annorlunda eftersom det finns flera rekvisita du måste vara medveten om, och det är skillnad på hur vi får tag i värdet i vår save
funktion.
Lägga till en RichText
komponent
Den enklaste formen av RichText
är att implementera det som du skulle göra med en textinmatning:
Vi destrukturerar RichText
komponenten från wp.blockEditor
paketet, men i övrigt är ovanstående identisk med vad vi gjorde med standardtextinmatningen.
Hantering save
medRichText
Men i save
funktionen måste du använda RichText
komponenten igen för att få värdet på attributet. Vi anropar RichText.Content
och ställer in rekvisitan value
till vårt attribut:
Detta kommer att mata ut vad som än skrevs i RichText
in-redigeraren direkt utan någon HTML-kod.
När du arbetar med RichText
vill du troligen styra HTML-omslaget runt texten, till exempel a <p>
eller a <h2>
, både i frontend och i editor. För det kan vi använda en rekvisita som heter tagName
.
Komponenten RichText
tillåter flera andra rekvisita också. Du kan definiera en platshållartext som visas (blekas) när den är tom med placeholder
rekvisitan. Komponenten låter dig också styra vilka formateringsalternativ fältet tillåter (vilka knappar det visar i verktygsfältet).
RichText
medtagName
Med propen tagName
kan du fördefiniera vilken HTML-tagg dess utdata ska lindas in i. När du använder tagName
bör du använda samma tagName
prop och värde i både edit
och save
.
Säg att du vill sätta ditt attributvärde i en <h2>
, som i editorn tvingar all indata att vara en h2. I edit
kan du göra:
Och i save
:
Ovanstående kommer nu att mata ut vad som än skrevs i RichText
området inuti en <h2>
tagg.
Använder sig avsource
Självklart kan du kombinera flera richtext för ett block, till exempel en för rubrik och en för ett stycke. Kom bara ihåg att var och en kommer att behöva sin egen egenskap. Till exempel:
Men du kommer nu att börja stöta på några problem. Även om du kan göra textformatering i editorn, kommer ingenting (eller en del) av din formatering att sparas. När du tittar på inlägget i frontend kommer det helt enkelt ut som h2
och en p
, utan någon formatering du har gjort (kursiv, fetstil, länk). Inte ens kommentarblocket för ditt block innehåller formateringen. Det här är det knepiga med RichText
. För att lösa detta måste vi arbeta med attributet egenskap source
.
Egenskapen source
som tillåter WordPress att extrahera och tolka innehållet direkt från inläggets innehåll. Om ett attribut inte har någon source
inställning, kommer det att sparas i och extraheras från HTML-kommentarblocket.
När vi arbetar med RichText
ställer vi vanligtvis in source
på html
, som använder WordPress bibliotek för att analysera HTML-uppmärkning. Egenskapen source
fungerar tillsammans med ett annat attribut egenskap; selector
som definierar vilken HTML-tagg den ska extraheras från.
Som ett exempel ställer vi in source
som html
i vårt stycke RichText
, och ställer in selector
som p
(annars är det förinställt att roten av blocket blockeras).
attributes: {
...
myRichText: {
type: 'string',
source: 'html',
selector: 'p'
}
},
Nu bör vår andra RichText
framgångsrikt spara all textformatering. Du kommer också att märka att kommentarsblocket nu bara visar myRichHeading
attributet i JSON. Attributet myRichText
har helt försvunnit från kommentarsblocket. Detta beror på att med source
WordPress nu analyserar inläggets innehåll istället för kommentarsblocket för attributvärdet.
För att vara helt ärlig har jag inte jobbat så mycket med source
attributet alls och skulle rekommendera att undvika det om du kan. WordPress dokumentation förklarar lite mer om källa och attribut för att du vill kolla upp det själv.
I det här inlägget har vi lärt oss grunderna om attribut; hur man definierar dem, uppdaterar dem och matar ut deras värden. I nästa steg kommer vi att titta på fler olika komponenter och hur man lägger till inställningar utanför själva blockinnehållet; i verktygsfältet och editorns sidofält (kallas Inspektör).