Toistaiseksi olemme renderöineet lohkon tulosteen Javascriptissä. Dynaamisen sisällön, kuten viimeaikaisten viestien tai viestien näyttämisen, kanssa meidän on kuitenkin renderöitävä lohkon tulos PHP:ssä. Tässä viestissä opimme kuinka ja miksi.
Miksi meidän täytyy käsitellä dynaamisia lohkoja eri tavalla?
Jotkut esimerkit ovat ilmeisiä; lohko, joka näyttää luokan uusimmat viestit, on dynaaminen, koska viestit muuttuvat ajan myötä. Et valitse lohkon viestejä; Sen sijaan sinulla on luultavasti asetukset luokan valitsemiseksi, mitä tietoja kussakin viestissä näytetään, viestien lukumäärää, sarakkeiden lukumäärää ja niin edelleen. Joka kerta, kun WordPress lataa postauksen tällä lohkolla, sen täytyy kysellä WordPressistä tuolloin uusimmat viestit. Saman postauksen katsominen kuukauden kuluttua saattaa tuottaa erilaisia tuloksia, vaikka itse lohkoa sisältävää viestiä ei ole päivitetty.
Mutta dynaamisten lohkojen tarve ei joskus ole niin ilmeinen. Voit kuvitella, että suositusviestilohko, jossa valitset yhden tietyn viestin näytettäväksi, ei välttämättä ole dynaaminen. Mutta se voi olla – ja sen pitäisi olla. Muista, että valitun postauksen otsikko, ote tai esitelty kuva voi päivittää milloin tahansa – ja tämän pitäisi näkyä lohkoissa, joissa tämä viesti on.
Jotta voit tehdä ei-dynaamisen lohkon yksittäisen viestin näyttämistä varten, sinun on tallennettava viestin tunnus, sen URL-osoite, esitellyn kuvan URL-osoite, katkelmamerkkijono tai mikä tahansa mitä tarvitset julkaisun esikatseluun, lohkon attribuutteihin. Ja tässä piilee ongelma. Jos päivität valitun postauksen suositeltua kuvaa, viesti, jossa on suositustekstilohko, ei päivitä automaattisesti määritteitään. Se säilyy vanhan esitellyn kuvan URL-osoitteen kanssa. Vain kun muokkaat viestiä lohkolla ja varmistat, että se tallentaa määritteet uudelleen päivitetyillä tiedoilla, lohko näyttää oikeat päivitetyt tiedot.
Joten aina kun käsittelemme dynaamista sisältöä – viestejä, luokkia tai mitä tahansa, mikä saattaa muuttua ajan myötä – käsittelemme dynaamisia lohkoja. Ja dynaamisille lohkoille meidän on käytettävä PHP:tä – palvelinpuolen koodia – lohkomme renderöimiseksi varmistaaksemme, että se hakee päivitetyt tiedot joka kerta, kun se hahmonnetaan.
Dynaamisten lohkojen muuttunut luonne editorissa
Kun alat kehittää dynaamisia lohkoja, lohkosi luonne editorissa muuttuu. Myös lohkosi edit
toiminnon on usein oltava dynaaminen. Esimerkiksi suositeltua viestilohkoa varten sinun on haettava viestejä, joista valita, tai uusimpien uutisten lohkoa varten sinun on haettava luettelo luokista, joista käyttäjä voi valita.
On täysin mahdollista pyytää tietoja WordPressistä editorin sisältä tekemällä AJAX-pyyntöjä – joko käyttämällä paketteja ja komponentteja tai suorittamalla ne manuaalisesti WordPress REST API :lla. Riippumatta menetelmästä, jonka valitset, lohkon on käsiteltävä asynkroninen syöttövirta – aikajakso vastausta odotellessa.
Dynaamisen lohkon luomiseksi Gutenbergille on useita menetelmiä ja malleja. Useimmiten käytät React-mallia, jota kutsutaan korkeamman asteen komponenteiksi, joihin WordPress tarjoaa runsaasti toimintoja ja komponentteja.
Tarkastelemme seuraavassa opetusohjelman osassa, kuinka noutaa viestit ja kuinka noutaa luokkia lohkossamme. Toistaiseksi meidän on opittava saamaan PHP renderöimään lohkomme.
Lohkomme valmistaminen PHP-renderöintiä varten
Tärkein osa, joka meidän on tehtävä Javascriptissä, on save
palauttaa lohkon funktio null
. Voit säilyttää alkuperäisen tulosteen, mutta kun kerromme WordPressin käyttämään PHP:tä lohkon renderöimiseen, tämä jätetään huomiotta. Muutamme toimintoa, jotta itselle ja muille olisi selvää, että lohkon tulosta ei käsitellä Javascriptissä save
.
Älä unohda, että tallennustoiminnon muuttaminen rikkoo kaikki olemassa olevat lohkot. Lisää lohko uudelleen. Lohkon pitäisi toimia kuten ennenkin; asetusten kanssa ja attribuuttien päivittäminen. Se ei nyt vain tulosta mitään käyttöliittymään. Kommenttilohko on siellä, ja se tallentaa kaikki attribuutit JSONiin, mutta näkyvää HTML-koodia ei hahmonneta.
Kuitenkin; Jos jokin määritteistäsi käyttää source
ominaisuutta, sinun on muutettava tätä. Tätä ei tueta PHP:llä renderöidyissä lohkoissa, koska ne jäsennetään suoraan tallennuksen lähdöstä – johon nyt palaamme null
. Käytämme lähdettä lohkomme toisessa RichText
– kappaleessa. Tässä vaiheessa editori ei tallenna tähän laittamaasi RichText
ollenkaan.
Joten jos käytät edelleen source
attribuuttia myRichText
, meidän on poistettava source
ja selector
ominaisuudet varmistaaksemme, että attribuutit tallennetaan eikä niitä jäsennetä save
funktiosta:
attributes: {
...
myRichText: {
type: 'string',
},
...
Tämän jälkeen lohkomme on valmis renderöitäväksi PHP:ssä. Voimme jättää Javascript-tiedostot (älä unohda rakentaa niitä) ja loput tehdään PHP:llä.
Lohkojen renderöinti PHP:ssä
Jotta WordPress voidaan käskeä renderöimään lohkon tulos PHP:ssä, lisäämme funktioon uuden argumentin register_block_type()
. Meidän on lisättävä render_callback
taulukkoon avain sen funktion arvolla, jonka sen pitäisi suorittaa.
PHP renderöintitoiminto
Määritetään funktio awp_myfirstblock_render
alempana functions.php
(tai minne tahansa olet sijoittanut PHP-koodisi). Toimintomme saa kaksi parametria; soitamme heille $attr
ja $content
.
function awp_myfirstblock_render($attr, $content) {
// return the block's output here
}
Parametri $attr
on assosiatiivinen taulukko, jossa on kaikki tallennetut attribuutit. Toinen parametri, $content
, on lohkomme sisällä oleville lohkoille. Tämä koskee vain lohkoja, jotka tukevat sisäkkäisiä lohkoja – kuten esimerkiksi Sarakkeet tai Kansi.
Toiminnolla ei koskaan pitäisi olla echo
mitään vikaa. Kaikki tulosteet on palautettava, joten sinun on muodostettava merkkijono ja palautettava se lopussa.
Attribuuteissa on tärkeää muistaa, että vain tallennetut attribuutit näkyvät funktion ensimmäisessä parametrissa. Jos attribuuttia ei koskaan varsinaisesti muutettu ja tallennettu – eli vain luotaen sen default
, attribuuttia ei sisällytetä PHP-funktiollemme ollenkaan.
Sinun on käsiteltävä tämä ongelma joko aina tarkistamalla if (isset($attr['...']))
tai suositeltavalla tavalla: määrittämällä attribuutit register_block_type()
kutsussamme. Voimme tarjota toisen avaimen, attributes
ja asettaa sen arvon taulukkoon, jossa on kaikki attribuutit, jotka haluamme poimia lohkostamme. Rakenteen tulee olla identtinen Javascriptissä määrittämäsi rakenteen kanssa, mutta Javascript-objektin sijasta tarvitset sen PHP-taulukossa. Tämä voi olla hieman hankalaa määrittää samat attribuutit uudelleen, mutta älykkäällä koodieditorilla pitäisi olla melko nopea kopioida+liitä ja monirivinen muokata se PHP:hen.
Lisäämme renderöintifunktion attribuutteja
Lisätään uusi attributes
elementti register_block_type()
ja liitetään täsmälleen samat attribuutit, jotka määritimme Javascript-tiedostossamme:
Muista, että jos määrität a default
kaikille määritteille, funktiosi $attr
parametrin tulee aina sisältää kaikki attribuutit. Esimerkiksi textAlignment
yllä oleva attribuutti on olemassa vain, $attr
jos sitä on muutettu – ja sinun on tarkistettava isset($attr['textAlignment'])
.
Valitettavasti tällä hetkellä on kaksi asiaa, joita et saa käsiksi PHP-lohkon renderöinnillä. Yksi on className
rekvisiitta – joten sinun on rakennettava kääreluokka (jos haluat) itse. Toinen on support
ominaisuus lohkojen kohdistusta varten. Tällä hetkellä WordPress ei tue tätä ominaisuutta dynaamisissa lohkoissa. Emme saa käsiinsä valitun lohkokohdistuksen arvoa, ellemme muuta sitä attribuutiksi ja käsittele sitä manuaalisesti Javascriptissä.
Mitä tulee funktion HTML-tulostukseen, tämä on täysin sinun päätettävissäsi!
PHP-renderöinnin pyytäminen sisäeditorista
On mahdollista pyytää lohkomme PHP-renderöintiä editorissa. Tämä on hyödyllistä, jos haluat esikatsella lohkon tulosta editorissa. ServerSideRender
Voimme tehdä tämän wp.editor
paketista kutsutulla komponentilla .
Rekvisiittana ServerSideRender
sinun on määriteltävä kaikki attribuutit, jotka haluat välittää. Vähintäänkin sinun on annettava lohkon nimi rekvisiittalle block
, jotta WordPress tietää, mitä renderöintimenetelmää etsiä. Tämä on käytettävissäsi props.name
toiminnossa edit
. Sinun on myös annettava kaikki tarvittavat attribuutit attributes
. Halutessasi voit lisätä myös tänne muokattuja muuttujia attribuuttien ulkopuolelle. Muista vain, että tämä toimii vain sisäisessä editorissa, ei käyttöliittymässä.
Et voi käyttää ServerSideRender
lohkon save
toiminnossa. Funktiosi save
on silti palattava null
.
Toteutetaan ServerSideRender
lohkossamme nähdäksesi sen käytännössä.
ServerSideRenderin käyttäminen lohkon esikatselu-/muokkaustilassa
Jos noudatit edellistä vaihetta, jossa teimme esikatselu/muokkaustilan vaihtajan lohkollemme, voimme nyt käyttää ServerSideRender
lohkon esikatselun hahmontamiseen PHP:stä, kun vaihdamme esikatselutilaan.
Ensin meidän on muistettava tuhota ServerSideRender
yläreunassa:
const { ServerSideRender } = wp.editor;
Jos muistat edellisestä vaiheesta, käytimme komponentteja Disabled
ja/tai Placeholder
esikatselun pitämiseen. Käytön ongelmana Placeholder
on, että saamme ei-toivottua tyyliä tuotoksellemme. Korvataan. Placeholder
_ ServerSideRender
Voit halutessasi säilyttää Disabled
komponentin varmistaaksesi, ettei sen sisältö ole napsautettavaa tai vedettävää.
Koodissa lohkon renderöimiseksi, kun attribuutti editMode
on epätosi, teemme:
Nyt työkalupalkin mukautettu painike näyttää PHP-tuloksen, kun siirrymme esikatselutilaan. Tulosteen tulee olla identtinen, kun katsotaan viestiä etuosasta. Tämä on hyvä tapa varmistaa, että tulos on identtinen sekä editorissa että käyttöliittymässä.
Esimerkki: Dynaaminen lohko, joka näyttää valitun viestin
PHP-renderöintitoiminnon tulos voi olla mitä tahansa, ja sinulla on täysi pääsy kaikkiin WordPress-toimintoihin. Oletetaan lohko, jossa viestitunnus tallennetaan attribuutissa. PHP – render_callback
funktiossa voit kysyä viestiä tunnuksesta ja tulostaa sen tiedot. Sen pitäisi olla melko itsestään selvää, kuinka tämä tehdään, mutta tässä on nopea esimerkki.
HUOM: Tässä esimerkissä lisäämme yksinkertaisesti tekstisyötteen editoriin postauksen tunnuksen manuaalista syöttämistä varten. Tämä ei ole kovin intuitiivinen ja käyttäjäystävällinen ratkaisu postauksen valitsemiseen – mutta tämän opimme seuraavassa vaiheessa. Painopiste on tässä PHP-osassa valitun viestin hahmontamisessa.
Lisätään selectedPostId
tyypin numero attribuutti:
attributes: {
selectedPostId: {
type: 'number'
}
}
Ja jonnekin lohkomme edit
funktion sisään lisäämme TextControl
komponentin. Se voi olla missä haluat – korttelin sisällä tai Inspectorissa.
Huomaa, että olen erityisen huolellinen varmistaakseni, että syöte tallentaa määritteen oikein numerona muuntamalla sen kokonaisluvuksi käyttämällä parseInt()
. Vaikka asetimme tyypin prop type
arvoksi number
numerosyötteen renderöimiseksi, muuttunut arvo tulkitaan silti merkkijonoksi. WordPress ei tallenna attribuuttiasi, jos se on väärässä muodossa.
Älä unohda lisätä uutta attribuuttia ServerSideRender
komponenttiin, jos sinulla on sellainen:
PHP osa
Sen olisi pitänyt hoitaa Javascript-osa. Siirrytään PHP:hen. Ensin meidän on lisättävä uusi selectedPostId
attribuutti attributes
taulukkoon register_block_type()
:
render_callback
Toiminnossa voimme nyt käyttää viestitunnusta $attr['selectedPostId']
. Voimme tällä suorittaa yksinkertaisen get_post()
ja tulostaa viestin tiedot; sen linkki ja otsikko:
Tämä on hyvin perusesimerkki, joka on tarkoitettu ponnahduslautana sinulle kehittyneemmän ja mukautetun koodin kirjoittamiseen.
Nyt kun tiedämme kuinka käsitellä dynaamisten lohkojen renderöintiä, seuraava askel on oppia tekemään myös editoriosasta intuitiivisempi. Seuraavassa vaiheessa keskitymme siihen, kuinka tehdä kyselyitä julkaisuista lohkoeditorissa ja tarjota käyttäjälle parempi tapa valita viesti.