Siiani oleme renderdanud ploki väljundi Javascriptis. Dünaamilise sisu puhul, nagu hiljutised postitused või postituse kuvamine, peame aga ploki väljundi PHP-s renderdama. Sellest postitusest õpime, kuidas ja miks.
Miks peame dünaamilisi plokke erinevalt käsitlema?
Mõned näited on ilmsed; plokk, mis kuvab kategooria viimaseid postitusi, on dünaamiline, kuna postitused muutuvad aja jooksul. Te ei vali ploki postitusi; selle asemel on teil tõenäoliselt seaded kategooria valimiseks, iga postituse kohta kuvatava teabe, postituste arvu, veergude arvu jne jaoks. Iga kord, kui WordPress laadib selle plokiga postituse, peab ta sel ajal WordPressist uusimate postituste jaoks päringu tegema. Sama postituse vaatamine järgmisel kuul võib anda teistsuguseid tulemusi, kuigi blokiga postitust pole värskendatud.
Kuid dünaamiliste plokkide vajadus pole mõnikord nii ilmne. Võite ette kujutada, et esiletoodud postituste plokk, kus valite selle kuvamiseks ühe kindla postituse, ei pruugi olla dünaamiline. Aga see võib olla – ja peaks olema. Pidage meeles, et valitud postitus võib oma pealkirja, väljavõtet või esiletoodud pilti igal ajal värskendada – ja see peaks kajastuma seda postitust sisaldavates plokkides.
Ühe postituse kuvamiseks mittedünaamilise ploki loomiseks peate ploki atribuutidesse salvestama postituse ID, selle URL-i, esiletoodud pildi URL-i, väljavõtte stringi või muu, mida vajate postituse eelvaate kuvamiseks. Ja siin peitubki probleem. Kui värskendate valitud postituse esiletoodud pilti, ei värskenda esiletõstetud postituse plokiga postitus automaatselt selle atribuute. See salvestatakse koos vana esiletoodud pildi URL-iga. Ainult siis, kui muudate postitust plokiga ja veenduge, et see salvestab atribuudid koos värskendatud teabega uuesti, kuvatakse plokis õige värskendatud teave.
Nii et kui käsitleme dünaamilist sisu – postitusi, kategooriaid või kõike, mis võib aja jooksul muutuda –, on tegemist dünaamiliste plokkidega. Ja dünaamiliste plokkide jaoks peame oma ploki renderdamiseks kasutama PHP-d – serveripoolset koodi – tagamaks, et see hangib värskendatud teabe iga kord, kui see renderdab.
Dünaamiliste plokkide olemus redaktoris
Kui hakkate dünaamilisi plokke arendama, muutub teie ploki olemus redaktoris. Teie ploki edit
funktsioon peab sageli olema ka dünaamiline. Näiteks esiletõstetud postituste ploki jaoks peate hankima postitused, mille hulgast valida, või viimaste uudisteploki jaoks peate hankima kategooriate loendi, mille vahel kasutaja saab valida.
Täielikult on võimalik WordPressist teavet pärida redaktorist, tehes AJAX päringuid – kas pakette ja komponente kasutades või käsitsi WordPress REST API -ga teostades. Olenemata sellest, millist meetodit kasutate, peab plokk käsitlema asünkroonitud sisendvoogu – vastust ootama jäävat ajavahemikku.
Gutenbergi jaoks dünaamilise ploki loomiseks on mitu meetodit ja mustrit. Enamasti kasutate Reacti mustrit, mida nimetatakse kõrgema järgu komponentideks, mille jaoks WordPress pakub palju funktsioone ja komponente.
Järgmises õpetuse osas vaatame, kuidas postitusi tuua ja kategooriaid meie plokis tuua. Praegu peame õppima, kuidas panna PHP meie plokki renderdama.
Meie ploki valmistamine PHP renderdamiseks
Peamine osa, mida peame Javascriptis tegema, on ploki save
funktsiooni tagastamine null
. Võite originaalväljundi alles jätta, kuid kui me ütleme WordPressile, et ta kasutaks ploki renderdamiseks PHP-d, siis seda ignoreeritakse. Et teha endale ja teistele selgeks, et ploki väljundit Javascriptis ei käsitleta, muudame save
funktsiooni.
Ärge unustage, et salvestamisfunktsiooni muutmine muudab kõik olemasolevad plokid katki. Lisage plokk uuesti. Plokk peaks töötama nagu varem; seadete ja atribuutide värskendamisega. Nüüd lihtsalt ei väljasta see eessüsteemis midagi. Kommentaariplokk on seal, salvestades kõik JSON-i atribuudid, kuid nähtavat HTML-i ei renderdata.
Kuid; kui mõni teie atribuutidest kasutab seda source
atribuuti, peate seda muutma. Seda ei toetata PHP-ga renderdatud plokkide puhul, kuna need sõelutakse otse salvestuse väljundist – mille me nüüd tagasi pöördume null
. Kasutame RichText
oma ploki teises allikas – lõigu jaoks. Sel hetkel ei salvesta toimetaja seda, mida te sellesse panite RichText
.
Seega, kui kasutate endiselt source
atribuuti myRichText
, peame eemaldama atribuudid source
ja selector
tagamaks, et atribuudid salvestatakse ja neid ei sõeluda save
funktsioonist:
attributes: {
...
myRichText: {
type: 'string',
},
...
Pärast seda on meie plokk PHP-s renderdamiseks valmis. Javascripti failid saame jätta (ärge unustage seda ehitada) ja ülejäänu tehakse PHP-s.
Plokkide renderdamine PHP-s
Selleks, et käskida WordPressil ploki väljund PHP-s renderdada, lisame funktsioonile uue argumendi register_block_type()
. Peame render_callback
massiivile lisama võtme koos selle funktsiooni väärtusega, mida see peaks käivitama.
PHP renderdusfunktsioon
Määratleme funktsiooni awp_myfirstblock_render
allpool functions.php
(või kuhu iganes olete oma PHP-koodi pannud). Meie funktsioon saab kaks parameetrit; me helistame neile $attr
ja $content
.
function awp_myfirstblock_render($attr, $content) {
// return the block's output here
}
Parameeter $attr
on assotsiatiivne massiiv koos kõigi salvestatud atribuutidega. Teine parameeter, $content
on meie ploki sees olevate plokkide jaoks. See kehtib ainult nende plokkide puhul, mis toetavad pesastatud plokke – mida näiteks veerud või kaaned teevad.
Funktsioon ei tohiks kunagi echo
midagi välja kukkuda. Kogu väljund tuleb tagastada, nii et peate koostama stringi ja tagastama selle lõpus.
Midagi olulist atribuutide puhul meeles pidada on see, et funktsiooni esimeses parameetris kuvatakse ainult salvestatud atribuudid. Kui atribuuti tegelikult kunagi ei muudetud ega salvestatud – st lihtsalt tuginedes selle default
, siis seda atribuuti meie PHP funktsiooni jaoks üldse ei kaasata.
Peate seda probleemi lahendama kas alati kontrollides if (isset($attr['...']))
või eelistatud viisil: määratledes meie register_block_type()
kõnes olevad atribuudid. Saame anda teise võtme attributes
ja määrata selle väärtuse massiivile, millel on kõik atribuudid, mida soovime oma plokist eraldada. Struktuur peaks olema identne Javascriptis määratletuga, kuid Javascripti objekti asemel vajate seda PHP massiivi. Samade atribuutide uuesti määratlemine võib olla pisut tülikas, kuid nutika koodiredaktoriga peaks selle kopeerimine+kleepimine ja mitmerealine muutmine PHP-sse üsna kiire.
Meie renderdusfunktsiooni atribuutide lisamine
Lisame uue attributes
elemendi register_block_type()
ja kleepime täpselt samadele atribuutidele, mille määratlesime oma Javascripti failis:
Pidage meeles, et kui määrate a default
kõigi atribuutide jaoks, $attr
peaks teie funktsiooni parameeter alati sisaldama kõiki atribuute. Näiteks textAlignment
ülaltoodud atribuut eksisteerib ainult siis, $attr
kui seda muudeti – ja peate kontrollima isset($attr['textAlignment'])
.
Kahjuks on praegu kaks asja, millest te PHP-ploki renderdamisega aru ei saa. Üks on className
rekvisiit – seega tuleb ümbrisklass (kui soovite) ise ehitada. Teine on support
plokkide joondamise omadus. Hetkel WordPress seda atribuuti dünaamilistes plokkides ei toeta. Me ei saa valitud ploki joonduse väärtust kätte, kui me ei muuda seda atribuudiks ja käsitleme seda käsitsi Javascriptis.
Funktsiooni HTML-väljundi osas on see täielikult teie otsustada!
PHP renderduse taotlemine sisemisest redaktorist
Redaktori sees on võimalik taotleda meie ploki PHP-renderdust. See on kasulik, kui soovite näha redaktoris ploki väljundi eelvaadet. Seda saame teha paketist kutsutud ServerSideRender
komponendiga wp.editor
.
Rekvisiidina ServerSideRender
peate määratlema kõik atribuudid, mida soovite edasi anda. Peate rekvisiidile esitama vähemalt ploki nime block
, et WordPress teaks, millist renderdamismeetodit otsida. See on teile props.name
funktsioonis saadaval edit
. Samuti peate rekvisiidis esitama kõik vajalikud atribuudid attributes
. Soovi korral saate siia lisada ka atribuutide väliseid kohandatud muutujaid. Pidage lihtsalt meeles, et see toimib ainult siseredaktoris, mitte kasutajaliideses.
Te ei saa kasutada ServerSideRender
ploki save
funktsioonis. Teie save
funktsioon peab siiski tagastama null
.
Rakendame ServerSideRender
oma plokis, et seda praktikas näha.
ServerSideRenderi kasutamine plokkide eelvaate/redigeerimisrežiimi jaoks
Kui järgisite eelmist sammu, kus tegime oma ploki jaoks eelvaate/redigeerimisrežiimi lüliti, saame nüüd kasutada ServerSideRender
eelvaaterežiimi lülitumisel PHP-st ploki eelvaate renderdamist.
Kõigepealt peame meeles pidama ServerSideRender
ülaosas destruktureerimist:
const { ServerSideRender } = wp.editor;
Kui mäletate eelmisest sammust, kasutasime komponente Disabled
ja/või Placeholder
eelvaate hoidmiseks. Kasutamise probleem Placeholder
seisneb selles, et meie väljundile rakendatakse soovimatut stiili. Asendame. Placeholder
_ ServerSideRender
Saate valida Disabled
komponendi allesjätmise tagamaks, et selle sisu pole klõpsatav ega lohistatav.
Koodi juures ploki renderdamiseks, kui atribuut editMode
on vale, teeme järgmist:
Nüüd renderdab meie kohandatud nupp tööriistaribal PHP väljundi, kui lülitame eelvaaterežiimi. Väljund peaks olema identne, kui vaatate postitust esiküljel. See on hea komme tagada, et väljund oleks nii redaktoris kui ka kasutajaliideses identne.
Näide: dünaamiline plokk, mis näitab valitud postitust
Teie PHP renderdusfunktsiooni väljund võib olla ükskõik milline ja teil on täielik juurdepääs kõigile WordPressi funktsioonidele. Oletame plokki, kus postituse ID salvestatakse atribuudis. PHP funktsioonis render_callback
saate ID-st postitust pärida ja selle teavet väljastada. See peaks olema üsna iseenesestmõistetav, kuidas seda teha, kuid siin on kiire näide.
NB! Selles näites lisame lihtsalt redaktorisse tekstisisestuse postituse ID käsitsi sisestamiseks. See ei ole väga intuitiivne ja kasutajasõbralik lahendus postituse valimiseks – aga seda õpime järgmises etapis. Siin keskendutakse valitud postituse renderdamise PHP osale.
Lisame atribuudi selectedPostId
tüübi number:
attributes: {
selectedPostId: {
type: 'number'
}
}
Ja kuskil meie ploki edit
funktsiooni sees lisame TextControl
komponendi. See võib olla kus iganes soovite – plokis või Inspektoris.
Pange tähele, et hoolitsen selle eest, et sisend salvestaks atribuudi õigesti numbrina, teisendades selle täisarvuks parseInt()
. Kuigi määrasime numbrisisendi renderdamiseks tüübi prop type
väärtusele number
, tõlgendatakse muudetud väärtust ikkagi stringina. WordPress ei salvesta teie atribuuti, kui see on vales vormingus.
Ärge unustage lisada oma ServerSideRender
komponendile uut atribuuti, kui teil see on:
PHP osa
See oleks pidanud hoolitsema Javascripti osa eest. Liigume edasi PHP juurde. Kõigepealt peame massiivile selectedPostId
lisama uue atribuudi :attributes``register_block_type()
Funktsioonis render_callback
pääseme nüüd postituse ID-le juurde $attr['selectedPostId']
. Sellega saame teha lihtsa get_post()
ja väljastada postituse andmed; selle link ja pealkiri:
See on väga lihtne näide, mis on mõeldud hüppelauaks täpsema ja kohandatud koodi kirjutamiseks.
Nüüd, kui teame, kuidas dünaamiliste plokkide renderdamist käsitleda, on järgmine samm õppida, kuidas muuta ka redaktori osa intuitiivsemaks. Järgmises etapis keskendume sellele, kuidas teha postitusi plokiredaktorist päringuid ja pakkuda kasutajale paremat viisi postituse valimiseks.